mandrel 1.94.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/story-worker.md +12 -13
- package/.agents/docs/SDLC.md +489 -1285
- package/.agents/docs/agentrc-reference.json +177 -67
- package/.agents/docs/configuration.md +104 -138
- package/.agents/docs/execution-reference.md +17 -20
- package/.agents/docs/quality-gates.md +13 -19
- package/.agents/docs/workflows.md +3 -3
- package/.agents/instructions.md +70 -81
- package/.agents/rules/ci-remediation.md +8 -12
- package/.agents/rules/git-conventions-reference.md +6 -7
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +54 -214
- 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/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-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/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/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 +2 -2
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +45 -29
- package/.agents/scripts/lib/config/explain.js +55 -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 +2 -7
- package/.agents/scripts/lib/config-settings-schema-delivery.js +24 -148
- package/.agents/scripts/lib/config-settings-schema-quality.js +8 -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 +2 -2
- 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 +1 -1
- package/.agents/scripts/lib/observability/hook-heartbeat.js +20 -52
- package/.agents/scripts/lib/observability/source-classifier.js +3 -3
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +8 -5
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +83 -20
- 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-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 +13 -13
- 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/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 +2 -7
- 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/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/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/update-ticket-state.js +6 -15
- package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
- package/.agents/skills/core/idea-refinement/SKILL.md +6 -6
- package/.agents/skills/core/scope-triage/SKILL.md +28 -172
- package/.agents/skills/skills.index.json +3 -43
- 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 -174
- 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 +16 -29
- 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/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 +2 -1
- 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 +30 -0
- package/lib/migrations/index.js +6 -5
- package/package.json +2 -2
- package/.agents/agents/retro.md +0 -42
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer.md +0 -33
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/security-engineer.md +0 -111
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
- package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
- package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- 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 -852
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- 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 -539
- package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
- 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 -621
- 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-slice-lifecycle.js +0 -270
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
- 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 -284
- 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/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 -302
- 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/retro-run.js +0 -218
- package/.agents/scripts/slice-phase.js +0 -361
- 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 -464
- 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 -383
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
- package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
- package/.agents/workflows/helpers/deliver-epic.md +0 -998
- package/.agents/workflows/helpers/deliver-stories.md +0 -450
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
- 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 -353
- 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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* check-prepush-recovery.js — gate decision for the pre-push coverage step.
|
|
4
4
|
*
|
|
5
5
|
* Story #3162. The pre-push hook normally runs `coverage-capture.js` +
|
|
6
|
-
* `crap:check` on every push. During a `story-close.js` recovery (operator
|
|
6
|
+
* `crap:check` on every push. During a pre-v2 `story-close.js` recovery (operator
|
|
7
7
|
* pushing `epic/<id>` to unblock a run after a merge-orchestrator failure),
|
|
8
8
|
* a pre-existing coverage regression on `epic/<id>` — unrelated to the
|
|
9
9
|
* Story under recovery — hard-blocks the push and forces a `--no-verify`
|
|
@@ -20,7 +20,12 @@
|
|
|
20
20
|
import { existsSync, readdirSync, rmSync } from 'node:fs';
|
|
21
21
|
import path from 'node:path';
|
|
22
22
|
import { runAsCli } from './lib/cli-utils.js';
|
|
23
|
-
|
|
23
|
+
|
|
24
|
+
const RESERVED_TEST_EPIC_TEMP_DIR = /^epic-999\d{3}$/;
|
|
25
|
+
|
|
26
|
+
function isReservedTestEpicTempDirName(name) {
|
|
27
|
+
return RESERVED_TEST_EPIC_TEMP_DIR.test(name);
|
|
28
|
+
}
|
|
24
29
|
|
|
25
30
|
/**
|
|
26
31
|
* @param {object} [opts]
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
* - `silent` → only `fatal` emits.
|
|
19
19
|
* - `info` → default. Emits `info` and above; suppresses `debug`.
|
|
20
20
|
* - `verbose` → emits everything (including `debug`).
|
|
21
|
-
* - `debug` → alias for `verbose` (backward compatible).
|
|
22
21
|
*/
|
|
23
22
|
/**
|
|
24
23
|
* Recognized log levels, lowest-noise first. Anything outside this set
|
|
@@ -26,9 +25,7 @@
|
|
|
26
25
|
*
|
|
27
26
|
* @type {ReadonlySet<string>}
|
|
28
27
|
*/
|
|
29
|
-
const VALID_LEVELS = Object.freeze(
|
|
30
|
-
new Set(['silent', 'info', 'verbose', 'debug']),
|
|
31
|
-
);
|
|
28
|
+
const VALID_LEVELS = Object.freeze(new Set(['silent', 'info', 'verbose']));
|
|
32
29
|
|
|
33
30
|
/**
|
|
34
31
|
* Process-wide level override. `null` means "no explicit override — read
|
|
@@ -50,7 +47,7 @@ let levelOverride = null;
|
|
|
50
47
|
* the level branches react in-process, without a child process per level
|
|
51
48
|
* (Story #3329).
|
|
52
49
|
*
|
|
53
|
-
* @returns {'silent'|'info'|'verbose'
|
|
50
|
+
* @returns {'silent'|'info'|'verbose'}
|
|
54
51
|
*/
|
|
55
52
|
export function resolveLevel() {
|
|
56
53
|
const raw = (
|
|
@@ -63,12 +60,12 @@ export function resolveLevel() {
|
|
|
63
60
|
|
|
64
61
|
/**
|
|
65
62
|
* Pin the process-wide log level, bypassing `AGENT_LOG_LEVEL`. Pass a
|
|
66
|
-
* recognized level (`silent` / `info` / `verbose`
|
|
63
|
+
* recognized level (`silent` / `info` / `verbose`) to force it,
|
|
67
64
|
* or `null` to clear the pin and restore env-driven resolution. An
|
|
68
65
|
* unrecognized non-null value throws so callers cannot silently pin a
|
|
69
66
|
* level that resolves to `info`.
|
|
70
67
|
*
|
|
71
|
-
* @param {('silent'|'info'|'verbose'
|
|
68
|
+
* @param {('silent'|'info'|'verbose')|null} level
|
|
72
69
|
* @returns {void}
|
|
73
70
|
*/
|
|
74
71
|
export function setLevel(level) {
|
|
@@ -78,15 +75,14 @@ export function setLevel(level) {
|
|
|
78
75
|
}
|
|
79
76
|
if (typeof level !== 'string' || !VALID_LEVELS.has(level.toLowerCase())) {
|
|
80
77
|
throw new RangeError(
|
|
81
|
-
`setLevel: level must be one of silent|info|verbose
|
|
78
|
+
`setLevel: level must be one of silent|info|verbose or null (got ${level})`,
|
|
82
79
|
);
|
|
83
80
|
}
|
|
84
81
|
levelOverride = level.toLowerCase();
|
|
85
82
|
}
|
|
86
83
|
|
|
87
84
|
function debugEnabled() {
|
|
88
|
-
|
|
89
|
-
return level === 'verbose' || level === 'debug';
|
|
85
|
+
return resolveLevel() === 'verbose';
|
|
90
86
|
}
|
|
91
87
|
|
|
92
88
|
function infoEnabled() {
|
|
@@ -189,8 +189,8 @@ export async function runAuditSuite({
|
|
|
189
189
|
injectedRules,
|
|
190
190
|
injectedWriteArtifact,
|
|
191
191
|
}) {
|
|
192
|
-
const
|
|
193
|
-
const paths = getPaths(
|
|
192
|
+
const config = resolveConfig();
|
|
193
|
+
const paths = getPaths(config);
|
|
194
194
|
const callerSubstitutions = substitutions ?? {};
|
|
195
195
|
const rules = injectedRules ?? (await loadRules(paths));
|
|
196
196
|
|
|
@@ -109,10 +109,10 @@ export const LENS_TIERS = Object.freeze(['local', 'cumulative', 'global']);
|
|
|
109
109
|
* @throws {Error} When the manifest cannot be read or parsed.
|
|
110
110
|
*/
|
|
111
111
|
function readAuditRulesSync() {
|
|
112
|
-
const
|
|
112
|
+
const config = resolveConfig();
|
|
113
113
|
const rulesPath = path.join(
|
|
114
114
|
PROJECT_ROOT,
|
|
115
|
-
getPaths(
|
|
115
|
+
getPaths(config).schemasRoot,
|
|
116
116
|
'audit-rules.json',
|
|
117
117
|
);
|
|
118
118
|
try {
|
|
@@ -160,7 +160,7 @@ export function resolveLensTier(lens) {
|
|
|
160
160
|
* every path) matches every change set here, so its concern is verified at
|
|
161
161
|
* BOTH innermost tiers — the
|
|
162
162
|
* write-time checklist threading and this Story-scope lens pass — and excluded
|
|
163
|
-
* from Epic
|
|
163
|
+
* from the retired Epic-close roster (local lenses stay Story-scope only).
|
|
164
164
|
* A local lens with an empty `filePatterns` list matches nothing here, so a
|
|
165
165
|
* diff matching no local lens's patterns yields an empty roster and adds no
|
|
166
166
|
* lens work.
|
|
@@ -300,12 +300,12 @@ export async function selectAudits({
|
|
|
300
300
|
gitTimeoutMsOverride,
|
|
301
301
|
gateModeOpts,
|
|
302
302
|
}) {
|
|
303
|
-
const
|
|
303
|
+
const config = resolveConfig();
|
|
304
304
|
const timeoutMs = gitTimeoutMsOverride ?? DEFAULT_GIT_TIMEOUT_MS;
|
|
305
305
|
|
|
306
306
|
const rulesPath = path.join(
|
|
307
307
|
PROJECT_ROOT,
|
|
308
|
-
getPaths(
|
|
308
|
+
getPaths(config).schemasRoot,
|
|
309
309
|
'audit-rules.json',
|
|
310
310
|
);
|
|
311
311
|
let rulesData;
|
package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js}
RENAMED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/audit-to-stories/seed-
|
|
2
|
+
* lib/audit-to-stories/seed-from-findings.js
|
|
3
3
|
*
|
|
4
|
-
* Build the
|
|
5
|
-
*
|
|
4
|
+
* Build the `/plan --seed`-shaped one-pager markdown that the audit-to-
|
|
5
|
+
* stories Single-plan grouping path emits for `/plan` to consume.
|
|
6
6
|
*
|
|
7
|
-
* The seed renders the canonical one-pager sections so the
|
|
8
|
-
*
|
|
7
|
+
* The seed renders the canonical one-pager sections so the authoring
|
|
8
|
+
* pass can sharpen it without having to invent context:
|
|
9
9
|
* - Problem Statement (aggregated severity profile)
|
|
10
10
|
* - Recommended Direction (rollup of recommendations by dimension)
|
|
11
11
|
* - Key Assumptions (carries the source-report links forward)
|
|
12
12
|
* - MVP Scope (the proposed Stories, one bullet per group)
|
|
13
|
-
* - Key Files (explicit file paths so
|
|
14
|
-
*
|
|
13
|
+
* - Key Files (explicit file paths so `/plan` authoring has concrete
|
|
14
|
+
* anchors)
|
|
15
15
|
* - Not Doing (out-of-scope items by convention)
|
|
16
16
|
*
|
|
17
17
|
* Pure: returns a string. The caller decides where to persist it.
|
|
@@ -112,14 +112,14 @@ function formatKeyAssumptions(sourceReports) {
|
|
|
112
112
|
* @param {string[]} params.sourceReports — list of source report paths.
|
|
113
113
|
* @returns {string}
|
|
114
114
|
*/
|
|
115
|
-
export function
|
|
115
|
+
export function buildPlanSeedMarkdown({ groups, findings, sourceReports }) {
|
|
116
116
|
if (
|
|
117
117
|
!Array.isArray(groups) ||
|
|
118
118
|
!Array.isArray(findings) ||
|
|
119
119
|
!Array.isArray(sourceReports)
|
|
120
120
|
) {
|
|
121
121
|
throw new Error(
|
|
122
|
-
'
|
|
122
|
+
'buildPlanSeedMarkdown: groups, findings, sourceReports must all be arrays',
|
|
123
123
|
);
|
|
124
124
|
}
|
|
125
125
|
const problem = formatProblemStatement(findings);
|
|
@@ -26,28 +26,215 @@
|
|
|
26
26
|
* @module lib/baselines/kernel
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
import
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
import {
|
|
30
|
+
applyEpsilon as bundleSizeApplyEpsilon,
|
|
31
|
+
compare as bundleSizeCompare,
|
|
32
|
+
kernelVersion as bundleSizeKernelVersion,
|
|
33
|
+
keyField as bundleSizeKeyField,
|
|
34
|
+
mergeRows as bundleSizeMergeRows,
|
|
35
|
+
name as bundleSizeName,
|
|
36
|
+
projectRow as bundleSizeProjectRow,
|
|
37
|
+
rollup as bundleSizeRollup,
|
|
38
|
+
sortRows as bundleSizeSortRows,
|
|
39
|
+
} from './kinds/bundle-size.js';
|
|
40
|
+
import {
|
|
41
|
+
applyEpsilon as coverageApplyEpsilon,
|
|
42
|
+
compare as coverageCompare,
|
|
43
|
+
kernelVersion as coverageKernelVersion,
|
|
44
|
+
keyField as coverageKeyField,
|
|
45
|
+
mergeRows as coverageMergeRows,
|
|
46
|
+
name as coverageName,
|
|
47
|
+
projectRow as coverageProjectRow,
|
|
48
|
+
rollup as coverageRollup,
|
|
49
|
+
sortRows as coverageSortRows,
|
|
50
|
+
} from './kinds/coverage.js';
|
|
51
|
+
import {
|
|
52
|
+
applyEpsilon as crapApplyEpsilon,
|
|
53
|
+
compare as crapCompare,
|
|
54
|
+
kernelVersion as crapKernelVersion,
|
|
55
|
+
keyField as crapKeyField,
|
|
56
|
+
mergeRows as crapMergeRows,
|
|
57
|
+
name as crapName,
|
|
58
|
+
projectRow as crapProjectRow,
|
|
59
|
+
rollup as crapRollup,
|
|
60
|
+
sortRows as crapSortRows,
|
|
61
|
+
} from './kinds/crap.js';
|
|
62
|
+
import {
|
|
63
|
+
applyEpsilon as duplicationApplyEpsilon,
|
|
64
|
+
compare as duplicationCompare,
|
|
65
|
+
kernelVersion as duplicationKernelVersion,
|
|
66
|
+
keyField as duplicationKeyField,
|
|
67
|
+
mergeRows as duplicationMergeRows,
|
|
68
|
+
name as duplicationName,
|
|
69
|
+
projectRow as duplicationProjectRow,
|
|
70
|
+
rollup as duplicationRollup,
|
|
71
|
+
sortRows as duplicationSortRows,
|
|
72
|
+
} from './kinds/duplication.js';
|
|
73
|
+
import {
|
|
74
|
+
applyEpsilon as lighthouseApplyEpsilon,
|
|
75
|
+
compare as lighthouseCompare,
|
|
76
|
+
kernelVersion as lighthouseKernelVersion,
|
|
77
|
+
keyField as lighthouseKeyField,
|
|
78
|
+
mergeRows as lighthouseMergeRows,
|
|
79
|
+
name as lighthouseName,
|
|
80
|
+
projectRow as lighthouseProjectRow,
|
|
81
|
+
rollup as lighthouseRollup,
|
|
82
|
+
sortRows as lighthouseSortRows,
|
|
83
|
+
} from './kinds/lighthouse.js';
|
|
84
|
+
import {
|
|
85
|
+
applyEpsilon as lintApplyEpsilon,
|
|
86
|
+
compare as lintCompare,
|
|
87
|
+
kernelVersion as lintKernelVersion,
|
|
88
|
+
keyField as lintKeyField,
|
|
89
|
+
mergeRows as lintMergeRows,
|
|
90
|
+
name as lintName,
|
|
91
|
+
projectRow as lintProjectRow,
|
|
92
|
+
rollup as lintRollup,
|
|
93
|
+
sortRows as lintSortRows,
|
|
94
|
+
} from './kinds/lint.js';
|
|
95
|
+
import {
|
|
96
|
+
applyEpsilon as maintainabilityApplyEpsilon,
|
|
97
|
+
compare as maintainabilityCompare,
|
|
98
|
+
kernelVersion as maintainabilityKernelVersion,
|
|
99
|
+
keyField as maintainabilityKeyField,
|
|
100
|
+
mergeRows as maintainabilityMergeRows,
|
|
101
|
+
name as maintainabilityName,
|
|
102
|
+
projectRow as maintainabilityProjectRow,
|
|
103
|
+
rollup as maintainabilityRollup,
|
|
104
|
+
sortRows as maintainabilitySortRows,
|
|
105
|
+
} from './kinds/maintainability.js';
|
|
106
|
+
import {
|
|
107
|
+
applyEpsilon as mutationApplyEpsilon,
|
|
108
|
+
compare as mutationCompare,
|
|
109
|
+
kernelVersion as mutationKernelVersion,
|
|
110
|
+
keyField as mutationKeyField,
|
|
111
|
+
mergeRows as mutationMergeRows,
|
|
112
|
+
name as mutationName,
|
|
113
|
+
projectRow as mutationProjectRow,
|
|
114
|
+
rollup as mutationRollup,
|
|
115
|
+
sortRows as mutationSortRows,
|
|
116
|
+
} from './kinds/mutation.js';
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Assemble the kind-module protocol from named imports.
|
|
120
|
+
*
|
|
121
|
+
* Prefer named imports over `import * as kind` here: knip (and the
|
|
122
|
+
* dead-exports ratchet) cannot see members reached only through
|
|
123
|
+
* `getKindModule(kind).projectRow(...)` after a namespace import, so
|
|
124
|
+
* star-imports of `kinds/*.js` produced systematic false-positive dead
|
|
125
|
+
* exports for the protocol surface (`name`, `keyField`, `kernelVersion`,
|
|
126
|
+
* `projectRow`, `sortRows`, `rollup`, …).
|
|
127
|
+
*
|
|
128
|
+
* @param {object} members
|
|
129
|
+
* @returns {object}
|
|
130
|
+
*/
|
|
131
|
+
function bindKindModule(members) {
|
|
132
|
+
return Object.freeze({
|
|
133
|
+
name: members.name,
|
|
134
|
+
keyField: members.keyField,
|
|
135
|
+
kernelVersion: members.kernelVersion,
|
|
136
|
+
projectRow: members.projectRow,
|
|
137
|
+
sortRows: members.sortRows,
|
|
138
|
+
rollup: members.rollup,
|
|
139
|
+
compare: members.compare,
|
|
140
|
+
applyEpsilon: members.applyEpsilon,
|
|
141
|
+
mergeRows: members.mergeRows,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
37
144
|
|
|
38
145
|
/**
|
|
39
146
|
* Registry of every shipped kind module. Keys mirror the per-kind schema
|
|
40
147
|
* filenames so a future "list all kinds" iterator can stay declarative.
|
|
41
148
|
*/
|
|
42
149
|
const KIND_MODULES = Object.freeze({
|
|
43
|
-
lint
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
150
|
+
lint: bindKindModule({
|
|
151
|
+
name: lintName,
|
|
152
|
+
keyField: lintKeyField,
|
|
153
|
+
kernelVersion: lintKernelVersion,
|
|
154
|
+
projectRow: lintProjectRow,
|
|
155
|
+
sortRows: lintSortRows,
|
|
156
|
+
rollup: lintRollup,
|
|
157
|
+
compare: lintCompare,
|
|
158
|
+
applyEpsilon: lintApplyEpsilon,
|
|
159
|
+
mergeRows: lintMergeRows,
|
|
160
|
+
}),
|
|
161
|
+
coverage: bindKindModule({
|
|
162
|
+
name: coverageName,
|
|
163
|
+
keyField: coverageKeyField,
|
|
164
|
+
kernelVersion: coverageKernelVersion,
|
|
165
|
+
projectRow: coverageProjectRow,
|
|
166
|
+
sortRows: coverageSortRows,
|
|
167
|
+
rollup: coverageRollup,
|
|
168
|
+
compare: coverageCompare,
|
|
169
|
+
applyEpsilon: coverageApplyEpsilon,
|
|
170
|
+
mergeRows: coverageMergeRows,
|
|
171
|
+
}),
|
|
172
|
+
crap: bindKindModule({
|
|
173
|
+
name: crapName,
|
|
174
|
+
keyField: crapKeyField,
|
|
175
|
+
kernelVersion: crapKernelVersion,
|
|
176
|
+
projectRow: crapProjectRow,
|
|
177
|
+
sortRows: crapSortRows,
|
|
178
|
+
rollup: crapRollup,
|
|
179
|
+
compare: crapCompare,
|
|
180
|
+
applyEpsilon: crapApplyEpsilon,
|
|
181
|
+
mergeRows: crapMergeRows,
|
|
182
|
+
}),
|
|
183
|
+
maintainability: bindKindModule({
|
|
184
|
+
name: maintainabilityName,
|
|
185
|
+
keyField: maintainabilityKeyField,
|
|
186
|
+
kernelVersion: maintainabilityKernelVersion,
|
|
187
|
+
projectRow: maintainabilityProjectRow,
|
|
188
|
+
sortRows: maintainabilitySortRows,
|
|
189
|
+
rollup: maintainabilityRollup,
|
|
190
|
+
compare: maintainabilityCompare,
|
|
191
|
+
applyEpsilon: maintainabilityApplyEpsilon,
|
|
192
|
+
mergeRows: maintainabilityMergeRows,
|
|
193
|
+
}),
|
|
194
|
+
mutation: bindKindModule({
|
|
195
|
+
name: mutationName,
|
|
196
|
+
keyField: mutationKeyField,
|
|
197
|
+
kernelVersion: mutationKernelVersion,
|
|
198
|
+
projectRow: mutationProjectRow,
|
|
199
|
+
sortRows: mutationSortRows,
|
|
200
|
+
rollup: mutationRollup,
|
|
201
|
+
compare: mutationCompare,
|
|
202
|
+
applyEpsilon: mutationApplyEpsilon,
|
|
203
|
+
mergeRows: mutationMergeRows,
|
|
204
|
+
}),
|
|
205
|
+
lighthouse: bindKindModule({
|
|
206
|
+
name: lighthouseName,
|
|
207
|
+
keyField: lighthouseKeyField,
|
|
208
|
+
kernelVersion: lighthouseKernelVersion,
|
|
209
|
+
projectRow: lighthouseProjectRow,
|
|
210
|
+
sortRows: lighthouseSortRows,
|
|
211
|
+
rollup: lighthouseRollup,
|
|
212
|
+
compare: lighthouseCompare,
|
|
213
|
+
applyEpsilon: lighthouseApplyEpsilon,
|
|
214
|
+
mergeRows: lighthouseMergeRows,
|
|
215
|
+
}),
|
|
216
|
+
'bundle-size': bindKindModule({
|
|
217
|
+
name: bundleSizeName,
|
|
218
|
+
keyField: bundleSizeKeyField,
|
|
219
|
+
kernelVersion: bundleSizeKernelVersion,
|
|
220
|
+
projectRow: bundleSizeProjectRow,
|
|
221
|
+
sortRows: bundleSizeSortRows,
|
|
222
|
+
rollup: bundleSizeRollup,
|
|
223
|
+
compare: bundleSizeCompare,
|
|
224
|
+
applyEpsilon: bundleSizeApplyEpsilon,
|
|
225
|
+
mergeRows: bundleSizeMergeRows,
|
|
226
|
+
}),
|
|
227
|
+
duplication: bindKindModule({
|
|
228
|
+
name: duplicationName,
|
|
229
|
+
keyField: duplicationKeyField,
|
|
230
|
+
kernelVersion: duplicationKernelVersion,
|
|
231
|
+
projectRow: duplicationProjectRow,
|
|
232
|
+
sortRows: duplicationSortRows,
|
|
233
|
+
rollup: duplicationRollup,
|
|
234
|
+
compare: duplicationCompare,
|
|
235
|
+
applyEpsilon: duplicationApplyEpsilon,
|
|
236
|
+
mergeRows: duplicationMergeRows,
|
|
237
|
+
}),
|
|
51
238
|
});
|
|
52
239
|
|
|
53
240
|
/**
|
|
@@ -55,10 +242,11 @@ const KIND_MODULES = Object.freeze({
|
|
|
55
242
|
* callers can't silently fall through to undefined behaviour.
|
|
56
243
|
*
|
|
57
244
|
* @param {string} kind
|
|
58
|
-
* @returns {{ name: string, kernelVersion: () => string,
|
|
245
|
+
* @returns {{ name: string, keyField: string, kernelVersion: () => string,
|
|
59
246
|
* projectRow: (row: object) => object,
|
|
60
247
|
* sortRows: (rows: object[]) => object[],
|
|
61
|
-
* rollup: (rows: object[], components?: object[]) => object
|
|
248
|
+
* rollup: (rows: object[], components?: object[]) => object,
|
|
249
|
+
* compare?: Function, applyEpsilon?: Function, mergeRows?: Function }}
|
|
62
250
|
*/
|
|
63
251
|
export function getKindModule(kind) {
|
|
64
252
|
const mod = KIND_MODULES[kind];
|
|
@@ -62,10 +62,6 @@ export const MAINTAINABILITY_EXCLUSIONS = Object.freeze(
|
|
|
62
62
|
// escomplex: "this[node.callee.type] is not a function" — the cyclomatic
|
|
63
63
|
// visitor lacks a handler for one of the quality-watch CLI's call shapes.
|
|
64
64
|
'.agents/scripts/quality-watch.js',
|
|
65
|
-
// escomplex: "Cannot read properties of undefined (reading 'pattern')" —
|
|
66
|
-
// same family as acceptance-spec-reconciler. The audit recheck CLI uses
|
|
67
|
-
// the same regex-property scan helpers.
|
|
68
|
-
'.agents/scripts/epic-audit-recheck.js',
|
|
69
65
|
// escomplex: parse-fails (MI=0) on the spec-freshness phase's optional-
|
|
70
66
|
// chained destructuring fallthrough. Same upstream family as the other
|
|
71
67
|
// "pattern" / destructuring failures; carve-out so the phase split of
|
|
@@ -86,15 +86,10 @@ function resolveBaselinePath(kind, opts = {}) {
|
|
|
86
86
|
cwd,
|
|
87
87
|
configPath: opts.configPath,
|
|
88
88
|
});
|
|
89
|
-
const gateBlock =
|
|
90
|
-
resolved?.agentSettings?.delivery?.quality?.gates?.[kind] ??
|
|
91
|
-
resolved?.delivery?.quality?.gates?.[kind] ??
|
|
92
|
-
null;
|
|
89
|
+
const gateBlock = resolved?.delivery?.quality?.gates?.[kind] ?? null;
|
|
93
90
|
if (gateBlock?.baselinePath) {
|
|
94
91
|
configured = gateBlock.baselinePath;
|
|
95
92
|
} else {
|
|
96
|
-
// Fall through to the legacy {lint, crap, maintainability} envelope
|
|
97
|
-
// exposed by getBaselines.
|
|
98
93
|
const flat = getBaselines(resolved ?? {});
|
|
99
94
|
if (kind === 'lint' || kind === 'crap' || kind === 'maintainability') {
|
|
100
95
|
configured = flat[kind]?.path ?? null;
|
|
@@ -62,9 +62,7 @@ export const BDD_RUNNER_TAG_TABLE = Object.freeze({
|
|
|
62
62
|
/**
|
|
63
63
|
* Shared set of tag tokens that mean "this scenario does not yet satisfy
|
|
64
64
|
* its AC — treat coverage as pending, not satisfied." Sourced from every
|
|
65
|
-
*
|
|
66
|
-
* `@pending` literal for backward compatibility with feature files
|
|
67
|
-
* authored before runner-aware detection.
|
|
65
|
+
* pending-tag value in `BDD_RUNNER_TAG_TABLE` (today `@skip` / `skip`).
|
|
68
66
|
*
|
|
69
67
|
* Both the prefixed (`@skip`) and the unprefixed (`skip`) form of each
|
|
70
68
|
* tag are included so consumers can look up either the raw tag string
|
|
@@ -75,18 +73,16 @@ export const BDD_RUNNER_TAG_TABLE = Object.freeze({
|
|
|
75
73
|
* - `acceptance-spec-reconciler.classifyCoverage` — membership check
|
|
76
74
|
* against parsed scenario tag sets.
|
|
77
75
|
* - Contract tests that walk `BDD_RUNNER_TAG_TABLE` and assert each
|
|
78
|
-
*
|
|
76
|
+
* pending tag is registered here, guarding against drift when a
|
|
79
77
|
* new runner is added.
|
|
80
78
|
*/
|
|
81
79
|
export const PENDING_TAGS = Object.freeze(
|
|
82
|
-
new Set(
|
|
83
|
-
|
|
80
|
+
new Set(
|
|
81
|
+
Object.values(BDD_RUNNER_TAG_TABLE).flatMap((tag) => [
|
|
84
82
|
tag,
|
|
85
83
|
tag.startsWith('@') ? tag.slice(1) : `@${tag}`,
|
|
86
84
|
]),
|
|
87
|
-
|
|
88
|
-
'pending',
|
|
89
|
-
]),
|
|
85
|
+
),
|
|
90
86
|
);
|
|
91
87
|
|
|
92
88
|
/**
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* bootstrap/issue-forms-template — Story #4227 (framework-gap)
|
|
3
3
|
*
|
|
4
|
-
* Generates GitHub **Issue
|
|
5
|
-
*
|
|
4
|
+
* Generates the GitHub **Story Issue Form**
|
|
5
|
+
* (`.github/ISSUE_TEMPLATE/story.yml`) derived from the canonical Story-body SSOT
|
|
6
6
|
* (`lib/story-body/story-body.js`). The forms exist so a human filing a
|
|
7
|
-
* Story
|
|
7
|
+
* Story in the GitHub web UI produces a body that round-trips through
|
|
8
8
|
* the same `story-body.parse()` agents rely on — closing the
|
|
9
9
|
* human↔agent ticket-shape gap.
|
|
10
10
|
*
|
|
@@ -57,12 +57,11 @@ import path from 'node:path';
|
|
|
57
57
|
const ISSUE_TEMPLATE_RELATIVE_DIR = '.github/ISSUE_TEMPLATE';
|
|
58
58
|
|
|
59
59
|
/**
|
|
60
|
-
* Relative
|
|
61
|
-
* and the bootstrap caller assert the canonical write
|
|
62
|
-
* re-deriving
|
|
60
|
+
* Relative path of the generated Story form, surfaced as a constant so tests
|
|
61
|
+
* and the bootstrap caller assert the canonical write target without
|
|
62
|
+
* re-deriving it.
|
|
63
63
|
*/
|
|
64
64
|
export const STORY_FORM_RELATIVE_PATH = `${ISSUE_TEMPLATE_RELATIVE_DIR}/story.yml`;
|
|
65
|
-
export const EPIC_FORM_RELATIVE_PATH = `${ISSUE_TEMPLATE_RELATIVE_DIR}/epic.yml`;
|
|
66
65
|
|
|
67
66
|
/**
|
|
68
67
|
* The human **intent subset** of the Story-body schema, in canonical
|
|
@@ -102,8 +101,12 @@ export const HUMAN_INTENT_FIELDS = [
|
|
|
102
101
|
heading: 'Changes',
|
|
103
102
|
label: 'Changes',
|
|
104
103
|
description:
|
|
105
|
-
'Files
|
|
106
|
-
|
|
104
|
+
'Files this work touches, one per line as JSON objects: ' +
|
|
105
|
+
'`{ "path": "…", "assumption": "creates"|"refactors-existing"|"exists"|"deletes" }`. ' +
|
|
106
|
+
'Advisory — the binding contract is Acceptance/Verify.',
|
|
107
|
+
placeholder:
|
|
108
|
+
'- {"path":"src/foo.js","assumption":"creates"}\n' +
|
|
109
|
+
'- {"path":"tests/foo.test.js","assumption":"creates"}',
|
|
107
110
|
required: false,
|
|
108
111
|
kind: 'textarea',
|
|
109
112
|
},
|
|
@@ -132,8 +135,10 @@ export const HUMAN_INTENT_FIELDS = [
|
|
|
132
135
|
id: 'references',
|
|
133
136
|
heading: 'References',
|
|
134
137
|
label: 'References',
|
|
135
|
-
description:
|
|
136
|
-
|
|
138
|
+
description:
|
|
139
|
+
'Read-only paths worth consulting, one per line as JSON objects ' +
|
|
140
|
+
'`{ "path": "…", "assumption": "exists" }`. Optional.',
|
|
141
|
+
placeholder: '- {"path":"docs/architecture.md","assumption":"exists"}',
|
|
137
142
|
required: false,
|
|
138
143
|
kind: 'textarea',
|
|
139
144
|
},
|
|
@@ -220,27 +225,26 @@ const GENERATED_BANNER =
|
|
|
220
225
|
'# (lint-issue-body.js) is the drift guard between this form and the parser.';
|
|
221
226
|
|
|
222
227
|
/**
|
|
223
|
-
* Render the GitHub Issue Form YAML for
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
* `parse()` is type-agnostic over the body shape.
|
|
228
|
+
* Render the GitHub Issue Form YAML for Stories. Epics are no longer a
|
|
229
|
+
* ticket type in the label taxonomy, so the generated human-entry surface
|
|
230
|
+
* is story-only.
|
|
227
231
|
*
|
|
228
232
|
* The output is deterministic so the round-trip + idempotency tests assert
|
|
229
233
|
* on its exact shape.
|
|
230
234
|
*
|
|
231
|
-
* @param {'story'
|
|
235
|
+
* @param {'story'} ticketType
|
|
232
236
|
* @param {IssueFormOptions} [opts]
|
|
233
237
|
* @returns {string}
|
|
234
238
|
*/
|
|
235
239
|
export function renderIssueForm(ticketType, opts = {}) {
|
|
236
|
-
if (ticketType !== 'story'
|
|
240
|
+
if (ticketType !== 'story') {
|
|
237
241
|
throw new Error(
|
|
238
|
-
`renderIssueForm: ticketType must be 'story'
|
|
242
|
+
`renderIssueForm: ticketType must be 'story', got ${ticketType}`,
|
|
239
243
|
);
|
|
240
244
|
}
|
|
241
245
|
const entryStateLabel = opts.entryStateLabel ?? 'agent::review-spec';
|
|
242
|
-
const typeLabel =
|
|
243
|
-
const titleCase =
|
|
246
|
+
const typeLabel = 'type::story';
|
|
247
|
+
const titleCase = 'Story';
|
|
244
248
|
const projectSuffix = opts.projectName ? ` for ${opts.projectName}` : '';
|
|
245
249
|
|
|
246
250
|
const fieldBlocks = HUMAN_INTENT_FIELDS.map(renderFieldBlock).join('\n');
|
|
@@ -309,8 +313,8 @@ export const CONFORMANCE_WORKFLOW_RELATIVE_PATH =
|
|
|
309
313
|
|
|
310
314
|
/**
|
|
311
315
|
* Render the CI workflow that runs the issue-body conformance lint
|
|
312
|
-
* (`lint-issue-body.js`) on opened/edited `type::story`
|
|
313
|
-
*
|
|
316
|
+
* (`lint-issue-body.js`) on opened/edited `type::story` issues. This is
|
|
317
|
+
* the mechanism that prevents the generated form and
|
|
314
318
|
* `story-body.parse()` from silently drifting (Story #4227 acceptance).
|
|
315
319
|
* Deterministic so the bootstrap test asserts its exact shape. Internal —
|
|
316
320
|
* exposed to consumers only through {@link ensureIssueForms}.
|
|
@@ -321,7 +325,7 @@ function renderConformanceWorkflow() {
|
|
|
321
325
|
return `# Issue-body conformance lint (Story #4227).
|
|
322
326
|
#
|
|
323
327
|
# Generated by agents-bootstrap-github. Runs the canonical story-body parser
|
|
324
|
-
# against human-opened type::story
|
|
328
|
+
# against human-opened type::story issues and comments when the
|
|
325
329
|
# body does not round-trip, instead of letting the supported human entry
|
|
326
330
|
# points (e.g. /plan from an existing Epic ID) fail silently later. The lint
|
|
327
331
|
# informs; it never fails the issue. Re-run /agents-bootstrap-github to refresh.
|
|
@@ -362,7 +366,7 @@ jobs:
|
|
|
362
366
|
}
|
|
363
367
|
|
|
364
368
|
/**
|
|
365
|
-
* Write (or refresh)
|
|
369
|
+
* Write (or refresh) the Story issue form into a project checkout. Idempotent at
|
|
366
370
|
* the byte level — mirrors {@link ensureCiWorkflow}'s contract:
|
|
367
371
|
*
|
|
368
372
|
* - file absent → `created`
|
|
@@ -378,7 +382,7 @@ jobs:
|
|
|
378
382
|
* @param {IssueFormOptions} [args.options]
|
|
379
383
|
* @param {boolean} [args.write=true] - When `false`, compute the would-be
|
|
380
384
|
* actions without touching disk (dry-run).
|
|
381
|
-
* @returns {{ forms: Array<{ type: 'story'|'
|
|
385
|
+
* @returns {{ forms: Array<{ type: 'story'|'conformance-workflow',
|
|
382
386
|
* action: 'created'|'unchanged'|'custom-skip',
|
|
383
387
|
* path: string, rendered: string }> }}
|
|
384
388
|
*/
|
|
@@ -387,20 +391,15 @@ export function ensureIssueForms(args) {
|
|
|
387
391
|
const options = args.options ?? {};
|
|
388
392
|
const write = args.write !== false;
|
|
389
393
|
|
|
390
|
-
// Each target pairs a
|
|
391
|
-
//
|
|
392
|
-
//
|
|
394
|
+
// Each target pairs a type key with the rendered body. The conformance
|
|
395
|
+
// workflow is materialized alongside the form because it is the form's
|
|
396
|
+
// drift guard — they ship as one unit.
|
|
393
397
|
const targets = [
|
|
394
398
|
{
|
|
395
399
|
type: 'story',
|
|
396
400
|
rel: STORY_FORM_RELATIVE_PATH,
|
|
397
401
|
rendered: renderIssueForm('story', options),
|
|
398
402
|
},
|
|
399
|
-
{
|
|
400
|
-
type: 'epic',
|
|
401
|
-
rel: EPIC_FORM_RELATIVE_PATH,
|
|
402
|
-
rendered: renderIssueForm('epic', options),
|
|
403
|
-
},
|
|
404
403
|
{
|
|
405
404
|
type: 'conformance-workflow',
|
|
406
405
|
rel: CONFORMANCE_WORKFLOW_RELATIVE_PATH,
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* Asserts that `git config core.bare` on the main checkout is NOT set
|
|
5
5
|
* to `true`. This guards the old failure mode where an `npm test` path
|
|
6
6
|
* mis-set `core.bare=true` on the main checkout, after which
|
|
7
|
-
* `story-close.js`'s post-rebase `git checkout` aborted with
|
|
7
|
+
* `single-story-close.js`'s post-rebase `git checkout` aborted with
|
|
8
8
|
* `fatal: this operation must be run in a work tree`. `cleanGitEnv`
|
|
9
9
|
* already lands the live fix; this check is the regression guard.
|
|
10
10
|
*
|
|
11
|
-
* Severity is `blocker` because story-close cannot recover on its own
|
|
11
|
+
* Severity is `blocker` because single-story-close cannot recover on its own
|
|
12
12
|
* — the operator must run `git config --unset core.bare` (or rely on
|
|
13
13
|
* `cleanGitEnv` to do it before the rebase). The check is
|
|
14
14
|
* refuse-and-print: the `fixCommand` is the literal unset, and the
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* checks/index.js — Discovery-based registry + runner for self-healing checks.
|
|
3
3
|
*
|
|
4
4
|
* This module is the single entry point for every consumer surface that
|
|
5
|
-
* runs checks (preflight guards at `
|
|
5
|
+
* runs checks (preflight guards at `single-story-close.js` and
|
|
6
|
+
* `mandrel-update-preflight.js`, the
|
|
6
7
|
* `npm test` wrapper, the `diagnose.js` CLI viewer, and the retro hook in
|
|
7
8
|
* `retro-runner.js`). Each surface calls `runChecks({ scope, autoFix, state })`
|
|
8
9
|
* with its own scope and gets back `{ findings, fixed }`.
|