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
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* emits the set of Stories safe to dispatch **on this beat** — a Story
|
|
12
12
|
* becomes dispatchable the instant its own dependencies are done, under the
|
|
13
13
|
* same global concurrency cap and the same file-overlap co-dispatch guard
|
|
14
|
-
*
|
|
14
|
+
* `lib/wave-runner/ready-set.js` applies everywhere. There is no wave barrier: this no longer batches
|
|
15
15
|
* Stories into fully-draining waves; it selects continuously.
|
|
16
16
|
*
|
|
17
17
|
* The previous static wave-batch plan (group N must fully drain before
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
* `/deliver` uses — `resolveConfig` + `getRunners` reading
|
|
51
51
|
* `delivery.deliverRunner.concurrencyCap` (default 3) — so a
|
|
52
52
|
* `.agentrc.local.json` override is honored. A `--concurrency <n>` CLI flag
|
|
53
|
-
* overrides the config-resolved value for that run only. This
|
|
54
|
-
*
|
|
55
|
-
*
|
|
53
|
+
* overrides the config-resolved value for that run only. This shares one
|
|
54
|
+
* deterministic config source (`delivery.deliverRunner.concurrencyCap`) and
|
|
55
|
+
* one scheduling kernel with every `/deliver` multi-Story invocation.
|
|
56
56
|
*
|
|
57
57
|
* On cycle detection, exits with code 2 and sets cycleError in the envelope.
|
|
58
58
|
*/
|
|
@@ -74,7 +74,7 @@ Continuous ready-set planner for standalone Story delivery. Consumes a
|
|
|
74
74
|
dependency graph of Story IDs plus the live run progress and emits the set
|
|
75
75
|
of Stories safe to dispatch on this beat — a Story is dispatchable the
|
|
76
76
|
instant its own dependencies are done — plus the resolved per-beat
|
|
77
|
-
concurrency cap and the same file-overlap guard
|
|
77
|
+
concurrency cap and the same file-overlap guard as selectReadySet.
|
|
78
78
|
|
|
79
79
|
Input DAG format (JSON array):
|
|
80
80
|
[{ "id": 101, "dependsOn": [] }, { "id": 102, "dependsOn": [101] }]
|
|
@@ -257,7 +257,7 @@ export function parseConcurrencyOverride(raw) {
|
|
|
257
257
|
/**
|
|
258
258
|
* Resolve the per-beat concurrency cap.
|
|
259
259
|
*
|
|
260
|
-
* Mirrors the `/deliver` seam (`
|
|
260
|
+
* Mirrors the `/deliver` multi-Story seam (`helpers/deliver-story.md`): resolve the
|
|
261
261
|
* project config (which deep-merges `.agentrc.local.json` over `.agentrc.json`)
|
|
262
262
|
* then read `delivery.deliverRunner.concurrencyCap` via `getRunners` (default
|
|
263
263
|
* 3). An explicit `override` (the `--concurrency <n>` CLI flag) wins over
|
|
@@ -2,33 +2,17 @@
|
|
|
2
2
|
/* node:coverage ignore file */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* story-plan.js —
|
|
5
|
+
* story-plan.js — QA helper for promote round-trips and `--emit-context`
|
|
6
|
+
* envelope emission.
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Canonical operator planning is `plan-context.js` + `plan-persist.js` (see
|
|
9
|
+
* `.agents/workflows/plan.md`). Use this CLI only for QA promote
|
|
10
|
+
* round-trips (`--body` / `--dry-run`) or test harnesses that need the
|
|
11
|
+
* standalone envelope shape.
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* corpus-aware `corpusContext` — the docs digest plus relevant
|
|
15
|
-
* existing-Epic Tech Spec excerpts, Story #4432) and print it as
|
|
16
|
-
* JSON on stdout. Logs route to stderr so the envelope is
|
|
17
|
-
* byte-clean for `JSON.parse`.
|
|
18
|
-
* 2. Persist mode — given a `--body <file>` authored by the host
|
|
19
|
-
* LLM after operator confirmation, validate the shape and persist
|
|
20
|
-
* via `provider.createIssue` (which also adds the new Story to
|
|
21
|
-
* the configured Projects V2 board — Story #3822) with
|
|
22
|
-
* `type::story` + the chosen persona label, falling back to
|
|
23
|
-
* `gh issue create` when the provider lacks a createIssue
|
|
24
|
-
* analogue. Prints `Next: /single-story-deliver <id>`.
|
|
25
|
-
* 3. `--dry-run` — same as persist but exits without touching
|
|
26
|
-
* GitHub. Echoes the rendered body and the `gh` argv it would
|
|
27
|
-
* have run.
|
|
28
|
-
*
|
|
29
|
-
* Mirrors the `/plan` pattern: deterministic Node I/O wrappers
|
|
30
|
-
* with HITL gating handled by the host LLM in chat. No external LLM
|
|
31
|
-
* APIs are called from this script.
|
|
13
|
+
* Operator planning:
|
|
14
|
+
* node .agents/scripts/plan-context.js --seed "…" | --seed-file <path> | --tickets <ids>
|
|
15
|
+
* node .agents/scripts/plan-persist.js --stories … --risk-verdict …
|
|
32
16
|
*/
|
|
33
17
|
|
|
34
18
|
import { readFile } from 'node:fs/promises';
|
|
@@ -53,10 +37,10 @@ import {
|
|
|
53
37
|
|
|
54
38
|
const HELP = `\
|
|
55
39
|
Usage:
|
|
56
|
-
story-plan.js --emit-context (--
|
|
57
|
-
[--
|
|
40
|
+
story-plan.js --emit-context (--seed "<seed>" | --seed-file <file>) \\
|
|
41
|
+
[--refine | --no-refine] [--pretty]
|
|
58
42
|
|
|
59
|
-
story-plan.js --body <file> [--
|
|
43
|
+
story-plan.js --body <file> [--dry-run]
|
|
60
44
|
|
|
61
45
|
story-plan.js --help
|
|
62
46
|
|
|
@@ -66,12 +50,11 @@ Modes:
|
|
|
66
50
|
draft body using the envelope and the body template.
|
|
67
51
|
--body <file> Persist a pre-authored body. Validates shape (required
|
|
68
52
|
sections, no Epic: ref, AC checklist non-empty) and
|
|
69
|
-
calls \`gh issue create\` with type::story
|
|
53
|
+
calls \`gh issue create\` with type::story.
|
|
70
54
|
--dry-run With --body: print the body and the gh argv that would
|
|
71
55
|
be invoked, then exit 0. No GitHub mutations.
|
|
72
56
|
|
|
73
57
|
Options:
|
|
74
|
-
--persona <name> Persona label (default: engineer).
|
|
75
58
|
--refine Force the idea-refinement hint on regardless of seed
|
|
76
59
|
length. Default heuristic: refine when seed < 200
|
|
77
60
|
chars.
|
|
@@ -80,17 +63,17 @@ Options:
|
|
|
80
63
|
`;
|
|
81
64
|
|
|
82
65
|
/**
|
|
83
|
-
* Resolve the seed string from --
|
|
66
|
+
* Resolve the seed string from --seed or --seed-file. One of the two
|
|
84
67
|
* must be present in --emit-context mode.
|
|
85
68
|
*/
|
|
86
|
-
async function resolveSeed({
|
|
87
|
-
if (
|
|
88
|
-
throw new Error('Pass either --
|
|
69
|
+
async function resolveSeed({ seed, seedFile }) {
|
|
70
|
+
if (seed && seedFile) {
|
|
71
|
+
throw new Error('Pass either --seed or --seed-file, not both.');
|
|
89
72
|
}
|
|
90
|
-
if (
|
|
91
|
-
if (
|
|
73
|
+
if (seed) return seed;
|
|
74
|
+
if (seedFile) return (await readFile(seedFile, 'utf8')).trim();
|
|
92
75
|
throw new Error(
|
|
93
|
-
'--emit-context requires --
|
|
76
|
+
'--emit-context requires --seed "<seed>" or --seed-file <file>.',
|
|
94
77
|
);
|
|
95
78
|
}
|
|
96
79
|
|
|
@@ -147,12 +130,11 @@ async function runEmitContext({
|
|
|
147
130
|
write = (s) => process.stdout.write(s),
|
|
148
131
|
}) {
|
|
149
132
|
const seed = await resolveSeed({
|
|
150
|
-
|
|
151
|
-
|
|
133
|
+
seed: values.seed,
|
|
134
|
+
seedFile: values['seed-file'],
|
|
152
135
|
});
|
|
153
136
|
const override = values.refine ? 'on' : values['no-refine'] ? 'off' : null;
|
|
154
137
|
const refine = shouldRefine({ seed, override });
|
|
155
|
-
const persona = values.persona ?? 'engineer';
|
|
156
138
|
|
|
157
139
|
// Corpus lookup uses the raw (un-defaulted) docsContextFiles list, same
|
|
158
140
|
// as the `/deliver` per-Epic digest builder: `config.project` fills in
|
|
@@ -186,7 +168,6 @@ async function runEmitContext({
|
|
|
186
168
|
const envelope = buildContextEnvelope({
|
|
187
169
|
seed,
|
|
188
170
|
refine,
|
|
189
|
-
persona,
|
|
190
171
|
bodyTemplate,
|
|
191
172
|
duplicateCandidates,
|
|
192
173
|
techStack,
|
|
@@ -221,8 +202,7 @@ async function runPersist({
|
|
|
221
202
|
}
|
|
222
203
|
|
|
223
204
|
const title = extractTitle(body);
|
|
224
|
-
const
|
|
225
|
-
const labels = [TYPE_LABELS.STORY, `persona::${persona}`];
|
|
205
|
+
const labels = [TYPE_LABELS.STORY];
|
|
226
206
|
const argv = renderGhArgv({ title, bodyPath, labels });
|
|
227
207
|
|
|
228
208
|
if (dryRun) {
|
|
@@ -264,7 +244,7 @@ async function runPersist({
|
|
|
264
244
|
}
|
|
265
245
|
|
|
266
246
|
write(`${JSON.stringify({ issueNumber, title, labels }, null, 2)}\n`);
|
|
267
|
-
Logger.info(`Next: /
|
|
247
|
+
Logger.info(`Next: /deliver ${issueNumber}`);
|
|
268
248
|
}
|
|
269
249
|
|
|
270
250
|
/* node:coverage ignore next */
|
|
@@ -272,10 +252,9 @@ async function main() {
|
|
|
272
252
|
const { values } = parseArgs({
|
|
273
253
|
options: {
|
|
274
254
|
'emit-context': { type: 'boolean', default: false },
|
|
275
|
-
|
|
276
|
-
'
|
|
255
|
+
seed: { type: 'string' },
|
|
256
|
+
'seed-file': { type: 'string' },
|
|
277
257
|
body: { type: 'string' },
|
|
278
|
-
persona: { type: 'string' },
|
|
279
258
|
refine: { type: 'boolean', default: false },
|
|
280
259
|
'no-refine': { type: 'boolean', default: false },
|
|
281
260
|
pretty: { type: 'boolean', default: false },
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Projects .agents/agents/ (and .agents/local/agents/ when present) into a flat
|
|
5
|
+
* `.claude/agents/` tree so Claude Code exposes each role definition as a
|
|
6
|
+
* role-scoped sub-agent (`subagent_type: <name>`). Exact sibling of
|
|
7
|
+
* `sync-claude-commands.js` — same header, same local-shadow policy, same
|
|
8
|
+
* orphan-reap, same prune-exempt handling for the consumer-authored
|
|
9
|
+
* `.agents/local/agents/` source. Two source directories are enumerated in
|
|
10
|
+
* order:
|
|
11
|
+
*
|
|
12
|
+
* 1. PAYLOAD_SRC — `.agents/agents/` (the installed Mandrel payload)
|
|
13
|
+
* 2. LOCAL_SRC — `.agents/local/agents/` (consumer-authored, prune-exempt)
|
|
14
|
+
*
|
|
15
|
+
* The payload directory wins on basename collision: if both sources supply
|
|
16
|
+
* `foo.md`, the payload copy is projected and the local copy is ignored with a
|
|
17
|
+
* `shadowed` warning. Because both sources are unioned into `sourceSet`, local
|
|
18
|
+
* agent defs are also protected from the orphan-reap — they survive
|
|
19
|
+
* `npm install`, `mandrel sync`, and `mandrel update` with no manual re-sync.
|
|
20
|
+
*
|
|
21
|
+
* Only top-level `.md` files project (`.claude/agents/<name>.md`). Unlike the
|
|
22
|
+
* commands sync there is no `loops/` namespace and no plugin tree to reap — the
|
|
23
|
+
* agent surface is flat.
|
|
24
|
+
*
|
|
25
|
+
* A `.claude/agents/<name>.md` runs on its **own** system prompt — it does NOT
|
|
26
|
+
* inherit the `CLAUDE.md` @-import closure — so a spawn routed to a role agent
|
|
27
|
+
* stops re-paying the always-loaded context (issue #4478). The role defs
|
|
28
|
+
* @-import `security-baseline.md` so the inviolable security MUSTs stay
|
|
29
|
+
* single-sourced.
|
|
30
|
+
*
|
|
31
|
+
* Usage: node .agents/scripts/sync-claude-agents.js
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
// cli-opt-out: top-level-await script with no main() function — runAsCli wraps an async main, which doesn't apply here.
|
|
35
|
+
import fs from 'node:fs';
|
|
36
|
+
import path from 'node:path';
|
|
37
|
+
|
|
38
|
+
import { applyHeader } from './lib/command-header.js';
|
|
39
|
+
import { Logger } from './lib/Logger.js';
|
|
40
|
+
|
|
41
|
+
// Resolve the project root from the invocation cwd — the consumer project where
|
|
42
|
+
// `.agents/` is materialized and where Claude Code loads `.claude/agents/`.
|
|
43
|
+
// It MUST NOT use `__dirname/../..`: in an npm-installed consumer this script
|
|
44
|
+
// runs from `node_modules/mandrel/.agents/scripts/`, so that climb lands on the
|
|
45
|
+
// package dir and the defs would be written *inside node_modules* rather than
|
|
46
|
+
// the consumer. Every real invocation runs with cwd at the project root
|
|
47
|
+
// (`npm run sync:agents`, the prepare hook). Tests drive fixture trees via the
|
|
48
|
+
// SYNC_CLAUDE_AGENTS_SRC/DEST overrides below.
|
|
49
|
+
const PROJECT_ROOT = process.cwd();
|
|
50
|
+
|
|
51
|
+
// Env-var overrides exist so the sync logic can be exercised against a fixture
|
|
52
|
+
// agents tree in isolation. When unset, behaviour is unchanged — the script
|
|
53
|
+
// defaults to the real agents / .claude/agents directories. SYNC_CLAUDE_AGENTS_SRC
|
|
54
|
+
// overrides the PAYLOAD source only; LOCAL_SRC is always derived from the project
|
|
55
|
+
// root so fixture tests can isolate the payload source.
|
|
56
|
+
const PAYLOAD_SRC =
|
|
57
|
+
process.env.SYNC_CLAUDE_AGENTS_SRC ??
|
|
58
|
+
path.join(PROJECT_ROOT, '.agents', 'agents');
|
|
59
|
+
const LOCAL_SRC = path.join(PROJECT_ROOT, '.agents', 'local', 'agents');
|
|
60
|
+
|
|
61
|
+
const DEST_DIR =
|
|
62
|
+
process.env.SYNC_CLAUDE_AGENTS_DEST ??
|
|
63
|
+
path.join(PROJECT_ROOT, '.claude', 'agents');
|
|
64
|
+
|
|
65
|
+
export const HEADER =
|
|
66
|
+
'<!-- AUTO-GENERATED — do not edit. Source of truth: .agents/agents/ -->\n<!-- Re-run: npm run sync:agents -->\n\n';
|
|
67
|
+
|
|
68
|
+
export const LOCAL_HEADER =
|
|
69
|
+
'<!-- AUTO-GENERATED from .agents/local/ — do not edit. Source of truth: .agents/local/agents/ -->\n<!-- Re-run: npm run sync:agents -->\n\n';
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Return true when the given directory path exists and is accessible.
|
|
73
|
+
*
|
|
74
|
+
* @param {string} dir
|
|
75
|
+
* @returns {boolean}
|
|
76
|
+
*/
|
|
77
|
+
function dirExists(dir) {
|
|
78
|
+
try {
|
|
79
|
+
return fs.statSync(dir).isDirectory();
|
|
80
|
+
} catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
fs.mkdirSync(DEST_DIR, { recursive: true });
|
|
86
|
+
|
|
87
|
+
// Top-level .md files project flat. Subdirectories are skipped.
|
|
88
|
+
const isTopLevelAgent = (entry) => entry.isFile() && entry.name.endsWith('.md');
|
|
89
|
+
|
|
90
|
+
// Enumerate sources: payload first, then local (if it exists). Payload wins on
|
|
91
|
+
// basename collision — a consumer must not silently shadow a core role def.
|
|
92
|
+
const SRC_DIRS = [PAYLOAD_SRC, LOCAL_SRC].filter(dirExists);
|
|
93
|
+
|
|
94
|
+
/** @type {Array<{dir: string, name: string}>} */
|
|
95
|
+
const entries = SRC_DIRS.flatMap((dir) =>
|
|
96
|
+
fs
|
|
97
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
98
|
+
.filter(isTopLevelAgent)
|
|
99
|
+
.map((e) => ({ dir, name: e.name })),
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
// Collision policy: payload wins, warn on a shadowed local file.
|
|
103
|
+
const byName = new Map();
|
|
104
|
+
for (const e of entries) {
|
|
105
|
+
if (byName.has(e.name)) {
|
|
106
|
+
Logger.warn(` shadowed ${e.name} (local copy ignored; payload wins)`);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
byName.set(e.name, e);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// sourceSet drives the orphan-reap: any existing agent def not in this set is
|
|
113
|
+
// removed.
|
|
114
|
+
const sourceSet = new Set(byName.keys());
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* List the `.md` agent defs currently on disk in the destination.
|
|
118
|
+
*
|
|
119
|
+
* @returns {string[]}
|
|
120
|
+
*/
|
|
121
|
+
function listExistingAgents() {
|
|
122
|
+
try {
|
|
123
|
+
return fs.readdirSync(DEST_DIR).filter((f) => f.endsWith('.md'));
|
|
124
|
+
} catch {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
for (const name of listExistingAgents()) {
|
|
130
|
+
if (!sourceSet.has(name)) {
|
|
131
|
+
fs.unlinkSync(path.join(DEST_DIR, name));
|
|
132
|
+
Logger.info(` removed ${name} (no longer in .agents/agents)`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Copy each role def, injecting the auto-generated header after any leading
|
|
137
|
+
// frontmatter (so the `---` block stays on line 1 and Claude Code parses the
|
|
138
|
+
// agent's name/description). Use a distinct header comment for local-origin files.
|
|
139
|
+
let synced = 0;
|
|
140
|
+
const resolvedEntries = Array.from(byName.values());
|
|
141
|
+
await Promise.all(
|
|
142
|
+
resolvedEntries.map(async ({ dir, name }) => {
|
|
143
|
+
const isLocal = dir === LOCAL_SRC;
|
|
144
|
+
const header = isLocal ? LOCAL_HEADER : HEADER;
|
|
145
|
+
const content = await fs.promises.readFile(path.join(dir, name), 'utf8');
|
|
146
|
+
const dest = path.join(DEST_DIR, name);
|
|
147
|
+
const target = applyHeader(content, header);
|
|
148
|
+
|
|
149
|
+
// Skip write if content is already identical (avoid noisy git diffs).
|
|
150
|
+
try {
|
|
151
|
+
const existingContent = await fs.promises.readFile(dest, 'utf8');
|
|
152
|
+
if (existingContent === target) return;
|
|
153
|
+
} catch (err) {
|
|
154
|
+
if (err.code !== 'ENOENT') throw err;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
await fs.promises.writeFile(dest, target, 'utf8');
|
|
158
|
+
synced++;
|
|
159
|
+
Logger.info(` synced ${name}`);
|
|
160
|
+
}),
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
Logger.info(
|
|
164
|
+
`\n✔ ${synced} file(s) synced, ${sourceSet.size} total agents in .claude/agents/`,
|
|
165
|
+
);
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* .agents/scripts/update-ticket-state.js — CLI
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* This file preserves backward compatibility for CLI usage and existing
|
|
8
|
-
* testing patterns.
|
|
9
|
-
*
|
|
10
|
-
* Successor to the retired mandrel MCP tools. See ADR 20260424-702a in docs/decisions.md for the migration table.
|
|
2
|
+
* .agents/scripts/update-ticket-state.js — CLI entrypoint for ticket
|
|
3
|
+
* label transitions. Core logic lives in `lib/orchestration/ticketing.js`;
|
|
4
|
+
* this file is the operator-facing command surface (not a compatibility
|
|
5
|
+
* layer).
|
|
11
6
|
*/
|
|
12
7
|
|
|
13
8
|
import { parseArgs } from 'node:util';
|
|
14
9
|
import { resolveConfig } from './lib/config-resolver.js';
|
|
15
10
|
import { Logger } from './lib/Logger.js';
|
|
11
|
+
import {
|
|
12
|
+
enqueueLabel,
|
|
13
|
+
outboxPathFor,
|
|
14
|
+
} from './lib/orchestration/bookkeeping-outbox.js';
|
|
16
15
|
import {
|
|
17
16
|
cascadeCompletion,
|
|
18
17
|
STATE_LABELS,
|
|
@@ -29,25 +28,23 @@ if (
|
|
|
29
28
|
const { values } = parseArgs({
|
|
30
29
|
args: process.argv.slice(2),
|
|
31
30
|
options: {
|
|
32
|
-
task: { type: 'string' },
|
|
33
31
|
ticket: { type: 'string' },
|
|
34
32
|
state: { type: 'string' },
|
|
35
33
|
'remove-label': { type: 'string' },
|
|
34
|
+
buffer: { type: 'boolean' },
|
|
35
|
+
epic: { type: 'string' },
|
|
36
36
|
},
|
|
37
37
|
strict: false,
|
|
38
38
|
});
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
// ticket type, not just Tasks). Both continue to work.
|
|
42
|
-
const idSource = values.ticket ?? values.task;
|
|
43
|
-
const ticketId = Number.parseInt(idSource, 10);
|
|
40
|
+
const ticketId = Number.parseInt(values.ticket, 10);
|
|
44
41
|
const state = values.state;
|
|
45
42
|
const removeLabel = values['remove-label'];
|
|
46
43
|
|
|
47
44
|
if (Number.isNaN(ticketId) || (!state && !removeLabel)) {
|
|
48
45
|
throw new Error(
|
|
49
46
|
'Usage: node update-ticket-state.js ' +
|
|
50
|
-
'
|
|
47
|
+
'--ticket <id> ' +
|
|
51
48
|
'[--state <state> | --remove-label <label>]',
|
|
52
49
|
);
|
|
53
50
|
}
|
|
@@ -69,6 +66,31 @@ if (
|
|
|
69
66
|
return;
|
|
70
67
|
}
|
|
71
68
|
|
|
69
|
+
// Headless buffering (Epic #4476 M5): buffer an intermediate state flip to
|
|
70
|
+
// the per-Epic outbox instead of a live GitHub round-trip; finalize's
|
|
71
|
+
// bookkeeping-reconcile.js drains it once. `agent::blocked` (the HITL gate,
|
|
72
|
+
// §1.J) and `agent::done` (its cascade must run live) ALWAYS surface
|
|
73
|
+
// immediately and are never buffered. Requires --epic to locate the outbox.
|
|
74
|
+
if (
|
|
75
|
+
values.buffer &&
|
|
76
|
+
state !== STATE_LABELS.BLOCKED &&
|
|
77
|
+
state !== STATE_LABELS.DONE
|
|
78
|
+
) {
|
|
79
|
+
const epicId = Number.parseInt(values.epic ?? '', 10);
|
|
80
|
+
if (!Number.isInteger(epicId) || epicId <= 0) {
|
|
81
|
+
throw new Error('--buffer requires --epic <id>');
|
|
82
|
+
}
|
|
83
|
+
enqueueLabel({
|
|
84
|
+
outboxPath: outboxPathFor(epicId, config),
|
|
85
|
+
ticketId,
|
|
86
|
+
state,
|
|
87
|
+
});
|
|
88
|
+
Logger.info(
|
|
89
|
+
`[State-Sync] Buffered #${ticketId} → ${state} (headless; drained at finalize)`,
|
|
90
|
+
);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
72
94
|
Logger.info(
|
|
73
95
|
`[State-Sync] Transitioning ticket #${ticketId} to ${state}...`,
|
|
74
96
|
);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: analyze-execution
|
|
3
3
|
description: >-
|
|
4
|
-
Aggregate per-Story or per-
|
|
4
|
+
Aggregate per-Story or per-plan-run execution signals into a structured
|
|
5
5
|
perf-summary or perf-report and upsert it onto the corresponding GitHub
|
|
6
|
-
ticket. Use after a Story closes (Story mode) or
|
|
7
|
-
|
|
6
|
+
ticket. Use after a Story closes (Story mode) or during run closeout
|
|
7
|
+
(plan-run mode). Reads NDJSON via
|
|
8
8
|
`lib/signals/read` and writes a single structured comment.
|
|
9
9
|
allowed_tools:
|
|
10
10
|
- Read
|
|
@@ -16,42 +16,42 @@ allowed_tools:
|
|
|
16
16
|
## Policy Capsule
|
|
17
17
|
|
|
18
18
|
- Invoke via the wrapping CLI `node .agents/scripts/analyze-execution.js`; do not duplicate the read/write logic from this Skill body.
|
|
19
|
-
- Resolve mode strictly by flags:
|
|
20
|
-
- Read NDJSON signals only through `lib/signals/read` (the async-iterator entry point). Never open `<tempRoot>/
|
|
19
|
+
- Resolve mode strictly by flags: Story + run id → Story mode; run id alone → plan-run mode. The current CLI still spells the run-id flag as `--epic <id>`; treat that value as the run id and do not add a second executor path here.
|
|
20
|
+
- Read NDJSON signals only through `lib/signals/read` (the async-iterator entry point). Never open `<tempRoot>/run-<id>/stories/story-<sid>/signals.ndjson` directly — the reader owns the warn-once malformed-JSON policy.
|
|
21
21
|
- Emit a single structured GitHub comment per ticket (`<!-- structured:story-perf-summary -->` or `<!-- structured:epic-perf-report -->`); rely on `upsertStructuredComment` for idempotence — never post duplicates.
|
|
22
|
-
- Never rename or alter the structured-marker IDs; the retro composer and
|
|
22
|
+
- Never rename or alter the structured-marker IDs; the retro composer and run dashboard grep them verbatim.
|
|
23
23
|
- Validate the structured payload against `docs/data-dictionary.md §StoryPerfSummary` or `§EpicPerfReport` before posting. Schema violations exit non-zero.
|
|
24
|
-
- Soft-fail (exit 0 with a warning) when NDJSON is missing for a Story or
|
|
24
|
+
- Soft-fail (exit 0 with a warning) when NDJSON is missing for a Story or a plan-run has no children — observability output MUST NOT block the close pipeline.
|
|
25
25
|
- Do not write to disk. Persistence is GitHub; the Skill is read-NDJSON + post-comment only.
|
|
26
26
|
|
|
27
27
|
## Role
|
|
28
28
|
|
|
29
29
|
Observability writer. Composes the structured `story-perf-summary` /
|
|
30
30
|
`epic-perf-report` comment bodies the retro composer downstream renders
|
|
31
|
-
into the
|
|
31
|
+
into the run dashboard.
|
|
32
32
|
|
|
33
33
|
## When to use
|
|
34
34
|
|
|
35
|
-
- **Story mode** — after `story-close.js` finishes, the
|
|
35
|
+
- **Story mode** — after `single-story-close.js` finishes, the close
|
|
36
36
|
pipeline dispatches this Skill (or the wrapping script) to roll up the
|
|
37
37
|
Story's NDJSON signals into a single `<!-- structured:story-perf-summary -->`
|
|
38
38
|
marker comment on the Story ticket.
|
|
39
|
-
- **
|
|
40
|
-
composer), the Skill fans out across every Story under the
|
|
39
|
+
- **Plan-run mode** — during run closeout (or the retro
|
|
40
|
+
composer), the Skill fans out across every Story under the plan-run,
|
|
41
41
|
reads each Story's structured perf summary, and posts a single
|
|
42
|
-
`<!-- structured:epic-perf-report -->` marker on the
|
|
42
|
+
`<!-- structured:epic-perf-report -->` marker on the run ticket.
|
|
43
43
|
|
|
44
44
|
## Inputs
|
|
45
45
|
|
|
46
46
|
The Skill reads (never writes) the NDJSON signal stream at:
|
|
47
47
|
|
|
48
48
|
```text
|
|
49
|
-
<tempRoot>/
|
|
49
|
+
<tempRoot>/run-<id>/stories/story-<sid>/signals.ndjson
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
Use the `lib/signals/read` async-iterator entry point — never open the
|
|
53
53
|
file directly. Story mode also reads `phase-timings.json` written by
|
|
54
|
-
|
|
54
|
+
the close pipeline.
|
|
55
55
|
|
|
56
56
|
## Outputs
|
|
57
57
|
|
|
@@ -64,8 +64,8 @@ the new one.
|
|
|
64
64
|
|
|
65
65
|
### Step 1 — Resolve mode
|
|
66
66
|
|
|
67
|
-
If both
|
|
68
|
-
If only
|
|
67
|
+
If both Story id and run id are supplied → Story mode.
|
|
68
|
+
If only run id is supplied → plan-run mode. The script
|
|
69
69
|
`analyze-execution.js` is the dispatcher today; this Skill documents the
|
|
70
70
|
contract the dispatcher implements.
|
|
71
71
|
|
|
@@ -77,6 +77,9 @@ node .agents/scripts/analyze-execution.js --story <sid> --epic <eid>
|
|
|
77
77
|
node .agents/scripts/analyze-execution.js --epic <eid>
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
+
`--epic <eid>` is the legacy spelling of the run-id flag in the current
|
|
81
|
+
CLI; treat `<eid>` as the run id for path/layout purposes.
|
|
82
|
+
|
|
80
83
|
### Step 3 — Validate the structured payload before posting
|
|
81
84
|
|
|
82
85
|
The payload must conform to `docs/data-dictionary.md §StoryPerfSummary`
|
|
@@ -92,7 +95,7 @@ the contract so we never silently emit malformed comments.
|
|
|
92
95
|
- Do **not** rename the structured-marker IDs
|
|
93
96
|
(`<!-- structured:story-perf-summary -->`,
|
|
94
97
|
`<!-- structured:epic-perf-report -->`); the retro composer and the
|
|
95
|
-
|
|
98
|
+
run dashboard both grep for them verbatim.
|
|
96
99
|
- Soft-failure mode is intentional: missing NDJSON for a Story or no
|
|
97
|
-
children for
|
|
100
|
+
children for a plan-run returns exit 0 with a warning so close pipelines
|
|
98
101
|
never block on observability output.
|
|
@@ -19,7 +19,7 @@ description:
|
|
|
19
19
|
- Define the contract before implementing — interfaces are the spec; implementation follows.
|
|
20
20
|
- Validate at system **boundaries** (API routes, form handlers, env-var loaders, third-party responses) using a strict schema. After validation, internal code trusts the types; do not re-validate between internal functions.
|
|
21
21
|
- Treat third-party API responses as untrusted data — validate shape and content before using them in any decision, render, or logic path.
|
|
22
|
-
- Prefer **addition over modification**: extend interfaces with optional fields rather than changing existing types or removing fields
|
|
22
|
+
- Prefer **addition over modification**: extend interfaces with optional fields rather than changing existing types or removing fields. When removal is unavoidable, use an expand–contract migration — ship the replacement, migrate consumers, then remove the old surface in a later release.
|
|
23
23
|
- Follow REST resource conventions (`GET/POST/PATCH/DELETE /resource`, sub-resources at `/resource/:id/child`) and paginate every list endpoint with `page` + `pageSize` query params and a `pagination` envelope.
|
|
24
24
|
- Security input-validation and test-tier MUSTs come from `.agents/rules/security-baseline.md` and `.agents/rules/testing-standards.md` respectively — apply both, and never put DB/wire-shape assertions outside the contract tier.
|
|
25
25
|
|
|
@@ -55,8 +55,10 @@ ordering — becomes a de facto contract once users depend on it. Implications:
|
|
|
55
55
|
potential commitment.
|
|
56
56
|
- **Don't leak implementation details.** If users can observe it, they will
|
|
57
57
|
depend on it.
|
|
58
|
-
- **Plan for deprecation at design time.**
|
|
59
|
-
|
|
58
|
+
- **Plan for deprecation at design time.** Remove things users depend on via
|
|
59
|
+
expand–contract: add the replacement, migrate consumers behind a deprecation
|
|
60
|
+
window, then delete the old surface — never break a published contract in one
|
|
61
|
+
step.
|
|
60
62
|
- **Tests are not enough.** Even with perfect contract tests, "safe" changes
|
|
61
63
|
can break real users who depend on undocumented behavior.
|
|
62
64
|
|