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,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* detectors-phase.js — pure post-merge phase that runs the per-Story
|
|
3
|
+
* signal detectors (rework + retry) before `analyze-execution.js` shells
|
|
4
|
+
* out to render the `<!-- structured:story-perf-summary -->` comment.
|
|
5
|
+
*
|
|
6
|
+
* Extracted from `post-merge-pipeline.js` (Story #1770 / Task #1779) to
|
|
7
|
+
* keep the parent sequencer's maintainability score above its baseline
|
|
8
|
+
* after the new wiring layer landed. The phase contract is identical to
|
|
9
|
+
* every other entry in `DEFAULT_POST_MERGE_PHASES`: take a context bag,
|
|
10
|
+
* return a value the runner stitches under a `stateKey`.
|
|
11
|
+
*
|
|
12
|
+
* ### Contract
|
|
13
|
+
*
|
|
14
|
+
* - **Pure detectors.** Both `detectRework` and `detectRetry` are pure
|
|
15
|
+
* modules under `lib/signals/detectors/` — they read the per-Story
|
|
16
|
+
* `traces.ndjson` and return SignalEvent arrays. This phase resolves
|
|
17
|
+
* the operator-tunable thresholds via `getSignals(config)` (Epic
|
|
18
|
+
* #1720 — `delivery.signals.*`), invokes each detector, and persists
|
|
19
|
+
* each event through `appendSignal` so the per-Story `signals.ndjson`
|
|
20
|
+
* stream covers both kinds before the analyzer reads it.
|
|
21
|
+
*
|
|
22
|
+
* - **Failure isolation.** A failing detector or a per-event append
|
|
23
|
+
* MUST NOT block Task close. Each call is wrapped in try/catch;
|
|
24
|
+
* failures degrade to a warn and contribute 0 to the offending
|
|
25
|
+
* detector's count. The phase always resolves with a stable
|
|
26
|
+
* `{ rework: N, retry: N }` shape.
|
|
27
|
+
*
|
|
28
|
+
* - **One info line per close.** The summary log
|
|
29
|
+
* (`detectors: rework=N retry=M`) is the only stdout signal — one
|
|
30
|
+
* line per Story rather than two per detector + N per event.
|
|
31
|
+
*
|
|
32
|
+
* - **3-tier (Storyless) closure (Story #3127).** When `tasks` is
|
|
33
|
+
* empty (the 3-tier hierarchy shape), `resolveLastTaskId` returns
|
|
34
|
+
* `null` and both detectors run with `taskId: null`. The detector
|
|
35
|
+
* modules already accept a nullable `taskId` (see
|
|
36
|
+
* `lib/signals/detectors/{rework,retry}.js`), so no branching on
|
|
37
|
+
* hierarchy mode is required here.
|
|
38
|
+
*
|
|
39
|
+
* @module lib/orchestration/detectors-phase
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
import { getSignals } from '../config/limits.js';
|
|
43
|
+
import { storyArtifactPath } from '../config/temp-paths.js';
|
|
44
|
+
import { Logger } from '../Logger.js';
|
|
45
|
+
import { appendSignal } from '../observability/signals-writer.js';
|
|
46
|
+
import { detectRetry, detectRework } from '../signals/detectors/index.js';
|
|
47
|
+
|
|
48
|
+
function reapPhaseLogger(progress) {
|
|
49
|
+
return progress ?? (() => {});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function resolveLastTaskId(tasks) {
|
|
53
|
+
if (!Array.isArray(tasks) || tasks.length === 0) return null;
|
|
54
|
+
const last = tasks[tasks.length - 1];
|
|
55
|
+
const id = Number(last?.id ?? last);
|
|
56
|
+
return Number.isInteger(id) && id > 0 ? id : null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function persistDetectorEvents({
|
|
60
|
+
events,
|
|
61
|
+
epicId,
|
|
62
|
+
storyId,
|
|
63
|
+
config,
|
|
64
|
+
appendSignalFn,
|
|
65
|
+
logger,
|
|
66
|
+
kind,
|
|
67
|
+
}) {
|
|
68
|
+
let count = 0;
|
|
69
|
+
for (const evt of events) {
|
|
70
|
+
try {
|
|
71
|
+
await appendSignalFn({ epicId, storyId, signal: evt, config });
|
|
72
|
+
count += 1;
|
|
73
|
+
} catch (err) {
|
|
74
|
+
logger?.warn?.(
|
|
75
|
+
`[detectors-phase] ${kind} appendSignal failed (${err?.message ?? err})`,
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return count;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function runOneDetector({
|
|
83
|
+
detectorFn,
|
|
84
|
+
args,
|
|
85
|
+
epicId,
|
|
86
|
+
storyId,
|
|
87
|
+
config,
|
|
88
|
+
appendSignalFn,
|
|
89
|
+
logger,
|
|
90
|
+
kind,
|
|
91
|
+
}) {
|
|
92
|
+
try {
|
|
93
|
+
const events = await detectorFn(args);
|
|
94
|
+
return await persistDetectorEvents({
|
|
95
|
+
events,
|
|
96
|
+
epicId,
|
|
97
|
+
storyId,
|
|
98
|
+
config,
|
|
99
|
+
appendSignalFn,
|
|
100
|
+
logger,
|
|
101
|
+
kind,
|
|
102
|
+
});
|
|
103
|
+
} catch (err) {
|
|
104
|
+
logger?.warn?.(
|
|
105
|
+
`[detectors-phase] ${kind} detector threw (${err?.message ?? err})`,
|
|
106
|
+
);
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function isValidIdPair(eid, sid) {
|
|
112
|
+
return Number.isInteger(eid) && eid > 0 && Number.isInteger(sid) && sid > 0;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Run the rework + retry detectors for one Story and persist every
|
|
117
|
+
* emission to `temp/epic-<eid>/stories/story-<sid>/signals.ndjson`.
|
|
118
|
+
*
|
|
119
|
+
* @param {{
|
|
120
|
+
* epicId: number|string,
|
|
121
|
+
* storyId: number|string,
|
|
122
|
+
* tasks?: Array<{ id?: number|string }>,
|
|
123
|
+
* config?: object,
|
|
124
|
+
* progress?: Function,
|
|
125
|
+
* logger?: object,
|
|
126
|
+
* detectorsImpl?: { detectRework?: typeof detectRework, detectRetry?: typeof detectRetry },
|
|
127
|
+
* appendSignalFn?: typeof appendSignal,
|
|
128
|
+
* }} ctx
|
|
129
|
+
* @returns {Promise<{ rework: number, retry: number }>}
|
|
130
|
+
*/
|
|
131
|
+
export async function detectorsPhase(ctx) {
|
|
132
|
+
const {
|
|
133
|
+
epicId,
|
|
134
|
+
storyId,
|
|
135
|
+
tasks,
|
|
136
|
+
config,
|
|
137
|
+
progress,
|
|
138
|
+
logger = Logger,
|
|
139
|
+
detectorsImpl,
|
|
140
|
+
appendSignalFn = appendSignal,
|
|
141
|
+
} = ctx;
|
|
142
|
+
const log = reapPhaseLogger(progress);
|
|
143
|
+
const eid = Number(epicId);
|
|
144
|
+
const sid = Number(storyId);
|
|
145
|
+
if (!isValidIdPair(eid, sid)) {
|
|
146
|
+
logger?.warn?.(
|
|
147
|
+
`[detectors-phase] skipped: invalid epicId=${epicId} / storyId=${storyId}`,
|
|
148
|
+
);
|
|
149
|
+
return { rework: 0, retry: 0 };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
let signalsCfg;
|
|
153
|
+
try {
|
|
154
|
+
signalsCfg = getSignals(config);
|
|
155
|
+
} catch (err) {
|
|
156
|
+
logger?.warn?.(
|
|
157
|
+
`[detectors-phase] getSignals failed (${err?.message ?? err}); using zero counts`,
|
|
158
|
+
);
|
|
159
|
+
return { rework: 0, retry: 0 };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const tracesPath = storyArtifactPath(eid, sid, 'traces.ndjson', config);
|
|
163
|
+
const taskId = resolveLastTaskId(tasks);
|
|
164
|
+
const baseArgs = { tracesPath, epicId: eid, storyId: sid, taskId };
|
|
165
|
+
const common = {
|
|
166
|
+
epicId: eid,
|
|
167
|
+
storyId: sid,
|
|
168
|
+
config,
|
|
169
|
+
appendSignalFn,
|
|
170
|
+
logger,
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const rework = await runOneDetector({
|
|
174
|
+
...common,
|
|
175
|
+
detectorFn: detectorsImpl?.detectRework ?? detectRework,
|
|
176
|
+
args: { ...baseArgs, threshold: signalsCfg.rework.editsPerFile },
|
|
177
|
+
kind: 'rework',
|
|
178
|
+
});
|
|
179
|
+
const retry = await runOneDetector({
|
|
180
|
+
...common,
|
|
181
|
+
detectorFn: detectorsImpl?.detectRetry ?? detectRetry,
|
|
182
|
+
args: { ...baseArgs, threshold: signalsCfg.retry.repeatCount },
|
|
183
|
+
kind: 'retry',
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
log('DETECTORS', `detectors: rework=${rework} retry=${retry}`);
|
|
187
|
+
return { rework, retry };
|
|
188
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/orchestration/dispatch-engine.js — Core Dispatch Engine (SDK coordinator)
|
|
3
|
+
*
|
|
4
|
+
* Thin facade composing:
|
|
5
|
+
* - `dispatch-pipeline.js` — internal resolve/fetch/reconcile/graph helpers
|
|
6
|
+
*
|
|
7
|
+
* Every Epic is 3-tier (Epic → Feature → Story); `dispatch()` computes a
|
|
8
|
+
* Story-level wave plan and emits a 3-tier manifest. The legacy Task-tier
|
|
9
|
+
* dispatch runtime (Task fetcher, single-Story executor, the per-Task
|
|
10
|
+
* wave fan-out, and the Epic-completion detector) was removed in Epic
|
|
11
|
+
* #3163.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { PROJECT_ROOT, resolveConfig } from '../config-resolver.js';
|
|
15
|
+
import { ConflictingTypeLabelsError } from '../errors/index.js';
|
|
16
|
+
import { ensureLocalBranch } from '../git-branch-lifecycle.js';
|
|
17
|
+
import { Logger } from '../Logger.js';
|
|
18
|
+
import { TYPE_LABELS } from '../label-constants.js';
|
|
19
|
+
import { createProvider } from '../provider-factory.js';
|
|
20
|
+
import {
|
|
21
|
+
buildStoryDispatchGraph,
|
|
22
|
+
fetchEpicContext,
|
|
23
|
+
isThreeTierDispatch,
|
|
24
|
+
reconcileEpicState,
|
|
25
|
+
resolveDispatchContext,
|
|
26
|
+
} from './dispatch-pipeline.js';
|
|
27
|
+
import { buildManifest } from './manifest-builder.js';
|
|
28
|
+
import { STATE_LABELS } from './ticketing.js';
|
|
29
|
+
|
|
30
|
+
export const AGENT_DONE_LABEL = STATE_LABELS.DONE;
|
|
31
|
+
export const AGENT_EXECUTING_LABEL = STATE_LABELS.EXECUTING;
|
|
32
|
+
export const AGENT_READY_LABEL = STATE_LABELS.READY;
|
|
33
|
+
|
|
34
|
+
/* node:coverage ignore next */
|
|
35
|
+
export function ensureBranch(branchName, baseBranch) {
|
|
36
|
+
ensureLocalBranch(branchName, baseBranch, PROJECT_ROOT, {
|
|
37
|
+
log: (msg) => Logger.info(msg),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Resolve a single ticket ID, detect its type, and delegate to the
|
|
43
|
+
* appropriate execution pipeline. Single entry point shared by the CLI
|
|
44
|
+
* wrapper and the MCP `dispatch_wave` tool.
|
|
45
|
+
*/
|
|
46
|
+
export async function resolveAndDispatch(options) {
|
|
47
|
+
const { ticketId, dryRun = false } = options;
|
|
48
|
+
const config = resolveConfig();
|
|
49
|
+
const provider = options.provider ?? createProvider(config);
|
|
50
|
+
|
|
51
|
+
const ticket = await provider.getTicket(ticketId);
|
|
52
|
+
const labels = ticket.labels || [];
|
|
53
|
+
|
|
54
|
+
const typeLabels = labels.filter((l) => l.startsWith('type::'));
|
|
55
|
+
if (typeLabels.length > 1) {
|
|
56
|
+
throw new ConflictingTypeLabelsError(
|
|
57
|
+
`Ticket #${ticketId} has conflicting type labels: ${typeLabels.join(', ')}. Exactly one type::* label is required.`,
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const isStory = labels.includes(TYPE_LABELS.STORY);
|
|
62
|
+
const isEpic = labels.includes(TYPE_LABELS.EPIC);
|
|
63
|
+
const isFeature = labels.includes(TYPE_LABELS.FEATURE);
|
|
64
|
+
|
|
65
|
+
if (isStory) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
`[Dispatcher] Ticket #${ticketId} is a **Story**. Stories are dispatched ` +
|
|
68
|
+
'through the 3-tier Story path, not directly via the dispatcher. ' +
|
|
69
|
+
`Run \`/story-deliver ${ticketId}\` to execute this Story, ` +
|
|
70
|
+
`or dispatch its parent Epic with \`/epic-deliver #<epicId>\`.`,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (isEpic) {
|
|
75
|
+
return dispatch({ epicId: ticketId, dryRun, provider });
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (isFeature) {
|
|
79
|
+
throw new Error(
|
|
80
|
+
`[Dispatcher] Ticket #${ticketId} is a **Feature**. Features are containers and cannot be executed directly. ` +
|
|
81
|
+
`Please execute individual Stories within this Feature using \`/epic-deliver #[Story ID]\`, ` +
|
|
82
|
+
`or dispatch the entire Epic using \`/epic-deliver #${ticket.body?.match(/^parent:\s*#(\d+)/m)?.[1] || 'ID'}\`.`,
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const typeLabel = labels.find((l) => l.startsWith('type::')) || 'unknown';
|
|
87
|
+
throw new Error(
|
|
88
|
+
`[Dispatcher] Ticket #${ticketId} has type "${typeLabel.replace('type::', '')}". ` +
|
|
89
|
+
`Only "epic" or "story" tickets can be dispatched. ` +
|
|
90
|
+
`Please ensure the ticket is correctly categorized before execution.`,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Main dispatcher. Orchestrates one dispatch cycle for an Epic.
|
|
96
|
+
* Primary public export of the orchestration SDK.
|
|
97
|
+
*/
|
|
98
|
+
export async function dispatch(options) {
|
|
99
|
+
const ctx = resolveDispatchContext(options, ensureBranch);
|
|
100
|
+
const { epicId, dryRun } = ctx;
|
|
101
|
+
|
|
102
|
+
const fetched = await fetchEpicContext(ctx);
|
|
103
|
+
await reconcileEpicState(ctx, fetched);
|
|
104
|
+
|
|
105
|
+
// Every Epic is 3-tier (Epic → Feature → Story). Compute Story-level
|
|
106
|
+
// waves directly from the Story tickets and emit a 3-tier-shaped
|
|
107
|
+
// manifest with `waves[].stories[]` so downstream consumers (manifest
|
|
108
|
+
// renderer, /epic-deliver wave planner) see the correct execution plan.
|
|
109
|
+
// Per-Story execution is owned by `/story-deliver` (story-init →
|
|
110
|
+
// story-close), not by this dispatcher.
|
|
111
|
+
if (isThreeTierDispatch(fetched.allTickets)) {
|
|
112
|
+
Logger.info(
|
|
113
|
+
'Detected 3-tier hierarchy — computing Story-level execution waves.',
|
|
114
|
+
);
|
|
115
|
+
const { allWaves: storyWaves } = buildStoryDispatchGraph(
|
|
116
|
+
fetched.allTickets,
|
|
117
|
+
);
|
|
118
|
+
return buildManifest({
|
|
119
|
+
epicId,
|
|
120
|
+
epic: fetched.epic,
|
|
121
|
+
tasks: [],
|
|
122
|
+
allTickets: fetched.allTickets,
|
|
123
|
+
waves: storyWaves,
|
|
124
|
+
dispatched: [],
|
|
125
|
+
dryRun,
|
|
126
|
+
hierarchy: '3-tier',
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// No Story tickets under the Epic — nothing to dispatch. Emit an empty
|
|
131
|
+
// manifest so callers (renderer, /epic-deliver) get a well-formed
|
|
132
|
+
// artifact instead of a throw.
|
|
133
|
+
Logger.info('No Story tickets found under the Epic. Nothing to dispatch.');
|
|
134
|
+
return buildManifest({
|
|
135
|
+
epicId,
|
|
136
|
+
epic: fetched.epic,
|
|
137
|
+
tasks: [],
|
|
138
|
+
allTickets: fetched.allTickets,
|
|
139
|
+
waves: [],
|
|
140
|
+
dispatched: [],
|
|
141
|
+
dryRun,
|
|
142
|
+
hierarchy: '3-tier',
|
|
143
|
+
});
|
|
144
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dispatch-pipeline.js
|
|
3
|
+
*
|
|
4
|
+
* Internal pipeline helpers composed by `dispatch-engine.js::dispatch()`.
|
|
5
|
+
* Keeping these out of the coordinator keeps the public entry point compact
|
|
6
|
+
* and focused on the 3-tier flow: resolve → fetch → reconcile → Story-graph.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { PROJECT_ROOT, resolveConfig } from '../config-resolver.js';
|
|
10
|
+
import { parseBlockedBy } from '../dependency-parser.js';
|
|
11
|
+
import { getEpicBranch } from '../git-utils.js';
|
|
12
|
+
import { Logger } from '../Logger.js';
|
|
13
|
+
import { TYPE_LABELS } from '../label-constants.js';
|
|
14
|
+
import { createProvider } from '../provider-factory.js';
|
|
15
|
+
import { WorktreeManager } from '../worktree-manager.js';
|
|
16
|
+
import { computeStoryWaves } from './dependency-analyzer.js';
|
|
17
|
+
import { reconcileHierarchy } from './reconciler.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Runtime context for a single dispatch cycle.
|
|
21
|
+
*
|
|
22
|
+
* Produced by {@link resolveDispatchContext} and consumed by every pipeline
|
|
23
|
+
* stage (fetch → reconcile → graph → scaffold → GC → dispatch). All fields
|
|
24
|
+
* are resolved once up-front so downstream helpers can stay free of
|
|
25
|
+
* configuration look-ups.
|
|
26
|
+
*
|
|
27
|
+
* @typedef {object} DispatchContext
|
|
28
|
+
* @property {number} epicId Epic ticket number under dispatch.
|
|
29
|
+
* @property {boolean} dryRun When true, mutating side-effects are skipped.
|
|
30
|
+
* @property {object} config Resolved canonical `.agentrc.json` (with `project`, `github`, `planning`, `delivery` blocks).
|
|
31
|
+
* @property {import('../ITicketingProvider.js').ITicketingProvider} provider Ticketing provider (may come from cache).
|
|
32
|
+
* @property {import('../worktree-manager.js').WorktreeManager | undefined} worktreeManager Optional worktree manager (only when isolation is enabled and not dry-run).
|
|
33
|
+
* @property {string} baseBranch Trunk branch the Epic branches from (default `main`).
|
|
34
|
+
* @property {string} epicBranch Epic branch name (`epic/<epicId>`).
|
|
35
|
+
* @property {(branchName: string, baseBranch: string) => void} ensureBranch Caller-supplied branch-creation helper.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The output of {@link fetchEpicContext}.
|
|
40
|
+
*
|
|
41
|
+
* @typedef {object} FetchedEpic
|
|
42
|
+
* @property {object} epic The Epic ticket record.
|
|
43
|
+
* @property {object[]} allTickets Every ticket under the Epic (stories + features + health).
|
|
44
|
+
* @property {Map<number, object>} allTicketsById Index of `allTickets` by ticket id.
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Resolve the runtime context for a dispatch: canonical config, provider, adapter,
|
|
49
|
+
* worktree manager, base/epic branch names, and the `ensureBranch` bound
|
|
50
|
+
* helper supplied by the caller.
|
|
51
|
+
*
|
|
52
|
+
* @param {object} options Dispatch entry options.
|
|
53
|
+
* @param {number} options.epicId Epic ticket number.
|
|
54
|
+
* @param {boolean} [options.dryRun=false] When true, skip branch creation and worktree setup.
|
|
55
|
+
* @param {import('../ITicketingProvider.js').ITicketingProvider} [options.provider] Pre-constructed provider (overrides factory).
|
|
56
|
+
* @param {import('../worktree-manager.js').WorktreeManager} [options.worktreeManager] Pre-constructed worktree manager.
|
|
57
|
+
* @param {(branchName: string, baseBranch: string) => void} ensureBranch Branch-creation helper bound by caller (keeps engine ↔ git-lifecycle coupling at the edge).
|
|
58
|
+
* @returns {DispatchContext} Fully resolved dispatch context.
|
|
59
|
+
*/
|
|
60
|
+
export function resolveDispatchContext(options, ensureBranch) {
|
|
61
|
+
const { epicId, dryRun = false } = options;
|
|
62
|
+
|
|
63
|
+
const config = resolveConfig();
|
|
64
|
+
const provider = options.provider ?? createProvider(config);
|
|
65
|
+
|
|
66
|
+
const wtConfig = config?.delivery?.worktreeIsolation;
|
|
67
|
+
let worktreeManager = options.worktreeManager;
|
|
68
|
+
if (!worktreeManager && wtConfig?.enabled && !dryRun) {
|
|
69
|
+
worktreeManager = new WorktreeManager({
|
|
70
|
+
repoRoot: PROJECT_ROOT,
|
|
71
|
+
config: wtConfig,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
epicId,
|
|
77
|
+
dryRun,
|
|
78
|
+
config,
|
|
79
|
+
provider,
|
|
80
|
+
worktreeManager,
|
|
81
|
+
baseBranch: config?.project?.baseBranch ?? 'main',
|
|
82
|
+
epicBranch: getEpicBranch(epicId),
|
|
83
|
+
ensureBranch,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Fetch Epic + all tickets and prime the provider cache.
|
|
89
|
+
*
|
|
90
|
+
* @param {DispatchContext} ctx Dispatch context.
|
|
91
|
+
* @returns {Promise<FetchedEpic>} Epic + ticket graph.
|
|
92
|
+
*/
|
|
93
|
+
export async function fetchEpicContext(ctx) {
|
|
94
|
+
const { provider, epicId } = ctx;
|
|
95
|
+
|
|
96
|
+
Logger.info(`\nFetching Epic #${epicId}...`);
|
|
97
|
+
const epic = await provider.getEpic(epicId);
|
|
98
|
+
|
|
99
|
+
Logger.info(`Fetching all tickets under Epic #${epicId}...`);
|
|
100
|
+
const allTickets = await provider.getTickets(epicId);
|
|
101
|
+
const allTicketsById = new Map(allTickets.map((t) => [t.id, t]));
|
|
102
|
+
|
|
103
|
+
provider.primeTicketCache(allTickets);
|
|
104
|
+
|
|
105
|
+
return { epic, allTickets, allTicketsById };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Propagate already-done work up the hierarchy so the manifest reflects
|
|
110
|
+
* reality before dispatch. Walks Stories → Features bottom-up.
|
|
111
|
+
*
|
|
112
|
+
* @param {DispatchContext} ctx Dispatch context.
|
|
113
|
+
* @param {FetchedEpic} fetched Result of {@link fetchEpicContext}.
|
|
114
|
+
* @returns {Promise<void>}
|
|
115
|
+
*/
|
|
116
|
+
export async function reconcileEpicState(ctx, fetched) {
|
|
117
|
+
const { provider, dryRun, epicId } = ctx;
|
|
118
|
+
const { epic, allTickets } = fetched;
|
|
119
|
+
|
|
120
|
+
await reconcileHierarchy(provider, epicId, epic, allTickets, dryRun);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Detect 3-tier hierarchy from the fetched ticket graph. After Epic #3163's
|
|
125
|
+
* hard cutover deleted the `type::task` ticket layer, shape selection is
|
|
126
|
+
* purely structural: any Epic carrying at least one `type::story` ticket
|
|
127
|
+
* resolves to 3-tier.
|
|
128
|
+
*
|
|
129
|
+
* @param {object[]} allTickets
|
|
130
|
+
* @returns {boolean}
|
|
131
|
+
*/
|
|
132
|
+
export function isThreeTierDispatch(allTickets) {
|
|
133
|
+
if (!Array.isArray(allTickets) || allTickets.length === 0) return false;
|
|
134
|
+
return allTickets.some((t) =>
|
|
135
|
+
(t.labelSet ?? new Set(t.labels ?? [])).has(TYPE_LABELS.STORY),
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Build the Story-level dispatch graph for a 3-tier Epic. Reads story
|
|
141
|
+
* tickets from `allTickets`, parses cross-Story `blocked by` references
|
|
142
|
+
* from each Story body (also honoring an optional `dependencies[]`
|
|
143
|
+
* field set by fixture providers), and computes wave indices via
|
|
144
|
+
* {@link computeStoryWaves}.
|
|
145
|
+
*
|
|
146
|
+
* The returned `allWaves` is an array of Story-ticket arrays, ordered by
|
|
147
|
+
* wave index. `storyMap` indexes the same Story tickets by id for downstream
|
|
148
|
+
* lookups (mirrors the `taskMap` returned by {@link buildDispatchGraph}).
|
|
149
|
+
*
|
|
150
|
+
* Stories with no resolvable wave (cycle pre-filter, missing in groups)
|
|
151
|
+
* are placed in their own trailing wave so they remain visible in the
|
|
152
|
+
* manifest output.
|
|
153
|
+
*
|
|
154
|
+
* @param {object[]} allTickets Fetched ticket graph (Epic + Features + Stories).
|
|
155
|
+
* @returns {{ allWaves: object[][], storyMap: Map<number, object> }}
|
|
156
|
+
* @throws {Error} When the Story dependency graph contains a cycle.
|
|
157
|
+
*/
|
|
158
|
+
export function buildStoryDispatchGraph(allTickets) {
|
|
159
|
+
const stories = (allTickets ?? []).filter((t) =>
|
|
160
|
+
(t.labelSet ?? new Set(t.labels ?? [])).has(TYPE_LABELS.STORY),
|
|
161
|
+
);
|
|
162
|
+
const storyMap = new Map(stories.map((s) => [s.id, s]));
|
|
163
|
+
|
|
164
|
+
const explicitDeps = new Map();
|
|
165
|
+
for (const story of stories) {
|
|
166
|
+
const fromBody = parseBlockedBy(story.body ?? '');
|
|
167
|
+
const fromField = Array.isArray(story.dependencies)
|
|
168
|
+
? story.dependencies.map(Number)
|
|
169
|
+
: [];
|
|
170
|
+
const merged = [...new Set([...fromBody, ...fromField])].filter(
|
|
171
|
+
(id) => Number.isInteger(id) && id !== story.id && storyMap.has(id),
|
|
172
|
+
);
|
|
173
|
+
if (merged.length > 0) explicitDeps.set(story.id, merged);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// computeStoryWaves expects a Map<storyId, { tasks: [] }>; with no Tasks
|
|
177
|
+
// present, only explicitDeps + focus-area rollup (no-op for empty
|
|
178
|
+
// task lists) drive wave assignment.
|
|
179
|
+
const storyGroups = new Map(
|
|
180
|
+
stories.map((s) => [s.id, { storyId: s.id, tasks: [] }]),
|
|
181
|
+
);
|
|
182
|
+
const waveAssignment = computeStoryWaves(storyGroups, explicitDeps);
|
|
183
|
+
|
|
184
|
+
// Bucket stories by wave index. `computeStoryWaves` returns -1 for any
|
|
185
|
+
// story it could not place; route those into a trailing bucket so they
|
|
186
|
+
// still surface in the manifest.
|
|
187
|
+
const byWave = new Map();
|
|
188
|
+
let maxWave = -1;
|
|
189
|
+
for (const story of stories) {
|
|
190
|
+
const wave = waveAssignment.get(story.id) ?? -1;
|
|
191
|
+
if (wave > maxWave) maxWave = wave;
|
|
192
|
+
if (!byWave.has(wave)) byWave.set(wave, []);
|
|
193
|
+
byWave.get(wave).push(story);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const allWaves = [];
|
|
197
|
+
for (let i = 0; i <= maxWave; i++) {
|
|
198
|
+
if (byWave.has(i)) allWaves.push(byWave.get(i));
|
|
199
|
+
}
|
|
200
|
+
if (byWave.has(-1)) allWaves.push(byWave.get(-1));
|
|
201
|
+
|
|
202
|
+
Logger.info(
|
|
203
|
+
`Computed ${allWaves.length} Story-level execution wave(s) (3-tier).`,
|
|
204
|
+
);
|
|
205
|
+
return { allWaves, storyMap };
|
|
206
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { getPaths } from '../config-resolver.js';
|
|
4
|
+
import { Logger } from '../Logger.js';
|
|
5
|
+
import { applyBudget } from './planning-context-budget.js';
|
|
6
|
+
|
|
7
|
+
async function readDocsFromRoot(docsRoot, settings) {
|
|
8
|
+
const explicit =
|
|
9
|
+
Array.isArray(settings.docsContextFiles) &&
|
|
10
|
+
settings.docsContextFiles.length > 0;
|
|
11
|
+
const usedFallback = !explicit;
|
|
12
|
+
let targetFiles;
|
|
13
|
+
if (explicit) {
|
|
14
|
+
targetFiles = settings.docsContextFiles.map((f) => ({
|
|
15
|
+
name: f,
|
|
16
|
+
full: path.join(docsRoot, f),
|
|
17
|
+
}));
|
|
18
|
+
} else {
|
|
19
|
+
const entries = fs.readdirSync(docsRoot, { withFileTypes: true });
|
|
20
|
+
targetFiles = entries
|
|
21
|
+
.filter((e) => e.isFile() && e.name.endsWith('.md'))
|
|
22
|
+
.map((e) => ({ name: e.name, full: path.join(docsRoot, e.name) }));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const reads = targetFiles.map(async ({ name, full }) => {
|
|
26
|
+
try {
|
|
27
|
+
const stat = await fs.promises.stat(full);
|
|
28
|
+
if (!stat.isFile()) return null;
|
|
29
|
+
const content = await fs.promises.readFile(full, 'utf-8');
|
|
30
|
+
return { name, path: name, content };
|
|
31
|
+
} catch (_e) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const docs = (await Promise.all(reads)).filter(Boolean);
|
|
37
|
+
return { docs, usedFallback };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Read project documentation, returning raw doc objects so callers can apply
|
|
42
|
+
* the planning-context budget themselves. Each entry is `{ name, path,
|
|
43
|
+
* content }`. The legacy single-string concatenation is no longer the public
|
|
44
|
+
* surface — use {@link buildDocsContext} when an envelope-shaped value is
|
|
45
|
+
* needed.
|
|
46
|
+
*
|
|
47
|
+
* @param {object} settings — Resolved config bag (`project.paths.docsRoot`,
|
|
48
|
+
* `project.docsContextFiles`) or legacy-shim view (same shape).
|
|
49
|
+
* @returns {Promise<{ docs: Array<{name: string, path: string, content: string}>, usedFallback: boolean }>}
|
|
50
|
+
*/
|
|
51
|
+
export async function scrapeProjectDocs(settings) {
|
|
52
|
+
// `settings` is the legacy-shim view (`{ paths, docsContextFiles, ... }`)
|
|
53
|
+
// OR the post-reshape canonical (`{ project: { paths, ... } }`). Under the
|
|
54
|
+
// resolver shim `agentSettings.paths === project.paths`, so re-wrap to the
|
|
55
|
+
// canonical shape `getPaths` consumes.
|
|
56
|
+
const docsRoot = getPaths({
|
|
57
|
+
project: { paths: settings?.project?.paths ?? settings?.paths },
|
|
58
|
+
}).docsRoot;
|
|
59
|
+
if (!docsRoot || !fs.existsSync(docsRoot)) {
|
|
60
|
+
return { docs: [], usedFallback: false };
|
|
61
|
+
}
|
|
62
|
+
Logger.info(`[Epic Planner] Scraping project docs from ${docsRoot}...`);
|
|
63
|
+
try {
|
|
64
|
+
const result = await readDocsFromRoot(docsRoot, settings);
|
|
65
|
+
if (result.usedFallback) {
|
|
66
|
+
Logger.warn(
|
|
67
|
+
'[Epic Planner] ⚠️ project.docsContextFiles is unset — falling back to every top-level *.md under docsRoot. Configure docsContextFiles for production planning.',
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
} catch (err) {
|
|
72
|
+
Logger.warn(
|
|
73
|
+
`[Epic Planner] Warning: Failed to read docsRoot: ${err.message}`,
|
|
74
|
+
);
|
|
75
|
+
return { docs: [], usedFallback: false };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Build the `docsContext` value emitted in `--emit-context` envelopes.
|
|
81
|
+
* Reads the docs and applies the planning-context budget so over-budget
|
|
82
|
+
* payloads downgrade to summary mode automatically. Callers pass
|
|
83
|
+
* `{ fullContext: true }` to honour the `--full-context` CLI opt-in.
|
|
84
|
+
*
|
|
85
|
+
* @param {object} settings — Resolved config bag (same shape as `scrapeProjectDocs`).
|
|
86
|
+
* @param {{ maxBytes?: number, summaryMode?: 'auto'|'always'|'never' }} [planningLimits]
|
|
87
|
+
* @param {{ fullContext?: boolean }} [opts]
|
|
88
|
+
* @returns {Promise<{ mode: 'full'|'summary', items: Array<object>, totalBytes: number, usedFallback: boolean }>}
|
|
89
|
+
*/
|
|
90
|
+
export async function buildDocsContext(settings, planningLimits, opts = {}) {
|
|
91
|
+
const { docs, usedFallback } = await scrapeProjectDocs(settings);
|
|
92
|
+
const budgeted = applyBudget(docs, planningLimits, opts);
|
|
93
|
+
return { ...budgeted, usedFallback };
|
|
94
|
+
}
|