mandrel 1.57.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 +954 -0
- package/.agents/docs/SDLC.md +1420 -0
- package/.agents/docs/agentrc-reference.json +278 -0
- package/.agents/docs/configuration.md +1040 -0
- package/.agents/docs/workflows.md +59 -0
- package/.agents/instructions.md +384 -0
- package/.agents/personas/architect.md +107 -0
- package/.agents/personas/devops-engineer.md +36 -0
- package/.agents/personas/engineer-mobile.md +119 -0
- package/.agents/personas/engineer-web.md +110 -0
- package/.agents/personas/engineer.md +90 -0
- package/.agents/personas/product.md +88 -0
- package/.agents/personas/project-manager.md +110 -0
- package/.agents/personas/qa-engineer.md +91 -0
- package/.agents/personas/refactorer.md +110 -0
- package/.agents/personas/security-engineer.md +112 -0
- package/.agents/personas/sre.md +86 -0
- package/.agents/personas/technical-writer.md +100 -0
- package/.agents/personas/ux-designer.md +95 -0
- package/.agents/rules/api-conventions.md +75 -0
- package/.agents/rules/changelog-style.md +238 -0
- package/.agents/rules/gherkin-standards.md +146 -0
- package/.agents/rules/git-conventions.md +146 -0
- package/.agents/rules/orchestration-error-handling.md +35 -0
- package/.agents/rules/security-baseline.md +92 -0
- package/.agents/rules/shell-conventions.md +70 -0
- package/.agents/rules/test-seams.md +59 -0
- package/.agents/rules/testing-standards.md +177 -0
- package/.agents/runtime-deps.json +18 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +93 -0
- package/.agents/schemas/agentrc.schema.json +1583 -0
- package/.agents/schemas/audit-results.schema.json +69 -0
- package/.agents/schemas/audit-rules.json +134 -0
- package/.agents/schemas/audit-rules.schema.json +69 -0
- package/.agents/schemas/baselines/baseline-envelope.schema.json +44 -0
- package/.agents/schemas/baselines/bundle-size.schema.json +47 -0
- package/.agents/schemas/baselines/coverage.schema.json +50 -0
- package/.agents/schemas/baselines/crap.schema.json +52 -0
- package/.agents/schemas/baselines/duplication.schema.json +62 -0
- package/.agents/schemas/baselines/lighthouse.schema.json +59 -0
- package/.agents/schemas/baselines/lint.schema.json +47 -0
- package/.agents/schemas/baselines/maintainability.schema.json +71 -0
- package/.agents/schemas/baselines/mutation.schema.json +52 -0
- package/.agents/schemas/crap-baseline.schema.json +57 -0
- package/.agents/schemas/crap-report.schema.json +102 -0
- package/.agents/schemas/dispatch-manifest.json +232 -0
- package/.agents/schemas/epic-perf-report.schema.json +89 -0
- package/.agents/schemas/epic-spec.schema.json +183 -0
- package/.agents/schemas/friction-event.schema.json +56 -0
- package/.agents/schemas/lifecycle/README.md +18 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +13 -0
- package/.agents/schemas/lifecycle/checkpoint.written.schema.json +13 -0
- package/.agents/schemas/lifecycle/close-validate.end.schema.json +18 -0
- package/.agents/schemas/lifecycle/close-validate.start.schema.json +13 -0
- package/.agents/schemas/lifecycle/code-review.end.schema.json +30 -0
- package/.agents/schemas/lifecycle/code-review.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +14 -0
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.complete.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +14 -0
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +17 -0
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +15 -0
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +18 -0
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +16 -0
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +28 -0
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +16 -0
- package/.agents/schemas/lifecycle/intervention.recorded.schema.json +15 -0
- package/.agents/schemas/lifecycle/ledger-record.schema.json +59 -0
- package/.agents/schemas/lifecycle/notification.emitted.schema.json +18 -0
- package/.agents/schemas/lifecycle/pr.created.schema.json +14 -0
- package/.agents/schemas/lifecycle/retro.end.schema.json +16 -0
- package/.agents/schemas/lifecycle/retro.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/story.blocked.schema.json +13 -0
- package/.agents/schemas/lifecycle/story.dispatch.end.schema.json +17 -0
- package/.agents/schemas/lifecycle/story.dispatch.start.schema.json +15 -0
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +20 -0
- package/.agents/schemas/lifecycle/story.merged.schema.json +13 -0
- package/.agents/schemas/mi-report.schema.json +58 -0
- package/.agents/schemas/model-attribution.schema.json +49 -0
- package/.agents/schemas/qa-finding.schema.json +133 -0
- package/.agents/schemas/qa-ledger.schema.json +89 -0
- package/.agents/schemas/risk-verdict.schema.json +53 -0
- package/.agents/schemas/signal-event.schema.json +58 -0
- package/.agents/schemas/skill.schema.json +31 -0
- package/.agents/schemas/skills-index.schema.json +81 -0
- package/.agents/schemas/story-perf-summary.schema.json +73 -0
- package/.agents/schemas/validation-evidence.schema.json +78 -0
- package/.agents/scripts/README.md +93 -0
- package/.agents/scripts/acceptance-eval.js +284 -0
- package/.agents/scripts/acceptance-spec-reconciler.js +556 -0
- package/.agents/scripts/agents-bootstrap-github.js +634 -0
- package/.agents/scripts/analyze-execution.js +369 -0
- package/.agents/scripts/assert-branch.js +83 -0
- package/.agents/scripts/audit-labels-bootstrap.js +253 -0
- package/.agents/scripts/audit-to-stories.js +257 -0
- package/.agents/scripts/bootstrap.js +1378 -0
- package/.agents/scripts/check-baselines.js +81 -0
- package/.agents/scripts/check-dead-exports.js +311 -0
- package/.agents/scripts/check-doc-links.js +401 -0
- package/.agents/scripts/check-gherkin-placeholders.js +663 -0
- package/.agents/scripts/check-lifecycle-doc-drift.js +402 -0
- package/.agents/scripts/check-lifecycle-lint.js +379 -0
- package/.agents/scripts/check-prepush-recovery.js +90 -0
- package/.agents/scripts/check-windows-git-perf.js +138 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +67 -0
- package/.agents/scripts/coverage-capture.js +112 -0
- package/.agents/scripts/detect-merges.js +111 -0
- package/.agents/scripts/diagnose-friction.js +257 -0
- package/.agents/scripts/diagnose.js +240 -0
- package/.agents/scripts/dispatcher.js +295 -0
- package/.agents/scripts/drain-pending-cleanup.js +147 -0
- package/.agents/scripts/epic-audit-prepare.js +419 -0
- package/.agents/scripts/epic-audit-recheck.js +241 -0
- package/.agents/scripts/epic-deliver-note-intervention.js +192 -0
- package/.agents/scripts/epic-deliver-preflight.js +407 -0
- package/.agents/scripts/epic-deliver-prepare.js +383 -0
- package/.agents/scripts/epic-execute-record-wave.js +463 -0
- package/.agents/scripts/epic-plan-clarity.js +201 -0
- package/.agents/scripts/epic-plan-decompose.js +79 -0
- package/.agents/scripts/epic-plan-healthcheck.js +363 -0
- package/.agents/scripts/epic-plan-spec-validate.js +111 -0
- package/.agents/scripts/epic-plan-spec.js +198 -0
- package/.agents/scripts/epic-reconcile.js +637 -0
- package/.agents/scripts/evidence-gate.js +235 -0
- package/.agents/scripts/generate-config-docs.js +516 -0
- package/.agents/scripts/generate-lifecycle-docs.js +224 -0
- package/.agents/scripts/generate-skills-index.js +252 -0
- package/.agents/scripts/generate-workflows-doc.js +168 -0
- package/.agents/scripts/git-cleanup.js +124 -0
- package/.agents/scripts/git-pr-quality-gate.js +203 -0
- package/.agents/scripts/git-rebase-and-resolve.js +234 -0
- package/.agents/scripts/hierarchy-gate.js +176 -0
- package/.agents/scripts/hydrate-context.js +179 -0
- package/.agents/scripts/install-matrix-assert.js +282 -0
- package/.agents/scripts/lib/Graph.js +326 -0
- package/.agents/scripts/lib/ITicketingProvider.js +349 -0
- package/.agents/scripts/lib/Logger.js +194 -0
- package/.agents/scripts/lib/audit-suite/cli.js +64 -0
- package/.agents/scripts/lib/audit-suite/findings.js +164 -0
- package/.agents/scripts/lib/audit-suite/frontmatter-lint.js +32 -0
- package/.agents/scripts/lib/audit-suite/frontmatter.js +110 -0
- package/.agents/scripts/lib/audit-suite/index.js +22 -0
- package/.agents/scripts/lib/audit-suite/runner.js +233 -0
- package/.agents/scripts/lib/audit-suite/selector.js +235 -0
- package/.agents/scripts/lib/audit-suite/substitutions.js +124 -0
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +49 -0
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +130 -0
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +114 -0
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +93 -0
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +265 -0
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +246 -0
- package/.agents/scripts/lib/audit-to-stories/seed-epic-from-findings.js +160 -0
- package/.agents/scripts/lib/auto-refresh-baselines.js +308 -0
- package/.agents/scripts/lib/baseline-loader.js +0 -0
- package/.agents/scripts/lib/baseline-schema-registry.js +69 -0
- package/.agents/scripts/lib/baseline-snapshot.js +716 -0
- package/.agents/scripts/lib/baselines/component-matcher.js +21 -0
- package/.agents/scripts/lib/baselines/components.js +126 -0
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +203 -0
- package/.agents/scripts/lib/baselines/duplication-scanner.js +220 -0
- package/.agents/scripts/lib/baselines/env-overrides.js +129 -0
- package/.agents/scripts/lib/baselines/envelope.js +368 -0
- package/.agents/scripts/lib/baselines/exit-codes.js +89 -0
- package/.agents/scripts/lib/baselines/git-base.js +0 -0
- package/.agents/scripts/lib/baselines/kernel.js +111 -0
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +220 -0
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +157 -0
- package/.agents/scripts/lib/baselines/kinds/coverage.js +194 -0
- package/.agents/scripts/lib/baselines/kinds/crap.js +555 -0
- package/.agents/scripts/lib/baselines/kinds/duplication.js +197 -0
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +185 -0
- package/.agents/scripts/lib/baselines/kinds/lint.js +172 -0
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +340 -0
- package/.agents/scripts/lib/baselines/kinds/mutation.js +153 -0
- package/.agents/scripts/lib/baselines/path-canon.js +279 -0
- package/.agents/scripts/lib/baselines/preview-gates.js +298 -0
- package/.agents/scripts/lib/baselines/reader.js +321 -0
- package/.agents/scripts/lib/baselines/refresh-service.js +733 -0
- package/.agents/scripts/lib/baselines/scope.js +291 -0
- package/.agents/scripts/lib/baselines/writer.js +312 -0
- package/.agents/scripts/lib/bdd-runner-detect.js +417 -0
- package/.agents/scripts/lib/bdd-scenario-scanner.js +310 -0
- package/.agents/scripts/lib/bootstrap/baselines-layout-migration.js +202 -0
- package/.agents/scripts/lib/bootstrap/branch-protection.js +222 -0
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +171 -0
- package/.agents/scripts/lib/bootstrap/commit-push.js +146 -0
- package/.agents/scripts/lib/bootstrap/gh-list.js +153 -0
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +306 -0
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +89 -0
- package/.agents/scripts/lib/bootstrap/install-ledger.js +174 -0
- package/.agents/scripts/lib/bootstrap/manifest.js +272 -0
- package/.agents/scripts/lib/bootstrap/merge-methods.js +108 -0
- package/.agents/scripts/lib/bootstrap/preflight.js +195 -0
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +801 -0
- package/.agents/scripts/lib/bootstrap/prompt.js +480 -0
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +370 -0
- package/.agents/scripts/lib/bootstrap/summary.js +75 -0
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +256 -0
- package/.agents/scripts/lib/branch-name-guard.js +98 -0
- package/.agents/scripts/lib/c8-cli-path.js +21 -0
- package/.agents/scripts/lib/changed-files.js +184 -0
- package/.agents/scripts/lib/checks/baseline-drift-main-checkout.js +104 -0
- package/.agents/scripts/lib/checks/core-bare-clean.js +48 -0
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +54 -0
- package/.agents/scripts/lib/checks/index.js +288 -0
- package/.agents/scripts/lib/checks/push-hook-parity.js +106 -0
- package/.agents/scripts/lib/checks/stale-origin-epic.js +49 -0
- package/.agents/scripts/lib/checks/state.js +558 -0
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +186 -0
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +182 -0
- package/.agents/scripts/lib/checks/windows-coverage-noise-floor.js +92 -0
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +81 -0
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +55 -0
- package/.agents/scripts/lib/cli/parse-numeric.js +60 -0
- package/.agents/scripts/lib/cli/standard-args.js +351 -0
- package/.agents/scripts/lib/cli-args.js +286 -0
- package/.agents/scripts/lib/cli-utils.js +69 -0
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +44 -0
- package/.agents/scripts/lib/close-validation/projections/inputs.js +86 -0
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +286 -0
- package/.agents/scripts/lib/close-validation.js +897 -0
- package/.agents/scripts/lib/codebase-snapshot.js +513 -0
- package/.agents/scripts/lib/command-header.js +33 -0
- package/.agents/scripts/lib/config/acceptance-eval.js +95 -0
- package/.agents/scripts/lib/config/baselines.js +60 -0
- package/.agents/scripts/lib/config/ci.js +30 -0
- package/.agents/scripts/lib/config/commands.js +36 -0
- package/.agents/scripts/lib/config/defaults.js +119 -0
- package/.agents/scripts/lib/config/explain.js +348 -0
- package/.agents/scripts/lib/config/gates/bundle-size.schema.js +23 -0
- package/.agents/scripts/lib/config/gates/coverage.schema.js +18 -0
- package/.agents/scripts/lib/config/gates/crap.schema.js +33 -0
- package/.agents/scripts/lib/config/gates/duplication.schema.js +26 -0
- package/.agents/scripts/lib/config/gates/index.js +36 -0
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +23 -0
- package/.agents/scripts/lib/config/gates/lint.schema.js +9 -0
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +20 -0
- package/.agents/scripts/lib/config/gates/mutation.schema.js +12 -0
- package/.agents/scripts/lib/config/gates/shared.js +117 -0
- package/.agents/scripts/lib/config/github.js +122 -0
- package/.agents/scripts/lib/config/lifecycle.js +40 -0
- package/.agents/scripts/lib/config/limits.js +211 -0
- package/.agents/scripts/lib/config/paths.js +73 -0
- package/.agents/scripts/lib/config/preflight.js +58 -0
- package/.agents/scripts/lib/config/quality.js +665 -0
- package/.agents/scripts/lib/config/retro.js +77 -0
- package/.agents/scripts/lib/config/runners.js +105 -0
- package/.agents/scripts/lib/config/runtime.js +167 -0
- package/.agents/scripts/lib/config/shared.js +46 -0
- package/.agents/scripts/lib/config/sync-agentrc.js +243 -0
- package/.agents/scripts/lib/config/temp-paths.js +373 -0
- package/.agents/scripts/lib/config/validate-orchestration.js +81 -0
- package/.agents/scripts/lib/config/worktree-isolation.js +80 -0
- package/.agents/scripts/lib/config-resolver.js +298 -0
- package/.agents/scripts/lib/config-schema-shared.js +32 -0
- package/.agents/scripts/lib/config-schema.js +20 -0
- package/.agents/scripts/lib/config-settings-schema-delivery.js +332 -0
- package/.agents/scripts/lib/config-settings-schema-quality.js +165 -0
- package/.agents/scripts/lib/config-settings-schema.js +420 -0
- package/.agents/scripts/lib/coverage-baseline.js +352 -0
- package/.agents/scripts/lib/coverage-capture.js +195 -0
- package/.agents/scripts/lib/coverage-utils.js +239 -0
- package/.agents/scripts/lib/cpu-pool.js +223 -0
- package/.agents/scripts/lib/crap-engine.js +119 -0
- package/.agents/scripts/lib/crap-utils.js +479 -0
- package/.agents/scripts/lib/degraded-mode.js +69 -0
- package/.agents/scripts/lib/dependency-parser.js +129 -0
- package/.agents/scripts/lib/duplicate-search.js +189 -0
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +70 -0
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +197 -0
- package/.agents/scripts/lib/dynamic-workflow/capability.js +396 -0
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +80 -0
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +72 -0
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +90 -0
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +43 -0
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +83 -0
- package/.agents/scripts/lib/env-loader.js +52 -0
- package/.agents/scripts/lib/epic-merge-lock.js +239 -0
- package/.agents/scripts/lib/epic-plan-clarity.js +142 -0
- package/.agents/scripts/lib/epic-plan-ideation.js +228 -0
- package/.agents/scripts/lib/error-redactor.js +125 -0
- package/.agents/scripts/lib/errors/index.js +67 -0
- package/.agents/scripts/lib/feedback-loop/audit-results-graduator.js +230 -0
- package/.agents/scripts/lib/feedback-loop/code-review-graduator.js +207 -0
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +421 -0
- package/.agents/scripts/lib/feedback-loop/memory-freshness.js +480 -0
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +229 -0
- package/.agents/scripts/lib/findings/classify-finding.js +195 -0
- package/.agents/scripts/lib/findings/promote-finding.js +353 -0
- package/.agents/scripts/lib/findings/route-finding.js +283 -0
- package/.agents/scripts/lib/findings/semantic-issue-search.js +179 -0
- package/.agents/scripts/lib/findings/severity.js +102 -0
- package/.agents/scripts/lib/gates/baseline-store.js +106 -0
- package/.agents/scripts/lib/gates/friction.js +43 -0
- package/.agents/scripts/lib/gh-exec.js +553 -0
- package/.agents/scripts/lib/git/cached-fetch.js +0 -0
- package/.agents/scripts/lib/git/sync-from-base.js +162 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +213 -0
- package/.agents/scripts/lib/git-branch-lifecycle.js +353 -0
- package/.agents/scripts/lib/git-merge-orchestrator.js +261 -0
- package/.agents/scripts/lib/git-utils.js +363 -0
- package/.agents/scripts/lib/github-url.js +29 -0
- package/.agents/scripts/lib/install-cmd-parser.js +51 -0
- package/.agents/scripts/lib/issue-link-parser.js +74 -0
- package/.agents/scripts/lib/json-utils.js +60 -0
- package/.agents/scripts/lib/label-constants.js +169 -0
- package/.agents/scripts/lib/label-taxonomy.js +200 -0
- package/.agents/scripts/lib/maintainability-engine.js +164 -0
- package/.agents/scripts/lib/maintainability-utils.js +343 -0
- package/.agents/scripts/lib/mandrel-catalog.js +170 -0
- package/.agents/scripts/lib/mutation/baseline-snapshot.js +238 -0
- package/.agents/scripts/lib/mutation/config-detector.js +119 -0
- package/.agents/scripts/lib/mutation/stryker-runner.js +306 -0
- package/.agents/scripts/lib/mutation/survivor-report.js +160 -0
- package/.agents/scripts/lib/notifications/notifier.js +75 -0
- package/.agents/scripts/lib/observability/active-story-env.js +182 -0
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +221 -0
- package/.agents/scripts/lib/observability/perf-aggregator.js +887 -0
- package/.agents/scripts/lib/observability/perf-report-readers.js +319 -0
- package/.agents/scripts/lib/observability/perf-report-render.js +182 -0
- package/.agents/scripts/lib/observability/signals-writer.js +296 -0
- package/.agents/scripts/lib/observability/source-classifier.js +103 -0
- package/.agents/scripts/lib/observability/tool-trace-hook.js +417 -0
- package/.agents/scripts/lib/onboard/detect-stack.js +300 -0
- package/.agents/scripts/lib/onboard/scaffold-docs.js +128 -0
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +173 -0
- package/.agents/scripts/lib/orchestration/cascade-grouping.js +275 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +131 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +80 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +132 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +142 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +149 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +158 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +56 -0
- package/.agents/scripts/lib/orchestration/code-review.js +652 -0
- package/.agents/scripts/lib/orchestration/column-sync.js +286 -0
- package/.agents/scripts/lib/orchestration/context-envelope.js +280 -0
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +581 -0
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +88 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +188 -0
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +144 -0
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +206 -0
- package/.agents/scripts/lib/orchestration/doc-reader.js +94 -0
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +473 -0
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +310 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/cli.js +167 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +151 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +74 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +78 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +72 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +155 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +321 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +75 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +86 -0
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/authoring-context.js +197 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/cli-args.js +48 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +94 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +414 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/prompts.js +55 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +105 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +120 -0
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +118 -0
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +295 -0
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +186 -0
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +50 -0
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +146 -0
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +110 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +392 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +217 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter.js +69 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +32 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +291 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +175 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +37 -0
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +127 -0
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +400 -0
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +285 -0
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +66 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +797 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +619 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +335 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +230 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +363 -0
- package/.agents/scripts/lib/orchestration/error-journal.js +139 -0
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +31 -0
- package/.agents/scripts/lib/orchestration/file-assumptions.js +506 -0
- package/.agents/scripts/lib/orchestration/finalize/close-planning-tickets.js +116 -0
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +241 -0
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +489 -0
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +88 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +219 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +309 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +99 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +123 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +57 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +114 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +426 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +84 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +365 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +72 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +69 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +214 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +137 -0
- package/.agents/scripts/lib/orchestration/label-transitions.js +43 -0
- package/.agents/scripts/lib/orchestration/lifecycle/bus.js +309 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +147 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +155 -0
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +226 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +69 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +378 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +248 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +527 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +259 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +278 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +355 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +647 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +331 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +140 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +421 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +168 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +668 -0
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +322 -0
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +114 -0
- package/.agents/scripts/lib/orchestration/manifest-builder.js +216 -0
- package/.agents/scripts/lib/orchestration/model-attribution.js +390 -0
- package/.agents/scripts/lib/orchestration/parked-follow-ons.js +147 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +87 -0
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +63 -0
- package/.agents/scripts/lib/orchestration/plan-runner/plan-router.js +86 -0
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +212 -0
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +213 -0
- package/.agents/scripts/lib/orchestration/planning-risk.js +155 -0
- package/.agents/scripts/lib/orchestration/planning-state-manager.js +318 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +56 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +33 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +78 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +68 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +118 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +396 -0
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +205 -0
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +47 -0
- package/.agents/scripts/lib/orchestration/preflight-cache.js +164 -0
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +202 -0
- package/.agents/scripts/lib/orchestration/reconciler.js +137 -0
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +152 -0
- package/.agents/scripts/lib/orchestration/recut.js +56 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +127 -0
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +94 -0
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +448 -0
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +335 -0
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +133 -0
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +57 -0
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +275 -0
- package/.agents/scripts/lib/orchestration/retro-proposals.js +395 -0
- package/.agents/scripts/lib/orchestration/retro-runner.js +171 -0
- package/.agents/scripts/lib/orchestration/review-depth.js +93 -0
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +363 -0
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +205 -0
- package/.agents/scripts/lib/orchestration/review-providers/native.js +805 -0
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +73 -0
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +396 -0
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +373 -0
- package/.agents/scripts/lib/orchestration/review-providers/types.js +89 -0
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +107 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +159 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +194 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +81 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +190 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +70 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +106 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +42 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +73 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +225 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +315 -0
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +149 -0
- package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +110 -0
- package/.agents/scripts/lib/orchestration/spec-freshness.js +320 -0
- package/.agents/scripts/lib/orchestration/spec-renderer.js +456 -0
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +80 -0
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +797 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +163 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +152 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +387 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +266 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +48 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +67 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +161 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +117 -0
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +86 -0
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +147 -0
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +142 -0
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +62 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix-scoped.js +221 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix-shared.js +123 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +216 -0
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +636 -0
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +198 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +105 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +222 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +220 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +291 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +234 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +110 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +86 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +112 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +157 -0
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +434 -0
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +290 -0
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +643 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +67 -0
- package/.agents/scripts/lib/orchestration/task-body-validator.js +391 -0
- package/.agents/scripts/lib/orchestration/ticket-lease.js +358 -0
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +783 -0
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +367 -0
- package/.agents/scripts/lib/orchestration/ticket-validator.js +691 -0
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +723 -0
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +474 -0
- package/.agents/scripts/lib/orchestration/ticketing/state.js +559 -0
- package/.agents/scripts/lib/orchestration/ticketing.js +55 -0
- package/.agents/scripts/lib/orchestration/wave-marker.js +28 -0
- package/.agents/scripts/lib/orchestration/wave-record-io.js +277 -0
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +189 -0
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +423 -0
- package/.agents/scripts/lib/path-security.js +25 -0
- package/.agents/scripts/lib/plan-phase-cleanup.js +125 -0
- package/.agents/scripts/lib/preflight-runner.js +196 -0
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +95 -0
- package/.agents/scripts/lib/presentation/manifest-builder.js +245 -0
- package/.agents/scripts/lib/presentation/manifest-formatter.js +243 -0
- package/.agents/scripts/lib/presentation/manifest-helpers.js +213 -0
- package/.agents/scripts/lib/presentation/manifest-persistence.js +262 -0
- package/.agents/scripts/lib/presentation/manifest-procedures.js +55 -0
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +252 -0
- package/.agents/scripts/lib/presentation/manifest-renderer.js +188 -0
- package/.agents/scripts/lib/presentation/manifest-story-views.js +119 -0
- package/.agents/scripts/lib/provider-factory.js +80 -0
- package/.agents/scripts/lib/push-epic-retry.js +209 -0
- package/.agents/scripts/lib/qa/console-allowlist.js +151 -0
- package/.agents/scripts/lib/qa/coverage-report.js +181 -0
- package/.agents/scripts/lib/qa/coverage-verdict.js +296 -0
- package/.agents/scripts/lib/qa/propose-missing-test.js +95 -0
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +296 -0
- package/.agents/scripts/lib/qa/qa-session.js +197 -0
- package/.agents/scripts/lib/qa/redact-evidence.js +245 -0
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +190 -0
- package/.agents/scripts/lib/qa/resolve-selection.js +373 -0
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +100 -0
- package/.agents/scripts/lib/runtime-deps/manifest.js +96 -0
- package/.agents/scripts/lib/runtime-deps/preflight.js +78 -0
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +202 -0
- package/.agents/scripts/lib/signals/detectors/common.js +36 -0
- package/.agents/scripts/lib/signals/detectors/hotspot.js +298 -0
- package/.agents/scripts/lib/signals/detectors/index.js +14 -0
- package/.agents/scripts/lib/signals/detectors/retry.js +289 -0
- package/.agents/scripts/lib/signals/detectors/rework.js +204 -0
- package/.agents/scripts/lib/signals/index.js +39 -0
- package/.agents/scripts/lib/signals/read.js +268 -0
- package/.agents/scripts/lib/signals/schema.js +225 -0
- package/.agents/scripts/lib/signals/span-tree.js +290 -0
- package/.agents/scripts/lib/signals/write.js +19 -0
- package/.agents/scripts/lib/single-story/confirm-merge.js +201 -0
- package/.agents/scripts/lib/single-story/story-merged-notify.js +126 -0
- package/.agents/scripts/lib/single-story-sweep/protection.js +274 -0
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +169 -0
- package/.agents/scripts/lib/single-story-sweep.js +329 -0
- package/.agents/scripts/lib/skills/parse-skill.js +202 -0
- package/.agents/scripts/lib/skills/walk-skill-files.js +56 -0
- package/.agents/scripts/lib/spec/index.js +36 -0
- package/.agents/scripts/lib/spec/loader.js +425 -0
- package/.agents/scripts/lib/spec/state.js +217 -0
- package/.agents/scripts/lib/story-body/story-body.js +743 -0
- package/.agents/scripts/lib/story-init/blocker-validator.js +68 -0
- package/.agents/scripts/lib/story-init/branch-initializer.js +422 -0
- package/.agents/scripts/lib/story-init/context-resolver.js +92 -0
- package/.agents/scripts/lib/story-init/donor-precheck.js +207 -0
- package/.agents/scripts/lib/story-init/hierarchy-tracer.js +36 -0
- package/.agents/scripts/lib/story-init/state-transitioner.js +80 -0
- package/.agents/scripts/lib/story-init/task-graph-builder.js +114 -0
- package/.agents/scripts/lib/story-init/transition-summary.js +34 -0
- package/.agents/scripts/lib/story-lifecycle.js +186 -0
- package/.agents/scripts/lib/story-plan.js +246 -0
- package/.agents/scripts/lib/task-utils.js +26 -0
- package/.agents/scripts/lib/templates/decomposer-prompts.js +168 -0
- package/.agents/scripts/lib/test-env.js +30 -0
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +52 -0
- package/.agents/scripts/lib/test-isolate/list-files.js +90 -0
- package/.agents/scripts/lib/test-isolate/parse-tap.js +75 -0
- package/.agents/scripts/lib/test-isolate/runner.js +483 -0
- package/.agents/scripts/lib/test-profile/parse-tap.js +136 -0
- package/.agents/scripts/lib/test-profile/render-report.js +45 -0
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +35 -0
- package/.agents/scripts/lib/test-tiers.js +94 -0
- package/.agents/scripts/lib/util/concurrent-map.js +59 -0
- package/.agents/scripts/lib/util/phase-timer-state.js +72 -0
- package/.agents/scripts/lib/util/phase-timer.js +163 -0
- package/.agents/scripts/lib/util/poll-loop.js +86 -0
- package/.agents/scripts/lib/util/with-timeout.js +32 -0
- package/.agents/scripts/lib/validation-evidence.js +323 -0
- package/.agents/scripts/lib/wave-runner/tick.js +665 -0
- package/.agents/scripts/lib/wave-runner/wave-checkpoint.js +91 -0
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +19 -0
- package/.agents/scripts/lib/workers/crap-worker.js +197 -0
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +137 -0
- package/.agents/scripts/lib/workers/maintainability-worker.js +79 -0
- package/.agents/scripts/lib/workspace-provisioner.js +189 -0
- package/.agents/scripts/lib/worktree/bootstrapper.js +48 -0
- package/.agents/scripts/lib/worktree/inspector.js +140 -0
- package/.agents/scripts/lib/worktree/lifecycle/creation.js +118 -0
- package/.agents/scripts/lib/worktree/lifecycle/drift-detection.js +62 -0
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +276 -0
- package/.agents/scripts/lib/worktree/lifecycle/gc.js +49 -0
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +178 -0
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +264 -0
- package/.agents/scripts/lib/worktree/lifecycle/precheck.js +100 -0
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +588 -0
- package/.agents/scripts/lib/worktree/lifecycle/registry-sync.js +124 -0
- package/.agents/scripts/lib/worktree/lifecycle/shared.js +26 -0
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +40 -0
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +349 -0
- package/.agents/scripts/lib/worktree-manager.js +243 -0
- package/.agents/scripts/lifecycle-diff.js +206 -0
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +194 -0
- package/.agents/scripts/lifecycle-emit.js +479 -0
- package/.agents/scripts/lint-baseline.js +507 -0
- package/.agents/scripts/lint-label-vocabulary.js +237 -0
- package/.agents/scripts/loc-delta.js +205 -0
- package/.agents/scripts/notify.js +307 -0
- package/.agents/scripts/package.json +3 -0
- package/.agents/scripts/post-structured-comment.js +127 -0
- package/.agents/scripts/pr-watch-with-update.js +152 -0
- package/.agents/scripts/providers/github/auth.js +65 -0
- package/.agents/scripts/providers/github/board-add.js +63 -0
- package/.agents/scripts/providers/github/branch-protection.js +186 -0
- package/.agents/scripts/providers/github/cache.js +72 -0
- package/.agents/scripts/providers/github/comments.js +131 -0
- package/.agents/scripts/providers/github/compose.js +111 -0
- package/.agents/scripts/providers/github/errors.js +242 -0
- package/.agents/scripts/providers/github/issues.js +242 -0
- package/.agents/scripts/providers/github/labels.js +179 -0
- package/.agents/scripts/providers/github/mappers.js +126 -0
- package/.agents/scripts/providers/github/merge-methods.js +82 -0
- package/.agents/scripts/providers/github/project-board.js +47 -0
- package/.agents/scripts/providers/github/projects-v2-graphql.js +472 -0
- package/.agents/scripts/providers/github/prs.js +103 -0
- package/.agents/scripts/providers/github/request-helpers.js +110 -0
- package/.agents/scripts/providers/github/sub-issues.js +369 -0
- package/.agents/scripts/providers/github/tickets.js +381 -0
- package/.agents/scripts/providers/github/transient-retry.js +62 -0
- package/.agents/scripts/providers/github.js +157 -0
- package/.agents/scripts/quality-preview.js +327 -0
- package/.agents/scripts/quality-watch.js +223 -0
- package/.agents/scripts/render-manifest.js +143 -0
- package/.agents/scripts/resync-status-column.js +176 -0
- package/.agents/scripts/retro-run.js +167 -0
- package/.agents/scripts/run-audit-suite.js +97 -0
- package/.agents/scripts/run-coverage.js +103 -0
- package/.agents/scripts/run-lint.js +94 -0
- package/.agents/scripts/run-test-profile.js +126 -0
- package/.agents/scripts/run-tests.js +185 -0
- package/.agents/scripts/run-verify.js +56 -0
- package/.agents/scripts/select-audits.js +155 -0
- package/.agents/scripts/signals-view.js +294 -0
- package/.agents/scripts/single-story-close.js +83 -0
- package/.agents/scripts/single-story-confirm-merge.js +183 -0
- package/.agents/scripts/single-story-init.js +692 -0
- package/.agents/scripts/stories-wave-tick.js +415 -0
- package/.agents/scripts/story-close.js +246 -0
- package/.agents/scripts/story-deliver-prepare.js +267 -0
- package/.agents/scripts/story-init.js +516 -0
- package/.agents/scripts/story-phase.js +327 -0
- package/.agents/scripts/story-plan.js +284 -0
- package/.agents/scripts/sync-agentrc.js +71 -0
- package/.agents/scripts/sync-branch-from-base.js +138 -0
- package/.agents/scripts/sync-claude-commands.js +151 -0
- package/.agents/scripts/test-isolate.js +222 -0
- package/.agents/scripts/test-wrapper.js +108 -0
- package/.agents/scripts/update-coverage-baseline.js +129 -0
- package/.agents/scripts/update-crap-baseline.js +177 -0
- package/.agents/scripts/update-duplication-baseline.js +134 -0
- package/.agents/scripts/update-maintainability-baseline.js +183 -0
- package/.agents/scripts/update-mutation-baseline.js +189 -0
- package/.agents/scripts/update-ticket-state.js +107 -0
- package/.agents/scripts/validate-docs-freshness.js +259 -0
- package/.agents/scripts/validate-skills.js +278 -0
- package/.agents/scripts/wave-tick.js +335 -0
- package/.agents/skills/core/analyze-execution/SKILL.md +98 -0
- package/.agents/skills/core/api-and-interface-design/SKILL.md +327 -0
- package/.agents/skills/core/baseline-refresh/SKILL.md +181 -0
- package/.agents/skills/core/browser-testing-with-devtools/SKILL.md +352 -0
- package/.agents/skills/core/ci-cd-and-automation/SKILL.md +274 -0
- package/.agents/skills/core/ci-cd-and-automation/examples.md +211 -0
- package/.agents/skills/core/code-review-and-quality/SKILL.md +421 -0
- package/.agents/skills/core/code-simplification/SKILL.md +389 -0
- package/.agents/skills/core/context-engineering/SKILL.md +309 -0
- package/.agents/skills/core/context-engineering/examples.md +58 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +338 -0
- package/.agents/skills/core/deprecation-and-migration/SKILL.md +250 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +79 -0
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +323 -0
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +145 -0
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +425 -0
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +393 -0
- package/.agents/skills/core/frontend-ui-engineering/SKILL.md +357 -0
- package/.agents/skills/core/git-workflow-and-versioning/SKILL.md +352 -0
- package/.agents/skills/core/hydrate-context/SKILL.md +118 -0
- package/.agents/skills/core/idea-refinement/SKILL.md +317 -0
- package/.agents/skills/core/idea-refinement/examples.md +437 -0
- package/.agents/skills/core/idea-refinement/frameworks.md +135 -0
- package/.agents/skills/core/idea-refinement/refinement-criteria.md +155 -0
- package/.agents/skills/core/idea-refinement/scripts/idea-refine.sh +15 -0
- package/.agents/skills/core/incremental-implementation/SKILL.md +271 -0
- package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +213 -0
- package/.agents/skills/core/knowledge-transfer/SKILL.md +175 -0
- package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +117 -0
- package/.agents/skills/core/performance-optimization/SKILL.md +314 -0
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +277 -0
- package/.agents/skills/core/property-based-testing/SKILL.md +148 -0
- package/.agents/skills/core/qa-coverage-mapping/SKILL.md +105 -0
- package/.agents/skills/core/refactoring-discipline/SKILL.md +111 -0
- package/.agents/skills/core/scope-triage/SKILL.md +127 -0
- package/.agents/skills/core/security-and-hardening/SKILL.md +400 -0
- package/.agents/skills/core/shipping-and-launch/SKILL.md +328 -0
- package/.agents/skills/core/spec-driven-development/SKILL.md +252 -0
- package/.agents/skills/core/test-driven-development/SKILL.md +475 -0
- package/.agents/skills/core/using-agent-skills/SKILL.md +232 -0
- package/.agents/skills/skills.index.json +596 -0
- package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +31 -0
- package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +51 -0
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +48 -0
- package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +31 -0
- package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +33 -0
- package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +31 -0
- package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +51 -0
- package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +54 -0
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +29 -0
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +30 -0
- package/.agents/skills/stack/backend/stripe-integration/SKILL.md +57 -0
- package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +9 -0
- package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +48 -0
- package/.agents/skills/stack/frontend/astro/SKILL.md +62 -0
- package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +30 -0
- package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +29 -0
- package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +50 -0
- package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +58 -0
- package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +34 -0
- package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +51 -0
- package/.agents/skills/stack/qa/gherkin-authoring/SKILL.md +257 -0
- package/.agents/skills/stack/qa/gherkin-authoring/examples/invoice-issue.feature +41 -0
- package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +199 -0
- package/.agents/skills/stack/qa/playwright/SKILL.md +50 -0
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +188 -0
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +142 -0
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +220 -0
- package/.agents/skills/stack/qa/vitest/SKILL.md +51 -0
- package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +68 -0
- package/.agents/starter-agentrc.json +22 -0
- package/.agents/templates/agent-protocol.md +72 -0
- package/.agents/templates/docs/architecture.md +30 -0
- package/.agents/templates/docs/decisions.md +24 -0
- package/.agents/templates/epic-from-idea.md +21 -0
- package/.agents/templates/single-story-body.md +17 -0
- package/.agents/workflows/agents-update.md +415 -0
- package/.agents/workflows/audit-architecture.md +312 -0
- package/.agents/workflows/audit-clean-code.md +179 -0
- package/.agents/workflows/audit-dependencies.md +91 -0
- package/.agents/workflows/audit-devops.md +110 -0
- package/.agents/workflows/audit-lighthouse.md +260 -0
- package/.agents/workflows/audit-performance.md +161 -0
- package/.agents/workflows/audit-privacy.md +104 -0
- package/.agents/workflows/audit-quality.md +191 -0
- package/.agents/workflows/audit-security.md +156 -0
- package/.agents/workflows/audit-seo.md +118 -0
- package/.agents/workflows/audit-sre.md +139 -0
- package/.agents/workflows/audit-to-stories.md +257 -0
- package/.agents/workflows/audit-ux-ui.md +102 -0
- package/.agents/workflows/epic-deliver.md +864 -0
- package/.agents/workflows/epic-plan.md +998 -0
- package/.agents/workflows/explain.md +118 -0
- package/.agents/workflows/git-cleanup.md +250 -0
- package/.agents/workflows/git-commit-all.md +15 -0
- package/.agents/workflows/git-merge-pr.md +377 -0
- package/.agents/workflows/git-pr-all.md +278 -0
- package/.agents/workflows/git-push.md +60 -0
- package/.agents/workflows/helpers/_merge-conflict-template.md +54 -0
- package/.agents/workflows/helpers/acceptance-self-eval.md +74 -0
- package/.agents/workflows/helpers/agents-sync-config.md +129 -0
- package/.agents/workflows/helpers/code-quality-guardrails.md +101 -0
- package/.agents/workflows/helpers/code-review.md +370 -0
- package/.agents/workflows/helpers/diagnose.md +117 -0
- package/.agents/workflows/helpers/epic-audit.md +295 -0
- package/.agents/workflows/helpers/epic-deliver-story.md +370 -0
- package/.agents/workflows/helpers/epic-plan-decompose.md +199 -0
- package/.agents/workflows/helpers/epic-plan-spec.md +184 -0
- package/.agents/workflows/helpers/epic-testing.md +125 -0
- package/.agents/workflows/helpers/parallel-tooling.md +88 -0
- package/.agents/workflows/helpers/signals.md +112 -0
- package/.agents/workflows/helpers/single-story-deliver.md +636 -0
- package/.agents/workflows/helpers/worktree-lifecycle.md +317 -0
- package/.agents/workflows/onboard.md +207 -0
- package/.agents/workflows/qa-assist.md +293 -0
- package/.agents/workflows/qa-explore.md +350 -0
- package/.agents/workflows/qa-run-harness.md +288 -0
- package/.agents/workflows/story-deliver.md +327 -0
- package/.agents/workflows/story-plan.md +233 -0
- package/LICENSE +21 -0
- package/README.md +193 -0
- package/bin/mandrel.js +56 -0
- package/bin/postinstall.js +195 -0
- package/lib/cli/__tests__/migrate.test.js +268 -0
- package/lib/cli/__tests__/sync-local-zone.test.js +247 -0
- package/lib/cli/__tests__/sync.test.js +372 -0
- package/lib/cli/__tests__/update-major.test.js +217 -0
- package/lib/cli/__tests__/update.test.js +696 -0
- package/lib/cli/__tests__/version-check.test.js +398 -0
- package/lib/cli/doctor.js +124 -0
- package/lib/cli/explain.js +107 -0
- package/lib/cli/migrate.js +260 -0
- package/lib/cli/registry.js +830 -0
- package/lib/cli/sync-commands.js +50 -0
- package/lib/cli/sync.js +200 -0
- package/lib/cli/uninstall.js +795 -0
- package/lib/cli/update.js +854 -0
- package/lib/cli/version-check.js +206 -0
- package/lib/migrations/README.md +69 -0
- package/lib/migrations/__tests__/index.test.js +216 -0
- package/lib/migrations/index.js +164 -0
- package/package.json +105 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// .agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js
|
|
2
|
+
/**
|
|
3
|
+
* BranchCleaner — lifecycle listener that owns post-merge **branch** reap
|
|
4
|
+
* for `/epic-deliver`. Story #2398 (companion to Cleaner, which owns the
|
|
5
|
+
* temp-tree archival half of end-of-Epic cleanup).
|
|
6
|
+
*
|
|
7
|
+
* Subscribes to:
|
|
8
|
+
* - `epic.cleanup.start` → and ONLY this event.
|
|
9
|
+
*
|
|
10
|
+
* Why `epic.cleanup.start` and not `epic.merge.armed`:
|
|
11
|
+
* Cleaner subscribes to `epic.merge.armed` and is the source of the
|
|
12
|
+
* `epic.cleanup.start → epic.cleanup.end → epic.complete` terminal
|
|
13
|
+
* sequence. The Bus runs listeners awaited and in registration order,
|
|
14
|
+
* so a BranchCleaner registered on `epic.cleanup.start` BEFORE Cleaner
|
|
15
|
+
* registers on `epic.merge.armed` will run synchronously inside
|
|
16
|
+
* Cleaner's emit chain, between the start and end events, and crucially
|
|
17
|
+
* BEFORE Cleaner's archive rename moves `temp/epic-<id>/` to
|
|
18
|
+
* `temp/archive/epic-<id>-<ts>/`. The state checkpoint that we read to
|
|
19
|
+
* enumerate Story branches lives on the Epic Issue (as the
|
|
20
|
+
* `epic-run-state` structured comment), not under `temp/`, so the
|
|
21
|
+
* ordering above is for symmetry with the existing Cleaner contract
|
|
22
|
+
* — both halves of cleanup observe the same temp tree as it exists at
|
|
23
|
+
* `epic.cleanup.start`.
|
|
24
|
+
*
|
|
25
|
+
* Side effects executed inside `handle()`:
|
|
26
|
+
* 1. Read the `epic-run-state` checkpoint via the injected
|
|
27
|
+
* `checkpointer`. Skip with classification `no-state` when the
|
|
28
|
+
* checkpoint is missing or carries no Stories (a brand-new run
|
|
29
|
+
* that armed without ever finalising a wave should never reach
|
|
30
|
+
* `epic.cleanup.start`, but the guard keeps this listener
|
|
31
|
+
* idempotent under replay).
|
|
32
|
+
* 2. Call `reapEpicBranches()` from `lib/orchestration/epic-cleanup.js`,
|
|
33
|
+
* which:
|
|
34
|
+
* - switches the main checkout off `epic/<id>` to the baseBranch
|
|
35
|
+
* when needed (so `git branch -D epic/<id>` isn't refused);
|
|
36
|
+
* - removes attached worktrees with the Windows file-lock fallback
|
|
37
|
+
* (worktree-remove → worktree-remove --force → fs.rm + prune);
|
|
38
|
+
* - deletes every `story-<id>` branch listed in the checkpoint plus
|
|
39
|
+
* the `epic/<id>` branch itself;
|
|
40
|
+
* - runs `git remote prune` to drop stale `<remote>/...` tracking
|
|
41
|
+
* refs left behind by `gh pr merge --delete-branch`;
|
|
42
|
+
* - deletes the `wt-branch` scratch ref left by `story-close.js`'s
|
|
43
|
+
* internal merge worktree when it is no longer checked out.
|
|
44
|
+
* 3. Record one classification entry per invocation (`reaped`,
|
|
45
|
+
* `no-state`, `failed`, or `skipped-duplicate`) so failures surface
|
|
46
|
+
* in the lifecycle ledger alongside Cleaner's archival outcome.
|
|
47
|
+
*
|
|
48
|
+
* Idempotency contract: per-instance `Set<string>` of `${event}:${seqId}`
|
|
49
|
+
* keys — repeat `(event, seqId)` invocation short-circuits and classifies
|
|
50
|
+
* `skipped-duplicate`. Mirrors Cleaner's bus-level replay defence.
|
|
51
|
+
*
|
|
52
|
+
* Side-effect firewall: the listener mutates **local git state** (branch
|
|
53
|
+
* refs, worktree paths, remote tracking refs) and nothing else. It does
|
|
54
|
+
* NOT touch the temp tree, the ticketing provider (the checkpointer
|
|
55
|
+
* `read()` is the only ticketing call and is read-only), or label state.
|
|
56
|
+
* Label transitions stay with LabelTransitioner on `epic.complete`.
|
|
57
|
+
*
|
|
58
|
+
* Production failure mode: `reapEpicBranches()` aggregates per-branch
|
|
59
|
+
* failures into the result envelope rather than throwing — a single
|
|
60
|
+
* branch that won't reap (e.g. because the operator stashed unmerged
|
|
61
|
+
* work onto it) must not block the rest of cleanup. The listener
|
|
62
|
+
* therefore records `failed` as a classification with the failure
|
|
63
|
+
* summary; orchestration callers that want hard-stop semantics can
|
|
64
|
+
* inspect the classifications. Programmer errors in the listener's own
|
|
65
|
+
* inputs (missing bus / non-numeric epicId / missing checkpointer)
|
|
66
|
+
* throw at construction time per
|
|
67
|
+
* `.agents/rules/orchestration-error-handling.md`.
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
import { rmSync as defaultRmSync } from 'node:fs';
|
|
71
|
+
|
|
72
|
+
import { gitSpawn as defaultGitSpawn } from '../../../git-utils.js';
|
|
73
|
+
import { reapEpicBranches } from '../../epic-cleanup.js';
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* BranchCleaner listener.
|
|
77
|
+
*/
|
|
78
|
+
export class BranchCleaner {
|
|
79
|
+
/**
|
|
80
|
+
* @param {object} opts
|
|
81
|
+
* @param {object} opts.bus
|
|
82
|
+
* @param {number} opts.epicId
|
|
83
|
+
* @param {{ read: () => Promise<object|null> }} opts.checkpointer
|
|
84
|
+
* Object exposing `read()` returning the `epic-run-state` checkpoint
|
|
85
|
+
* shape (epicId + waves[].stories[].id). Production passes the
|
|
86
|
+
* stateless `epic-run-state-store` module bound to `{provider, epicId}`;
|
|
87
|
+
* tests pass a fake.
|
|
88
|
+
* @param {string} opts.cwd - Absolute path to the **main** checkout
|
|
89
|
+
* (not a worktree). `reapEpicBranches()` runs `git checkout`,
|
|
90
|
+
* `git branch -D`, and `git remote prune` against this directory.
|
|
91
|
+
* @param {string} [opts.baseBranch='main'] - Branch to switch the main
|
|
92
|
+
* checkout to before reaping `epic/<id>`.
|
|
93
|
+
* @param {string} [opts.remote='origin'] - Remote to prune.
|
|
94
|
+
* @param {Function} [opts.gitSpawn] - Injectable git spawner for tests.
|
|
95
|
+
* @param {Function} [opts.rmSyncFn] - Injectable filesystem remove for
|
|
96
|
+
* the worktree Windows-lock fallback.
|
|
97
|
+
* @param {Function} [opts.spawnFn] - Injectable process spawner forwarded
|
|
98
|
+
* to `reapEpicBranches` for the Story #3367 open-PR guard probe
|
|
99
|
+
* (`gh pr list --head epic/<id> --state open`). Defaults to the real
|
|
100
|
+
* `spawnSync` inside `epic-cleanup.js`; tests inject a stub.
|
|
101
|
+
* @param {{ info?: Function, warn?: Function, debug?: Function }} [opts.logger]
|
|
102
|
+
*/
|
|
103
|
+
constructor(opts = {}) {
|
|
104
|
+
if (
|
|
105
|
+
!opts.bus ||
|
|
106
|
+
typeof opts.bus.on !== 'function' ||
|
|
107
|
+
typeof opts.bus.emit !== 'function'
|
|
108
|
+
) {
|
|
109
|
+
throw new TypeError('BranchCleaner requires a bus with on() and emit()');
|
|
110
|
+
}
|
|
111
|
+
if (!Number.isInteger(opts.epicId) || opts.epicId < 1) {
|
|
112
|
+
throw new TypeError('BranchCleaner requires a numeric epicId');
|
|
113
|
+
}
|
|
114
|
+
if (!opts.checkpointer || typeof opts.checkpointer.read !== 'function') {
|
|
115
|
+
throw new TypeError(
|
|
116
|
+
'BranchCleaner requires a checkpointer exposing read()',
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
if (typeof opts.cwd !== 'string' || opts.cwd.length === 0) {
|
|
120
|
+
throw new TypeError('BranchCleaner requires a non-empty cwd string');
|
|
121
|
+
}
|
|
122
|
+
this.bus = opts.bus;
|
|
123
|
+
this.epicId = opts.epicId;
|
|
124
|
+
this.checkpointer = opts.checkpointer;
|
|
125
|
+
this.cwd = opts.cwd;
|
|
126
|
+
this.baseBranch = opts.baseBranch ?? 'main';
|
|
127
|
+
this.remote = opts.remote ?? 'origin';
|
|
128
|
+
this.gitSpawn = opts.gitSpawn ?? defaultGitSpawn;
|
|
129
|
+
this.rmSyncFn = opts.rmSyncFn ?? defaultRmSync;
|
|
130
|
+
// Story #3367 — forwarded to reapEpicBranches' open-PR guard probe.
|
|
131
|
+
// `undefined` lets epic-cleanup.js fall back to its real `spawnSync`.
|
|
132
|
+
this.spawnFn = opts.spawnFn;
|
|
133
|
+
this.logger = opts.logger ?? console;
|
|
134
|
+
/** @type {Set<string>} `${event}:${seqId}` idempotency cache. */
|
|
135
|
+
this._seen = new Set();
|
|
136
|
+
/**
|
|
137
|
+
* Classification log — every `epic.cleanup.start` observed lands
|
|
138
|
+
* here with the outcome (`reaped`, `no-state`, `failed`,
|
|
139
|
+
* `skipped-duplicate`). Mirrors Cleaner's "no silent skip" surface.
|
|
140
|
+
*/
|
|
141
|
+
this.classifications = [];
|
|
142
|
+
// Frozen tuple — BranchCleaner subscribes to EXACTLY one event.
|
|
143
|
+
this.events = Object.freeze(['epic.cleanup.start']);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
register() {
|
|
147
|
+
return this.events.map((event) =>
|
|
148
|
+
this.bus.on(event, async (ctx) => this.handle(ctx)),
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async handle({ event, seqId }) {
|
|
153
|
+
const key = `${event}:${seqId}`;
|
|
154
|
+
if (this._seen.has(key)) {
|
|
155
|
+
this.classifications.push({
|
|
156
|
+
event,
|
|
157
|
+
seqId,
|
|
158
|
+
outcome: 'skipped-duplicate',
|
|
159
|
+
});
|
|
160
|
+
this.logger.debug?.(`[BranchCleaner] skip duplicate ${key} (idempotent)`);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
this._seen.add(key);
|
|
164
|
+
|
|
165
|
+
let state;
|
|
166
|
+
try {
|
|
167
|
+
state = await this.checkpointer.read();
|
|
168
|
+
} catch (err) {
|
|
169
|
+
this.classifications.push({
|
|
170
|
+
event,
|
|
171
|
+
seqId,
|
|
172
|
+
outcome: 'failed',
|
|
173
|
+
reason: `checkpoint-read-failed:${err?.message ?? err}`,
|
|
174
|
+
});
|
|
175
|
+
this.logger.warn?.(
|
|
176
|
+
`[BranchCleaner] checkpoint read failed: ${err?.message ?? err}`,
|
|
177
|
+
);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (!state || !Number.isInteger(state.epicId) || state.epicId < 1) {
|
|
182
|
+
this.classifications.push({
|
|
183
|
+
event,
|
|
184
|
+
seqId,
|
|
185
|
+
outcome: 'no-state',
|
|
186
|
+
reason: 'checkpoint-absent-or-empty',
|
|
187
|
+
});
|
|
188
|
+
this.logger.info?.(
|
|
189
|
+
'[BranchCleaner] no epic-run-state checkpoint; nothing to reap.',
|
|
190
|
+
);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const result = reapEpicBranches({
|
|
195
|
+
state,
|
|
196
|
+
cwd: this.cwd,
|
|
197
|
+
gitSpawn: this.gitSpawn,
|
|
198
|
+
rmSyncFn: this.rmSyncFn,
|
|
199
|
+
baseBranch: this.baseBranch,
|
|
200
|
+
remote: this.remote,
|
|
201
|
+
spawnFn: this.spawnFn,
|
|
202
|
+
logger: this.logger,
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
const summary = summarizeReap(result);
|
|
206
|
+
if (result.ok) {
|
|
207
|
+
this.classifications.push({
|
|
208
|
+
event,
|
|
209
|
+
seqId,
|
|
210
|
+
outcome: 'reaped',
|
|
211
|
+
epicId: result.epicId,
|
|
212
|
+
...summary,
|
|
213
|
+
});
|
|
214
|
+
this.logger.info?.(
|
|
215
|
+
`[BranchCleaner] reaped ${summary.branchesDeleted} branch(es) + ${summary.worktreesRemoved} worktree(s) for epic/${result.epicId}`,
|
|
216
|
+
);
|
|
217
|
+
} else {
|
|
218
|
+
this.classifications.push({
|
|
219
|
+
event,
|
|
220
|
+
seqId,
|
|
221
|
+
outcome: 'failed',
|
|
222
|
+
reason: 'reap-failures',
|
|
223
|
+
epicId: result.epicId,
|
|
224
|
+
...summary,
|
|
225
|
+
failures: result.failures.map((f) => ({
|
|
226
|
+
branch: f.branch,
|
|
227
|
+
stderr: f.stderr ?? null,
|
|
228
|
+
})),
|
|
229
|
+
});
|
|
230
|
+
this.logger.warn?.(
|
|
231
|
+
`[BranchCleaner] ${result.failures.length} branch(es) failed to reap for epic/${result.epicId}`,
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
reset() {
|
|
237
|
+
this._seen.clear();
|
|
238
|
+
this.classifications = [];
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Pure: condense a `reapEpicBranches()` result into the counts that the
|
|
244
|
+
* classification log carries. Exported for tests.
|
|
245
|
+
*
|
|
246
|
+
* @param {{ reaped: Array<object>, pruned: { pruned: string[] }|null, wtBranch: { deleted: boolean }|null }} result
|
|
247
|
+
* @returns {{ branchesDeleted: number, worktreesRemoved: number, tracksPruned: number, wtBranchDeleted: boolean }}
|
|
248
|
+
*/
|
|
249
|
+
export function summarizeReap(result) {
|
|
250
|
+
const reaped = Array.isArray(result?.reaped) ? result.reaped : [];
|
|
251
|
+
return {
|
|
252
|
+
branchesDeleted: reaped.filter((r) => r.branchDeleted).length,
|
|
253
|
+
worktreesRemoved: reaped.filter(
|
|
254
|
+
(r) => r.worktreeReaped && r.method !== 'no-worktree',
|
|
255
|
+
).length,
|
|
256
|
+
tracksPruned: result?.pruned?.pruned?.length ?? 0,
|
|
257
|
+
wtBranchDeleted: result?.wtBranch?.deleted === true,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
// .agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js
|
|
2
|
+
/**
|
|
3
|
+
* CheckpointPointerWriter — lifecycle listener that maintains a
|
|
4
|
+
* minimal pointer file at `temp/epic-<id>/checkpoint.json` after every
|
|
5
|
+
* `*.end` lifecycle event (Story #2266 / Task #2268, Epic #2172).
|
|
6
|
+
*
|
|
7
|
+
* The writer replaces the legacy `epic-runner/checkpointer.js`
|
|
8
|
+
* structured-comment checkpointer with a ledger-driven pointer: the
|
|
9
|
+
* NDJSON ledger (`lifecycle.ndjson`) is the canonical run history, and
|
|
10
|
+
* the pointer file is a tiny `{ lastCompletedSeqId, phase }` snapshot
|
|
11
|
+
* the runner reads at resume time to seek the right offset into the
|
|
12
|
+
* ledger.
|
|
13
|
+
*
|
|
14
|
+
* Subscription set: **every event whose name ends in `.end`**. The
|
|
15
|
+
* frozen `EVENTS` tuple is computed from the lifecycle schema directory
|
|
16
|
+
* via the helper export so the registration cannot drift from the
|
|
17
|
+
* taxonomy without updating the schema set.
|
|
18
|
+
*
|
|
19
|
+
* Self-emit contract: after the pointer write succeeds the listener
|
|
20
|
+
* emits `checkpoint.written` exactly once per observed `*.end`. The
|
|
21
|
+
* self-emit is guarded by the per-instance `(event, seqId)` idempotency
|
|
22
|
+
* set so the bus's resume window (re-emitting an event whose `emitted`
|
|
23
|
+
* line landed but whose `completed` did not) cannot produce a duplicate
|
|
24
|
+
* `checkpoint.written`. The seqId set persists for the lifetime of the
|
|
25
|
+
* listener; cross-process restart relies on the on-disk pointer's
|
|
26
|
+
* monotonicity (the second invocation observes `lastCompletedSeqId >=
|
|
27
|
+
* payload.seqId` and short-circuits).
|
|
28
|
+
*
|
|
29
|
+
* Side-effect firewall: filesystem write + exactly one `bus.emit`. No
|
|
30
|
+
* provider calls, no GitHub IO, no runner-state mutation.
|
|
31
|
+
*
|
|
32
|
+
* Registration order: the runner factory registers this listener
|
|
33
|
+
* EARLY — before downstream listeners that may fail — so the pointer
|
|
34
|
+
* file always advances even if a later listener throws on the SAME
|
|
35
|
+
* `*.end`. The throw still flows through the bus's `onFailed` hook
|
|
36
|
+
* (LedgerWriter records a `failed` line) but the pointer reflects the
|
|
37
|
+
* last `*.end` that reached this listener, which is what the resume
|
|
38
|
+
* coordinator needs to skip past completed events on the next start.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
42
|
+
import path from 'node:path';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The pointer file name under `temp/epic-<id>/`. Stable and grep-able
|
|
46
|
+
* so future tooling can locate the file without re-deriving the path.
|
|
47
|
+
*/
|
|
48
|
+
export const POINTER_FILENAME = 'checkpoint.json';
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The self-emitted lifecycle event name. Matches the schema id at
|
|
52
|
+
* `.agents/schemas/lifecycle/checkpoint.written.schema.json`.
|
|
53
|
+
*/
|
|
54
|
+
export const CHECKPOINT_WRITTEN_EVENT = 'checkpoint.written';
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The frozen list of `*.end` events the writer subscribes to. Sourced
|
|
58
|
+
* from the lifecycle taxonomy (`.agents/schemas/lifecycle/*.end.schema.json`).
|
|
59
|
+
*
|
|
60
|
+
* Listed explicitly rather than discovered at runtime so:
|
|
61
|
+
* (a) the registration set is a code-visible contract — adding a new
|
|
62
|
+
* `*.end` event to the schema set forces a code change here,
|
|
63
|
+
* which is the seam reviewers grep for;
|
|
64
|
+
* (b) construction stays synchronous (no readdir + parse) and the
|
|
65
|
+
* constructor remains safe to call inside the runner factory.
|
|
66
|
+
*
|
|
67
|
+
* If a new `*.end` event is added to the schema directory, append it
|
|
68
|
+
* here. The `checkpoint.written` event itself is intentionally NOT in
|
|
69
|
+
* this list — the writer's own self-emit must not retrigger the writer
|
|
70
|
+
* (that would loop), and `checkpoint.written` is not an `*.end` event
|
|
71
|
+
* by naming convention.
|
|
72
|
+
*/
|
|
73
|
+
export const SUBSCRIBED_END_EVENTS = Object.freeze([
|
|
74
|
+
'close-validate.end',
|
|
75
|
+
'code-review.end',
|
|
76
|
+
'epic.automerge.end',
|
|
77
|
+
'epic.cleanup.end',
|
|
78
|
+
'epic.close.end',
|
|
79
|
+
'epic.finalize.end',
|
|
80
|
+
'epic.plan.end',
|
|
81
|
+
'epic.snapshot.end',
|
|
82
|
+
'epic.watch.end',
|
|
83
|
+
'retro.end',
|
|
84
|
+
'story.dispatch.end',
|
|
85
|
+
]);
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Resolve the pointer-file path for a given Epic. Exported so tests
|
|
89
|
+
* can target the same file without re-deriving the layout.
|
|
90
|
+
*/
|
|
91
|
+
export function resolvePointerPath({ tempRoot, epicId }) {
|
|
92
|
+
if (typeof tempRoot !== 'string' || tempRoot.length === 0) {
|
|
93
|
+
throw new TypeError(
|
|
94
|
+
'resolvePointerPath: tempRoot must be a non-empty string',
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
if (!Number.isInteger(epicId) || epicId < 1) {
|
|
98
|
+
throw new TypeError(
|
|
99
|
+
'resolvePointerPath: epicId must be a positive integer',
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
return path.join(tempRoot, `epic-${epicId}`, POINTER_FILENAME);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Build the pointer payload. Pulled out so tests can assert the exact
|
|
107
|
+
* on-disk shape without parsing JSON every time.
|
|
108
|
+
*/
|
|
109
|
+
export function buildPointerPayload({ lastCompletedSeqId, phase }) {
|
|
110
|
+
return {
|
|
111
|
+
lastCompletedSeqId,
|
|
112
|
+
phase,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* CheckpointPointerWriter listener.
|
|
118
|
+
*/
|
|
119
|
+
export class CheckpointPointerWriter {
|
|
120
|
+
/**
|
|
121
|
+
* @param {object} opts
|
|
122
|
+
* @param {object} opts.bus Lifecycle bus exposing `on()` + `emit()`.
|
|
123
|
+
* @param {number} opts.epicId Epic ticket id.
|
|
124
|
+
* @param {string} opts.tempRoot Absolute or repo-relative path; the
|
|
125
|
+
* listener resolves `<tempRoot>/epic-<id>/checkpoint.json`.
|
|
126
|
+
* @param {typeof writeFileSync} [opts.writeFn] Injectable writer for
|
|
127
|
+
* tests.
|
|
128
|
+
* @param {typeof mkdirSync} [opts.mkdirFn] Injectable directory
|
|
129
|
+
* creator for tests.
|
|
130
|
+
* @param {{ info?: Function, warn?: Function, debug?: Function }} [opts.logger]
|
|
131
|
+
*/
|
|
132
|
+
constructor(opts = {}) {
|
|
133
|
+
if (
|
|
134
|
+
!opts.bus ||
|
|
135
|
+
typeof opts.bus.on !== 'function' ||
|
|
136
|
+
typeof opts.bus.emit !== 'function'
|
|
137
|
+
) {
|
|
138
|
+
throw new TypeError(
|
|
139
|
+
'CheckpointPointerWriter requires a bus with on() and emit()',
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
if (!Number.isInteger(opts.epicId) || opts.epicId < 1) {
|
|
143
|
+
throw new TypeError('CheckpointPointerWriter requires a numeric epicId');
|
|
144
|
+
}
|
|
145
|
+
if (typeof opts.tempRoot !== 'string' || opts.tempRoot.length === 0) {
|
|
146
|
+
throw new TypeError(
|
|
147
|
+
'CheckpointPointerWriter requires a non-empty tempRoot string',
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
this.bus = opts.bus;
|
|
151
|
+
this.epicId = opts.epicId;
|
|
152
|
+
this.tempRoot = opts.tempRoot;
|
|
153
|
+
this._writeFn = opts.writeFn ?? writeFileSync;
|
|
154
|
+
this._mkdirFn = opts.mkdirFn ?? mkdirSync;
|
|
155
|
+
this.logger = opts.logger ?? console;
|
|
156
|
+
this._pointerPath = resolvePointerPath({
|
|
157
|
+
tempRoot: this.tempRoot,
|
|
158
|
+
epicId: this.epicId,
|
|
159
|
+
});
|
|
160
|
+
this._epicDir = path.dirname(this._pointerPath);
|
|
161
|
+
/** @type {Set<string>} `${event}:${seqId}` idempotency cache. */
|
|
162
|
+
this._seen = new Set();
|
|
163
|
+
/**
|
|
164
|
+
* Monotonic seqId guard. The pointer's `lastCompletedSeqId` MUST
|
|
165
|
+
* be non-decreasing — observing a lower seqId after a higher one
|
|
166
|
+
* means we are replaying an out-of-order event (resume window or
|
|
167
|
+
* test misuse). The listener short-circuits on the regression and
|
|
168
|
+
* logs a debug line; it does NOT throw, because a resume cycle
|
|
169
|
+
* can legitimately replay older `emitted` lines before catching
|
|
170
|
+
* up.
|
|
171
|
+
*/
|
|
172
|
+
this._lastSeqId = 0;
|
|
173
|
+
this.events = SUBSCRIBED_END_EVENTS;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Resolved on-disk path for the pointer file. Exposed for tests.
|
|
178
|
+
*/
|
|
179
|
+
get pointerPath() {
|
|
180
|
+
return this._pointerPath;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Register the listener on every subscribed `*.end` event. Returns
|
|
185
|
+
* the array of unsubscribe callbacks the bus produced (parity with
|
|
186
|
+
* `signals-appender.register()`).
|
|
187
|
+
*/
|
|
188
|
+
register() {
|
|
189
|
+
return this.events.map((event) =>
|
|
190
|
+
this.bus.on(event, async (ctx) => this.handle(ctx)),
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Bus listener body. Idempotent on `(event, seqId)`; emits
|
|
196
|
+
* `checkpoint.written` exactly once after the pointer write
|
|
197
|
+
* succeeds.
|
|
198
|
+
*/
|
|
199
|
+
async handle({ event, seqId, payload: _payload }) {
|
|
200
|
+
const key = `${event}:${seqId}`;
|
|
201
|
+
if (this._seen.has(key)) {
|
|
202
|
+
this.logger.debug?.(
|
|
203
|
+
`[CheckpointPointerWriter] skip duplicate ${key} (idempotent)`,
|
|
204
|
+
);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
this._seen.add(key);
|
|
208
|
+
|
|
209
|
+
// Resume / out-of-order guard. The on-disk pointer is the
|
|
210
|
+
// canonical "highest seqId observed so far" — when a replay
|
|
211
|
+
// delivers a seqId lower than what we already wrote, we keep the
|
|
212
|
+
// pointer untouched and do NOT re-emit `checkpoint.written` for
|
|
213
|
+
// the stale event. This makes the listener safe to register
|
|
214
|
+
// BEFORE the resume coordinator has fully consumed the prior
|
|
215
|
+
// ledger.
|
|
216
|
+
if (seqId <= this._lastSeqId) {
|
|
217
|
+
this.logger.debug?.(
|
|
218
|
+
`[CheckpointPointerWriter] skip non-advancing seqId=${seqId} (lastCompletedSeqId=${this._lastSeqId})`,
|
|
219
|
+
);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// The `phase` carried in the pointer is the event name itself —
|
|
224
|
+
// every `*.end` event is by convention a phase boundary, so the
|
|
225
|
+
// event name is the human-readable phase label the resume
|
|
226
|
+
// coordinator displays ("we crashed after wave.end seqId=42").
|
|
227
|
+
// Embedding the event name keeps the pointer self-describing
|
|
228
|
+
// without requiring an extra `payload.phase` field on every
|
|
229
|
+
// schema.
|
|
230
|
+
const phase = event;
|
|
231
|
+
const pointerPayload = buildPointerPayload({
|
|
232
|
+
lastCompletedSeqId: seqId,
|
|
233
|
+
phase,
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
try {
|
|
237
|
+
this._mkdirFn(this._epicDir, { recursive: true });
|
|
238
|
+
// `writeFileSync` with the default flag truncates — exactly
|
|
239
|
+
// what we want: the pointer is a single-line atomic snapshot,
|
|
240
|
+
// not an append log. The ledger is the append log; this file
|
|
241
|
+
// is the cursor.
|
|
242
|
+
this._writeFn(
|
|
243
|
+
this._pointerPath,
|
|
244
|
+
`${JSON.stringify(pointerPayload)}\n`,
|
|
245
|
+
'utf8',
|
|
246
|
+
);
|
|
247
|
+
} catch (err) {
|
|
248
|
+
// A failed pointer write is recoverable — the ledger still has
|
|
249
|
+
// the full history, and the next `*.end` will retry the
|
|
250
|
+
// pointer. Surface as a warning and bail before the self-emit
|
|
251
|
+
// so we don't claim progress we didn't persist.
|
|
252
|
+
this.logger.warn?.(
|
|
253
|
+
`[CheckpointPointerWriter] pointer write failed for ${key}: ${err?.message ?? err}`,
|
|
254
|
+
);
|
|
255
|
+
// Leave the seqId guard advanced for this `(event, seqId)` so
|
|
256
|
+
// the in-process retry path doesn't loop on the same failure,
|
|
257
|
+
// but DO NOT bump `_lastSeqId` — the next event may still want
|
|
258
|
+
// to advance past `seqId`.
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
this._lastSeqId = seqId;
|
|
262
|
+
|
|
263
|
+
// Self-emit AFTER the pointer write succeeds. Per the listener
|
|
264
|
+
// README, listeners MAY emit follow-up events; the seqId guard
|
|
265
|
+
// above ensures `checkpoint.written` fires exactly once per
|
|
266
|
+
// observed `*.end`.
|
|
267
|
+
await this.bus.emit(CHECKPOINT_WRITTEN_EVENT, pointerPayload);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Test-only — clear the seqId cache so a single instance can
|
|
272
|
+
* exercise resume scenarios without re-constructing the listener.
|
|
273
|
+
*/
|
|
274
|
+
resetSeen() {
|
|
275
|
+
this._seen.clear();
|
|
276
|
+
this._lastSeqId = 0;
|
|
277
|
+
}
|
|
278
|
+
}
|