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
package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js
DELETED
|
@@ -1,446 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* refresh-commit.js — phase 3 of baseline-attribution.
|
|
3
|
-
*
|
|
4
|
-
* When the attribution classifier decides every regression row is
|
|
5
|
-
* attributable to the Story's diff, this phase refreshes the kind's
|
|
6
|
-
* baseline in-process via `refreshBaseline()` (Story #2205), stages the
|
|
7
|
-
* resulting baseline file, and either skips (no drift) or commits one
|
|
8
|
-
* canonical `chore(baselines): refresh <kind> for story-<id>` on the
|
|
9
|
-
* Story branch. The retry loop in `gate-failure.js` is gated by an
|
|
10
|
-
* idempotency token (`cycleState.refreshedKinds`) so a fail-then-pass
|
|
11
|
-
* sequence still emits at most one baseline-refresh commit per close
|
|
12
|
-
* cycle (AC-9, #2176-fixture).
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import fs from 'node:fs';
|
|
16
|
-
import path from 'node:path';
|
|
17
|
-
import { filterExcludedRows } from '../../../../baselines/kinds/maintainability.js';
|
|
18
|
-
import { canonicalise as canonicalisePath } from '../../../../baselines/path-canon.js';
|
|
19
|
-
import { refreshBaseline as defaultRefreshBaseline } from '../../../../baselines/refresh-service.js';
|
|
20
|
-
import {
|
|
21
|
-
getBaselines as defaultGetBaselines,
|
|
22
|
-
getQuality as defaultGetQuality,
|
|
23
|
-
} from '../../../../config-resolver.js';
|
|
24
|
-
import { loadCoverage as defaultLoadCoverage } from '../../../../coverage-utils.js';
|
|
25
|
-
import {
|
|
26
|
-
resolveEscomplexVersion as defaultResolveEscomplexVersion,
|
|
27
|
-
resolveTsTranspilerVersion as defaultResolveTsTranspilerVersion,
|
|
28
|
-
scanAndScore as defaultScanAndScore,
|
|
29
|
-
} from '../../../../crap-utils.js';
|
|
30
|
-
import { gitSpawn as defaultGitSpawn } from '../../../../git-utils.js';
|
|
31
|
-
import { Logger as DefaultLogger } from '../../../../Logger.js';
|
|
32
|
-
import {
|
|
33
|
-
calculateAll as defaultCalculateAll,
|
|
34
|
-
scanDirectory as defaultScanDirectory,
|
|
35
|
-
isIgnoredByGlobs as isIgnoredByGlobsMi,
|
|
36
|
-
} from '../../../../maintainability-utils.js';
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Build the per-kind scorer the refresh-service consumes. Each scorer
|
|
40
|
-
* receives an (in-scope) file list plus a context bag and returns the
|
|
41
|
-
* row array the writer persists.
|
|
42
|
-
*
|
|
43
|
-
* Story #2205 — the scorer is exposed as a helper so unit tests can
|
|
44
|
-
* inject a deterministic stub via `deps.refreshBaseline` (which receives
|
|
45
|
-
* the scorer via the option bag).
|
|
46
|
-
*
|
|
47
|
-
* @param {{
|
|
48
|
-
* kind: 'maintainability' | 'crap',
|
|
49
|
-
* cwd: string,
|
|
50
|
-
* config?: object,
|
|
51
|
-
* getQuality?: typeof defaultGetQuality,
|
|
52
|
-
* scanDirectory?: typeof defaultScanDirectory,
|
|
53
|
-
* calculateAll?: typeof defaultCalculateAll,
|
|
54
|
-
* loadCoverage?: typeof defaultLoadCoverage,
|
|
55
|
-
* scanAndScore?: typeof defaultScanAndScore,
|
|
56
|
-
* resolveEscomplexVersion?: typeof defaultResolveEscomplexVersion,
|
|
57
|
-
* resolveTsTranspilerVersion?: typeof defaultResolveTsTranspilerVersion,
|
|
58
|
-
* }} input
|
|
59
|
-
* @returns {(files: string[], opts: object) => Promise<object[]>}
|
|
60
|
-
*/
|
|
61
|
-
export function buildKindScorer({
|
|
62
|
-
kind,
|
|
63
|
-
cwd,
|
|
64
|
-
config,
|
|
65
|
-
getQuality = defaultGetQuality,
|
|
66
|
-
scanDirectory = defaultScanDirectory,
|
|
67
|
-
calculateAll = defaultCalculateAll,
|
|
68
|
-
loadCoverage = defaultLoadCoverage,
|
|
69
|
-
scanAndScore = defaultScanAndScore,
|
|
70
|
-
resolveEscomplexVersion = defaultResolveEscomplexVersion,
|
|
71
|
-
resolveTsTranspilerVersion = defaultResolveTsTranspilerVersion,
|
|
72
|
-
}) {
|
|
73
|
-
const quality = getQuality(config) ?? {};
|
|
74
|
-
if (kind === 'maintainability') {
|
|
75
|
-
const targetDirs = quality?.maintainability?.targetDirs ?? [];
|
|
76
|
-
const miIgnoreGlobs = quality?.maintainability?.ignoreGlobs ?? [];
|
|
77
|
-
// Scorer receives `(files, opts)` from the refresh-service.
|
|
78
|
-
// When `opts.fullScope !== true`, score only the in-scope diff files
|
|
79
|
-
// that fall under a configured target dir — rows outside those roots
|
|
80
|
-
// are preserved verbatim by the service / writer (out-of-scope merging).
|
|
81
|
-
// When `opts.fullScope === true`, walk the full target dirs as before.
|
|
82
|
-
return async (files, opts) => {
|
|
83
|
-
const effectiveCwd = opts?.cwd ?? cwd;
|
|
84
|
-
const targetAbsDirs = targetDirs.map((dir) =>
|
|
85
|
-
path.isAbsolute(dir) ? dir : path.resolve(effectiveCwd, dir),
|
|
86
|
-
);
|
|
87
|
-
let sourceList;
|
|
88
|
-
if (opts?.fullScope) {
|
|
89
|
-
sourceList = [];
|
|
90
|
-
for (const abs of targetAbsDirs) {
|
|
91
|
-
scanDirectory(abs, sourceList, {
|
|
92
|
-
cwd: effectiveCwd,
|
|
93
|
-
ignoreGlobs: miIgnoreGlobs,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
} else {
|
|
97
|
-
// Diff-scope: resolve each in-scope file to absolute path, keep
|
|
98
|
-
// only those that fall under a configured target dir.
|
|
99
|
-
sourceList = [];
|
|
100
|
-
for (const rel of files ?? []) {
|
|
101
|
-
const abs = path.resolve(effectiveCwd, rel);
|
|
102
|
-
const underTarget = targetAbsDirs.some(
|
|
103
|
-
(root) => abs === root || abs.startsWith(`${root}${path.sep}`),
|
|
104
|
-
);
|
|
105
|
-
// Apply `ignoreGlobs` here too — the full-scope walk drops
|
|
106
|
-
// ignore-matched files via `scanDirectory`, so the diff-scope path
|
|
107
|
-
// must do the same or an ignored-but-changed file (e.g. one matched
|
|
108
|
-
// by `config-settings-schema*.js`) enters `rows` and drags the
|
|
109
|
-
// `rollup["*"].min` below the maintainability floor. This mirrors the
|
|
110
|
-
// canonical `buildDefaultMaintainabilityScorer` (refresh-service.js,
|
|
111
|
-
// Story #4293); the story-close auto-refresh routes through this
|
|
112
|
-
// scorer, not that one, so the fix has to live here too.
|
|
113
|
-
if (
|
|
114
|
-
underTarget &&
|
|
115
|
-
!isIgnoredByGlobsMi(abs, miIgnoreGlobs, effectiveCwd)
|
|
116
|
-
) {
|
|
117
|
-
sourceList.push(abs);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
const scores = await calculateAll(sourceList);
|
|
122
|
-
return filterExcludedRows(
|
|
123
|
-
Object.entries(scores).map(([key, mi]) => {
|
|
124
|
-
const rel = path.isAbsolute(key)
|
|
125
|
-
? path.relative(effectiveCwd, key)
|
|
126
|
-
: key;
|
|
127
|
-
const posixRel = rel.split(path.sep).join('/');
|
|
128
|
-
return { path: canonicalisePath(posixRel), mi };
|
|
129
|
-
}),
|
|
130
|
-
);
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
if (kind === 'crap') {
|
|
134
|
-
const crapCfg = quality?.crap ?? {};
|
|
135
|
-
const targetDirs = Array.isArray(crapCfg.targetDirs)
|
|
136
|
-
? crapCfg.targetDirs
|
|
137
|
-
: [];
|
|
138
|
-
const crapIgnoreGlobs = Array.isArray(crapCfg.ignoreGlobs)
|
|
139
|
-
? crapCfg.ignoreGlobs
|
|
140
|
-
: [];
|
|
141
|
-
const requireCoverage = crapCfg.requireCoverage !== false;
|
|
142
|
-
const coveragePath = crapCfg.coveragePath ?? 'coverage/coverage-final.json';
|
|
143
|
-
// Scorer receives `(files, opts)` from the refresh-service.
|
|
144
|
-
// When `opts.fullScope !== true`, forward the diff-scope file list to
|
|
145
|
-
// `scanAndScore` via its `scopeFiles` parameter so it restricts scoring
|
|
146
|
-
// to the in-scope files (Story #3647 — diff-scope awareness).
|
|
147
|
-
return async (files, opts) => {
|
|
148
|
-
const effectiveCwd = opts?.cwd ?? cwd;
|
|
149
|
-
const coverageAbs = path.isAbsolute(coveragePath)
|
|
150
|
-
? coveragePath
|
|
151
|
-
: path.resolve(effectiveCwd, coveragePath);
|
|
152
|
-
const coverage = loadCoverage(coverageAbs);
|
|
153
|
-
if (!coverage && requireCoverage) return [];
|
|
154
|
-
const scopeFiles = opts?.fullScope ? null : (files ?? null);
|
|
155
|
-
const { rows } = await scanAndScore({
|
|
156
|
-
targetDirs,
|
|
157
|
-
coverage,
|
|
158
|
-
requireCoverage,
|
|
159
|
-
cwd: effectiveCwd,
|
|
160
|
-
ignoreGlobs: crapIgnoreGlobs,
|
|
161
|
-
scopeFiles,
|
|
162
|
-
});
|
|
163
|
-
// Stamp kernel versions so downstream gates can reason about the
|
|
164
|
-
// scoring environment. The writer keeps `kernelVersion`; the others
|
|
165
|
-
// remain available via the resolved values for the per-kind module.
|
|
166
|
-
resolveEscomplexVersion(effectiveCwd);
|
|
167
|
-
resolveTsTranspilerVersion();
|
|
168
|
-
return (rows ?? []).filter(
|
|
169
|
-
(r) => typeof r?.crap === 'number' && Number.isFinite(r.crap),
|
|
170
|
-
);
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
throw new Error(
|
|
174
|
-
`buildKindScorer: unsupported kind "${kind}" (expected maintainability|crap)`,
|
|
175
|
-
);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Resolve the absolute on-disk path for a kind's baseline file.
|
|
180
|
-
*
|
|
181
|
-
* @param {{ cwd: string, kind: string, config?: object, getBaselines?: typeof defaultGetBaselines }} input
|
|
182
|
-
* @returns {string|null}
|
|
183
|
-
*/
|
|
184
|
-
function resolveBaselineWritePath({
|
|
185
|
-
cwd,
|
|
186
|
-
kind,
|
|
187
|
-
config,
|
|
188
|
-
getBaselines = defaultGetBaselines,
|
|
189
|
-
}) {
|
|
190
|
-
const baselines = getBaselines(config) ?? {};
|
|
191
|
-
const rel = baselines?.[kind]?.path;
|
|
192
|
-
if (typeof rel !== 'string' || rel.length === 0) return null;
|
|
193
|
-
return path.isAbsolute(rel) ? rel : path.resolve(cwd, rel);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function normalizeTargetDir(dir) {
|
|
197
|
-
if (typeof dir !== 'string' || dir.length === 0) return null;
|
|
198
|
-
return dir.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+$/, '');
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
function buildRequiredScopeFilePredicate({
|
|
202
|
-
kind,
|
|
203
|
-
config,
|
|
204
|
-
getQuality = defaultGetQuality,
|
|
205
|
-
}) {
|
|
206
|
-
const quality = getQuality(config) ?? {};
|
|
207
|
-
const targetDirs = Array.isArray(quality?.[kind]?.targetDirs)
|
|
208
|
-
? quality[kind].targetDirs.map(normalizeTargetDir).filter(Boolean)
|
|
209
|
-
: [];
|
|
210
|
-
if (targetDirs.length === 0) return () => true;
|
|
211
|
-
return (file) =>
|
|
212
|
-
targetDirs.some((dir) => file === dir || file.startsWith(`${dir}/`));
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Stage the baseline file, then check whether the staged tree differs
|
|
217
|
-
* from HEAD via `git diff --cached --exit-code`. Returns one of:
|
|
218
|
-
*
|
|
219
|
-
* - `{ hasDrift: true }` — staged content differs; caller emits commit.
|
|
220
|
-
* - `{ hasDrift: false }` — staged content matches HEAD; caller skips.
|
|
221
|
-
* - `{ error: string }` — git add or diff itself failed.
|
|
222
|
-
*
|
|
223
|
-
* Pure-ish: every git invocation goes through the injected `gitRunner`.
|
|
224
|
-
*/
|
|
225
|
-
export function stageAndCheckBaselineDrift({
|
|
226
|
-
cwd,
|
|
227
|
-
baselineFile,
|
|
228
|
-
gitRunner = { gitSpawn: defaultGitSpawn },
|
|
229
|
-
}) {
|
|
230
|
-
const rel = path.isAbsolute(baselineFile)
|
|
231
|
-
? path.relative(cwd, baselineFile)
|
|
232
|
-
: baselineFile;
|
|
233
|
-
const posixRel = rel.split(path.sep).join('/');
|
|
234
|
-
const addRes = gitRunner.gitSpawn(cwd, 'add', posixRel);
|
|
235
|
-
if (addRes.status !== 0) {
|
|
236
|
-
return {
|
|
237
|
-
error: `git add ${rel} failed: ${addRes.stderr || addRes.stdout}`,
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
const diffRes = gitRunner.gitSpawn(
|
|
241
|
-
cwd,
|
|
242
|
-
'diff',
|
|
243
|
-
'--cached',
|
|
244
|
-
'--exit-code',
|
|
245
|
-
'--',
|
|
246
|
-
posixRel,
|
|
247
|
-
);
|
|
248
|
-
// `git diff --exit-code` exits 0 when no drift, 1 when drift. Anything
|
|
249
|
-
// else (128 for a corrupt index, etc.) is an error.
|
|
250
|
-
if (diffRes.status === 0) return { hasDrift: false };
|
|
251
|
-
if (diffRes.status === 1) return { hasDrift: true };
|
|
252
|
-
return {
|
|
253
|
-
error: `git diff --cached --exit-code ${rel} failed: ${diffRes.stderr || diffRes.stdout}`,
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Run the gate's refresh inside the supplied worktree:
|
|
259
|
-
*
|
|
260
|
-
* 1. Call `refreshBaseline({ kind, writePath, scopeFiles, ... })` — the
|
|
261
|
-
* service writes the scope-merged envelope atomically.
|
|
262
|
-
* 2. Stage the baseline file and run `git diff --cached --exit-code`.
|
|
263
|
-
* Empty diff → return `{ ok: true, skipped: true,
|
|
264
|
-
* reason: 'no-baseline-drift' }`. No commit lands.
|
|
265
|
-
* 3. Otherwise commit on the Story branch with the canonical
|
|
266
|
-
* `chore(baselines): refresh <kind> for story-<id>` subject.
|
|
267
|
-
*
|
|
268
|
-
* Story #2205 — the retry loop is gated by `cycleState.refreshedKinds`
|
|
269
|
-
* (a `Set<string>` of kinds already refreshed this close cycle). When a
|
|
270
|
-
* kind is already present, the helper short-circuits with `{ ok: true,
|
|
271
|
-
* skipped: true, reason: 'idempotency-token' }` so a fail-then-pass
|
|
272
|
-
* retry sequence emits at most one commit per kind per cycle (AC-9).
|
|
273
|
-
*
|
|
274
|
-
* The caller must already have asserted `cwd === worktreePath` is on the
|
|
275
|
-
* Story branch — this helper does NOT re-check the branch. story-close.js
|
|
276
|
-
* holds that invariant via `withEpicMergeLock`.
|
|
277
|
-
*
|
|
278
|
-
* Story #4017 — this helper is the **single refresh→stage→commit funnel**
|
|
279
|
-
* for story-close. Both call paths route through it: the gate-failure
|
|
280
|
-
* attribution retry (`gate-failure.js`, no `capCheck`) and the post-gates
|
|
281
|
-
* bounded auto-refresh (`auto-refresh-runner.js`, which injects a
|
|
282
|
-
* `capCheck` evaluating the refreshed envelope against the configured
|
|
283
|
-
* delta caps). When `capCheck` returns `{ canAutoRefresh: false }`, the
|
|
284
|
-
* staged refresh is rolled back to HEAD and the helper returns
|
|
285
|
-
* `{ ok: true, refused: true, verdict }` without committing.
|
|
286
|
-
*
|
|
287
|
-
* @returns {Promise<
|
|
288
|
-
* | { ok: true, sha: string, skipped?: boolean, reason?: string, refused?: boolean, verdict?: object }
|
|
289
|
-
* | { ok: false, error: string }
|
|
290
|
-
* >}
|
|
291
|
-
*/
|
|
292
|
-
export async function runRefreshCommit({
|
|
293
|
-
cwd,
|
|
294
|
-
kind,
|
|
295
|
-
storyId,
|
|
296
|
-
epicBranch,
|
|
297
|
-
storyBranch,
|
|
298
|
-
config,
|
|
299
|
-
cycleState = null,
|
|
300
|
-
capCheck = null,
|
|
301
|
-
refreshBaseline = defaultRefreshBaseline,
|
|
302
|
-
scorerBuilder = buildKindScorer,
|
|
303
|
-
getBaselines: getBaselinesImpl = defaultGetBaselines,
|
|
304
|
-
getQuality: getQualityImpl = defaultGetQuality,
|
|
305
|
-
fsImpl = fs,
|
|
306
|
-
gitRunner = { gitSpawn: defaultGitSpawn },
|
|
307
|
-
logger = DefaultLogger,
|
|
308
|
-
}) {
|
|
309
|
-
// AC: retry-loop is gated by an idempotency token so a fail-then-pass
|
|
310
|
-
// sequence never emits a duplicate commit for the same kind.
|
|
311
|
-
if (cycleState?.refreshedKinds instanceof Set) {
|
|
312
|
-
if (cycleState.refreshedKinds.has(kind)) {
|
|
313
|
-
logger?.info?.(
|
|
314
|
-
`[baseline-attribution-wiring] refresh for kind=${kind} already landed this cycle; skipping (idempotency-token).`,
|
|
315
|
-
);
|
|
316
|
-
return {
|
|
317
|
-
ok: true,
|
|
318
|
-
sha: cycleState.lastRefreshSha ?? '',
|
|
319
|
-
skipped: true,
|
|
320
|
-
reason: 'idempotency-token',
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
const writePath = resolveBaselineWritePath({
|
|
326
|
-
cwd,
|
|
327
|
-
kind,
|
|
328
|
-
config,
|
|
329
|
-
getBaselines: getBaselinesImpl,
|
|
330
|
-
});
|
|
331
|
-
if (!writePath) {
|
|
332
|
-
return {
|
|
333
|
-
ok: false,
|
|
334
|
-
error: `no baseline path configured for kind "${kind}"`,
|
|
335
|
-
};
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// The refresh-service derives the scope from `git diff --name-only
|
|
339
|
-
// <baseRef>..<headRef>` when scopeFiles is null. Story-close branches
|
|
340
|
-
// diff against `origin/<epicBranch>`; passing those refs makes the
|
|
341
|
-
// scope-derivation match the attribution computation.
|
|
342
|
-
const baseRef = epicBranch ? `origin/${epicBranch}` : 'origin/main';
|
|
343
|
-
const headRef = storyBranch ?? 'HEAD';
|
|
344
|
-
let scorer;
|
|
345
|
-
try {
|
|
346
|
-
scorer = scorerBuilder({ kind, cwd, config });
|
|
347
|
-
} catch (err) {
|
|
348
|
-
return {
|
|
349
|
-
ok: false,
|
|
350
|
-
error: `scorer build failed for kind "${kind}": ${err?.message ?? err}`,
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
let refreshResult;
|
|
355
|
-
try {
|
|
356
|
-
refreshResult = await refreshBaseline({
|
|
357
|
-
kind,
|
|
358
|
-
baseRef,
|
|
359
|
-
headRef,
|
|
360
|
-
scopeFiles: null,
|
|
361
|
-
fullScope: false,
|
|
362
|
-
writePath,
|
|
363
|
-
scorer,
|
|
364
|
-
fs: fsImpl,
|
|
365
|
-
cwd,
|
|
366
|
-
requireRowsForScopeFiles: true,
|
|
367
|
-
requiredScopeFilePredicate: buildRequiredScopeFilePredicate({
|
|
368
|
-
kind,
|
|
369
|
-
config,
|
|
370
|
-
getQuality: getQualityImpl,
|
|
371
|
-
}),
|
|
372
|
-
});
|
|
373
|
-
} catch (err) {
|
|
374
|
-
return {
|
|
375
|
-
ok: false,
|
|
376
|
-
error: `refreshBaseline(${kind}) failed: ${err?.message ?? err}`,
|
|
377
|
-
};
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// Story #4017 — when the service reports it persisted nothing, skip the
|
|
381
|
-
// stage/diff round-trip entirely: there is no drift to fold in.
|
|
382
|
-
if (refreshResult?.wrote === false) {
|
|
383
|
-
if (cycleState?.refreshedKinds instanceof Set) {
|
|
384
|
-
cycleState.refreshedKinds.add(kind);
|
|
385
|
-
}
|
|
386
|
-
logger?.info?.(
|
|
387
|
-
`[baseline-attribution-wiring] refresh wrote nothing for kind=${kind} (story-${storyId}); skipping.`,
|
|
388
|
-
);
|
|
389
|
-
return { ok: true, sha: '', skipped: true, reason: 'no-baseline-drift' };
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
const drift = stageAndCheckBaselineDrift({
|
|
393
|
-
cwd,
|
|
394
|
-
baselineFile: writePath,
|
|
395
|
-
gitRunner,
|
|
396
|
-
});
|
|
397
|
-
if (drift.error) return { ok: false, error: drift.error };
|
|
398
|
-
if (!drift.hasDrift) {
|
|
399
|
-
if (cycleState?.refreshedKinds instanceof Set) {
|
|
400
|
-
cycleState.refreshedKinds.add(kind);
|
|
401
|
-
}
|
|
402
|
-
logger?.info?.(
|
|
403
|
-
`[baseline-attribution-wiring] no baseline drift to fold in for kind=${kind} (story-${storyId}).`,
|
|
404
|
-
);
|
|
405
|
-
return { ok: true, sha: '', skipped: true, reason: 'no-baseline-drift' };
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
// Story #4017 — optional bounded-delta cap check (injected by the
|
|
409
|
-
// post-gates auto-refresh path). A refusal rolls the staged refresh back
|
|
410
|
-
// to HEAD so the merge consumes the pre-refresh baseline unchanged.
|
|
411
|
-
if (typeof capCheck === 'function') {
|
|
412
|
-
const verdict = await capCheck({ kind, writePath });
|
|
413
|
-
if (verdict && verdict.canAutoRefresh === false) {
|
|
414
|
-
const rel = path.isAbsolute(writePath)
|
|
415
|
-
? path.relative(cwd, writePath)
|
|
416
|
-
: writePath;
|
|
417
|
-
const posixRel = rel.split(path.sep).join('/');
|
|
418
|
-
const res = gitRunner.gitSpawn(cwd, 'checkout', 'HEAD', '--', posixRel);
|
|
419
|
-
if (res.status !== 0) {
|
|
420
|
-
logger?.warn?.(
|
|
421
|
-
`[baseline-attribution-wiring] failed to restore ${rel} after cap refusal: ${res.stderr || res.stdout}`,
|
|
422
|
-
);
|
|
423
|
-
}
|
|
424
|
-
return { ok: true, sha: '', refused: true, verdict };
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
const subject = `chore(baselines): refresh ${kind} for story-${storyId}`;
|
|
429
|
-
const commitRes = gitRunner.gitSpawn(cwd, 'commit', '-m', subject);
|
|
430
|
-
if (commitRes.status !== 0) {
|
|
431
|
-
return {
|
|
432
|
-
ok: false,
|
|
433
|
-
error: `git commit failed: ${commitRes.stderr || commitRes.stdout}`,
|
|
434
|
-
};
|
|
435
|
-
}
|
|
436
|
-
const headRes = gitRunner.gitSpawn(cwd, 'rev-parse', '--short', 'HEAD');
|
|
437
|
-
const sha = headRes.status === 0 ? (headRes.stdout || '').trim() : '';
|
|
438
|
-
if (cycleState?.refreshedKinds instanceof Set) {
|
|
439
|
-
cycleState.refreshedKinds.add(kind);
|
|
440
|
-
cycleState.lastRefreshSha = sha;
|
|
441
|
-
}
|
|
442
|
-
logger?.info?.(
|
|
443
|
-
`[baseline-attribution-wiring] committed ${subject} (${sha}); single-commit-per-cycle invariant intact.`,
|
|
444
|
-
);
|
|
445
|
-
return { ok: true, sha };
|
|
446
|
-
}
|