mandrel 2.60.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +25 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* plan-context.js — single planner-context envelope
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* ONE JSON envelope, so the authoring middle reads a single file instead of
|
|
6
|
-
* shim-scripting library imports.
|
|
7
|
-
*
|
|
8
|
-
* Two operator modes (v2 Story-only):
|
|
9
|
-
* - `seed` / `seed-file` — freeform text (chat or on-disk). Carries
|
|
10
|
-
* `seed` plus `duplicates[]` (open-Story dup search).
|
|
11
|
-
* - `tickets` — one or more existing issue ids to analyze into proper
|
|
12
|
-
* Stories. Carries `sourceTickets[]` plus `duplicates[]` (excluding
|
|
13
|
-
* the source ids themselves).
|
|
14
|
-
*
|
|
15
|
-
* All fields are JSON-serialisable; the module performs no GitHub writes.
|
|
16
|
-
* The only I/O surfaces are the injected `provider` (reads) and the
|
|
17
|
-
* best-effort local scans the folded builders already perform.
|
|
2
|
+
* plan-context.js — builds the single JSON planner-context envelope for
|
|
3
|
+
* `/mandrel-plan` (modes: seed, seed-file, tickets, amends). No GitHub
|
|
4
|
+
* writes; I/O is the injected provider's reads plus best-effort local scans.
|
|
18
5
|
*/
|
|
19
6
|
|
|
20
7
|
import { readFile } from 'node:fs/promises';
|
|
@@ -39,43 +26,17 @@ import { findOpenEpicCandidates } from './epic-candidates.js';
|
|
|
39
26
|
import { buildAuthoringContext } from './planning/authoring-context.js';
|
|
40
27
|
|
|
41
28
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* envelope size: Story #4541 removed the `applyBudget` pass from
|
|
45
|
-
* `buildAuthoringContext`, because both builders below discard that budgeted
|
|
46
|
-
* body and ship the raw seed on `seed.content` instead — the budget bounded
|
|
47
|
-
* a field that never left the function.
|
|
48
|
-
*
|
|
49
|
-
* A measured seed-mode envelope on this repo (a thin `.feature` corpus) is
|
|
50
|
-
* ~120 KB, dominated by the digest-first `docsContext` (~63 KB inline
|
|
51
|
-
* digest) and the rendered `systemPrompts` (~54 KB); every other field is
|
|
52
|
-
* under 1 KB. Story #4811 retired the tier-capped codebase snapshot that
|
|
53
|
-
* used to sit alongside them (~35 KB skinny here). This measurement is
|
|
54
|
-
* **not** representative of every consumer, though: Story #4977 found
|
|
55
|
-
* `bddScenarios` at 118 KB on a consumer with a mature Gherkin corpus —
|
|
56
|
-
* larger than `docsContext` and `systemPrompts` combined, consuming nearly
|
|
57
|
-
* all of the ceiling's headroom on its own, because the scanner applied no
|
|
58
|
-
* cap. `bddScenarios` is now truncated to `BDD_SCENARIOS_BYTE_BUDGET`
|
|
59
|
-
* (`lib/bdd-scenario-budget.js`, ≤24 KB) before it reaches this envelope,
|
|
60
|
-
* so the seed remains the only field this ceiling leaves genuinely
|
|
61
|
-
* unbounded. 256 KB (~64K tokens at the ≈4-chars/token estimate) leaves
|
|
62
|
-
* roughly 2× headroom over the fixed-floor measurement above while staying
|
|
63
|
-
* well under the session budget. An envelope over it is truncated with a
|
|
64
|
-
* `truncated` note rather than refused (Story #5312) — raise the ceiling
|
|
65
|
-
* only with a measured justification.
|
|
29
|
+
* The only bound on envelope size: ~2× a measured ~120 KB seed-mode envelope.
|
|
30
|
+
* Raise only with a measured justification.
|
|
66
31
|
*/
|
|
67
32
|
export const PLAN_CONTEXT_ENVELOPE_BYTE_CEILING = 256_000;
|
|
68
33
|
|
|
69
|
-
/** Marker appended to a string field the cap had to cut. */
|
|
70
34
|
const TRUNCATION_MARKER =
|
|
71
35
|
'\n\n[… truncated by plan-context: PLAN_CONTEXT_ENVELOPE_BYTE_CEILING …]';
|
|
72
36
|
|
|
73
|
-
/** Bounded number of cap rounds — each round cuts the current largest field. */
|
|
74
37
|
const MAX_TRUNCATION_ROUNDS = 8;
|
|
75
38
|
|
|
76
39
|
/**
|
|
77
|
-
* Byte length of a JSON-serialised value.
|
|
78
|
-
*
|
|
79
40
|
* @param {unknown} value
|
|
80
41
|
* @returns {number}
|
|
81
42
|
*/
|
|
@@ -84,9 +45,6 @@ function jsonBytes(value) {
|
|
|
84
45
|
}
|
|
85
46
|
|
|
86
47
|
/**
|
|
87
|
-
* Cut a string to fit `excess` fewer bytes, keeping a leading prefix and
|
|
88
|
-
* appending the truncation marker.
|
|
89
|
-
*
|
|
90
48
|
* @param {string} text
|
|
91
49
|
* @param {number} excess
|
|
92
50
|
* @returns {string}
|
|
@@ -104,11 +62,8 @@ function truncateString(text, excess) {
|
|
|
104
62
|
}
|
|
105
63
|
|
|
106
64
|
/**
|
|
107
|
-
* Cut one
|
|
108
|
-
*
|
|
109
|
-
* fits), and an object whose largest string property is cut in place — which
|
|
110
|
-
* covers `seed.content`, `docsContext.digest` and every list field. Returns
|
|
111
|
-
* `null` for a shape nothing here can shrink.
|
|
65
|
+
* Cut one field by ~`excess` bytes: a string to a prefix, an array by tail
|
|
66
|
+
* entries, an object by its largest string property. `null` if uncuttable.
|
|
112
67
|
*
|
|
113
68
|
* @param {unknown} value
|
|
114
69
|
* @param {number} excess
|
|
@@ -149,28 +104,12 @@ function truncateField(value, excess) {
|
|
|
149
104
|
}
|
|
150
105
|
|
|
151
106
|
/**
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
* field so the planner can see what it did not get.
|
|
155
|
-
*
|
|
156
|
-
* Until Story #5312 this refused the envelope outright and exited non-zero
|
|
157
|
-
* naming what to trim. That was the wrong direction for a bound whose only
|
|
158
|
-
* job is to keep the planner's context readable: an oversize seed or
|
|
159
|
-
* `--tickets` body is an operator's real input, and refusing to plan from it
|
|
160
|
-
* cost a re-run for a ceiling the operator had no way to act on (the seed is
|
|
161
|
-
* carried verbatim by design). A truncated envelope with a note is a plan
|
|
162
|
-
* that runs on the part that fits and says so; a refusal is no plan at all.
|
|
163
|
-
* The bound itself stays a fixed framework constant — a cap the operator can
|
|
164
|
-
* raise past what the model can read fails silently again.
|
|
165
|
-
*
|
|
166
|
-
* Deliberately **not** exported: its only external caller would be a test, and
|
|
167
|
-
* a test-only export is a production-dead one. It is reachable end to end
|
|
168
|
-
* through {@link buildPlanContext}, which is where the behaviour matters.
|
|
107
|
+
* Truncate the largest fields to fit, rather than refuse: an oversize seed is
|
|
108
|
+
* the operator's real input, and a partial plan that says so beats none.
|
|
169
109
|
*
|
|
170
110
|
* @param {object} envelope
|
|
171
111
|
* @param {{ ceiling?: number }} [opts]
|
|
172
|
-
* @returns {object}
|
|
173
|
-
* copy carrying `truncated: Array<{ field, originalBytes, keptBytes, note }>`.
|
|
112
|
+
* @returns {object} unchanged when it fits, else a copy with `truncated[]`.
|
|
174
113
|
*/
|
|
175
114
|
function capPlanContextEnvelope(envelope, opts = {}) {
|
|
176
115
|
const ceiling = opts.ceiling ?? PLAN_CONTEXT_ENVELOPE_BYTE_CEILING;
|
|
@@ -181,13 +120,9 @@ function capPlanContextEnvelope(envelope, opts = {}) {
|
|
|
181
120
|
for (let round = 0; round < MAX_TRUNCATION_ROUNDS; round += 1) {
|
|
182
121
|
const total = jsonBytes({ ...next, truncated });
|
|
183
122
|
if (total <= ceiling) break;
|
|
184
|
-
// JSON escaping of
|
|
185
|
-
//
|
|
186
|
-
// absorbs the whole excess rather than a residual spilling onto the next
|
|
187
|
-
// largest one (which is the planner's own prompt).
|
|
123
|
+
// Over-cut slightly (JSON escaping of marker/note) so the dominant field
|
|
124
|
+
// absorbs the whole excess instead of spilling onto the system prompts.
|
|
188
125
|
const excess = total - ceiling + 128;
|
|
189
|
-
// The largest field that can be cut — re-cut on a later round rather than
|
|
190
|
-
// moving on to a smaller field it never had to touch.
|
|
191
126
|
const candidates = Object.entries(next)
|
|
192
127
|
.map(([field, value]) => [field, jsonBytes(value)])
|
|
193
128
|
.sort((a, b) => b[1] - a[1]);
|
|
@@ -222,13 +157,7 @@ function capPlanContextEnvelope(envelope, opts = {}) {
|
|
|
222
157
|
return { ...next, truncated };
|
|
223
158
|
}
|
|
224
159
|
|
|
225
|
-
/**
|
|
226
|
-
* Compact, machine-readable descriptor of the `tickets.json` array the
|
|
227
|
-
* authoring pass writes and `validateAndNormalizeTickets` gates at persist
|
|
228
|
-
* time. A descriptor, not a validator: the deterministic gate stays in the
|
|
229
|
-
* persist half (design § 1 step 3); this field exists so the authoring
|
|
230
|
-
* middle knows the shape without re-reading the decomposer prompt prose.
|
|
231
|
-
*/
|
|
160
|
+
/** Shape descriptor only; persist's validator is the gate. */
|
|
232
161
|
export const TICKET_SCHEMA_DESCRIPTOR = Object.freeze({
|
|
233
162
|
shape: 'array',
|
|
234
163
|
itemFields: Object.freeze({
|
|
@@ -248,22 +177,11 @@ export const TICKET_SCHEMA_DESCRIPTOR = Object.freeze({
|
|
|
248
177
|
'validateAndNormalizeTickets (lib/orchestration/ticket-validator.js) at persist time',
|
|
249
178
|
});
|
|
250
179
|
|
|
251
|
-
/**
|
|
252
|
-
* Filename of the ready-to-fill Story authoring template `plan-context.js`
|
|
253
|
-
* writes next to the captured envelope (Story #4707).
|
|
254
|
-
*/
|
|
255
180
|
export const STORIES_TEMPLATE_FILENAME = 'stories.template.json';
|
|
256
181
|
|
|
257
182
|
/**
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
* **bare path string** — the default authored form since Story #5342. The
|
|
261
|
-
* template used to pre-resolve each one to a creates-vs-refactors assumption
|
|
262
|
-
* against the repo snapshot; persist re-derives it against the base-branch
|
|
263
|
-
* ref, which is the authoritative probe, so the skeleton no longer carries a
|
|
264
|
-
* second answer for the author to keep in sync. Order follows
|
|
265
|
-
* `predictedPaths` (first appearance in the seed). Falls back to the
|
|
266
|
-
* single instructive placeholder entry when the seed predicted no paths.
|
|
183
|
+
* Template `changes[]`: the seed-predicted paths as bare strings (persist
|
|
184
|
+
* derives each assumption against the base branch), or one placeholder.
|
|
267
185
|
*
|
|
268
186
|
* @param {{ predictedPaths?: string[] }|null|undefined} complexitySignals
|
|
269
187
|
* @returns {string[]}
|
|
@@ -278,31 +196,10 @@ function buildTemplateChanges(complexitySignals) {
|
|
|
278
196
|
}
|
|
279
197
|
|
|
280
198
|
/**
|
|
281
|
-
*
|
|
282
|
-
*
|
|
283
|
-
* One-shot authoring: the planner copies this file to `stories.json`, fills
|
|
284
|
-
* the placeholder values, and runs persist — no step requires reading
|
|
285
|
-
* `story-body.js` source or re-poking the envelope for format discovery
|
|
286
|
-
* (bench: ~7 of 17 plan turns were format discovery). The template uses the
|
|
287
|
-
* **structured-object body** shape, which persist parses and serializes to
|
|
288
|
-
* the canonical markdown itself (`parse` accepts an object;
|
|
289
|
-
* `assembleOnePlanStory` re-serializes canonically), so the serializer
|
|
290
|
-
* contract never has to be reverse-engineered by the author. `acceptance[]`
|
|
291
|
-
* / `verify[]` live at the ticket's top level — the machine contract persist
|
|
292
|
-
* syncs into the body.
|
|
293
|
-
*
|
|
294
|
-
* Correct-by-construction skeleton (Story #4723): when the envelope's
|
|
295
|
-
* `complexitySignals` predicted a footprint the `changes[]` entries arrive
|
|
296
|
-
* already filled in, as the bare paths Story #5342 made the default form —
|
|
297
|
-
* a faithfully-filled skeleton passes the persist ticket validators without a
|
|
298
|
-
* mechanical round-trip. Persist derives each assumption by probing the base
|
|
299
|
-
* branch ref and reports the derivation.
|
|
199
|
+
* Ready-to-fill `stories.json` template. Uses the structured-object body
|
|
200
|
+
* persist serializes itself, so authors never reverse-engineer the markdown.
|
|
300
201
|
*
|
|
301
|
-
*
|
|
302
|
-
* instructive placeholder values rather than comments.
|
|
303
|
-
*
|
|
304
|
-
* @param {{ complexitySignals?: object|null }} [opts] Envelope signals to
|
|
305
|
-
* pre-resolve the skeleton against; omit for the bare placeholder shape.
|
|
202
|
+
* @param {{ complexitySignals?: object|null }} [opts]
|
|
306
203
|
* @returns {string} Pretty-printed JSON template content.
|
|
307
204
|
*/
|
|
308
205
|
export function renderStoriesTemplate({ complexitySignals = null } = {}) {
|
|
@@ -313,12 +210,8 @@ export function renderStoriesTemplate({ complexitySignals = null } = {}) {
|
|
|
313
210
|
title: 'Fill: short descriptive title',
|
|
314
211
|
body: {
|
|
315
212
|
goal: 'Fill: one sentence stating why this Story exists.',
|
|
316
|
-
// A filled
|
|
317
|
-
//
|
|
318
|
-
// Story, so the skeleton has to show an author what a checkpoint
|
|
319
|
-
// list looks like. Each line is a stage of the work — a commit
|
|
320
|
-
// boundary inside one session — never a restatement of an
|
|
321
|
-
// acceptance item, which states what is true once the Story lands.
|
|
213
|
+
// A filled example: each line is a commit-boundary stage of the
|
|
214
|
+
// work, never a restated acceptance item.
|
|
322
215
|
slicing:
|
|
323
216
|
'1. Re-anchor the shared constant and its consumers.\n' +
|
|
324
217
|
'2. Move the gate ahead of the first write and arm the refusal.\n' +
|
|
@@ -347,9 +240,7 @@ export function renderStoriesTemplate({ complexitySignals = null } = {}) {
|
|
|
347
240
|
}
|
|
348
241
|
|
|
349
242
|
/**
|
|
350
|
-
* Count
|
|
351
|
-
* free-form seed text. Unlike {@link countScopeItems} this does not require
|
|
352
|
-
* a scope-shaped heading — a raw `--seed` text rarely has one.
|
|
243
|
+
* Count enumerated lines (`- `, `* `, `1. `) anywhere — no heading required.
|
|
353
244
|
*
|
|
354
245
|
* @param {string} text
|
|
355
246
|
* @returns {number}
|
|
@@ -361,24 +252,13 @@ function countEnumeratedItems(text) {
|
|
|
361
252
|
.filter((line) => /^\s*(?:[-*]|\d+\.)\s+\S/.test(line)).length;
|
|
362
253
|
}
|
|
363
254
|
|
|
364
|
-
/**
|
|
365
|
-
* Delta-shaped change-request verbs — a change request naming one of these
|
|
366
|
-
* stays a Story by default when the footprint stays inside Story width.
|
|
367
|
-
*/
|
|
255
|
+
/** Change-request verbs: such a seed stays a Story within Story width. */
|
|
368
256
|
const DELTA_VERB_RE =
|
|
369
257
|
/\b(fix(?:es)?|tweak(?:s)?|extend(?:s)?|update(?:s)?|adjust(?:s)?|rename(?:s)?|correct(?:s)?|patch(?:es)?|bug|regression|flaky)\b/i;
|
|
370
258
|
|
|
371
259
|
/**
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
* path from needing a judgment pass of its own.
|
|
375
|
-
*
|
|
376
|
-
* The heuristics anchor to the granularity SSOT —
|
|
377
|
-
* `DELIVERABLE_GRANULARITY_GUIDANCE` in `ticket-validator-sizing.js` (one
|
|
378
|
-
* Story = one coherent capability slice; multiple independent capabilities =
|
|
379
|
-
* an Epic) — and to the change-request delta rubric above. The verdict is
|
|
380
|
-
* **advisory**: being wrong in the `epic` direction is cheap, and
|
|
381
|
-
* `borderline` is a first-class output, not a forced call.
|
|
260
|
+
* Advisory scope signal over raw seed text (one capability = one Story).
|
|
261
|
+
* Erring toward `epic` is cheap; `borderline` is a real verdict.
|
|
382
262
|
*
|
|
383
263
|
* @param {{ seedText?: string }} args
|
|
384
264
|
* @returns {{ verdict: 'epic'|'story'|'borderline', reasons: string[], advisory: true, appliedBy: 'cli' }}
|
|
@@ -440,27 +320,17 @@ export function buildScopeTriageSignal({ seedText = '' } = {}) {
|
|
|
440
320
|
};
|
|
441
321
|
}
|
|
442
322
|
|
|
443
|
-
/**
|
|
444
|
-
* The `audit-rules.json` lens `target` value marking a lens applicable only to
|
|
445
|
-
* a project with a rendered frontend.
|
|
446
|
-
*/
|
|
447
323
|
const WEB_LENS_TARGET = 'web';
|
|
448
324
|
|
|
449
325
|
/**
|
|
450
|
-
*
|
|
451
|
-
*
|
|
452
|
-
* `MAX_PREDICTED_PATHS` paths — enumerating all of them would let one UI-heavy
|
|
453
|
-
* seed blow that budget. The full count travels beside the sample as
|
|
454
|
-
* `matchedPathCount`, so nothing is silently lost.
|
|
326
|
+
* Sample size of matched UI paths: the signal rides the ~2KB `--out` stdout
|
|
327
|
+
* digest; `matchedPathCount` carries the full total.
|
|
455
328
|
*/
|
|
456
329
|
const UI_MATCHED_PATH_SAMPLE = 5;
|
|
457
330
|
|
|
458
331
|
/**
|
|
459
|
-
* Union of
|
|
460
|
-
*
|
|
461
|
-
* "this path is part of a rendered UI surface". Read from the manifest rather
|
|
462
|
-
* than re-listed here: a second copy of the glob set would be a second thing to
|
|
463
|
-
* keep in sync, and the manifest is already the place an operator extends it.
|
|
332
|
+
* Union of every `target: "web"` lens's `triggers.filePatterns` — read from
|
|
333
|
+
* the manifest, never re-listed, so there is one glob set to extend.
|
|
464
334
|
*
|
|
465
335
|
* @param {{ audits?: Record<string, object> }} rules
|
|
466
336
|
* @returns {string[]} Deduplicated globs, in manifest order.
|
|
@@ -477,12 +347,8 @@ function resolveWebFilePatterns(rules) {
|
|
|
477
347
|
}
|
|
478
348
|
|
|
479
349
|
/**
|
|
480
|
-
*
|
|
481
|
-
*
|
|
482
|
-
* An unreadable manifest is **indeterminate**, not "no match": the signal fails
|
|
483
|
-
* OPEN in the same direction {@link hasWebSurface} does, because a spurious
|
|
484
|
-
* mention of an operator-invoked command costs nothing while a missed one costs
|
|
485
|
-
* the whole point of the offer.
|
|
350
|
+
* Predicted paths on a UI surface. An unreadable manifest is indeterminate and
|
|
351
|
+
* fails OPEN: a spurious offer costs nothing, a missed one defeats it.
|
|
486
352
|
*
|
|
487
353
|
* @param {string[]} predictedPaths
|
|
488
354
|
* @returns {{ matchedPaths: string[], indeterminate: boolean }}
|
|
@@ -503,9 +369,6 @@ function resolveWebFootprintMatch(predictedPaths) {
|
|
|
503
369
|
}
|
|
504
370
|
|
|
505
371
|
/**
|
|
506
|
-
* The one sentence a `uiSurface` signal carries — why the offer fires, or why it
|
|
507
|
-
* does not. Kept in one place so the fired and unfired shapes stay one object.
|
|
508
|
-
*
|
|
509
372
|
* @param {{
|
|
510
373
|
* detected: boolean,
|
|
511
374
|
* webSurface: boolean,
|
|
@@ -537,22 +400,8 @@ function uiSurfaceReason({
|
|
|
537
400
|
}
|
|
538
401
|
|
|
539
402
|
/**
|
|
540
|
-
*
|
|
541
|
-
*
|
|
542
|
-
* Two observables, both already shipped, ANDed together:
|
|
543
|
-
*
|
|
544
|
-
* 1. the project is web-capable at all (`hasWebSurface` — the same
|
|
545
|
-
* applicability predicate the `target: "web"` audit lenses gate on), and
|
|
546
|
-
* 2. at least one predicted path matches a web lens `filePattern`.
|
|
547
|
-
*
|
|
548
|
-
* No new detection surface and no new `.agentrc.json` key: both halves are
|
|
549
|
-
* derived from the consumer's own checkout, so a frontend-less project — this
|
|
550
|
-
* repository included — resolves falsey and the offer never fires.
|
|
551
|
-
*
|
|
552
|
-
* The signal carries **no routing authority** (`automatic: false`): `/mandrel-plan`
|
|
553
|
-
* may say that a plan touches UI and that `/prototype` exists, and must never
|
|
554
|
-
* invoke it. Pure over its inputs and total — a malformed signal bag or an
|
|
555
|
-
* unreadable manifest degrades, never throws.
|
|
403
|
+
* Advisory: web-capable project AND a predicted path matches a web lens glob.
|
|
404
|
+
* The planner may mention `/prototype`, never invoke it. Never throws.
|
|
556
405
|
*
|
|
557
406
|
* @param {{
|
|
558
407
|
* complexitySignals?: object|null,
|
|
@@ -567,8 +416,7 @@ function uiSurfaceReason({
|
|
|
567
416
|
* matchedPaths: string[],
|
|
568
417
|
* matchedPathCount: number,
|
|
569
418
|
* reasons: string[],
|
|
570
|
-
* }}
|
|
571
|
-
* ({@link UI_MATCHED_PATH_SAMPLE}); `matchedPathCount` is the full total.
|
|
419
|
+
* }}
|
|
572
420
|
*/
|
|
573
421
|
function buildUiSurfaceSignal({ complexitySignals, config, cwd } = {}) {
|
|
574
422
|
const predictedPaths = Array.isArray(complexitySignals?.predictedPaths)
|
|
@@ -609,10 +457,8 @@ function buildUiSurfaceSignal({ complexitySignals, config, cwd } = {}) {
|
|
|
609
457
|
}
|
|
610
458
|
|
|
611
459
|
/**
|
|
612
|
-
*
|
|
613
|
-
*
|
|
614
|
-
* keys — keeps every existing per-mode envelope key set byte-stable: both are
|
|
615
|
-
* derived from the signals they ride on.
|
|
460
|
+
* Nest the advisory signals inside `complexitySignals` so the per-mode
|
|
461
|
+
* top-level envelope key sets stay stable.
|
|
616
462
|
*
|
|
617
463
|
* @param {object} complexitySignals
|
|
618
464
|
* @param {{ config?: object, cwd?: string }} [context]
|
|
@@ -626,21 +472,8 @@ function withAdvisorySignals(complexitySignals, { config, cwd } = {}) {
|
|
|
626
472
|
}
|
|
627
473
|
|
|
628
474
|
/**
|
|
629
|
-
*
|
|
630
|
-
*
|
|
631
|
-
* `lib/templates/decomposer-prompts.js`, with the schedule rules and the
|
|
632
|
-
* collision refusal a planner reads only when the default-single split policy
|
|
633
|
-
* clears carried separately as `storySplitRules` (Story #5312).
|
|
634
|
-
*
|
|
635
|
-
* Story #5332 deleted the `spec` / `acceptance` fields with the module that
|
|
636
|
-
* rendered them: nothing read either, and both contradicted the current
|
|
637
|
-
* contract — one asserting Spec budgets that no longer exist, the other
|
|
638
|
-
* demanding the verify tier suffixes tickets mode now strips.
|
|
639
|
-
*
|
|
640
|
-
* `storyTicketsRules` is the one mode-conditional field (Story #5323): it
|
|
641
|
-
* only means anything when the seed is an existing ticket, and an envelope
|
|
642
|
-
* that carries it in every mode teaches the author to look for a source
|
|
643
|
-
* ticket that a `--seed` run does not have.
|
|
475
|
+
* `storyTicketsRules` only in tickets mode: a `--seed` run has no source
|
|
476
|
+
* ticket to look for.
|
|
644
477
|
*
|
|
645
478
|
* @param {{ mode?: string }} [args]
|
|
646
479
|
* @returns {{ story: string, storySplitRules: string, storyTicketsRules?: string }}
|
|
@@ -654,8 +487,7 @@ export function buildSystemPrompts({ mode } = {}) {
|
|
|
654
487
|
}
|
|
655
488
|
|
|
656
489
|
/**
|
|
657
|
-
*
|
|
658
|
-
* signal, not a gate.
|
|
490
|
+
* Open-Story duplicate search; failures degrade to [] (triage, not a gate).
|
|
659
491
|
*
|
|
660
492
|
* @param {{
|
|
661
493
|
* seed: string,
|
|
@@ -688,20 +520,9 @@ async function searchStoryDuplicates({
|
|
|
688
520
|
}
|
|
689
521
|
|
|
690
522
|
/**
|
|
691
|
-
* Gather
|
|
692
|
-
*
|
|
693
|
-
*
|
|
694
|
-
* concurrency (Story #4952).
|
|
695
|
-
*
|
|
696
|
-
* None of them reads a value the others produce, so the result is a pure
|
|
697
|
-
* function of `seed` and the injected config: the assembled envelope is
|
|
698
|
-
* **byte-identical** to the serial build for the same inputs, whichever order
|
|
699
|
-
* the three happen to settle in. `concurrentMap` preserves input order, so the
|
|
700
|
-
* destructuring below is positional and stable.
|
|
701
|
-
*
|
|
702
|
-
* `docsContextFiles` is emptied for the `buildAuthoringContext` call: the
|
|
703
|
-
* per-plan digest-file path needs a plan id that does not exist yet — the
|
|
704
|
-
* inline digest gathered alongside it replaces that pointer.
|
|
523
|
+
* Gather independent envelope inputs concurrently; order-preserving, so the
|
|
524
|
+
* result matches a serial build. `docsContextFiles` is emptied because no
|
|
525
|
+
* plan id exists yet for a digest file — the inline digest replaces it.
|
|
705
526
|
*
|
|
706
527
|
* @param {{
|
|
707
528
|
* seed: string,
|
|
@@ -749,10 +570,6 @@ async function gatherEnvelopeInputs({
|
|
|
749
570
|
epic: { id: 0, title: epicTitle, body: seed },
|
|
750
571
|
github: config.github ?? null,
|
|
751
572
|
cwd,
|
|
752
|
-
// Story #5182 — the memory-hygiene advisory's two thresholds.
|
|
753
|
-
// They live on `planning`, not the `project` block `settings`
|
|
754
|
-
// carries, so they ride the opts bag rather than that legacy one.
|
|
755
|
-
memoryPool: config.planning?.memoryPool ?? null,
|
|
756
573
|
},
|
|
757
574
|
),
|
|
758
575
|
() =>
|
|
@@ -760,10 +577,6 @@ async function gatherEnvelopeInputs({
|
|
|
760
577
|
docsContextFiles: settings?.docsContextFiles,
|
|
761
578
|
docsRoot: paths.docsRoot,
|
|
762
579
|
}),
|
|
763
|
-
// Story #5155 — the two cross-plan lookups. Both are advisory triage
|
|
764
|
-
// lists offered at Gate #3, independent of every other gather and of
|
|
765
|
-
// each other, so they join the same bounded fan-out rather than adding
|
|
766
|
-
// two more serial round-trips to the operator's wait.
|
|
767
580
|
() =>
|
|
768
581
|
findOpenEpicCandidates({
|
|
769
582
|
seed,
|
|
@@ -781,10 +594,6 @@ async function gatherEnvelopeInputs({
|
|
|
781
594
|
}),
|
|
782
595
|
],
|
|
783
596
|
(gather) => gather(),
|
|
784
|
-
// The per-mode envelope gathers (Story #4952): the duplicate search, the
|
|
785
|
-
// authoring-context fold and the docs digest have no data dependency on
|
|
786
|
-
// one another, so their serialization was incidental and `/mandrel-plan` paid it
|
|
787
|
-
// with the operator waiting at Gate #1.
|
|
788
597
|
{ concurrency: FANOUT_CONCURRENCY },
|
|
789
598
|
);
|
|
790
599
|
|
|
@@ -800,12 +609,7 @@ async function gatherEnvelopeInputs({
|
|
|
800
609
|
};
|
|
801
610
|
}
|
|
802
611
|
|
|
803
|
-
/**
|
|
804
|
-
* Build the seed-file (ideation) envelope. No parent ticket
|
|
805
|
-
* exists yet — creation moves to the persist half — so the open-Story
|
|
806
|
-
* dup search is the mode's gating input. `docsContext` is inline-digest:
|
|
807
|
-
* there is no plan temp directory to anchor a digest file to yet.
|
|
808
|
-
*/
|
|
612
|
+
/** Seed-file envelope; also the base for seed mode. */
|
|
809
613
|
async function buildSeedFileModeEnvelope({
|
|
810
614
|
seedFilePath,
|
|
811
615
|
seedFileContent,
|
|
@@ -823,18 +627,12 @@ async function buildSeedFileModeEnvelope({
|
|
|
823
627
|
);
|
|
824
628
|
}
|
|
825
629
|
|
|
826
|
-
//
|
|
827
|
-
// intersects against `predictedPaths`, so the signals have to exist before
|
|
828
|
-
// the fan-out starts. `buildComplexitySignals` is synchronous and reads
|
|
829
|
-
// nothing the gather produces, so hoisting it changes cost, not output.
|
|
630
|
+
// Before the gather: dependency candidates intersect `predictedPaths`.
|
|
830
631
|
const complexitySignals = withAdvisorySignals(
|
|
831
632
|
buildComplexitySignals({ seedText: content, cwd }),
|
|
832
633
|
{ config, cwd },
|
|
833
634
|
);
|
|
834
635
|
|
|
835
|
-
// Dup search, the authoring-context fold grounded in the seed prose, the
|
|
836
|
-
// inline docs digest and the two cross-plan candidate lists are independent
|
|
837
|
-
// — gathered concurrently (Story #4952, Story #5155).
|
|
838
636
|
const {
|
|
839
637
|
duplicates,
|
|
840
638
|
authoring,
|
|
@@ -854,9 +652,7 @@ async function buildSeedFileModeEnvelope({
|
|
|
854
652
|
return {
|
|
855
653
|
mode: modeLabel,
|
|
856
654
|
seed: { path: seedFilePath ?? null, content },
|
|
857
|
-
// Advisory
|
|
858
|
-
// nested `uiSurface` is the advisory /prototype offer — never an
|
|
859
|
-
// automatic reroute.
|
|
655
|
+
// Advisory only — no routing authority.
|
|
860
656
|
complexitySignals,
|
|
861
657
|
duplicates,
|
|
862
658
|
epicCandidates,
|
|
@@ -869,16 +665,11 @@ async function buildSeedFileModeEnvelope({
|
|
|
869
665
|
ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
|
|
870
666
|
systemPrompts: buildSystemPrompts(),
|
|
871
667
|
planState: null,
|
|
872
|
-
// N=1 default: author one Story; skip Epic-scale decompose ceremony.
|
|
873
668
|
planProfile: 'story-default',
|
|
874
669
|
};
|
|
875
670
|
}
|
|
876
671
|
|
|
877
|
-
/**
|
|
878
|
-
* Build the seed-mode (chat text) envelope. The seed-file does not exist
|
|
879
|
-
* yet: the dup search and the authoring-context fold both run off the raw
|
|
880
|
-
* seed text (N=1 default — no Epic-scale decompose).
|
|
881
|
-
*/
|
|
672
|
+
/** Seed-mode (chat text) envelope. */
|
|
882
673
|
async function buildSeedModeEnvelope({
|
|
883
674
|
seedText,
|
|
884
675
|
provider,
|
|
@@ -909,9 +700,6 @@ async function buildSeedModeEnvelope({
|
|
|
909
700
|
}
|
|
910
701
|
|
|
911
702
|
/**
|
|
912
|
-
* Fetch source tickets for `--tickets` mode.
|
|
913
|
-
* Hydrates ids concurrently (bounded) while preserving input order.
|
|
914
|
-
*
|
|
915
703
|
* @param {number[]} ticketIds
|
|
916
704
|
* @param {object} provider
|
|
917
705
|
* @returns {Promise<Array<{ id:number, title:string, body:string, labels:string[], url?:string }>>}
|
|
@@ -942,16 +730,11 @@ async function fetchSourceTickets(ticketIds, provider) {
|
|
|
942
730
|
state: ticket.state ?? undefined,
|
|
943
731
|
};
|
|
944
732
|
},
|
|
945
|
-
// `--tickets` source-ticket hydration: one independent read per id.
|
|
946
733
|
{ concurrency: FANOUT_CONCURRENCY },
|
|
947
734
|
);
|
|
948
735
|
}
|
|
949
736
|
|
|
950
|
-
/**
|
|
951
|
-
* Build the tickets-mode envelope — analyze existing issue(s) into proper
|
|
952
|
-
* Stories. Dup search excludes the source ids so a ticket is not reported
|
|
953
|
-
* as a duplicate of itself.
|
|
954
|
-
*/
|
|
737
|
+
/** Dup search excludes the source ids: a ticket is not its own duplicate. */
|
|
955
738
|
async function buildTicketsModeEnvelope({
|
|
956
739
|
ticketIds,
|
|
957
740
|
provider,
|
|
@@ -969,15 +752,11 @@ async function buildTicketsModeEnvelope({
|
|
|
969
752
|
.map((t) => `# ${t.title}\n\n${t.body}`)
|
|
970
753
|
.join('\n\n---\n\n');
|
|
971
754
|
|
|
972
|
-
// Hoisted for the same reason as seed-file mode (Story #5155).
|
|
973
755
|
const complexitySignals = withAdvisorySignals(
|
|
974
756
|
buildComplexitySignals({ seedText: seed, cwd }),
|
|
975
757
|
{ config, cwd },
|
|
976
758
|
);
|
|
977
759
|
|
|
978
|
-
// Same independent gathers as seed-file mode, concurrent under the same
|
|
979
|
-
// bound (Story #4952); only the source-ticket hydration above is a genuine
|
|
980
|
-
// data dependency, because `seed` is derived from it.
|
|
981
760
|
const {
|
|
982
761
|
duplicates,
|
|
983
762
|
authoring,
|
|
@@ -1022,9 +801,8 @@ async function buildTicketsModeEnvelope({
|
|
|
1022
801
|
}
|
|
1023
802
|
|
|
1024
803
|
/**
|
|
1025
|
-
*
|
|
1026
|
-
*
|
|
1027
|
-
* grounded on whatever survived), never a throw.
|
|
804
|
+
* Prior Story's acceptance and delivered files; an unparseable body degrades
|
|
805
|
+
* to empty lists, never a throw.
|
|
1028
806
|
*
|
|
1029
807
|
* @param {string} priorBody
|
|
1030
808
|
* @returns {{ priorAcceptance: string[], deliveredFiles: string[] }}
|
|
@@ -1048,20 +826,8 @@ function extractPriorArtifacts(priorBody) {
|
|
|
1048
826
|
}
|
|
1049
827
|
|
|
1050
828
|
/**
|
|
1051
|
-
*
|
|
1052
|
-
*
|
|
1053
|
-
* light amendment through the light path: instead of re-interrogating the
|
|
1054
|
-
* repo from scratch (`buildAuthoringContext`'s codebase snapshot and the BDD /
|
|
1055
|
-
* memory / feedback probes), the envelope composes a DELTA from what already
|
|
1056
|
-
* exists — the prior Story's body, its acceptance criteria (the real
|
|
1057
|
-
* contract), and its delivered file map — so a follow-up change plans from the
|
|
1058
|
-
* shape already shipped.
|
|
1059
|
-
*
|
|
1060
|
-
* The semantic steps that reach the ticket are preserved: the open-Story
|
|
1061
|
-
* duplicate search (excluding the amended Story itself) and the authoring
|
|
1062
|
-
* system prompts still ride the envelope. What is
|
|
1063
|
-
* dropped is only the from-scratch repo interrogation the prior artifacts
|
|
1064
|
-
* already stand in for — that is the round-trip diet, not an amputation.
|
|
829
|
+
* `--amends` envelope: a delta grounded on the prior Story instead of a
|
|
830
|
+
* from-scratch repo interrogation.
|
|
1065
831
|
*
|
|
1066
832
|
* @param {{
|
|
1067
833
|
* amendsId: number,
|
|
@@ -1093,12 +859,7 @@ async function buildAmendmentModeEnvelope({
|
|
|
1093
859
|
const priorBody = typeof prior.body === 'string' ? prior.body : '';
|
|
1094
860
|
const { priorAcceptance, deliveredFiles } = extractPriorArtifacts(priorBody);
|
|
1095
861
|
|
|
1096
|
-
//
|
|
1097
|
-
// member. `provider.getTicket` above is a hard data dependency (the prior
|
|
1098
|
-
// body IS the seed), and the mode deliberately carries no authoring-context
|
|
1099
|
-
// fold and no docs digest — the prior artifacts are the grounding. It still
|
|
1100
|
-
// goes through the same bounded gather as the other two builders so one file
|
|
1101
|
-
// does not carry two ways of gathering independent envelope inputs.
|
|
862
|
+
// A one-member gather, kept on the same path as the other builders.
|
|
1102
863
|
const [duplicates] = await concurrentMap(
|
|
1103
864
|
[
|
|
1104
865
|
() =>
|
|
@@ -1110,7 +871,6 @@ async function buildAmendmentModeEnvelope({
|
|
|
1110
871
|
}),
|
|
1111
872
|
],
|
|
1112
873
|
(gather) => gather(),
|
|
1113
|
-
// Same independent-gather fan-out as the seed-mode envelope above.
|
|
1114
874
|
{ concurrency: FANOUT_CONCURRENCY },
|
|
1115
875
|
);
|
|
1116
876
|
|
|
@@ -1123,15 +883,12 @@ async function buildAmendmentModeEnvelope({
|
|
|
1123
883
|
priorAcceptance,
|
|
1124
884
|
deliveredFiles,
|
|
1125
885
|
},
|
|
1126
|
-
// The prior body is the seed the delta is authored against.
|
|
1127
886
|
seed: { text: priorBody, path: null },
|
|
1128
887
|
complexitySignals: withAdvisorySignals(
|
|
1129
888
|
buildComplexitySignals({ seedText: priorBody, cwd }),
|
|
1130
889
|
{ config, cwd },
|
|
1131
890
|
),
|
|
1132
891
|
duplicates,
|
|
1133
|
-
// No plan temp dir and no from-scratch repo interrogation — the prior
|
|
1134
|
-
// artifacts are the grounding, so there is no docs digest to anchor.
|
|
1135
892
|
docsContext: null,
|
|
1136
893
|
ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
|
|
1137
894
|
systemPrompts: buildSystemPrompts(),
|
|
@@ -1141,11 +898,7 @@ async function buildAmendmentModeEnvelope({
|
|
|
1141
898
|
}
|
|
1142
899
|
|
|
1143
900
|
/**
|
|
1144
|
-
* Build the
|
|
1145
|
-
*
|
|
1146
|
-
* Every mode returns through here, which makes this the one place the
|
|
1147
|
-
* envelope's total size is decided — and therefore the only honest place to
|
|
1148
|
-
* bound it (see {@link capPlanContextEnvelope}).
|
|
901
|
+
* Build the planner-context envelope — the one place every mode is capped.
|
|
1149
902
|
*
|
|
1150
903
|
* @param {{
|
|
1151
904
|
* mode: 'seed-file'|'seed'|'tickets'|'amends',
|
|
@@ -1189,10 +942,6 @@ export async function buildPlanContext({
|
|
|
1189
942
|
);
|
|
1190
943
|
}
|
|
1191
944
|
|
|
1192
|
-
/**
|
|
1193
|
-
* Mode dispatch for {@link buildPlanContext}. Split out so the ceiling cap
|
|
1194
|
-
* wraps every mode exactly once.
|
|
1195
|
-
*/
|
|
1196
945
|
async function buildPlanContextEnvelope({
|
|
1197
946
|
mode,
|
|
1198
947
|
seedFilePath,
|