mandrel 2.0.0 → 2.2.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 -28
- package/.agents/agents/acceptance-critic.md +20 -9
- package/.agents/agents/story-worker.md +45 -48
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +60 -46
- package/.agents/docs/agentrc-reference.json +8 -13
- package/.agents/docs/configuration.md +33 -57
- package/.agents/docs/execution-reference.md +39 -10
- package/.agents/docs/quality-gates.md +17 -19
- package/.agents/docs/workflows.md +6 -6
- package/.agents/instructions.md +64 -79
- package/.agents/rules/ci-remediation.md +3 -3
- package/.agents/rules/gherkin-standards.md +10 -0
- package/.agents/rules/git-conventions-reference.md +42 -51
- package/.agents/schemas/acceptance-eval-verdict.schema.json +2 -2
- package/.agents/schemas/agentrc.schema.json +35 -46
- package/.agents/schemas/audit-rules.json +59 -1
- package/.agents/schemas/audit-rules.schema.json +33 -1
- package/.agents/schemas/lifecycle/README.md +1 -2
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
- package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
- package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
- package/.agents/schemas/signal-event.schema.json +3 -3
- package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/acceptance-eval.js +24 -68
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/bootstrap.js +3 -3
- package/.agents/scripts/check-dead-exports.js +43 -104
- package/.agents/scripts/check-doc-links.js +2 -2
- package/.agents/scripts/check-lifecycle-lint.js +1 -1
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- package/.agents/scripts/deliver-recover.js +122 -0
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +20 -50
- package/.agents/scripts/generate-skills-index.js +17 -1
- package/.agents/scripts/generate-workflows-doc.js +4 -4
- package/.agents/scripts/lib/ITicketingProvider.js +1 -19
- package/.agents/scripts/lib/audit-suite/selector.js +323 -23
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -11
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
- package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -1
- package/.agents/scripts/lib/checks/index.js +1 -1
- package/.agents/scripts/lib/checks/loop-health.js +12 -11
- package/.agents/scripts/lib/checks/state.js +17 -248
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +3 -3
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
- package/.agents/scripts/lib/cli-args.js +23 -2
- package/.agents/scripts/lib/close-validation/gates.js +13 -13
- package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
- package/.agents/scripts/lib/close-validation/runner.js +13 -21
- package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
- package/.agents/scripts/lib/config/acceptance-eval.js +2 -2
- package/.agents/scripts/lib/config/delivery-routing.js +7 -6
- package/.agents/scripts/lib/config/explain.js +10 -16
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +15 -25
- package/.agents/scripts/lib/config/quality.js +11 -14
- package/.agents/scripts/lib/config/runners.js +8 -21
- package/.agents/scripts/lib/config/temp-paths.js +18 -56
- package/.agents/scripts/lib/config-settings-schema-delivery.js +34 -16
- package/.agents/scripts/lib/config-settings-schema-quality.js +9 -2
- package/.agents/scripts/lib/config-settings-schema.js +48 -22
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/duplicate-search.js +38 -7
- package/.agents/scripts/lib/findings/promote-finding.js +23 -14
- package/.agents/scripts/lib/format-generated-json.js +97 -0
- package/.agents/scripts/lib/framework-version.js +19 -189
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-lifecycle.js +0 -158
- package/.agents/scripts/lib/git-utils.js +0 -14
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +0 -15
- package/.agents/scripts/lib/label-taxonomy.js +1 -12
- package/.agents/scripts/lib/observability/active-story-env.js +42 -163
- package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
- package/.agents/scripts/lib/observability/signal-validator.js +4 -4
- package/.agents/scripts/lib/observability/signals-writer.js +6 -82
- package/.agents/scripts/lib/observability/source-classifier.js +2 -2
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +43 -45
- package/.agents/scripts/lib/orchestration/change-set.js +103 -0
- package/.agents/scripts/lib/orchestration/code-review.js +70 -191
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +3 -3
- package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +9 -11
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +7 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
- package/.agents/scripts/lib/orchestration/merge-block-class.js +76 -20
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/plan-context.js +116 -33
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +26 -36
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +31 -22
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +16 -6
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +173 -25
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +280 -100
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +472 -55
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +21 -16
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +230 -0
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +41 -40
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +1 -2
- package/.agents/scripts/lib/orchestration/planning/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/retro-proposals.js +7 -7
- package/.agents/scripts/lib/orchestration/review-depth.js +105 -40
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
- package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
- package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
- package/.agents/scripts/lib/orchestration/run-epilogue.js +374 -16
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +24 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +4 -13
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +72 -30
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +12 -8
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +264 -43
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +104 -279
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +191 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +120 -0
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +75 -14
- package/.agents/scripts/lib/orchestration/story-init-remote.js +12 -8
- package/.agents/scripts/lib/orchestration/story-plan-state.js +14 -29
- package/.agents/scripts/lib/orchestration/task-body-validator.js +52 -7
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +119 -14
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +3 -4
- package/.agents/scripts/lib/orchestration/ticket-validator.js +121 -18
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -47
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +19 -32
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +61 -1
- package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
- package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
- package/.agents/scripts/lib/planning-corpus.js +12 -286
- package/.agents/scripts/lib/preflight-runner.js +2 -2
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
- package/.agents/scripts/lib/signals/index.js +4 -17
- package/.agents/scripts/lib/signals/read.js +35 -35
- package/.agents/scripts/lib/signals/schema.js +8 -11
- package/.agents/scripts/lib/signals/span-tree.js +7 -7
- package/.agents/scripts/lib/signals/write.js +0 -1
- package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
- package/.agents/scripts/lib/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +8 -7
- package/.agents/scripts/lib/story-body/story-body.js +81 -13
- package/.agents/scripts/lib/templates/decomposer-prompts.js +15 -16
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/ticket-body-sections.js +0 -14
- package/.agents/scripts/lib/validation-evidence.js +31 -59
- package/.agents/scripts/lib/wave-runner/live-probe.js +315 -0
- package/.agents/scripts/lib/wave-runner/ready-set.js +32 -6
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +68 -19
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- package/.agents/scripts/plan-context.js +38 -7
- package/.agents/scripts/plan-critics.js +203 -0
- package/.agents/scripts/plan-persist.js +145 -35
- package/.agents/scripts/plan-run-epilogue.js +83 -38
- package/.agents/scripts/post-structured-comment.js +0 -38
- package/.agents/scripts/pr-watch-with-update.js +43 -22
- package/.agents/scripts/providers/github/compose.js +0 -1
- package/.agents/scripts/providers/github/errors.js +0 -19
- package/.agents/scripts/providers/github/issues.js +1 -11
- package/.agents/scripts/providers/github/mappers.js +5 -0
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -153
- package/.agents/scripts/providers/github.js +17 -6
- package/.agents/scripts/quality-preview.js +13 -6
- package/.agents/scripts/resolve-stories.js +236 -0
- package/.agents/scripts/run-coverage.js +4 -1
- package/.agents/scripts/run-lint.js +2 -2
- package/.agents/scripts/run-verify.js +31 -2
- package/.agents/scripts/signals-view.js +9 -10
- package/.agents/scripts/single-story-close.js +173 -18
- package/.agents/scripts/single-story-confirm-merge.js +288 -15
- package/.agents/scripts/single-story-init.js +6 -10
- package/.agents/scripts/stories-wave-tick.js +380 -53
- package/.agents/scripts/story-plan.js +3 -3
- package/.agents/scripts/update-ticket-state.js +8 -50
- package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
- package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
- package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
- package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
- package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
- package/.agents/skills/core/idea-refinement/SKILL.md +3 -3
- package/.agents/skills/core/scope-triage/SKILL.md +3 -0
- package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
- package/.agents/skills/core/security-and-hardening/reference.md +375 -0
- package/.agents/skills/skills.index.json +2 -12
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
- package/.agents/workflows/audit-architecture.md +3 -4
- package/.agents/workflows/audit-clean-code.md +4 -4
- package/.agents/workflows/audit-documentation.md +4 -5
- package/.agents/workflows/audit-lighthouse.md +8 -0
- package/.agents/workflows/audit-navigability.md +10 -0
- package/.agents/workflows/audit-performance.md +2 -3
- package/.agents/workflows/audit-quality.md +8 -9
- package/.agents/workflows/audit-security.md +1 -2
- package/.agents/workflows/audit-seo.md +10 -0
- package/.agents/workflows/audit-ux-ui.md +7 -0
- package/.agents/workflows/deliver.md +133 -45
- package/.agents/workflows/git-cleanup.md +2 -2
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +34 -17
- package/.agents/workflows/helpers/code-quality-guardrails.md +15 -12
- package/.agents/workflows/helpers/code-review.md +14 -12
- package/.agents/workflows/helpers/deliver-story-reference.md +73 -32
- package/.agents/workflows/helpers/deliver-story.md +209 -118
- package/.agents/workflows/helpers/parallel-tooling.md +2 -2
- package/.agents/workflows/helpers/worktree-lifecycle.md +28 -32
- package/.agents/workflows/plan.md +239 -19
- package/.agents/workflows/qa-assist.md +6 -6
- package/.agents/workflows/qa-explore.md +3 -3
- package/.agents/workflows/qa-run.md +1 -5
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +62 -0
- package/lib/cli/registry.js +262 -19
- package/lib/cli/sync-agents.js +157 -0
- package/lib/cli/sync-commands.js +115 -6
- package/lib/cli/sync.js +168 -6
- package/lib/cli/update.js +105 -8
- package/lib/cli/version-helpers.js +131 -0
- package/lib/migrations/README.md +7 -5
- package/lib/migrations/index.js +17 -9
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +154 -0
- package/package.json +2 -2
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -53
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
- package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -187
- package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
- package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
- package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +0 -128
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -273
- package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
- package/.agents/scripts/lib/orchestration/planning/risk-verdict.js +0 -104
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
- package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -21
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -397
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- package/.agents/scripts/lib/orchestration/resolve-plan-run.js +0 -155
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/story-progress/story-run-progress-writer.js +0 -400
- package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +0 -36
- package/.agents/scripts/resolve-plan-run.js +0 -117
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -101
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* deliver-recover.js — probe a stranded Story's live state and print the ONE
|
|
5
|
+
* command that resumes it (Story #4543).
|
|
6
|
+
*
|
|
7
|
+
* Read-only by construction. This CLI mutates nothing: it reads the ticket's
|
|
8
|
+
* labels and lease, the Story branch locally and via its tracking ref, the
|
|
9
|
+
* worktree, and the PR (state + checks), then walks a fixed decision table
|
|
10
|
+
* and prints one command with the evidence it was derived from. It never
|
|
11
|
+
* prints a menu — a menu of options is what the operator already has, and it
|
|
12
|
+
* is the thing they cannot act on.
|
|
13
|
+
*
|
|
14
|
+
* The strand this exists for above all others is the **merged-but-label-stale**
|
|
15
|
+
* Story: a `/deliver` re-run refuses it outright, because
|
|
16
|
+
* `single-story-init.js` hard-errors on an already-closed Story. Before this
|
|
17
|
+
* surface, that Story had no automated way back.
|
|
18
|
+
*
|
|
19
|
+
* Usage:
|
|
20
|
+
* node .agents/scripts/deliver-recover.js --story <STORY_ID> [--cwd <main-repo>]
|
|
21
|
+
* [--json]
|
|
22
|
+
*
|
|
23
|
+
* Exit codes:
|
|
24
|
+
* 0 — a recovery shape was resolved and its next command printed (including
|
|
25
|
+
* the "nothing to recover" shapes). Reading state is not a failure.
|
|
26
|
+
* 1 — the probe itself could not run (unreadable ticket, bad input).
|
|
27
|
+
*
|
|
28
|
+
* @see .agents/scripts/lib/orchestration/deliver-recover.js
|
|
29
|
+
* @see .agents/schemas/story-deliver-terminal.schema.json
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import { parseArgs } from 'node:util';
|
|
33
|
+
import { runAsCli } from './lib/cli-utils.js';
|
|
34
|
+
import { resolveConfig } from './lib/config-resolver.js';
|
|
35
|
+
import { Logger } from './lib/Logger.js';
|
|
36
|
+
import {
|
|
37
|
+
recoverStory,
|
|
38
|
+
renderRecovery,
|
|
39
|
+
} from './lib/orchestration/deliver-recover.js';
|
|
40
|
+
import { PROJECT_ROOT } from './lib/project-root.js';
|
|
41
|
+
import { createProvider } from './lib/provider-factory.js';
|
|
42
|
+
|
|
43
|
+
const HELP = `Usage: node .agents/scripts/deliver-recover.js --story <id> [--cwd <main-repo>] [--json]
|
|
44
|
+
|
|
45
|
+
Probes a Story's live delivery state — labels, lease, branch, worktree, PR
|
|
46
|
+
state and checks — and prints the single next command that resumes it, with
|
|
47
|
+
the evidence it was derived from. Read-only: mutates nothing.
|
|
48
|
+
|
|
49
|
+
Flags:
|
|
50
|
+
--story GitHub issue number of the Story (required).
|
|
51
|
+
--cwd Main-repo checkout to probe (default: project root).
|
|
52
|
+
--json Emit the full recovery envelope as JSON instead of prose.
|
|
53
|
+
--help Show this message.
|
|
54
|
+
`;
|
|
55
|
+
|
|
56
|
+
export function parseArgv(argv) {
|
|
57
|
+
const { values } = parseArgs({
|
|
58
|
+
args: argv,
|
|
59
|
+
options: {
|
|
60
|
+
story: { type: 'string' },
|
|
61
|
+
cwd: { type: 'string' },
|
|
62
|
+
json: { type: 'boolean', default: false },
|
|
63
|
+
help: { type: 'boolean', default: false },
|
|
64
|
+
},
|
|
65
|
+
strict: false,
|
|
66
|
+
});
|
|
67
|
+
return {
|
|
68
|
+
storyId: Number.parseInt(String(values.story ?? ''), 10),
|
|
69
|
+
cwd: values.cwd ?? null,
|
|
70
|
+
json: Boolean(values.json),
|
|
71
|
+
help: Boolean(values.help),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Probe and report. Exported for testing.
|
|
77
|
+
*/
|
|
78
|
+
export async function runDeliverRecover({
|
|
79
|
+
storyId: storyIdParam,
|
|
80
|
+
cwd: cwdParam,
|
|
81
|
+
json: jsonParam,
|
|
82
|
+
argv,
|
|
83
|
+
injectedProvider,
|
|
84
|
+
injectedConfig,
|
|
85
|
+
injectedGh,
|
|
86
|
+
injectedGitSpawn,
|
|
87
|
+
} = {}) {
|
|
88
|
+
const parsed =
|
|
89
|
+
storyIdParam !== undefined
|
|
90
|
+
? { storyId: storyIdParam, cwd: cwdParam ?? null, json: !!jsonParam }
|
|
91
|
+
: parseArgv(argv ?? process.argv.slice(2));
|
|
92
|
+
|
|
93
|
+
if (parsed.help) {
|
|
94
|
+
Logger.info(HELP);
|
|
95
|
+
return { success: true, result: null };
|
|
96
|
+
}
|
|
97
|
+
if (!Number.isInteger(parsed.storyId) || parsed.storyId <= 0) {
|
|
98
|
+
throw new Error(
|
|
99
|
+
'Usage: node deliver-recover.js --story <STORY_ID> [--cwd <main-repo>] [--json]',
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const cwd = parsed.cwd ?? PROJECT_ROOT;
|
|
104
|
+
const config = injectedConfig || resolveConfig({ cwd });
|
|
105
|
+
const provider = injectedProvider || createProvider(config);
|
|
106
|
+
|
|
107
|
+
const recovery = await recoverStory({
|
|
108
|
+
storyId: parsed.storyId,
|
|
109
|
+
cwd,
|
|
110
|
+
provider,
|
|
111
|
+
config,
|
|
112
|
+
gh: injectedGh,
|
|
113
|
+
gitSpawnFn: injectedGitSpawn,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
Logger.info(
|
|
117
|
+
parsed.json ? JSON.stringify(recovery, null, 2) : renderRecovery(recovery),
|
|
118
|
+
);
|
|
119
|
+
return { success: true, result: recovery };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
runAsCli(import.meta.url, runDeliverRecover, { source: 'deliver-recover' });
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* any still-stuck entries by enumerating the processes holding handles
|
|
9
9
|
* inside the worktree path and terminating them.
|
|
10
10
|
*
|
|
11
|
-
* Invoked by `/deliver
|
|
11
|
+
* Invoked by `/deliver` and `/plan`
|
|
12
12
|
* (via `drainPendingCleanupAtBoot` → `worktree-sweep.js`), and
|
|
13
13
|
* `story-close` so the pending-cleanup ledger drains automatically
|
|
14
14
|
* across the sprint lifecycle. Operators can also run it standalone:
|
|
@@ -13,42 +13,22 @@
|
|
|
13
13
|
*
|
|
14
14
|
* Usage:
|
|
15
15
|
* node .agents/scripts/evidence-gate.js \
|
|
16
|
-
*
|
|
16
|
+
* --standalone --scope-id <storyId> --gate <name> \
|
|
17
17
|
* [--worktree <path>] [--no-evidence] -- <cmd> [args...]
|
|
18
18
|
*
|
|
19
19
|
* Examples:
|
|
20
|
-
* node .agents/scripts/evidence-gate.js --epic-id 802 --scope-id 817 --gate lint -- npm run lint
|
|
21
|
-
* node .agents/scripts/evidence-gate.js --epic-id 1030 --scope-id 1030 --gate test -- npm test
|
|
22
|
-
* node .agents/scripts/evidence-gate.js --epic-id 1114 --scope-id 1120 --gate test \
|
|
23
|
-
* --worktree .worktrees/story-1120 -- npm test
|
|
24
20
|
* node .agents/scripts/evidence-gate.js --standalone --scope-id 4250 --gate lint \
|
|
25
21
|
* --worktree .worktrees/story-4250 -- npm run lint
|
|
22
|
+
* node .agents/scripts/evidence-gate.js --standalone --scope-id 4250 --gate test \
|
|
23
|
+
* --worktree .worktrees/story-4250 -- npm test
|
|
26
24
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* (`<tempRoot>/epic-<eid>/validation-evidence.json`); when `scope-id !==
|
|
30
|
-
* epic-id` it is Story-scoped under
|
|
31
|
-
* `<tempRoot>/epic-<eid>/story-<sid>/validation-evidence.json`. With
|
|
32
|
-
* `--standalone` (Story #4250) the file is anchored on the Story id alone at
|
|
25
|
+
* `--standalone` (Story #4250) is required: the evidence file is anchored on
|
|
26
|
+
* the Story id at
|
|
33
27
|
* `<tempRoot>/standalone/stories/story-<sid>/validation-evidence.json` — the
|
|
34
28
|
* same keyspace the standalone close consults, so the acceptance-self-eval
|
|
35
29
|
* critic's verify[] runs (lint / typecheck) are shared with the close.
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* is the *evidence cwd* — it locates the per-Epic temp tree under the main
|
|
39
|
-
* checkout's `.git/`. `--worktree` is the *spawn cwd* — when supplied, the
|
|
40
|
-
* gate runner is launched with `cwd: <worktree>` and the HEAD-SHA used as
|
|
41
|
-
* the evidence key is read from the worktree (so caching keys to the Story
|
|
42
|
-
* branch's HEAD, not the main branch's). When `--worktree` is omitted,
|
|
43
|
-
* spawn cwd falls back to `--cwd` (legacy single-tree behaviour).
|
|
44
|
-
*
|
|
45
|
-
* Exit codes:
|
|
46
|
-
* 0 — gate passed (or skipped via evidence)
|
|
47
|
-
* N — gate failed (passes through the runner's exit code)
|
|
48
|
-
*
|
|
49
|
-
* `--no-evidence` forces the runner regardless of recorded state. The
|
|
50
|
-
* evidence file is gitignored — evidence is a perf optimization, not a
|
|
51
|
-
* trust boundary; pre-push hooks and CI continue to verify independently.
|
|
30
|
+
* v2.0.0 removed the Epic tier along with the `--epic-id` Epic-keyed
|
|
31
|
+
* keyspace.
|
|
52
32
|
*/
|
|
53
33
|
|
|
54
34
|
import { spawnSync } from 'node:child_process';
|
|
@@ -88,7 +68,6 @@ export function parseWrapperArgs(argv) {
|
|
|
88
68
|
args: argv,
|
|
89
69
|
options: {
|
|
90
70
|
'scope-id': { type: 'string' },
|
|
91
|
-
'epic-id': { type: 'string' },
|
|
92
71
|
gate: { type: 'string' },
|
|
93
72
|
'no-evidence': { type: 'boolean', default: false },
|
|
94
73
|
standalone: { type: 'boolean', default: false },
|
|
@@ -98,10 +77,8 @@ export function parseWrapperArgs(argv) {
|
|
|
98
77
|
strict: false,
|
|
99
78
|
});
|
|
100
79
|
const scopeId = Number.parseInt(values['scope-id'] ?? '', 10);
|
|
101
|
-
const epicId = Number.parseInt(values['epic-id'] ?? '', 10);
|
|
102
80
|
return {
|
|
103
81
|
scopeId: Number.isNaN(scopeId) || scopeId <= 0 ? null : scopeId,
|
|
104
|
-
epicId: Number.isNaN(epicId) || epicId <= 0 ? null : epicId,
|
|
105
82
|
standalone: values.standalone === true,
|
|
106
83
|
gate: values.gate ?? null,
|
|
107
84
|
useEvidence: values['no-evidence'] !== true,
|
|
@@ -126,15 +103,13 @@ function resolveHeadShaDefault(cwd, gitSpawnFn) {
|
|
|
126
103
|
* Exported for tests + the CLI `main()`.
|
|
127
104
|
*
|
|
128
105
|
* @param {object} params
|
|
129
|
-
* @param {number} params.scopeId — Story
|
|
130
|
-
* @param {
|
|
131
|
-
*
|
|
132
|
-
* storyId-anchored standalone keyspace instead of the Epic-keyed path
|
|
133
|
-
* (Story #4250). Substitutes for `epicId`.
|
|
106
|
+
* @param {number} params.scopeId — Story ID (positive integer).
|
|
107
|
+
* @param {boolean} [params.standalone] — Required. Routes to the
|
|
108
|
+
* storyId-anchored standalone keyspace (Story #4250).
|
|
134
109
|
* @param {string} params.gate — Logical gate name (`lint`, `typecheck`, …).
|
|
135
110
|
* @param {boolean} params.useEvidence — When false, force the runner.
|
|
136
|
-
* @param {string} params.cwd — Evidence cwd (locates the
|
|
137
|
-
*
|
|
111
|
+
* @param {string} params.cwd — Evidence cwd (locates the temp
|
|
112
|
+
* tree). The runner is spawned in `worktreePath` when set, else `cwd`.
|
|
138
113
|
* @param {string|null} [params.worktreePath] — Spawn cwd override (Story #1120).
|
|
139
114
|
* When set, the runner runs in the Story worktree and the HEAD-SHA used as
|
|
140
115
|
* the evidence cache key is read from the worktree, not from `cwd`.
|
|
@@ -159,7 +134,6 @@ export async function runEvidenceGate(params, deps = {}) {
|
|
|
159
134
|
} = deps;
|
|
160
135
|
const {
|
|
161
136
|
scopeId,
|
|
162
|
-
epicId,
|
|
163
137
|
standalone = false,
|
|
164
138
|
gate,
|
|
165
139
|
useEvidence,
|
|
@@ -168,31 +142,27 @@ export async function runEvidenceGate(params, deps = {}) {
|
|
|
168
142
|
runnerArgs,
|
|
169
143
|
} = params ?? {};
|
|
170
144
|
|
|
171
|
-
// `--
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
// can record verify[] evidence into the same keyspace the standalone close
|
|
175
|
-
// consults.
|
|
145
|
+
// `--standalone` (Story #4250) routes the evidence file to the
|
|
146
|
+
// storyId-anchored keyspace so the acceptance-self-eval critic can record
|
|
147
|
+
// verify[] evidence into the same keyspace the standalone close consults.
|
|
176
148
|
if (
|
|
177
149
|
!scopeId ||
|
|
178
|
-
|
|
150
|
+
!standalone ||
|
|
179
151
|
!gate ||
|
|
180
152
|
!runnerArgs ||
|
|
181
153
|
runnerArgs.length === 0
|
|
182
154
|
) {
|
|
183
155
|
logger.fatal(
|
|
184
|
-
'Usage: node evidence-gate.js
|
|
156
|
+
'Usage: node evidence-gate.js --standalone --scope-id <id> --gate <name> [--worktree <path>] [--no-evidence] -- <cmd> [args...]',
|
|
185
157
|
);
|
|
186
158
|
return { status: 1, skipped: false };
|
|
187
159
|
}
|
|
188
|
-
// Evidence-store opts shared by shouldSkip + recordPass below.
|
|
189
|
-
|
|
190
|
-
// resolves under `epicId`.
|
|
191
|
-
const evidenceStoreOpts = { cwd, epicId, standalone };
|
|
160
|
+
// Evidence-store opts shared by shouldSkip + recordPass below.
|
|
161
|
+
const evidenceStoreOpts = { cwd, standalone };
|
|
192
162
|
|
|
193
163
|
// Spawn cwd is the worktree when supplied — every gate command sees the
|
|
194
164
|
// Story branch's tree, not the main checkout. Evidence cwd stays anchored
|
|
195
|
-
// to the main checkout so the
|
|
165
|
+
// to the main checkout so the temp tree resolves under the main
|
|
196
166
|
// `.git/`. The HEAD-SHA used as the cache key is read from the spawn cwd
|
|
197
167
|
// (the worktree), so cache entries key against the Story branch's HEAD.
|
|
198
168
|
const spawnCwd = worktreePath ?? cwd;
|
|
@@ -21,6 +21,11 @@
|
|
|
21
21
|
// --out <file> Override the manifest output path (defaults to
|
|
22
22
|
// `<root>/.agents/skills/skills.index.json`).
|
|
23
23
|
//
|
|
24
|
+
// Written output is passed through the project formatter (Biome) so that
|
|
25
|
+
// regenerating on a clean tree leaves no format drift behind; the step is
|
|
26
|
+
// best-effort and degrades to plain `JSON.stringify` output where Biome is
|
|
27
|
+
// not installed. See `lib/format-generated-json.js`.
|
|
28
|
+
//
|
|
24
29
|
// Honors AGENT_LOG_LEVEL via the shared `Logger`. Stdout is reserved for
|
|
25
30
|
// the diff text in --check failure mode; informational progress goes to
|
|
26
31
|
// stderr.
|
|
@@ -30,6 +35,7 @@ import path from 'node:path';
|
|
|
30
35
|
import { fileURLToPath } from 'node:url';
|
|
31
36
|
import { parseStandardCliArgs } from './lib/cli/standard-args.js';
|
|
32
37
|
import { runAsCli } from './lib/cli-utils.js';
|
|
38
|
+
import { formatGeneratedJson } from './lib/format-generated-json.js';
|
|
33
39
|
import { Logger } from './lib/Logger.js';
|
|
34
40
|
import { parseSkill } from './lib/skills/parse-skill.js';
|
|
35
41
|
import { collectSkillFiles } from './lib/skills/walk-skill-files.js';
|
|
@@ -125,6 +131,12 @@ export function buildManifest(repoRoot, { nowIso } = {}) {
|
|
|
125
131
|
* Serialize a manifest object as canonical JSON: 2-space indent,
|
|
126
132
|
* trailing newline. Two runs against an unchanged corpus produce
|
|
127
133
|
* byte-identical output modulo `generatedAt`.
|
|
134
|
+
*
|
|
135
|
+
* This is the *pre-format* shape. `JSON.stringify` expands every array
|
|
136
|
+
* across multiple lines, while Biome collapses short ones that fit
|
|
137
|
+
* inside `lineWidth` (`"allowedTools": ["Read", "Bash"]`). Writing this
|
|
138
|
+
* text verbatim therefore leaves the tree format-dirty on every run —
|
|
139
|
+
* see `lib/format-generated-json.js`, which reconciles the two.
|
|
128
140
|
*/
|
|
129
141
|
export function serializeManifest(manifest) {
|
|
130
142
|
return `${JSON.stringify(manifest, null, 2)}\n`;
|
|
@@ -233,8 +245,12 @@ export function run({ argv = [], now = new Date(), repoRoot } = {}) {
|
|
|
233
245
|
}
|
|
234
246
|
|
|
235
247
|
const serialized = serializeManifest(fresh);
|
|
248
|
+
const opts = { cwd: root, filename: 'skills.index.json' };
|
|
236
249
|
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
|
237
|
-
fs.writeFileSync(
|
|
250
|
+
fs.writeFileSync(
|
|
251
|
+
outPath,
|
|
252
|
+
formatGeneratedJson(serialized, opts) ?? serialized,
|
|
253
|
+
);
|
|
238
254
|
Logger.info(
|
|
239
255
|
`wrote ${path.relative(root, outPath).split(path.sep).join('/')} (${fresh.skills.length} entries)`,
|
|
240
256
|
);
|
|
@@ -91,10 +91,10 @@ export function renderWorkflowsDoc(catalog, loopCatalog = []) {
|
|
|
91
91
|
'compose. This file is only for "which command does X?" lookups.',
|
|
92
92
|
'',
|
|
93
93
|
'Every command file lives at `.agents/workflows/<name>.md` and is projected',
|
|
94
|
-
'into a flat `.claude/commands/` tree by `npm run sync:commands` (
|
|
95
|
-
'
|
|
96
|
-
'slash command (e.g. `/deliver`). The projection
|
|
97
|
-
'`.claude/commands/<name>.md` — there is no plugin manifest and no',
|
|
94
|
+
'into a flat `.claude/commands/` tree by `npm run sync:commands` (kept',
|
|
95
|
+
'current at install time and on every `mandrel sync`/`update`) so it shows',
|
|
96
|
+
'up as a bare `/<name>` slash command (e.g. `/deliver`). The projection',
|
|
97
|
+
'writes only `.claude/commands/<name>.md` — there is no plugin manifest and no',
|
|
98
98
|
'marketplace listing. The commands load in every Claude Code environment.',
|
|
99
99
|
'',
|
|
100
100
|
'Loop units are the one namespaced exception: files under',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ITicketingProvider — Abstract Ticketing Provider Interface
|
|
3
3
|
*
|
|
4
|
-
* All ticketing interactions in the v5
|
|
4
|
+
* All ticketing interactions in the v5 Story-centric orchestration are mediated
|
|
5
5
|
* through this interface. Concrete implementations (e.g., `providers/github.js`)
|
|
6
6
|
* extend this class and override every method.
|
|
7
7
|
*
|
|
@@ -17,21 +17,6 @@ export class ITicketingProvider {
|
|
|
17
17
|
// Read Operations
|
|
18
18
|
// ---------------------------------------------------------------------------
|
|
19
19
|
|
|
20
|
-
/**
|
|
21
|
-
* Fetch all Epic tickets in the repository.
|
|
22
|
-
*
|
|
23
|
-
* @param {{ state?: 'open'|'closed'|'all' }} [filters={}]
|
|
24
|
-
* @returns {Promise<Array<{
|
|
25
|
-
* id: number,
|
|
26
|
-
* title: string,
|
|
27
|
-
* labels: string[],
|
|
28
|
-
* state: 'open'|'closed'
|
|
29
|
-
* }>>}
|
|
30
|
-
*/
|
|
31
|
-
async getEpics(_filters = {}) {
|
|
32
|
-
throw new Error('Not implemented: getEpics');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
20
|
/**
|
|
36
21
|
* Fetch the Epic issue with its body — the single planning document
|
|
37
22
|
* (ideation sections plus the folded Tech Spec / Acceptance Table
|
|
@@ -165,9 +150,6 @@ export class ITicketingProvider {
|
|
|
165
150
|
* }} ticketData - The ticket content and metadata.
|
|
166
151
|
* @returns {Promise<{ id: number, url: string }>}
|
|
167
152
|
*/
|
|
168
|
-
async createTicket(_parentId, _ticketData) {
|
|
169
|
-
throw new Error('Not implemented: createTicket');
|
|
170
|
-
}
|
|
171
153
|
|
|
172
154
|
/**
|
|
173
155
|
* Link an existing issue as a sub-issue of a parent.
|