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,239 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
|
|
3
|
+
const COVERAGE_INDEX = Symbol('coverage-utils.coverage-index');
|
|
4
|
+
const ENTRY_INDEX = Symbol('coverage-utils.entry-index');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Load and parse an istanbul/c8 `coverage-final.json` artifact.
|
|
8
|
+
*
|
|
9
|
+
* Returns the parsed object (keyed by absolute file path) on success, or
|
|
10
|
+
* `null` when the file is missing, unreadable, non-JSON, or structurally
|
|
11
|
+
* unusable. Never throws — consumers treat a null map as "no coverage
|
|
12
|
+
* available" and apply their own `requireCoverage` policy.
|
|
13
|
+
*
|
|
14
|
+
* @param {string} coveragePath
|
|
15
|
+
* @returns {object|null}
|
|
16
|
+
*/
|
|
17
|
+
export function loadCoverage(coveragePath) {
|
|
18
|
+
try {
|
|
19
|
+
if (!coveragePath || !fs.existsSync(coveragePath)) return null;
|
|
20
|
+
const raw = fs.readFileSync(coveragePath, 'utf-8');
|
|
21
|
+
const parsed = JSON.parse(raw);
|
|
22
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return parsed;
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function normalizeSep(p) {
|
|
32
|
+
return String(p).replace(/\\/g, '/');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function stripLeadingDotSlash(p) {
|
|
36
|
+
return p.replace(/^\.\/+/, '').replace(/^\/+/, '');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Build a single-pass index over a parsed `coverage-final.json` map.
|
|
41
|
+
*
|
|
42
|
+
* Returns `{map, byNormalizedSuffix}` where `byNormalizedSuffix` is a
|
|
43
|
+
* `Map<string, object>` keyed by the POSIX-normalized form of each original
|
|
44
|
+
* key. Lookups that need exact-equality or `/`-bounded suffix matching
|
|
45
|
+
* consult that Map without re-enumerating `Object.keys(map)` on every call.
|
|
46
|
+
*
|
|
47
|
+
* @param {object|null} map
|
|
48
|
+
* @returns {{map: object|null, byNormalizedSuffix: Map<string, object>}}
|
|
49
|
+
*/
|
|
50
|
+
export function buildCoverageIndex(map) {
|
|
51
|
+
const byNormalizedSuffix = new Map();
|
|
52
|
+
if (map && typeof map === 'object' && !Array.isArray(map)) {
|
|
53
|
+
for (const key of Object.keys(map)) {
|
|
54
|
+
byNormalizedSuffix.set(normalizeSep(key), map[key]);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { map, byNormalizedSuffix };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function getCoverageIndex(map) {
|
|
61
|
+
if (!map || typeof map !== 'object' || Array.isArray(map)) return null;
|
|
62
|
+
const cached = map[COVERAGE_INDEX];
|
|
63
|
+
if (cached) return cached;
|
|
64
|
+
const idx = buildCoverageIndex(map);
|
|
65
|
+
Object.defineProperty(map, COVERAGE_INDEX, {
|
|
66
|
+
value: idx,
|
|
67
|
+
enumerable: false,
|
|
68
|
+
configurable: true,
|
|
69
|
+
writable: false,
|
|
70
|
+
});
|
|
71
|
+
return idx;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Locate the coverage entry for a repo-relative path.
|
|
76
|
+
*
|
|
77
|
+
* `coverage-final.json` keys are typically absolute, platform-specific paths,
|
|
78
|
+
* while callers pass POSIX-ish repo-relative strings. Match by exact equality
|
|
79
|
+
* or by `/`-bounded suffix so we tolerate both Windows and POSIX producers.
|
|
80
|
+
* If two distinct keys both end with the same `/`-bounded suffix (duplicate
|
|
81
|
+
* basenames in different trees), the suffix is ambiguous — return null
|
|
82
|
+
* rather than picking the first iteration-order hit and silently scoring
|
|
83
|
+
* the wrong file.
|
|
84
|
+
*/
|
|
85
|
+
function findFileEntry(map, relPath) {
|
|
86
|
+
if (!map || !relPath) return null;
|
|
87
|
+
const suffix = stripLeadingDotSlash(normalizeSep(relPath));
|
|
88
|
+
if (!suffix) return null;
|
|
89
|
+
const idx = getCoverageIndex(map);
|
|
90
|
+
if (!idx) return null;
|
|
91
|
+
const direct = idx.byNormalizedSuffix.get(suffix);
|
|
92
|
+
if (direct !== undefined) return direct ?? null;
|
|
93
|
+
const needle = `/${suffix}`;
|
|
94
|
+
let match = null;
|
|
95
|
+
for (const [norm, entry] of idx.byNormalizedSuffix) {
|
|
96
|
+
if (!norm.endsWith(needle)) continue;
|
|
97
|
+
if (match !== null) return null; // ambiguous suffix — refuse to guess
|
|
98
|
+
match = entry ?? null;
|
|
99
|
+
}
|
|
100
|
+
return match;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export { findFileEntry as findCoverageEntry };
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Does the map contain any entry whose path matches `relPath`?
|
|
107
|
+
*
|
|
108
|
+
* @param {object|null} map
|
|
109
|
+
* @param {string} relPath
|
|
110
|
+
* @returns {boolean}
|
|
111
|
+
*/
|
|
112
|
+
export function hasCoverageFor(map, relPath) {
|
|
113
|
+
return findFileEntry(map, relPath) !== null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Build a per-entry index that turns method-coverage lookups from
|
|
118
|
+
* `O(fnCount + statementCount)` per call into `O(method-line-span)`.
|
|
119
|
+
*
|
|
120
|
+
* - `fnByStartLine`: maps either `decl.start.line` or `loc.start.line` to the
|
|
121
|
+
* raw `fnMap` entry — so callers may key by the escomplex `lineStart`
|
|
122
|
+
* (which can match either, depending on producer).
|
|
123
|
+
* - `fnLocByStartLine`: same keying, value is `{fnStart, fnEnd}` derived once.
|
|
124
|
+
* - `statementsByLine`: `Map<line, {total, covered}>` so range scans don't
|
|
125
|
+
* re-walk the full statement map.
|
|
126
|
+
*
|
|
127
|
+
* @param {object|null} entry One inner value from a `coverage-final.json` map.
|
|
128
|
+
*/
|
|
129
|
+
export function buildEntryIndex(entry) {
|
|
130
|
+
const fnByStartLine = new Map();
|
|
131
|
+
const fnLocByStartLine = new Map();
|
|
132
|
+
const statementsByLine = new Map();
|
|
133
|
+
if (!entry || typeof entry !== 'object') {
|
|
134
|
+
return { fnByStartLine, fnLocByStartLine, statementsByLine };
|
|
135
|
+
}
|
|
136
|
+
const fnMap = entry.fnMap ?? {};
|
|
137
|
+
const statementMap = entry.statementMap ?? {};
|
|
138
|
+
const statementHits = entry.s ?? {};
|
|
139
|
+
|
|
140
|
+
for (const fnId of Object.keys(fnMap)) {
|
|
141
|
+
const f = fnMap[fnId];
|
|
142
|
+
const declLine = f?.decl?.start?.line;
|
|
143
|
+
const locLine = f?.loc?.start?.line;
|
|
144
|
+
const fnStart = locLine ?? declLine ?? null;
|
|
145
|
+
const fnEnd = f?.loc?.end?.line ?? null;
|
|
146
|
+
const loc = { fnStart, fnEnd };
|
|
147
|
+
if (typeof declLine === 'number' && !fnByStartLine.has(declLine)) {
|
|
148
|
+
fnByStartLine.set(declLine, f);
|
|
149
|
+
fnLocByStartLine.set(declLine, loc);
|
|
150
|
+
}
|
|
151
|
+
if (typeof locLine === 'number' && !fnByStartLine.has(locLine)) {
|
|
152
|
+
fnByStartLine.set(locLine, f);
|
|
153
|
+
fnLocByStartLine.set(locLine, loc);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
for (const stmtId of Object.keys(statementMap)) {
|
|
158
|
+
const stmt = statementMap[stmtId];
|
|
159
|
+
const sLine = stmt?.start?.line;
|
|
160
|
+
if (typeof sLine !== 'number') continue;
|
|
161
|
+
let bucket = statementsByLine.get(sLine);
|
|
162
|
+
if (!bucket) {
|
|
163
|
+
bucket = { total: 0, covered: 0 };
|
|
164
|
+
statementsByLine.set(sLine, bucket);
|
|
165
|
+
}
|
|
166
|
+
bucket.total += 1;
|
|
167
|
+
if ((statementHits[stmtId] ?? 0) > 0) bucket.covered += 1;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return { fnByStartLine, fnLocByStartLine, statementsByLine };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function getEntryIndex(entry) {
|
|
174
|
+
if (!entry || typeof entry !== 'object') return null;
|
|
175
|
+
const cached = entry[ENTRY_INDEX];
|
|
176
|
+
if (cached) return cached;
|
|
177
|
+
const idx = buildEntryIndex(entry);
|
|
178
|
+
Object.defineProperty(entry, ENTRY_INDEX, {
|
|
179
|
+
value: idx,
|
|
180
|
+
enumerable: false,
|
|
181
|
+
configurable: true,
|
|
182
|
+
writable: false,
|
|
183
|
+
});
|
|
184
|
+
return idx;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Compute the statement-coverage ratio for a single method inside a single
|
|
189
|
+
* file's coverage entry.
|
|
190
|
+
*
|
|
191
|
+
* The ratio is the fraction of statements whose `start.line` falls within the
|
|
192
|
+
* function's `loc` range that were executed at least once. An empty range
|
|
193
|
+
* returns 0. A missing / malformed entry or no matching function returns
|
|
194
|
+
* `null` so the caller can distinguish "no data" from "tested zero times."
|
|
195
|
+
*
|
|
196
|
+
* The first call on a given entry builds and caches a per-entry index via a
|
|
197
|
+
* non-enumerable Symbol property; consecutive method lookups in the same
|
|
198
|
+
* file pay the build cost exactly once.
|
|
199
|
+
*
|
|
200
|
+
* @param {object|null} entry One inner value from a `coverage-final.json` map.
|
|
201
|
+
* @param {number} startLine The escomplex `lineStart` for the method.
|
|
202
|
+
* @returns {number|null}
|
|
203
|
+
*/
|
|
204
|
+
export function coverageForMethodInEntry(entry, startLine) {
|
|
205
|
+
if (!entry || typeof entry !== 'object') return null;
|
|
206
|
+
const idx = getEntryIndex(entry);
|
|
207
|
+
if (!idx.fnByStartLine.has(startLine)) return null;
|
|
208
|
+
const loc = idx.fnLocByStartLine.get(startLine);
|
|
209
|
+
if (!loc) return null;
|
|
210
|
+
const { fnStart, fnEnd } = loc;
|
|
211
|
+
if (fnStart === null || fnEnd === null) return null;
|
|
212
|
+
|
|
213
|
+
let total = 0;
|
|
214
|
+
let covered = 0;
|
|
215
|
+
for (let line = fnStart; line <= fnEnd; line += 1) {
|
|
216
|
+
const bucket = idx.statementsByLine.get(line);
|
|
217
|
+
if (!bucket) continue;
|
|
218
|
+
total += bucket.total;
|
|
219
|
+
covered += bucket.covered;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (total === 0) return 0;
|
|
223
|
+
return covered / total;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Look up per-method coverage in a full coverage map.
|
|
228
|
+
*
|
|
229
|
+
* @param {object|null} map Parsed `coverage-final.json`.
|
|
230
|
+
* @param {string} relPath Repo-relative path of the source file.
|
|
231
|
+
* @param {number} startLine The escomplex `lineStart` for the method.
|
|
232
|
+
* @returns {number|null} Coverage in [0, 1], or null when the file or method
|
|
233
|
+
* is absent.
|
|
234
|
+
*/
|
|
235
|
+
export function coverageByMethod(map, relPath, startLine) {
|
|
236
|
+
const entry = findFileEntry(map, relPath);
|
|
237
|
+
if (!entry) return null;
|
|
238
|
+
return coverageForMethodInEntry(entry, startLine);
|
|
239
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/cpu-pool.js — Generic worker_threads pool for CPU-bound work.
|
|
3
|
+
*
|
|
4
|
+
* `runOnPool(workerScript, items, opts)` spawns up to
|
|
5
|
+
* `opts.concurrency ?? os.availableParallelism()` persistent workers,
|
|
6
|
+
* dispatches `items` to whichever worker is idle, and resolves with an
|
|
7
|
+
* array of per-item results in input order. The queue is bounded by
|
|
8
|
+
* worker count — we only have N items in flight at once, where N =
|
|
9
|
+
* concurrency, so back-pressure is implicit.
|
|
10
|
+
*
|
|
11
|
+
* Determinism:
|
|
12
|
+
* - The returned `results` array is indexed by input position. Workers
|
|
13
|
+
* race on dispatch but each result lands at its source index, so
|
|
14
|
+
* callers that need deterministic output order can either consume
|
|
15
|
+
* `results` directly (already in input order) or apply a stable
|
|
16
|
+
* sort by file path / id of their choosing after the pool drains.
|
|
17
|
+
*
|
|
18
|
+
* Failure handling:
|
|
19
|
+
* - The worker contract is: emit `{ ok: true, result }` per item, or
|
|
20
|
+
* `{ ok: false, error: string }` for a per-item failure. The default
|
|
21
|
+
* is to capture per-item failures as `{ __cpuPoolError: true,
|
|
22
|
+
* message }` entries at the corresponding result index so one bad
|
|
23
|
+
* input does not abort the run. Pass `opts.throwOnItemError === true`
|
|
24
|
+
* (an explicit `true`, not just truthy) to flip to the abort-on-first
|
|
25
|
+
* mode, which rejects the whole `runOnPool` call.
|
|
26
|
+
* - A worker that crashes (`error` event) or exits non-zero rejects
|
|
27
|
+
* the whole pool — that is not a per-item failure, it is a host-level
|
|
28
|
+
* fault and must surface.
|
|
29
|
+
*
|
|
30
|
+
* Worker-side contract:
|
|
31
|
+
* - The worker entry receives `workerData` (passed once at spawn).
|
|
32
|
+
* - It listens on `parentPort` for messages of shape `{ item }` for
|
|
33
|
+
* work dispatch, or `{ exit: true }` to drain and exit cleanly.
|
|
34
|
+
* - It must `parentPort.postMessage({ ok, result | error })` exactly
|
|
35
|
+
* once per `{ item }` it receives.
|
|
36
|
+
*
|
|
37
|
+
* No project config or git access is loaded here — the pool itself is
|
|
38
|
+
* a thin scheduler so workers stay cheap to spawn.
|
|
39
|
+
*
|
|
40
|
+
* Worker injection (testability):
|
|
41
|
+
* - The worker handle is produced by `opts.workerFactory(script, options)`,
|
|
42
|
+
* defaulting to `(script, options) => new Worker(script, options)`. The
|
|
43
|
+
* factory must return an EventEmitter-shaped handle exposing the subset
|
|
44
|
+
* of the `worker_threads.Worker` surface the scheduler uses: `on`,
|
|
45
|
+
* `off`, `once`, `postMessage`, and a thenable `terminate()`. Injecting
|
|
46
|
+
* a synchronous fake factory lets unit tests drive the scheduling,
|
|
47
|
+
* ordering, and exit-race branches in-process without spawning a real
|
|
48
|
+
* OS thread.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
import os from 'node:os';
|
|
52
|
+
import { Worker } from 'node:worker_threads';
|
|
53
|
+
|
|
54
|
+
/** Default factory: spawn a real `worker_threads.Worker`. */
|
|
55
|
+
const defaultWorkerFactory = (script, options) => new Worker(script, options);
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @template TItem, TResult
|
|
59
|
+
* @param {string|URL} workerScript - File URL or path to the worker entry.
|
|
60
|
+
* @param {TItem[]} items
|
|
61
|
+
* @param {{
|
|
62
|
+
* concurrency?: number,
|
|
63
|
+
* workerData?: unknown,
|
|
64
|
+
* throwOnItemError?: boolean,
|
|
65
|
+
* workerFactory?: (
|
|
66
|
+
* script: string|URL,
|
|
67
|
+
* options: { workerData?: unknown },
|
|
68
|
+
* ) => import('node:events').EventEmitter & {
|
|
69
|
+
* postMessage: (msg: unknown) => void,
|
|
70
|
+
* terminate: () => Promise<unknown> | unknown,
|
|
71
|
+
* },
|
|
72
|
+
* }} [opts]
|
|
73
|
+
* @returns {Promise<Array<TResult | { __cpuPoolError: true, message: string }>>}
|
|
74
|
+
*/
|
|
75
|
+
export async function runOnPool(workerScript, items, opts = {}) {
|
|
76
|
+
const itemsArr = [...items];
|
|
77
|
+
if (itemsArr.length === 0) return [];
|
|
78
|
+
|
|
79
|
+
const requested = opts.concurrency ?? os.availableParallelism();
|
|
80
|
+
const concurrency = Math.max(1, Math.min(requested, itemsArr.length));
|
|
81
|
+
const workerData = opts.workerData;
|
|
82
|
+
const throwOnItemError = opts.throwOnItemError === true;
|
|
83
|
+
const workerFactory = opts.workerFactory ?? defaultWorkerFactory;
|
|
84
|
+
|
|
85
|
+
const results = new Array(itemsArr.length);
|
|
86
|
+
let nextIndex = 0;
|
|
87
|
+
let firstFatalError = null;
|
|
88
|
+
|
|
89
|
+
async function runWorker() {
|
|
90
|
+
const worker = workerFactory(workerScript, { workerData });
|
|
91
|
+
// Track exit at worker scope so the finally block can short-circuit
|
|
92
|
+
// when the worker has already gone away (e.g. mid-dispatch
|
|
93
|
+
// process.exit). Registering a single persistent listener here also
|
|
94
|
+
// sidesteps the race where worker.once('exit', ...) added inside
|
|
95
|
+
// finally arrives after the 'exit' event has already fired and
|
|
96
|
+
// therefore never resolves.
|
|
97
|
+
let workerExited = false;
|
|
98
|
+
worker.on('exit', () => {
|
|
99
|
+
workerExited = true;
|
|
100
|
+
});
|
|
101
|
+
try {
|
|
102
|
+
while (firstFatalError === null) {
|
|
103
|
+
const myIndex = nextIndex++;
|
|
104
|
+
if (myIndex >= itemsArr.length) break;
|
|
105
|
+
const item = itemsArr[myIndex];
|
|
106
|
+
// eslint-disable-next-line no-await-in-loop
|
|
107
|
+
const outcome = await dispatchOne(worker, item);
|
|
108
|
+
if (outcome.kind === 'ok') {
|
|
109
|
+
results[myIndex] = outcome.result;
|
|
110
|
+
} else if (outcome.kind === 'item-error') {
|
|
111
|
+
if (throwOnItemError) {
|
|
112
|
+
firstFatalError = new Error(
|
|
113
|
+
`cpu-pool item failure: ${outcome.message}`,
|
|
114
|
+
);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
results[myIndex] = {
|
|
118
|
+
__cpuPoolError: true,
|
|
119
|
+
message: outcome.message,
|
|
120
|
+
};
|
|
121
|
+
} else {
|
|
122
|
+
// host-level fault: worker crashed or emitted bad shape.
|
|
123
|
+
if (firstFatalError === null) firstFatalError = outcome.error;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
} finally {
|
|
128
|
+
if (!workerExited) {
|
|
129
|
+
try {
|
|
130
|
+
worker.postMessage({ exit: true });
|
|
131
|
+
} catch {
|
|
132
|
+
// worker may already be terminating
|
|
133
|
+
}
|
|
134
|
+
// Wait briefly for clean exit, then force-terminate. Re-check
|
|
135
|
+
// workerExited because the dispatch loop may have observed the
|
|
136
|
+
// exit between the guard above and here.
|
|
137
|
+
if (!workerExited) {
|
|
138
|
+
const exited = new Promise((resolve) => {
|
|
139
|
+
if (workerExited) resolve();
|
|
140
|
+
else worker.once('exit', resolve);
|
|
141
|
+
});
|
|
142
|
+
// Do NOT .unref() the fallback timer: an unrefed timer lets
|
|
143
|
+
// the event loop appear idle while this promise is pending,
|
|
144
|
+
// which trips Node's test runner cancellation under cold-CI
|
|
145
|
+
// conditions.
|
|
146
|
+
await Promise.race([
|
|
147
|
+
exited,
|
|
148
|
+
new Promise((resolve) => setTimeout(resolve, 1000)),
|
|
149
|
+
]);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
await worker.terminate();
|
|
154
|
+
} catch {
|
|
155
|
+
// already gone
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
await Promise.all(Array.from({ length: concurrency }, () => runWorker()));
|
|
161
|
+
|
|
162
|
+
if (firstFatalError !== null) throw firstFatalError;
|
|
163
|
+
return results;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Round-trip a single item through `worker`, resolving to a tagged
|
|
168
|
+
* outcome. Never throws: a host-level fault is reported as
|
|
169
|
+
* `{ kind: 'fatal', error }` so `runOnPool` can record it as the first
|
|
170
|
+
* fatal error and stop dispatching.
|
|
171
|
+
*/
|
|
172
|
+
function dispatchOne(worker, item) {
|
|
173
|
+
return new Promise((resolve) => {
|
|
174
|
+
const cleanup = () => {
|
|
175
|
+
worker.off('message', onMessage);
|
|
176
|
+
worker.off('error', onError);
|
|
177
|
+
worker.off('exit', onExit);
|
|
178
|
+
};
|
|
179
|
+
const onMessage = (msg) => {
|
|
180
|
+
cleanup();
|
|
181
|
+
if (msg && msg.ok === true) {
|
|
182
|
+
resolve({ kind: 'ok', result: msg.result });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (msg && msg.ok === false) {
|
|
186
|
+
resolve({
|
|
187
|
+
kind: 'item-error',
|
|
188
|
+
message: typeof msg.error === 'string' ? msg.error : 'unknown',
|
|
189
|
+
});
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
resolve({
|
|
193
|
+
kind: 'fatal',
|
|
194
|
+
error: new Error(
|
|
195
|
+
`cpu-pool: malformed worker message: ${JSON.stringify(msg)}`,
|
|
196
|
+
),
|
|
197
|
+
});
|
|
198
|
+
};
|
|
199
|
+
const onError = (err) => {
|
|
200
|
+
cleanup();
|
|
201
|
+
resolve({ kind: 'fatal', error: err });
|
|
202
|
+
};
|
|
203
|
+
const onExit = (code) => {
|
|
204
|
+
cleanup();
|
|
205
|
+
if (code !== 0) {
|
|
206
|
+
resolve({
|
|
207
|
+
kind: 'fatal',
|
|
208
|
+
error: new Error(`cpu-pool: worker exited with code ${code}`),
|
|
209
|
+
});
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
// Clean exit mid-dispatch: treat as fatal so the item is not silently lost.
|
|
213
|
+
resolve({
|
|
214
|
+
kind: 'fatal',
|
|
215
|
+
error: new Error('cpu-pool: worker exited mid-dispatch'),
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
worker.on('message', onMessage);
|
|
219
|
+
worker.on('error', onError);
|
|
220
|
+
worker.on('exit', onExit);
|
|
221
|
+
worker.postMessage({ item });
|
|
222
|
+
});
|
|
223
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import escomplex from 'typhonjs-escomplex';
|
|
2
|
+
import { coverageForMethodInEntry } from './coverage-utils.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Score each method in a JavaScript source for Change Risk Anti-Patterns
|
|
6
|
+
* (CRAP): `c² · (1 − cov)³ + c`, where `c` is cyclomatic complexity and `cov`
|
|
7
|
+
* is the per-method statement-coverage ratio in [0, 1].
|
|
8
|
+
*
|
|
9
|
+
* Kernel contract:
|
|
10
|
+
* - Pure (no I/O, no AST parse beyond the one delegated to escomplex via
|
|
11
|
+
* `analyzeModule`).
|
|
12
|
+
* - Methods whose coverage cannot be resolved from `coverageForFile`
|
|
13
|
+
* produce `coverage: null` and `crap: null`. Callers apply their own
|
|
14
|
+
* `requireCoverage` policy at the scanner level; this kernel never
|
|
15
|
+
* decides to skip.
|
|
16
|
+
* - A parse error returns an empty array — the file is unscorable, not
|
|
17
|
+
* zero-complexity.
|
|
18
|
+
*
|
|
19
|
+
* @param {string} source JavaScript source text.
|
|
20
|
+
* @param {object|null} coverageForFile The inner value from a
|
|
21
|
+
* `coverage-final.json` map keyed by this file's path, or null when no
|
|
22
|
+
* coverage data is available for this file.
|
|
23
|
+
* @returns {Array<{
|
|
24
|
+
* method: string,
|
|
25
|
+
* startLine: number,
|
|
26
|
+
* cyclomatic: number,
|
|
27
|
+
* coverage: number|null,
|
|
28
|
+
* crap: number|null,
|
|
29
|
+
* }>}
|
|
30
|
+
*/
|
|
31
|
+
export function calculateCrapForSource(source, coverageForFile) {
|
|
32
|
+
let report;
|
|
33
|
+
try {
|
|
34
|
+
report = escomplex.analyzeModule(source);
|
|
35
|
+
} catch {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
const methods = report?.methods ?? [];
|
|
39
|
+
const rows = [];
|
|
40
|
+
for (const m of methods) {
|
|
41
|
+
const startLine = m?.lineStart;
|
|
42
|
+
if (typeof startLine !== 'number') continue;
|
|
43
|
+
const cyclomatic = m?.cyclomatic ?? 0;
|
|
44
|
+
const coverage = coverageForFile
|
|
45
|
+
? coverageForMethodInEntry(coverageForFile, startLine)
|
|
46
|
+
: null;
|
|
47
|
+
const crap = coverage === null ? null : crapFormula(cyclomatic, coverage);
|
|
48
|
+
rows.push({
|
|
49
|
+
method: m.name,
|
|
50
|
+
startLine,
|
|
51
|
+
cyclomatic,
|
|
52
|
+
coverage,
|
|
53
|
+
crap,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return rows;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* CRAP formula, exported for callers that need to derive target scores or
|
|
61
|
+
* `fixGuidance` values without re-scoring source.
|
|
62
|
+
*
|
|
63
|
+
* @param {number} cyclomatic
|
|
64
|
+
* @param {number} coverage In [0, 1].
|
|
65
|
+
* @returns {number}
|
|
66
|
+
*/
|
|
67
|
+
export function crapFormula(cyclomatic, coverage) {
|
|
68
|
+
const c = Number(cyclomatic) || 0;
|
|
69
|
+
const cov = Math.max(0, Math.min(1, Number(coverage) || 0));
|
|
70
|
+
return c * c * (1 - cov) ** 3 + c;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Derive the deterministic single-axis fixes that would bring a method at
|
|
75
|
+
* cyclomatic complexity `c` at or under the `target` CRAP score.
|
|
76
|
+
*
|
|
77
|
+
* Two orthogonal remediations are surfaced:
|
|
78
|
+
* - `minComplexityAt100Cov`: branch count a refactor must reach so that,
|
|
79
|
+
* even untested, the method would pass (`CRAP@cov=1 = c` → `c ≤ target`).
|
|
80
|
+
* Computed as `floor(sqrt(target))`.
|
|
81
|
+
* - `minCoverageAtCurrentComplexity`: ratio a test-addition must reach at
|
|
82
|
+
* the current complexity to pass, derived by inverting the formula:
|
|
83
|
+
* `cov = 1 − ((target − c) / c²)^(1/3)`. Null when unachievable — i.e.
|
|
84
|
+
* `c > target` (CRAP at 100% coverage still exceeds the target) or when
|
|
85
|
+
* `c ≤ 0` (no branches; coverage is meaningless).
|
|
86
|
+
*
|
|
87
|
+
* Callers apply the target convention: `baseline` for regressions,
|
|
88
|
+
* `newMethodCeiling` for new violations. The helper stays scalar so it can
|
|
89
|
+
* be re-used by MI-parity output or future guidance surfaces.
|
|
90
|
+
*
|
|
91
|
+
* @param {{ cyclomatic: number, target: number }} params
|
|
92
|
+
* @returns {{
|
|
93
|
+
* crapCeiling: number,
|
|
94
|
+
* minComplexityAt100Cov: number,
|
|
95
|
+
* minCoverageAtCurrentComplexity: number | null,
|
|
96
|
+
* } | null}
|
|
97
|
+
*/
|
|
98
|
+
export function deriveFixGuidance({ cyclomatic, target } = {}) {
|
|
99
|
+
const c = Number(cyclomatic);
|
|
100
|
+
const t = Number(target);
|
|
101
|
+
if (!Number.isFinite(c) || !Number.isFinite(t) || t < 0) return null;
|
|
102
|
+
|
|
103
|
+
const minComplexityAt100Cov = Math.max(0, Math.floor(Math.sqrt(t)));
|
|
104
|
+
|
|
105
|
+
let minCoverageAtCurrentComplexity = null;
|
|
106
|
+
if (c > 0 && t >= c) {
|
|
107
|
+
// `(t - c) / c²` lies in `[0, 1]` for `t ∈ [c, c + c²]`; Math.cbrt stays
|
|
108
|
+
// real-valued for any input so a numeric clamp is the only safeguard.
|
|
109
|
+
const ratio = (t - c) / (c * c);
|
|
110
|
+
const minCov = 1 - Math.cbrt(ratio);
|
|
111
|
+
minCoverageAtCurrentComplexity = Math.max(0, Math.min(1, minCov));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
crapCeiling: t,
|
|
116
|
+
minComplexityAt100Cov,
|
|
117
|
+
minCoverageAtCurrentComplexity,
|
|
118
|
+
};
|
|
119
|
+
}
|