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,419 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* node:coverage ignore file */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* epic-audit-prepare.js — Phase 4 prepare CLI for `/epic-deliver`.
|
|
6
|
+
*
|
|
7
|
+
* Thin glue around the audit-suite `selectAudits` SDK. Reads the Epic
|
|
8
|
+
* ticket, runs the change-set selector against the Epic branch diff
|
|
9
|
+
* (`main..epic/<id>`), and emits a JSON envelope on stdout that the
|
|
10
|
+
* inline `helpers/epic-audit.md` consumes.
|
|
11
|
+
*
|
|
12
|
+
* The CLI carries no business logic beyond:
|
|
13
|
+
* 1. validating `--epic <id>`,
|
|
14
|
+
* 2. resolving the Epic branch name (`epic/<id>`),
|
|
15
|
+
* 3. running `selectAudits` at the close-gate (`gate3`),
|
|
16
|
+
* 4. routing the model-judged risk envelope's high-risk axes onto their
|
|
17
|
+
* mapped audit lenses (Story #3889 — `resolveAuditLenses`) and unioning
|
|
18
|
+
* them into the change-set selection,
|
|
19
|
+
* 5. resolving the run's audit depth (`light` / `standard` / `deep`) from
|
|
20
|
+
* the same risk envelope + the change-set's changed-file count via the
|
|
21
|
+
* shared `resolveDepth` resolver (Story #3939), and
|
|
22
|
+
* 6. shaping the result into the helper-consumable envelope.
|
|
23
|
+
*
|
|
24
|
+
* Story #3939 — depth-aware lenses. The `depth` field tells the audit
|
|
25
|
+
* executor (`helpers/epic-audit.md`) how thorough each selected lens should
|
|
26
|
+
* be on this Epic without ever skipping a selected (or alwaysRun) lens:
|
|
27
|
+
* `light` shrinks a lens's sweep to the changed surface + Critical/High
|
|
28
|
+
* findings, `standard` is today's behavior, and `deep` widens the sweep to
|
|
29
|
+
* the directly-touched modules. Depth never changes which lenses fire, the
|
|
30
|
+
* severity taxonomy, the findings shape, or the Phase 4 halting rule — it is
|
|
31
|
+
* an orthogonal "how deep" signal alongside the "which lenses" selection.
|
|
32
|
+
* Depth is resolved from the SAME best-effort `planningRisk` checkpoint read
|
|
33
|
+
* the risk-routed lenses use (a missing/unparseable checkpoint degrades to
|
|
34
|
+
* `standard`, never an abort) folded with the changed-file count the
|
|
35
|
+
* change-set diff already produces.
|
|
36
|
+
*
|
|
37
|
+
* Story #3889 — risk-routed lenses. Epic #3865 added `resolveAuditLenses`
|
|
38
|
+
* (axis → audit-lens mapping for the model-judged risk verdict) to
|
|
39
|
+
* `lib/orchestration/code-review.js` but nothing invoked it in the live
|
|
40
|
+
* delivery path. This CLI now reads the `planningRisk` envelope off the
|
|
41
|
+
* Epic's `epic-plan-state` checkpoint and unions the routed lenses into
|
|
42
|
+
* `selectedAudits`, so a high-risk Epic auto-runs its mapped lenses
|
|
43
|
+
* (e.g. a `security`-axis Epic runs `audit-security`) at Phase 4 through the
|
|
44
|
+
* SAME `runAuditSuite` / `selectAuditStrategy` engine the helper already
|
|
45
|
+
* dispatches — no new audit machinery. A low-risk Epic routes no extra
|
|
46
|
+
* lenses. Reading the checkpoint is best-effort: a missing/unparseable
|
|
47
|
+
* checkpoint degrades to the change-set selection alone (never an abort).
|
|
48
|
+
*
|
|
49
|
+
* Envelope shape (Tech Spec #2588 — API Changes § New CLI):
|
|
50
|
+
*
|
|
51
|
+
* {
|
|
52
|
+
* "epicId": 2586,
|
|
53
|
+
* "epicBranch": "epic/2586",
|
|
54
|
+
* "depth": "deep",
|
|
55
|
+
* "selectedAudits": ["audit-security", "audit-privacy"],
|
|
56
|
+
* "changeSetAudits": ["audit-privacy"],
|
|
57
|
+
* "riskRoutedAudits": ["audit-security"],
|
|
58
|
+
* "changedFiles": ["src/api/admin/users.ts", "..."],
|
|
59
|
+
* "changedFilesCount": 47,
|
|
60
|
+
* "substitutionsPayload": "src/api/admin/users.ts\n..."
|
|
61
|
+
* }
|
|
62
|
+
*
|
|
63
|
+
* `selectedAudits` is the union the helper dispatches: the change-set
|
|
64
|
+
* selection (`changeSetAudits`) plus the risk-routed lenses
|
|
65
|
+
* (`riskRoutedAudits`), de-duplicated. The two source-of-truth arrays are
|
|
66
|
+
* surfaced for observability so the operator can see why each lens fired.
|
|
67
|
+
* `depth` (`light` / `standard` / `deep`) is the orthogonal "how deep each
|
|
68
|
+
* selected lens runs" signal (Story #3939).
|
|
69
|
+
*
|
|
70
|
+
* Usage:
|
|
71
|
+
* node .agents/scripts/epic-audit-prepare.js --epic <epicId> [--base-branch main]
|
|
72
|
+
*
|
|
73
|
+
* Exit codes:
|
|
74
|
+
* 0 — envelope written to stdout
|
|
75
|
+
* 2 — validation error (missing/invalid --epic)
|
|
76
|
+
* 1 — provider / git failure
|
|
77
|
+
*/
|
|
78
|
+
|
|
79
|
+
import { selectAudits } from './lib/audit-suite/index.js';
|
|
80
|
+
import { defineFlags } from './lib/cli-args.js';
|
|
81
|
+
import { runAsCli } from './lib/cli-utils.js';
|
|
82
|
+
import { resolveConfig } from './lib/config-resolver.js';
|
|
83
|
+
import { resolveAuditLenses } from './lib/orchestration/code-review.js';
|
|
84
|
+
import { read as readPlanState } from './lib/orchestration/epic-plan-state-store.js';
|
|
85
|
+
import { resolveDepth } from './lib/orchestration/review-depth.js';
|
|
86
|
+
import { createProvider } from './lib/provider-factory.js';
|
|
87
|
+
|
|
88
|
+
const HELP = `Usage: node .agents/scripts/epic-audit-prepare.js --epic <epicId> [--base-branch main]
|
|
89
|
+
|
|
90
|
+
Flags:
|
|
91
|
+
--epic Epic ticket ID to prepare audit selection for (required).
|
|
92
|
+
--base-branch Branch to diff against for the selector's change-set
|
|
93
|
+
input (default: main).
|
|
94
|
+
--gate Audit gate label (default: gate3 — Epic close gate).
|
|
95
|
+
--help Show this message.
|
|
96
|
+
|
|
97
|
+
Output (JSON envelope on stdout):
|
|
98
|
+
epicId, epicBranch
|
|
99
|
+
depth Audit depth for this run — one of light | standard | deep
|
|
100
|
+
(Story #3939). Resolved from the model-judged risk
|
|
101
|
+
envelope + the change-set's changed-file count via the
|
|
102
|
+
shared resolveDepth resolver; an absent checkpoint
|
|
103
|
+
degrades to standard. Tells the audit executor how deep
|
|
104
|
+
each SELECTED lens runs; it never changes which lenses
|
|
105
|
+
fire, the severity taxonomy, or the Phase 4 halting rule.
|
|
106
|
+
selectedAudits De-duplicated union of changeSetAudits + riskRoutedAudits.
|
|
107
|
+
changeSetAudits Lenses the change-set selector chose.
|
|
108
|
+
riskRoutedAudits Lenses routed from the model-judged high-risk axes.
|
|
109
|
+
changedFiles, changedFilesCount, substitutionsPayload
|
|
110
|
+
`;
|
|
111
|
+
|
|
112
|
+
const DEFAULT_GATE = 'gate3';
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Parse argv into the values bag this CLI understands.
|
|
116
|
+
*
|
|
117
|
+
* @param {string[]} argv
|
|
118
|
+
* @returns {{ epic: number|null, 'base-branch': string, gate: string, help: boolean }}
|
|
119
|
+
*/
|
|
120
|
+
export function parseArgv(argv) {
|
|
121
|
+
const { values } = defineFlags(
|
|
122
|
+
{
|
|
123
|
+
epic: { type: 'ticket', alias: 'epicId' },
|
|
124
|
+
'base-branch': { type: 'string', default: 'main', alias: 'baseBranch' },
|
|
125
|
+
gate: { type: 'string', default: DEFAULT_GATE },
|
|
126
|
+
help: { type: 'boolean' },
|
|
127
|
+
},
|
|
128
|
+
argv,
|
|
129
|
+
);
|
|
130
|
+
return values;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Resolve the risk-routed audit lenses for an Epic by reading the model-judged
|
|
135
|
+
* `planningRisk` envelope off the Epic's `epic-plan-state` checkpoint and
|
|
136
|
+
* mapping its high-risk axes onto audit lenses via `resolveAuditLenses`
|
|
137
|
+
* (Story #3889). Best-effort: a missing/unparseable checkpoint, an absent
|
|
138
|
+
* `planningRisk` field, or a provider read failure resolves to an empty array
|
|
139
|
+
* so the change-set selection is never aborted by a risk-read failure.
|
|
140
|
+
*
|
|
141
|
+
* @param {{
|
|
142
|
+
* epicId: number,
|
|
143
|
+
* provider: object,
|
|
144
|
+
* readPlanState?: typeof readPlanState,
|
|
145
|
+
* resolveAuditLenses?: typeof resolveAuditLenses,
|
|
146
|
+
* }} params
|
|
147
|
+
* @returns {Promise<string[]>} Ordered, de-duplicated risk-routed lens names.
|
|
148
|
+
*/
|
|
149
|
+
export async function resolveRiskRoutedLenses({
|
|
150
|
+
epicId,
|
|
151
|
+
provider,
|
|
152
|
+
readPlanState: readPlanStateFn = readPlanState,
|
|
153
|
+
resolveAuditLenses: resolveAuditLensesFn = resolveAuditLenses,
|
|
154
|
+
}) {
|
|
155
|
+
let state = null;
|
|
156
|
+
try {
|
|
157
|
+
state = await readPlanStateFn({ provider, epicId });
|
|
158
|
+
} catch {
|
|
159
|
+
// A read failure (provider error, malformed comment) must not abort the
|
|
160
|
+
// change-set audit. Degrade to "no risk-routed lenses".
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
const planningRisk = state?.planningRisk;
|
|
164
|
+
if (!planningRisk || !Array.isArray(planningRisk.axes)) return [];
|
|
165
|
+
return resolveAuditLensesFn(planningRisk);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Resolve the operator's `planning.taskSizing` override the same way the
|
|
170
|
+
* ticket validator and the code-review depth resolver do, so retuning sizing
|
|
171
|
+
* retunes the audit-depth thresholds in lockstep. Reads `config.planning`
|
|
172
|
+
* first, then the legacy `config.agentSettings.planning` nest; absent →
|
|
173
|
+
* `undefined` so {@link resolveDepth} falls back to `DEFAULT_TASK_SIZING`.
|
|
174
|
+
*
|
|
175
|
+
* @param {object|null|undefined} config
|
|
176
|
+
* @returns {object|undefined}
|
|
177
|
+
*/
|
|
178
|
+
function resolveTaskSizing(config) {
|
|
179
|
+
return (
|
|
180
|
+
config?.planning?.taskSizing ??
|
|
181
|
+
config?.agentSettings?.planning?.taskSizing ??
|
|
182
|
+
undefined
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Resolve the run's audit depth (`light` / `standard` / `deep`) for an Epic
|
|
188
|
+
* via the shared {@link resolveDepth} resolver (Story #3939), folding the
|
|
189
|
+
* model-judged risk envelope's `overallLevel` (read off the Epic's
|
|
190
|
+
* `epic-plan-state` checkpoint) with the mechanical changed-file count of the
|
|
191
|
+
* change set the prepare CLI already enumerated.
|
|
192
|
+
*
|
|
193
|
+
* Best-effort and total, mirroring `resolveRiskRoutedLenses`: a
|
|
194
|
+
* missing/unparseable checkpoint, an absent `planningRisk` field, or a
|
|
195
|
+
* provider read failure all degrade to `standard` — the neutral default that
|
|
196
|
+
* preserves today's behavior — so an Epic that skipped `/epic-plan` (no
|
|
197
|
+
* checkpoint) still gets a passing `standard` pass with no new failure mode.
|
|
198
|
+
* The changed-file count can only escalate a low-risk Epic to `deep` (a wide
|
|
199
|
+
* diff) and never downgrades a high-risk one; an unknown/absent count is the
|
|
200
|
+
* neutral "width unknown" signal {@link resolveDepth} tolerates.
|
|
201
|
+
*
|
|
202
|
+
* @param {{
|
|
203
|
+
* epicId: number,
|
|
204
|
+
* provider: object,
|
|
205
|
+
* changedFileCount: number|null,
|
|
206
|
+
* sizing?: object|undefined,
|
|
207
|
+
* readPlanState?: typeof readPlanState,
|
|
208
|
+
* }} params
|
|
209
|
+
* @returns {Promise<import('./lib/orchestration/review-depth.js').ReviewDepth>}
|
|
210
|
+
*/
|
|
211
|
+
export async function resolveRunDepth({
|
|
212
|
+
epicId,
|
|
213
|
+
provider,
|
|
214
|
+
changedFileCount,
|
|
215
|
+
sizing,
|
|
216
|
+
readPlanState: readPlanStateFn = readPlanState,
|
|
217
|
+
}) {
|
|
218
|
+
let state = null;
|
|
219
|
+
try {
|
|
220
|
+
state = await readPlanStateFn({ provider, epicId });
|
|
221
|
+
} catch {
|
|
222
|
+
// A read failure must not abort the audit. Resolve from the diff width
|
|
223
|
+
// alone (width can still escalate to `deep`); an unknown width with no
|
|
224
|
+
// risk signal lands on `standard`.
|
|
225
|
+
return resolveDepth({ changedFileCount, sizing });
|
|
226
|
+
}
|
|
227
|
+
return resolveDepth({
|
|
228
|
+
overallLevel: state?.planningRisk?.overallLevel,
|
|
229
|
+
changedFileCount,
|
|
230
|
+
sizing,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Union two ordered lens lists, de-duplicating while preserving the order of
|
|
236
|
+
* first appearance (change-set selection first, then risk-routed extras).
|
|
237
|
+
*
|
|
238
|
+
* @param {string[]} changeSetAudits
|
|
239
|
+
* @param {string[]} riskRoutedAudits
|
|
240
|
+
* @returns {string[]}
|
|
241
|
+
*/
|
|
242
|
+
function unionAudits(changeSetAudits, riskRoutedAudits) {
|
|
243
|
+
const seen = new Set();
|
|
244
|
+
const merged = [];
|
|
245
|
+
for (const lens of [...changeSetAudits, ...riskRoutedAudits]) {
|
|
246
|
+
if (typeof lens !== 'string' || lens.length === 0 || seen.has(lens)) {
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
seen.add(lens);
|
|
250
|
+
merged.push(lens);
|
|
251
|
+
}
|
|
252
|
+
return merged;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Orchestration body. Exported as a sibling so tests can drive it
|
|
257
|
+
* without spawning a child process. CLI surface unchanged.
|
|
258
|
+
*
|
|
259
|
+
* @param {{ epicId: number, baseBranch?: string, gate?: string, help?: boolean }} values
|
|
260
|
+
* @param {{
|
|
261
|
+
* resolveConfig?: () => object,
|
|
262
|
+
* createProvider?: (config: object) => object,
|
|
263
|
+
* selectAudits?: typeof selectAudits,
|
|
264
|
+
* readPlanState?: typeof readPlanState,
|
|
265
|
+
* resolveAuditLenses?: typeof resolveAuditLenses,
|
|
266
|
+
* resolveRunDepth?: typeof resolveRunDepth,
|
|
267
|
+
* help?: string,
|
|
268
|
+
* }} [deps]
|
|
269
|
+
* @returns {Promise<{ exitCode: number, result: object }>}
|
|
270
|
+
* `result.kind` is one of `'help'`, `'validation-error'`, `'envelope'`.
|
|
271
|
+
*/
|
|
272
|
+
export async function runEpicAuditPrepare(values, deps = {}) {
|
|
273
|
+
const helpText = deps.help ?? HELP;
|
|
274
|
+
if (values.help) {
|
|
275
|
+
return { exitCode: 0, result: { kind: 'help', text: helpText } };
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const { epicId, baseBranch, gate } = values;
|
|
279
|
+
|
|
280
|
+
if (!Number.isFinite(epicId) || epicId <= 0) {
|
|
281
|
+
return {
|
|
282
|
+
exitCode: 2,
|
|
283
|
+
result: {
|
|
284
|
+
kind: 'validation-error',
|
|
285
|
+
message: '[epic-audit-prepare] --epic <id> is required.',
|
|
286
|
+
help: helpText,
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const cfg = deps.resolveConfig ? deps.resolveConfig() : resolveConfig();
|
|
292
|
+
const provider = deps.createProvider
|
|
293
|
+
? deps.createProvider(cfg)
|
|
294
|
+
: createProvider(cfg);
|
|
295
|
+
const runner = deps.selectAudits ?? selectAudits;
|
|
296
|
+
|
|
297
|
+
// Pin the change set to the requested Epic's own branch rather than the
|
|
298
|
+
// shared checkout's HEAD (Story #3362). Under two concurrent /epic-deliver
|
|
299
|
+
// runs sharing one working copy, a HEAD-relative diff silently reports the
|
|
300
|
+
// *other* Epic's change set; `refs/heads/epic/<id>` is unambiguous.
|
|
301
|
+
const epicBranch = `epic/${epicId}`;
|
|
302
|
+
const epicRef = `refs/heads/${epicBranch}`;
|
|
303
|
+
|
|
304
|
+
const envelope = await runner({
|
|
305
|
+
ticketId: epicId,
|
|
306
|
+
gate: gate ?? DEFAULT_GATE,
|
|
307
|
+
provider,
|
|
308
|
+
baseBranch,
|
|
309
|
+
headRef: epicRef,
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
// Degraded envelopes from selectAudits short-circuit through the
|
|
313
|
+
// same surface so callers can branch on `degraded: true`. The
|
|
314
|
+
// helper treats a degraded envelope as a Phase 4 abort — propagate
|
|
315
|
+
// it verbatim with a non-zero exit code so shell pipelines see the
|
|
316
|
+
// failure. An unresolved Epic ref (HEAD_REF_UNRESOLVED) flows through
|
|
317
|
+
// here too: better to abort Phase 4 than audit a phantom change set.
|
|
318
|
+
if (envelope?.degraded) {
|
|
319
|
+
return {
|
|
320
|
+
exitCode: 1,
|
|
321
|
+
result: {
|
|
322
|
+
kind: 'envelope',
|
|
323
|
+
envelope: {
|
|
324
|
+
epicId,
|
|
325
|
+
epicBranch,
|
|
326
|
+
...envelope,
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Defence in depth: assert the selector diffed the ref we asked for. If a
|
|
333
|
+
// future selector change drops the pin, fail closed with an explicit
|
|
334
|
+
// degraded envelope rather than emitting an audit selection silently
|
|
335
|
+
// derived from the wrong branch.
|
|
336
|
+
const resolvedRef = envelope?.context?.resolvedRef;
|
|
337
|
+
if (resolvedRef !== epicRef) {
|
|
338
|
+
return {
|
|
339
|
+
exitCode: 1,
|
|
340
|
+
result: {
|
|
341
|
+
kind: 'envelope',
|
|
342
|
+
envelope: {
|
|
343
|
+
epicId,
|
|
344
|
+
epicBranch,
|
|
345
|
+
ok: false,
|
|
346
|
+
degraded: true,
|
|
347
|
+
reason: 'EPIC_REF_MISMATCH',
|
|
348
|
+
detail: `epic-audit-prepare: selector diffed '${resolvedRef ?? '(unset)'}' but Epic #${epicId} requested '${epicRef}'`,
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
const changedFiles = envelope?.context?.changedFiles ?? [];
|
|
355
|
+
const changeSetAudits = envelope?.selectedAudits ?? [];
|
|
356
|
+
|
|
357
|
+
// Story #3889 — union the model-judged risk-routed lenses into the
|
|
358
|
+
// change-set selection. Read off the Epic's epic-plan-state checkpoint
|
|
359
|
+
// (best-effort; a read failure yields no extra lenses). A high-risk
|
|
360
|
+
// `security` axis therefore fires `audit-security` even when the change
|
|
361
|
+
// set alone did not select it; a low-risk Epic adds nothing.
|
|
362
|
+
const riskRoutedAudits = await resolveRiskRoutedLenses({
|
|
363
|
+
epicId,
|
|
364
|
+
provider,
|
|
365
|
+
readPlanState: deps.readPlanState,
|
|
366
|
+
resolveAuditLenses: deps.resolveAuditLenses,
|
|
367
|
+
});
|
|
368
|
+
const selectedAudits = unionAudits(changeSetAudits, riskRoutedAudits);
|
|
369
|
+
|
|
370
|
+
// Story #3939 — resolve the run's audit depth from the SAME model-judged
|
|
371
|
+
// risk envelope the lenses route from, folded with the changed-file count
|
|
372
|
+
// the change set just produced. Best-effort: an absent checkpoint degrades
|
|
373
|
+
// to `standard`. Depth tells the executor how deep each SELECTED lens runs;
|
|
374
|
+
// it never changes the lens roster above.
|
|
375
|
+
const resolveRunDepthFn = deps.resolveRunDepth ?? resolveRunDepth;
|
|
376
|
+
const depth = await resolveRunDepthFn({
|
|
377
|
+
epicId,
|
|
378
|
+
provider,
|
|
379
|
+
changedFileCount: changedFiles.length,
|
|
380
|
+
sizing: resolveTaskSizing(cfg),
|
|
381
|
+
readPlanState: deps.readPlanState,
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
return {
|
|
385
|
+
exitCode: 0,
|
|
386
|
+
result: {
|
|
387
|
+
kind: 'envelope',
|
|
388
|
+
envelope: {
|
|
389
|
+
epicId,
|
|
390
|
+
epicBranch,
|
|
391
|
+
depth,
|
|
392
|
+
selectedAudits,
|
|
393
|
+
changeSetAudits,
|
|
394
|
+
riskRoutedAudits,
|
|
395
|
+
changedFiles,
|
|
396
|
+
changedFilesCount: changedFiles.length,
|
|
397
|
+
substitutionsPayload: changedFiles.join('\n'),
|
|
398
|
+
},
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
export async function main(argv = process.argv.slice(2)) {
|
|
404
|
+
const values = parseArgv(argv);
|
|
405
|
+
const { exitCode, result } = await runEpicAuditPrepare(values);
|
|
406
|
+
|
|
407
|
+
if (result.kind === 'help') {
|
|
408
|
+
process.stdout.write(result.text);
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
if (result.kind === 'validation-error') {
|
|
412
|
+
process.stderr.write(`${result.message}\n${result.help}`);
|
|
413
|
+
process.exit(exitCode);
|
|
414
|
+
}
|
|
415
|
+
process.stdout.write(`${JSON.stringify(result.envelope)}\n`);
|
|
416
|
+
if (exitCode !== 0) process.exit(exitCode);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
runAsCli(import.meta.url, main, { source: 'epic-audit-prepare' });
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* node:coverage ignore file */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* epic-audit-recheck.js — Cross-phase re-trigger selector.
|
|
6
|
+
*
|
|
7
|
+
* Story #2619 (Epic #2586). Read a list of touched files (provided by the
|
|
8
|
+
* caller after the code-review auto-fix loop in
|
|
9
|
+
* `.agents/workflows/helpers/code-review.md` Step 4.6) and emit the
|
|
10
|
+
* subset of audit lenses whose `filePatterns` overlap that list.
|
|
11
|
+
*
|
|
12
|
+
* The CLI is intentionally narrower than `select-audits.js`: it does NOT
|
|
13
|
+
* run a git diff, does NOT consult the Epic ticket body for keyword
|
|
14
|
+
* triggers, and does NOT honor `alwaysRun`. The auto-fix tail already knows
|
|
15
|
+
* exactly which paths it touched — only file-pattern overlap is relevant
|
|
16
|
+
* for deciding which lenses are stale and need re-invocation.
|
|
17
|
+
*
|
|
18
|
+
* Usage:
|
|
19
|
+
* node .agents/scripts/epic-audit-recheck.js \
|
|
20
|
+
* --epic <id> --files <comma-list-or-@file>
|
|
21
|
+
*
|
|
22
|
+
* --files comma-list: --files src/auth/login.js,src/api/users.ts
|
|
23
|
+
* --files @path: --files @temp/touched.txt (newline-delimited)
|
|
24
|
+
*
|
|
25
|
+
* Output: a single JSON envelope on stdout:
|
|
26
|
+
* {
|
|
27
|
+
* epicId,
|
|
28
|
+
* selectedAudits: string[], // lenses whose filePatterns overlap input
|
|
29
|
+
* context: {
|
|
30
|
+
* changedFiles: string[], // normalized input list (dedup, non-empty)
|
|
31
|
+
* changedFilesCount: number,
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* Exit codes:
|
|
36
|
+
* 0 — emitted envelope (selectedAudits MAY be empty when no lens overlaps)
|
|
37
|
+
* 2 — validation error (missing --epic, missing --files, unreadable
|
|
38
|
+
* @file). Error message written to stderr.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import fs from 'node:fs';
|
|
42
|
+
import path from 'node:path';
|
|
43
|
+
import { matchesAnyFilePattern } from './lib/audit-suite/index.js';
|
|
44
|
+
import { defineFlags } from './lib/cli-args.js';
|
|
45
|
+
import { runAsCli } from './lib/cli-utils.js';
|
|
46
|
+
import {
|
|
47
|
+
getPaths,
|
|
48
|
+
PROJECT_ROOT,
|
|
49
|
+
resolveConfig,
|
|
50
|
+
} from './lib/config-resolver.js';
|
|
51
|
+
|
|
52
|
+
const HELP = `Usage: node .agents/scripts/epic-audit-recheck.js \\
|
|
53
|
+
--epic <id> --files <comma-list-or-@file>
|
|
54
|
+
|
|
55
|
+
Flags:
|
|
56
|
+
--epic GitHub Epic issue number (required).
|
|
57
|
+
--files Comma-separated list of touched file paths, OR @<path> to read
|
|
58
|
+
a newline-delimited list from a file (required). Empty entries
|
|
59
|
+
are stripped.
|
|
60
|
+
--help Show this message.
|
|
61
|
+
`;
|
|
62
|
+
|
|
63
|
+
export function parseArgv(argv) {
|
|
64
|
+
const { values } = defineFlags(
|
|
65
|
+
{
|
|
66
|
+
epic: { type: 'ticket' },
|
|
67
|
+
files: { type: 'string' },
|
|
68
|
+
help: { type: 'boolean' },
|
|
69
|
+
},
|
|
70
|
+
argv,
|
|
71
|
+
);
|
|
72
|
+
return values;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Normalize a `--files` value into a deduped array of non-empty paths.
|
|
77
|
+
* Accepts either a comma-separated literal or `@<path>` (newline-delimited
|
|
78
|
+
* file). Returns `{ files, error }` — exactly one is populated.
|
|
79
|
+
*
|
|
80
|
+
* @param {string} raw
|
|
81
|
+
* @param {{ readFileSync?: typeof fs.readFileSync, cwd?: string }} [deps]
|
|
82
|
+
*/
|
|
83
|
+
export function resolveFilesArg(raw, deps = {}) {
|
|
84
|
+
if (typeof raw !== 'string' || raw.trim() === '') {
|
|
85
|
+
return { error: '[epic-audit-recheck] --files is required.' };
|
|
86
|
+
}
|
|
87
|
+
const readFile = deps.readFileSync ?? fs.readFileSync;
|
|
88
|
+
const cwd = deps.cwd ?? process.cwd();
|
|
89
|
+
|
|
90
|
+
let listText = raw;
|
|
91
|
+
if (raw.startsWith('@')) {
|
|
92
|
+
const filePath = raw.slice(1);
|
|
93
|
+
if (!filePath) {
|
|
94
|
+
return { error: '[epic-audit-recheck] --files @<path> missing path.' };
|
|
95
|
+
}
|
|
96
|
+
const absPath = path.isAbsolute(filePath)
|
|
97
|
+
? filePath
|
|
98
|
+
: path.join(cwd, filePath);
|
|
99
|
+
try {
|
|
100
|
+
listText = readFile(absPath, 'utf8');
|
|
101
|
+
} catch (err) {
|
|
102
|
+
return {
|
|
103
|
+
error: `[epic-audit-recheck] Failed to read ${absPath}: ${err.message}`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Comma or newline are both valid delimiters — the @file form is
|
|
109
|
+
// newline-delimited, the inline form is comma-delimited. Splitting on
|
|
110
|
+
// either keeps both code paths converging on the same normalizer.
|
|
111
|
+
const seen = new Set();
|
|
112
|
+
const files = [];
|
|
113
|
+
for (const token of listText.split(/[\n,]/)) {
|
|
114
|
+
const trimmed = token.trim();
|
|
115
|
+
if (trimmed === '') continue;
|
|
116
|
+
if (seen.has(trimmed)) continue;
|
|
117
|
+
seen.add(trimmed);
|
|
118
|
+
files.push(trimmed);
|
|
119
|
+
}
|
|
120
|
+
return { files };
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Load the audit-rules document validated elsewhere by
|
|
125
|
+
* `lib/audit-suite/selector.js`. Surfaced as a separate function so tests
|
|
126
|
+
* can swap a fixture in without touching the on-disk schema file.
|
|
127
|
+
*
|
|
128
|
+
* @param {{ readFileSync?: typeof fs.readFileSync }} [deps]
|
|
129
|
+
*/
|
|
130
|
+
export function loadAuditRules(deps = {}) {
|
|
131
|
+
const config = resolveConfig();
|
|
132
|
+
const rulesPath = path.join(
|
|
133
|
+
PROJECT_ROOT,
|
|
134
|
+
getPaths(config).schemasRoot,
|
|
135
|
+
'audit-rules.json',
|
|
136
|
+
);
|
|
137
|
+
const read = deps.readFileSync ?? fs.readFileSync;
|
|
138
|
+
let text;
|
|
139
|
+
try {
|
|
140
|
+
text = read(rulesPath, 'utf8');
|
|
141
|
+
} catch (err) {
|
|
142
|
+
throw new Error(
|
|
143
|
+
`[epic-audit-recheck] Failed to read audit-rules from ${rulesPath}: ${err.message}`,
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
return JSON.parse(text);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Pure overlap detector. Walks the audit-rules document and returns the
|
|
151
|
+
* names of every audit whose `triggers.filePatterns` matches at least one
|
|
152
|
+
* entry in `files`. Lenses without `filePatterns` (or with an empty
|
|
153
|
+
* array) NEVER appear in the output — `alwaysRun` and keyword triggers
|
|
154
|
+
* are intentionally ignored: this CLI answers "what was invalidated by
|
|
155
|
+
* the touched paths?", not "what should I run from scratch?".
|
|
156
|
+
*
|
|
157
|
+
* @param {{ audits: Record<string, { triggers?: { filePatterns?: string[] } }> }} rules
|
|
158
|
+
* @param {string[]} files
|
|
159
|
+
*/
|
|
160
|
+
export function selectOverlappingAudits(rules, files) {
|
|
161
|
+
const selected = [];
|
|
162
|
+
for (const [auditName, ruleOpts] of Object.entries(rules?.audits ?? {})) {
|
|
163
|
+
const patterns = ruleOpts?.triggers?.filePatterns;
|
|
164
|
+
if (!Array.isArray(patterns) || patterns.length === 0) continue;
|
|
165
|
+
if (matchesAnyFilePattern(patterns, files)) {
|
|
166
|
+
selected.push(auditName);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return selected;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Pure pipeline body. Returns `{ exitCode, result }` where
|
|
174
|
+
* `result.kind` is `'help' | 'validation-error' | 'envelope'`. `main`
|
|
175
|
+
* renders these; tests drive this directly.
|
|
176
|
+
*/
|
|
177
|
+
export async function runEpicAuditRecheckCli(values, deps = {}) {
|
|
178
|
+
const helpText = deps.help ?? HELP;
|
|
179
|
+
if (values.help) {
|
|
180
|
+
return { exitCode: 0, result: { kind: 'help', text: helpText } };
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const { epic, files: filesRaw } = values;
|
|
184
|
+
|
|
185
|
+
if (!Number.isFinite(epic) || epic <= 0) {
|
|
186
|
+
return {
|
|
187
|
+
exitCode: 2,
|
|
188
|
+
result: {
|
|
189
|
+
kind: 'validation-error',
|
|
190
|
+
message: '[epic-audit-recheck] --epic <id> is required.',
|
|
191
|
+
help: helpText,
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const filesResult = (deps.resolveFilesArg ?? resolveFilesArg)(filesRaw, deps);
|
|
197
|
+
if (filesResult.error) {
|
|
198
|
+
return {
|
|
199
|
+
exitCode: 2,
|
|
200
|
+
result: {
|
|
201
|
+
kind: 'validation-error',
|
|
202
|
+
message: filesResult.error,
|
|
203
|
+
help: helpText,
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const rules = (deps.loadAuditRules ?? loadAuditRules)(deps);
|
|
209
|
+
const selectedAudits = (
|
|
210
|
+
deps.selectOverlappingAudits ?? selectOverlappingAudits
|
|
211
|
+
)(rules, filesResult.files);
|
|
212
|
+
|
|
213
|
+
const envelope = {
|
|
214
|
+
epicId: epic,
|
|
215
|
+
selectedAudits,
|
|
216
|
+
context: {
|
|
217
|
+
changedFiles: filesResult.files,
|
|
218
|
+
changedFilesCount: filesResult.files.length,
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
return { exitCode: 0, result: { kind: 'envelope', envelope } };
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export async function main(argv = process.argv.slice(2)) {
|
|
226
|
+
const values = parseArgv(argv);
|
|
227
|
+
const { exitCode, result } = await runEpicAuditRecheckCli(values);
|
|
228
|
+
|
|
229
|
+
if (result.kind === 'help') {
|
|
230
|
+
process.stdout.write(result.text);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (result.kind === 'validation-error') {
|
|
234
|
+
process.stderr.write(`${result.message}\n${result.help}`);
|
|
235
|
+
process.exit(exitCode);
|
|
236
|
+
}
|
|
237
|
+
process.stdout.write(`${JSON.stringify(result.envelope)}\n`);
|
|
238
|
+
if (exitCode !== 0) process.exit(exitCode);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
runAsCli(import.meta.url, main, { source: 'epic-audit-recheck' });
|