mandrel 1.93.0 → 2.0.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 +59 -73
- package/.agents/agents/acceptance-critic.md +129 -0
- package/.agents/agents/story-worker.md +161 -0
- package/.agents/docs/SDLC.md +489 -1285
- package/.agents/docs/agentrc-reference.json +177 -67
- package/.agents/docs/configuration.md +108 -136
- package/.agents/docs/execution-reference.md +44 -22
- package/.agents/docs/quality-gates.md +13 -19
- package/.agents/docs/workflows.md +3 -3
- package/.agents/instructions.md +107 -108
- package/.agents/rules/ci-remediation.md +8 -12
- package/.agents/rules/git-conventions-reference.md +224 -0
- package/.agents/rules/git-conventions.md +42 -223
- package/.agents/rules/security-baseline.md +5 -0
- package/.agents/rules/testing-standards.md +106 -13
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +71 -201
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/risk-verdict.schema.json +0 -13
- package/.agents/scripts/acceptance-eval.js +62 -18
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/analyze-execution.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/check-context-budget.js +62 -5
- package/.agents/scripts/check-lifecycle-lint.js +6 -9
- package/.agents/scripts/check-prepush-recovery.js +1 -1
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/diagnose-friction.js +0 -6
- package/.agents/scripts/lib/Logger.js +6 -10
- package/.agents/scripts/lib/audit-suite/runner.js +2 -2
- package/.agents/scripts/lib/audit-suite/selector.js +5 -5
- package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
- package/.agents/scripts/lib/baselines/kernel.js +206 -18
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
- package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
- package/.agents/scripts/lib/checks/index.js +2 -1
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +16 -7
- package/.agents/scripts/lib/close-validation/gates.js +160 -22
- package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +103 -0
- package/.agents/scripts/lib/config/explain.js +57 -36
- package/.agents/scripts/lib/config/limits.js +17 -58
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +1 -1
- package/.agents/scripts/lib/config/runners.js +17 -50
- package/.agents/scripts/lib/config/temp-paths.js +19 -14
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +3 -8
- package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
- package/.agents/scripts/lib/config-settings-schema.js +52 -38
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +39 -4
- package/.agents/scripts/lib/duplicate-search.js +211 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +5 -5
- package/.agents/scripts/lib/framework-version.js +2 -3
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
- package/.agents/scripts/lib/git-utils.js +32 -6
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/label-constants.js +10 -23
- package/.agents/scripts/lib/label-taxonomy.js +9 -43
- package/.agents/scripts/lib/observability/active-story-env.js +112 -3
- package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
- package/.agents/scripts/lib/observability/source-classifier.js +3 -3
- package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
- package/.agents/scripts/lib/orchestration/code-review.js +20 -268
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
- package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
- package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +14 -14
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
- package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
- package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
- package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
- package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
- package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
- package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
- package/.agents/scripts/lib/planning-corpus.js +16 -11
- package/.agents/scripts/lib/preflight-runner.js +2 -2
- package/.agents/scripts/lib/provider-factory.js +1 -1
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/story-adjacency.js +11 -14
- package/.agents/scripts/lib/story-body/story-body.js +124 -70
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
- package/.agents/scripts/lib/validation-evidence.js +1 -1
- package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
- package/.agents/scripts/lint-issue-body.js +71 -40
- package/.agents/scripts/mandrel-update-preflight.js +1 -1
- package/.agents/scripts/notify.js +4 -3
- package/.agents/scripts/plan-context.js +64 -74
- package/.agents/scripts/plan-persist.js +121 -280
- package/.agents/scripts/plan-run-epilogue.js +97 -0
- package/.agents/scripts/post-structured-comment.js +38 -0
- package/.agents/scripts/providers/github/issues.js +17 -33
- package/.agents/scripts/providers/github/mappers.js +0 -12
- package/.agents/scripts/providers/github/tickets.js +2 -5
- package/.agents/scripts/resolve-plan-run.js +117 -0
- package/.agents/scripts/signals-view.js +24 -19
- package/.agents/scripts/single-story-close.js +11 -14
- package/.agents/scripts/single-story-confirm-merge.js +39 -23
- package/.agents/scripts/single-story-init.js +29 -20
- package/.agents/scripts/stories-wave-tick.js +6 -6
- package/.agents/scripts/story-plan.js +26 -47
- package/.agents/scripts/sync-claude-agents.js +165 -0
- package/.agents/scripts/update-ticket-state.js +37 -15
- package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
- package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
- package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
- package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
- package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
- package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
- package/.agents/skills/core/scope-triage/SKILL.md +28 -172
- package/.agents/skills/skills.index.json +8 -418
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +3 -3
- package/.agents/workflows/audit-clean-code.md +3 -3
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +5 -5
- package/.agents/workflows/audit-lighthouse.md +3 -3
- package/.agents/workflows/audit-navigability.md +3 -2
- package/.agents/workflows/audit-performance.md +3 -3
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +3 -3
- package/.agents/workflows/audit-security.md +3 -3
- package/.agents/workflows/audit-seo.md +3 -3
- package/.agents/workflows/audit-sre.md +3 -3
- package/.agents/workflows/audit-to-stories.md +20 -20
- package/.agents/workflows/audit-ux-ui.md +3 -3
- package/.agents/workflows/deliver.md +122 -131
- package/.agents/workflows/git-cleanup.md +3 -4
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
- package/.agents/workflows/helpers/code-review.md +70 -193
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
- package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
- package/.agents/workflows/helpers/parallel-tooling.md +1 -1
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
- package/.agents/workflows/mandrel-update.md +3 -2
- package/.agents/workflows/plan.md +112 -145
- package/.agents/workflows/qa-assist.md +24 -30
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -2
- package/README.md +9 -8
- package/docs/CHANGELOG.md +46 -0
- package/lib/cli/registry.js +95 -0
- package/lib/migrations/index.js +6 -5
- package/package.json +5 -3
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer-mobile.md +0 -120
- package/.agents/personas/engineer-web.md +0 -111
- package/.agents/personas/engineer.md +0 -119
- package/.agents/personas/product.md +0 -94
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/refactorer.md +0 -113
- package/.agents/personas/security-engineer.md +0 -112
- package/.agents/personas/sre.md +0 -86
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/personas/ux-designer.md +0 -95
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/dispatcher.js +0 -295
- package/.agents/scripts/epic-audit-prepare.js +0 -497
- package/.agents/scripts/epic-audit-recheck.js +0 -274
- package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
- package/.agents/scripts/epic-deliver-preflight.js +0 -462
- package/.agents/scripts/epic-deliver-prepare.js +0 -590
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-decompose.js +0 -54
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-plan-spec.js +0 -64
- package/.agents/scripts/epic-reconcile.js +0 -625
- package/.agents/scripts/lib/baseline-snapshot.js +0 -979
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
- package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
- package/.agents/scripts/lib/config/lifecycle.js +0 -40
- package/.agents/scripts/lib/config/preflight.js +0 -58
- package/.agents/scripts/lib/config/retro.js +0 -77
- package/.agents/scripts/lib/epic-merge-lock.js +0 -322
- package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
- package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -660
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -388
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -278
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
- package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
- package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
- package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
- package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
- package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -301
- package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
- package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
- package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
- package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
- package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
- package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
- package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
- package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
- package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
- package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
- package/.agents/scripts/lib/push-epic-retry.js +0 -209
- package/.agents/scripts/lib/spec/index.js +0 -36
- package/.agents/scripts/lib/spec/loader.js +0 -425
- package/.agents/scripts/lib/spec/state.js +0 -208
- package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
- package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
- package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
- package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
- package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
- package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
- package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
- package/.agents/scripts/lib/wave-runner/tick.js +0 -754
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
- package/.agents/scripts/lifecycle-emit.js +0 -510
- package/.agents/scripts/plan-critics.js +0 -199
- package/.agents/scripts/retro-run.js +0 -218
- package/.agents/scripts/standalone-feedback-rollup.js +0 -188
- package/.agents/scripts/story-close.js +0 -294
- package/.agents/scripts/story-init.js +0 -599
- package/.agents/scripts/story-phase.js +0 -369
- package/.agents/scripts/wave-tick.js +0 -335
- package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
- package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
- package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
- package/.agents/skills/core/code-simplification/SKILL.md +0 -389
- package/.agents/skills/core/context-engineering/SKILL.md +0 -309
- package/.agents/skills/core/context-engineering/examples.md +0 -58
- package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
- package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
- package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
- package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -413
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
- package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
- package/.agents/skills/core/idea-refinement/examples.md +0 -437
- package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
- package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
- package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
- package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
- package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
- package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
- package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
- package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
- package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
- package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
- package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
- package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
- package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
- package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
- package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
- package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
- package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
- package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
- package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
- package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
- package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
- package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
- package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
- package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
- package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
- package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
- package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
- package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
- package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
- package/.agents/workflows/helpers/deliver-epic.md +0 -955
- package/.agents/workflows/helpers/deliver-stories.md +0 -440
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
- package/.agents/workflows/helpers/epic-testing.md +0 -125
- package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
- package/.agents/workflows/helpers/plan-epic.md +0 -351
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
|
@@ -42,7 +42,8 @@
|
|
|
42
42
|
* @property {string} [summary]
|
|
43
43
|
*
|
|
44
44
|
* @typedef {Object} RoutedProposalsInput
|
|
45
|
-
* @property {number}
|
|
45
|
+
* @property {number} anchorId Story or run/Epic id in titles.
|
|
46
|
+
* @property {'epic'|'story'|'run'} [anchorKind] Wording in titles/bodies (default `epic`).
|
|
46
47
|
* @property {string} frameworkRepo `"<owner>/<repo>"`.
|
|
47
48
|
* @property {string} consumerRepo `"<owner>/<repo>"`.
|
|
48
49
|
* @property {FrictionSignal[]} [signals]
|
|
@@ -142,23 +143,53 @@ function dominantSource(entry) {
|
|
|
142
143
|
return entry.firstSource;
|
|
143
144
|
}
|
|
144
145
|
|
|
146
|
+
/**
|
|
147
|
+
* @param {'epic'|'story'|'run'} kind
|
|
148
|
+
* @param {number} id
|
|
149
|
+
* @returns {string}
|
|
150
|
+
*/
|
|
151
|
+
function formatAnchor(kind, id) {
|
|
152
|
+
if (kind === 'story') return `Story #${id}`;
|
|
153
|
+
if (kind === 'run') return `plan-run ${id}`;
|
|
154
|
+
return `Epic #${id}`;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** Story scope promotes single-occurrence friction; Epic/run keep ≥2. */
|
|
158
|
+
function isActionableFriction(total, force, anchorKind) {
|
|
159
|
+
const threshold = anchorKind === 'story' ? 1 : 2;
|
|
160
|
+
return total >= threshold || Boolean(force);
|
|
161
|
+
}
|
|
162
|
+
|
|
145
163
|
/**
|
|
146
164
|
* Render the issue body. Plain text — no markdown headings — so the
|
|
147
165
|
* pre-drafted `gh issue create --body-file` heredoc remains a faithful
|
|
148
166
|
* representation of what the operator would paste.
|
|
149
167
|
*
|
|
150
|
-
* @param {{
|
|
168
|
+
* @param {{
|
|
169
|
+
* anchorId: number,
|
|
170
|
+
* anchorKind: 'epic'|'story'|'run',
|
|
171
|
+
* category: string,
|
|
172
|
+
* occurrences: number,
|
|
173
|
+
* source: "framework"|"consumer",
|
|
174
|
+
* }} args
|
|
151
175
|
* @returns {string}
|
|
152
176
|
*/
|
|
153
|
-
function renderIssueBody({
|
|
177
|
+
function renderIssueBody({
|
|
178
|
+
anchorId,
|
|
179
|
+
anchorKind,
|
|
180
|
+
category,
|
|
181
|
+
occurrences,
|
|
182
|
+
source,
|
|
183
|
+
}) {
|
|
184
|
+
const anchor = formatAnchor(anchorKind, anchorId);
|
|
154
185
|
return [
|
|
155
|
-
`Recurring friction category "${category}" surfaced ${occurrences} times during
|
|
186
|
+
`Recurring friction category "${category}" surfaced ${occurrences} times during ${anchor}.`,
|
|
156
187
|
'',
|
|
157
188
|
`Source classification: ${source}.`,
|
|
158
189
|
'',
|
|
159
|
-
'Captured by the
|
|
190
|
+
'Captured by the follow-up composer. Triage and either:',
|
|
160
191
|
`- File a follow-on Story to address the underlying ${source} gap, or`,
|
|
161
|
-
|
|
192
|
+
`- Close with "wontfix" and document the rationale on ${anchor}.`,
|
|
162
193
|
].join('\n');
|
|
163
194
|
}
|
|
164
195
|
|
|
@@ -193,7 +224,8 @@ function renderIssueCommand({ repo, title, metaLabel, category, body }) {
|
|
|
193
224
|
* Build an actionable RoutedItem for a category.
|
|
194
225
|
*
|
|
195
226
|
* @param {{
|
|
196
|
-
*
|
|
227
|
+
* anchorId: number,
|
|
228
|
+
* anchorKind: 'epic'|'story'|'run',
|
|
197
229
|
* category: string,
|
|
198
230
|
* occurrences: number,
|
|
199
231
|
* source: "framework"|"consumer",
|
|
@@ -203,15 +235,23 @@ function renderIssueCommand({ repo, title, metaLabel, category, body }) {
|
|
|
203
235
|
* @returns {RoutedItem}
|
|
204
236
|
*/
|
|
205
237
|
function buildRoutedItem({
|
|
206
|
-
|
|
238
|
+
anchorId,
|
|
239
|
+
anchorKind,
|
|
207
240
|
category,
|
|
208
241
|
occurrences,
|
|
209
242
|
source,
|
|
210
243
|
frameworkRepo,
|
|
211
244
|
consumerRepo,
|
|
212
245
|
}) {
|
|
213
|
-
const
|
|
214
|
-
const
|
|
246
|
+
const anchor = formatAnchor(anchorKind, anchorId);
|
|
247
|
+
const title = `Friction: ${category} recurred ${occurrences} times in ${anchor}`;
|
|
248
|
+
const body = renderIssueBody({
|
|
249
|
+
anchorId,
|
|
250
|
+
anchorKind,
|
|
251
|
+
category,
|
|
252
|
+
occurrences,
|
|
253
|
+
source,
|
|
254
|
+
});
|
|
215
255
|
const repo = source === 'framework' ? frameworkRepo : consumerRepo;
|
|
216
256
|
const metaLabel =
|
|
217
257
|
source === 'framework' ? 'framework-gap' : 'consumer-improvement';
|
|
@@ -231,23 +271,29 @@ function buildRoutedItem({
|
|
|
231
271
|
*
|
|
232
272
|
* @param {unknown} input
|
|
233
273
|
* @returns {{
|
|
234
|
-
*
|
|
274
|
+
* anchorId: number,
|
|
275
|
+
* anchorKind: 'epic'|'story'|'run',
|
|
235
276
|
* frameworkRepo: string,
|
|
236
277
|
* consumerRepo: string,
|
|
237
278
|
* signals: FrictionSignal[],
|
|
238
279
|
* unresolvedBlockedEvents: BlockedEvent[],
|
|
239
280
|
* } | null}
|
|
240
281
|
*/
|
|
282
|
+
function normalizeAnchorKind(kind) {
|
|
283
|
+
return kind === 'story' || kind === 'run' || kind === 'epic' ? kind : 'epic';
|
|
284
|
+
}
|
|
285
|
+
|
|
241
286
|
function normaliseInput(input) {
|
|
242
287
|
if (input === null || typeof input !== 'object') return null;
|
|
243
288
|
const record = /** @type {RoutedProposalsInput} */ (input);
|
|
244
|
-
const
|
|
245
|
-
if (!Number.isInteger(
|
|
289
|
+
const anchorId = Number(record.anchorId);
|
|
290
|
+
if (!Number.isInteger(anchorId) || anchorId <= 0) return null;
|
|
246
291
|
const frameworkRepo = asString(record.frameworkRepo);
|
|
247
292
|
const consumerRepo = asString(record.consumerRepo);
|
|
248
|
-
if (frameworkRepo
|
|
293
|
+
if (!frameworkRepo || !consumerRepo) return null;
|
|
249
294
|
return {
|
|
250
|
-
|
|
295
|
+
anchorId,
|
|
296
|
+
anchorKind: normalizeAnchorKind(record.anchorKind),
|
|
251
297
|
frameworkRepo,
|
|
252
298
|
consumerRepo,
|
|
253
299
|
signals: Array.isArray(record.signals) ? record.signals : [],
|
|
@@ -257,35 +303,7 @@ function normaliseInput(input) {
|
|
|
257
303
|
};
|
|
258
304
|
}
|
|
259
305
|
|
|
260
|
-
|
|
261
|
-
* Compose the four routed proposal sections from aggregated source-tagged
|
|
262
|
-
* signals.
|
|
263
|
-
*
|
|
264
|
-
* Pure — no I/O, no time-dependent state, no provider calls. Returns an
|
|
265
|
-
* object with three arrays:
|
|
266
|
-
* - `framework`: actionable items routed to the framework repo.
|
|
267
|
-
* - `consumer`: actionable items routed to the consumer repo.
|
|
268
|
-
* - `discarded`: single-occurrence friction with no follow-on signal.
|
|
269
|
-
*
|
|
270
|
-
* @param {RoutedProposalsInput} input
|
|
271
|
-
* @returns {RoutedProposals}
|
|
272
|
-
*/
|
|
273
|
-
export function composeRoutedProposals(input) {
|
|
274
|
-
const normalised = normaliseInput(input);
|
|
275
|
-
if (normalised === null) return emptyResult();
|
|
276
|
-
const {
|
|
277
|
-
epicId,
|
|
278
|
-
frameworkRepo,
|
|
279
|
-
consumerRepo,
|
|
280
|
-
signals,
|
|
281
|
-
unresolvedBlockedEvents,
|
|
282
|
-
} = normalised;
|
|
283
|
-
|
|
284
|
-
const byCategory = aggregateByCategory(signals);
|
|
285
|
-
|
|
286
|
-
// Unresolved agent::blocked events always promote their category to
|
|
287
|
-
// actionable — even if the friction count is < 2. The event itself
|
|
288
|
-
// doesn't count as a friction occurrence; we treat it as a force-flag.
|
|
306
|
+
function blockedForceMap(unresolvedBlockedEvents) {
|
|
289
307
|
/** @type {Map<string, { source: "framework"|"consumer" }>} */
|
|
290
308
|
const blockedForceActionable = new Map();
|
|
291
309
|
for (const evt of unresolvedBlockedEvents) {
|
|
@@ -297,56 +315,99 @@ export function composeRoutedProposals(input) {
|
|
|
297
315
|
blockedForceActionable.set(category, { source });
|
|
298
316
|
}
|
|
299
317
|
}
|
|
318
|
+
return blockedForceActionable;
|
|
319
|
+
}
|
|
300
320
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
/** @type {DiscardedItem[]} */
|
|
306
|
-
const discarded = [];
|
|
321
|
+
function pushRouted(buckets, source, item) {
|
|
322
|
+
if (source === 'framework') buckets.framework.push(item);
|
|
323
|
+
else buckets.consumer.push(item);
|
|
324
|
+
}
|
|
307
325
|
|
|
308
|
-
|
|
326
|
+
function routeCategoryBuckets({
|
|
327
|
+
byCategory,
|
|
328
|
+
blockedForceActionable,
|
|
329
|
+
anchorId,
|
|
330
|
+
anchorKind,
|
|
331
|
+
frameworkRepo,
|
|
332
|
+
consumerRepo,
|
|
333
|
+
}) {
|
|
334
|
+
/** @type {RoutedProposals} */
|
|
335
|
+
const buckets = { framework: [], consumer: [], discarded: [] };
|
|
309
336
|
for (const entry of byCategory.values()) {
|
|
310
337
|
const { category, total } = entry;
|
|
311
338
|
const force = blockedForceActionable.get(category);
|
|
312
339
|
const source = force ? force.source : dominantSource(entry);
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
340
|
+
if (!isActionableFriction(total, force, anchorKind)) {
|
|
341
|
+
buckets.discarded.push({ category, occurrences: total, source });
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
pushRouted(
|
|
345
|
+
buckets,
|
|
346
|
+
source,
|
|
347
|
+
buildRoutedItem({
|
|
348
|
+
anchorId,
|
|
349
|
+
anchorKind,
|
|
317
350
|
category,
|
|
318
351
|
occurrences: total,
|
|
319
352
|
source,
|
|
320
353
|
frameworkRepo,
|
|
321
354
|
consumerRepo,
|
|
322
|
-
})
|
|
323
|
-
|
|
324
|
-
else consumer.push(item);
|
|
325
|
-
continue;
|
|
326
|
-
}
|
|
327
|
-
// total === 1 AND no force flag → discarded.
|
|
328
|
-
discarded.push({ category, occurrences: total, source });
|
|
355
|
+
}),
|
|
356
|
+
);
|
|
329
357
|
}
|
|
330
|
-
|
|
331
|
-
// Walk blocked-force categories that had NO friction signal at all —
|
|
332
|
-
// these still need an issue proposal (the blocker is the trigger).
|
|
333
358
|
for (const [category, info] of blockedForceActionable) {
|
|
334
359
|
if (byCategory.has(category)) continue;
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
360
|
+
pushRouted(
|
|
361
|
+
buckets,
|
|
362
|
+
info.source,
|
|
363
|
+
buildRoutedItem({
|
|
364
|
+
anchorId,
|
|
365
|
+
anchorKind,
|
|
366
|
+
category,
|
|
367
|
+
occurrences: 0,
|
|
368
|
+
source: info.source,
|
|
369
|
+
frameworkRepo,
|
|
370
|
+
consumerRepo,
|
|
371
|
+
}),
|
|
372
|
+
);
|
|
345
373
|
}
|
|
374
|
+
buckets.framework.sort((a, b) => a.category.localeCompare(b.category));
|
|
375
|
+
buckets.consumer.sort((a, b) => a.category.localeCompare(b.category));
|
|
376
|
+
buckets.discarded.sort((a, b) => a.category.localeCompare(b.category));
|
|
377
|
+
return buckets;
|
|
378
|
+
}
|
|
346
379
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
380
|
+
/**
|
|
381
|
+
* Compose the four routed proposal sections from aggregated source-tagged
|
|
382
|
+
* signals.
|
|
383
|
+
*
|
|
384
|
+
* Pure — no I/O, no time-dependent state, no provider calls. Returns an
|
|
385
|
+
* object with three arrays:
|
|
386
|
+
* - `framework`: actionable items routed to the framework repo.
|
|
387
|
+
* - `consumer`: actionable items routed to the consumer repo.
|
|
388
|
+
* - `discarded`: single-occurrence friction with no follow-on signal.
|
|
389
|
+
*
|
|
390
|
+
* @param {RoutedProposalsInput} input
|
|
391
|
+
* @returns {RoutedProposals}
|
|
392
|
+
*/
|
|
393
|
+
export function composeRoutedProposals(input) {
|
|
394
|
+
const normalised = normaliseInput(input);
|
|
395
|
+
if (normalised === null) return emptyResult();
|
|
396
|
+
const {
|
|
397
|
+
anchorId,
|
|
398
|
+
anchorKind,
|
|
399
|
+
frameworkRepo,
|
|
400
|
+
consumerRepo,
|
|
401
|
+
signals,
|
|
402
|
+
unresolvedBlockedEvents,
|
|
403
|
+
} = normalised;
|
|
350
404
|
|
|
351
|
-
return {
|
|
405
|
+
return routeCategoryBuckets({
|
|
406
|
+
byCategory: aggregateByCategory(signals),
|
|
407
|
+
blockedForceActionable: blockedForceMap(unresolvedBlockedEvents),
|
|
408
|
+
anchorId,
|
|
409
|
+
anchorKind,
|
|
410
|
+
frameworkRepo,
|
|
411
|
+
consumerRepo,
|
|
412
|
+
});
|
|
352
413
|
}
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Tier rules:
|
|
12
12
|
* - `deep` — `overallLevel === 'high'` OR the changed-file count exceeds
|
|
13
|
-
* the wide-change scale (`
|
|
14
|
-
* Epic whose risk was judged low (or never judged)
|
|
15
|
-
* a deep pass on size alone.
|
|
13
|
+
* the wide-change scale (`diffWidth.hardFiles`). A wide-
|
|
14
|
+
* footprint Epic whose risk was judged low (or never judged)
|
|
15
|
+
* still earns a deep pass on size alone.
|
|
16
16
|
* - `light` — `overallLevel === 'low'` AND the changed-file count is at or
|
|
17
|
-
* below the small-change scale (`
|
|
17
|
+
* below the small-change scale (`diffWidth.softFiles`). An
|
|
18
18
|
* *unknown* count does NOT block `light`: a missing diff width
|
|
19
19
|
* is treated as "not wide", so a low-risk Epic with no count
|
|
20
20
|
* still resolves to `light` (preserves the #3937 producer
|
|
@@ -29,14 +29,25 @@
|
|
|
29
29
|
* Pure and total: inputs in, tier out. No I/O, no throws. `null` / `undefined`
|
|
30
30
|
* / malformed inputs all degrade to `standard` (or `deep`/`light` only when the
|
|
31
31
|
* width signal unambiguously says so). Callers (e.g. `runCodeReview`) enumerate
|
|
32
|
-
* the changed-file count from the diff they already run and supply it here
|
|
33
|
-
*
|
|
34
|
-
*
|
|
32
|
+
* the changed-file count from the diff they already run and supply it here.
|
|
33
|
+
*
|
|
34
|
+
* v2 Stage 2: review depth is **decoupled** from the planning model-capacity
|
|
35
|
+
* advisory. Diff width is a mechanical review signal (files in the landed
|
|
36
|
+
* diff); planning capacity is an absolute authored-token session-mass signal.
|
|
37
|
+
* The two no longer share a constant.
|
|
35
38
|
*
|
|
36
39
|
* @typedef {'light'|'standard'|'deep'} ReviewDepth
|
|
37
40
|
*/
|
|
38
41
|
|
|
39
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Mechanical diff-width scales for review-depth tiering. These are **not**
|
|
44
|
+
* planning Story-sizing ceilings (those are gone in v2) — they only classify
|
|
45
|
+
* the changed-file count of a diff under review.
|
|
46
|
+
*/
|
|
47
|
+
export const DEFAULT_DIFF_WIDTH = Object.freeze({
|
|
48
|
+
softFiles: 15,
|
|
49
|
+
hardFiles: 30,
|
|
50
|
+
});
|
|
40
51
|
|
|
41
52
|
/**
|
|
42
53
|
* Coerce an arbitrary input into a non-negative integer changed-file count, or
|
|
@@ -61,6 +72,7 @@ function normalizeChangedFileCount(value) {
|
|
|
61
72
|
* overallLevel?: ('low'|'medium'|'high'|string|null|undefined),
|
|
62
73
|
* changedFileCount?: (number|null|undefined),
|
|
63
74
|
* sizing?: { softFiles?: number, hardFiles?: number }|null,
|
|
75
|
+
* diffWidth?: { softFiles?: number, hardFiles?: number }|null,
|
|
64
76
|
* }} [input]
|
|
65
77
|
* @returns {ReviewDepth}
|
|
66
78
|
*/
|
|
@@ -72,11 +84,13 @@ export function resolveDepth(input = {}) {
|
|
|
72
84
|
? normalizeChangedFileCount(input.changedFileCount)
|
|
73
85
|
: null;
|
|
74
86
|
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
87
|
+
const override =
|
|
88
|
+
input && typeof input === 'object' ? (input.diffWidth ?? {}) : {};
|
|
89
|
+
const mergedWidth = {
|
|
90
|
+
...DEFAULT_DIFF_WIDTH,
|
|
91
|
+
...override,
|
|
78
92
|
};
|
|
79
|
-
const { softFiles, hardFiles } =
|
|
93
|
+
const { softFiles, hardFiles } = mergedWidth;
|
|
80
94
|
|
|
81
95
|
// A known count strictly above the wide-change scale is wide.
|
|
82
96
|
const isWide = changedFileCount !== null && changedFileCount > hardFiles;
|
|
@@ -44,7 +44,7 @@ export const CODEX_REMEDIATIONS = Object.freeze({
|
|
|
44
44
|
'Install the Codex plugin (https://github.com/openai/codex-plugin-cc) ' +
|
|
45
45
|
'so the host registers the `/codex:review` slash command.',
|
|
46
46
|
fallback:
|
|
47
|
-
'Or set `codeReview.
|
|
47
|
+
'Or set `codeReview.providers` to [{ name: "native" }] in .agentrc.json to use the ' +
|
|
48
48
|
'in-process maintainability/lint provider instead.',
|
|
49
49
|
});
|
|
50
50
|
|
|
@@ -96,7 +96,7 @@ export function defaultProbeCodexCommand(opts = {}) {
|
|
|
96
96
|
*/
|
|
97
97
|
export function buildCodexUnavailableError() {
|
|
98
98
|
return new Error(
|
|
99
|
-
'[ReviewProviderFactory] codeReview.
|
|
99
|
+
'[ReviewProviderFactory] codeReview.providers includes "codex" but the ' +
|
|
100
100
|
'`/codex:review` slash command is not registered on this host. ' +
|
|
101
101
|
`${CODEX_REMEDIATIONS.install} ${CODEX_REMEDIATIONS.fallback}`,
|
|
102
102
|
);
|
|
@@ -1,34 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* review-providers/review-provider-factory.js — resolve
|
|
3
|
-
* `codeReview.
|
|
4
|
-
* `ReviewProvider` instance.
|
|
3
|
+
* `codeReview.providers` to a concrete `ReviewProvider` instance.
|
|
5
4
|
*
|
|
6
5
|
* Story #2825 (Epic #2815) — the factory is the only entry point.
|
|
7
6
|
* `runCodeReview()` never references a specific adapter directly;
|
|
8
7
|
* adding a backend is (1) implement the interface, (2) register here,
|
|
9
8
|
* (3) extend the schema enum.
|
|
10
9
|
*
|
|
11
|
-
* Story #2871 —
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* `ChainProvider` that fans out `runReview` across every inline
|
|
17
|
-
* entry (merging `Finding[]` in declaration order) and exposes
|
|
18
|
-
* `getPromptMessages` so the orchestrator can render the
|
|
19
|
-
* trailing "Manual review suggestions" section without knowing
|
|
20
|
-
* about per-provider mechanics.
|
|
10
|
+
* Story #2871 — the factory always returns a `ChainProvider` that
|
|
11
|
+
* fans out `runReview` across every inline entry (merging `Finding[]`
|
|
12
|
+
* in declaration order) and exposes `getPromptMessages` so the
|
|
13
|
+
* orchestrator can render the trailing "Manual review suggestions"
|
|
14
|
+
* section without knowing about per-provider mechanics.
|
|
21
15
|
*
|
|
22
16
|
* Behaviour:
|
|
23
|
-
* - Unset /
|
|
17
|
+
* - Unset / empty `codeReview.providers` defaults to a single-entry
|
|
18
|
+
* chain `[{ name: 'native' }]`.
|
|
24
19
|
* - Unknown provider name throws an Error with remediation text
|
|
25
20
|
* naming the supported values.
|
|
26
21
|
* - Adapters that throw at construction time (e.g. `codex` probing
|
|
27
22
|
* for an absent plugin command) bubble their error verbatim —
|
|
28
23
|
* EXCEPT when the chain entry carries `optional: true`, in which
|
|
29
24
|
* case the chain logs a warning and skips that entry.
|
|
30
|
-
* - When both `provider` (legacy single) and `providers` (chain) are
|
|
31
|
-
* present, `providers` wins; `provider` is ignored with a warning.
|
|
32
25
|
*
|
|
33
26
|
* @typedef {import('./types.js').ReviewProvider} ReviewProvider
|
|
34
27
|
* @typedef {import('./types.js').ManualPromptProvider} ManualPromptProvider
|
|
@@ -70,8 +63,8 @@ const PROMPT_PROVIDERS = Object.freeze({
|
|
|
70
63
|
});
|
|
71
64
|
|
|
72
65
|
/**
|
|
73
|
-
* The provider name used when `codeReview.
|
|
74
|
-
* `codeReview` block is absent entirely.
|
|
66
|
+
* The inline provider name used when `codeReview.providers` is unset,
|
|
67
|
+
* empty, or the `codeReview` block is absent entirely.
|
|
75
68
|
*/
|
|
76
69
|
export const DEFAULT_PROVIDER_NAME = 'native';
|
|
77
70
|
|
|
@@ -127,13 +120,10 @@ export function isScopeApplicable(declaredScopes, currentScope) {
|
|
|
127
120
|
* config block. Pass the `codeReview` sub-object (not the full
|
|
128
121
|
* config) so callers can compose with their own config readers.
|
|
129
122
|
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* otherwise returns the single legacy adapter selected by
|
|
133
|
-
* `codeReviewConfig.provider`.
|
|
123
|
+
* Always returns a `ChainProvider`. When `codeReviewConfig.providers`
|
|
124
|
+
* is unset or empty, the chain defaults to `[{ name: 'native' }]`.
|
|
134
125
|
*
|
|
135
126
|
* @param {{
|
|
136
|
-
* provider?: string,
|
|
137
127
|
* providers?: Array<object>,
|
|
138
128
|
* providerConfig?: object,
|
|
139
129
|
* }|null|undefined} codeReviewConfig
|
|
@@ -152,44 +142,19 @@ export function createReviewProvider(codeReviewConfig, opts = {}) {
|
|
|
152
142
|
const promptRegistry = opts.promptRegistry ?? PROMPT_PROVIDERS;
|
|
153
143
|
const logger = opts.logger;
|
|
154
144
|
|
|
155
|
-
|
|
156
|
-
if (
|
|
145
|
+
const entries =
|
|
157
146
|
codeReviewConfig &&
|
|
158
147
|
Array.isArray(codeReviewConfig.providers) &&
|
|
159
148
|
codeReviewConfig.providers.length > 0
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
logger?.warn?.(
|
|
163
|
-
'[ReviewProviderFactory] Both `provider` and `providers` are set; ' +
|
|
164
|
-
'`providers` wins. Remove the legacy `provider` field to silence ' +
|
|
165
|
-
'this warning.',
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
const chain = buildProviderChain(codeReviewConfig.providers, {
|
|
169
|
-
inlineRegistry,
|
|
170
|
-
promptRegistry,
|
|
171
|
-
logger,
|
|
172
|
-
});
|
|
173
|
-
return createChainProvider(chain, { logger });
|
|
174
|
-
}
|
|
149
|
+
? codeReviewConfig.providers
|
|
150
|
+
: [{ name: DEFAULT_PROVIDER_NAME }];
|
|
175
151
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
const ctor = inlineRegistry[name];
|
|
183
|
-
if (!ctor) {
|
|
184
|
-
const supported = Object.keys(inlineRegistry).sort().join(', ');
|
|
185
|
-
throw new Error(
|
|
186
|
-
`[ReviewProviderFactory] Unknown codeReview.provider "${name}". ` +
|
|
187
|
-
`Supported values: ${supported}. ` +
|
|
188
|
-
'Set codeReview.provider in .agentrc.json to one of the supported ' +
|
|
189
|
-
'values, or remove the field to use the default ("native").',
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
return ctor();
|
|
152
|
+
const chain = buildProviderChain(entries, {
|
|
153
|
+
inlineRegistry,
|
|
154
|
+
promptRegistry,
|
|
155
|
+
logger,
|
|
156
|
+
});
|
|
157
|
+
return createChainProvider(chain, { logger });
|
|
193
158
|
}
|
|
194
159
|
|
|
195
160
|
/**
|