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,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* env-overrides.js — pure resolvers for the per-kind baseline env overrides.
|
|
3
|
+
*
|
|
4
|
+
* Hoisted from `check-crap.js` and `check-maintainability.js` (Story #1981,
|
|
5
|
+
* Task #1989) so the env-precedence behavior — config → env → default,
|
|
6
|
+
* malformed values warn-and-fall-through — lives in a lib module the
|
|
7
|
+
* per-kind callers (and tests) can share without spawning a CLI.
|
|
8
|
+
*
|
|
9
|
+
* No I/O. No side effects beyond logger warnings.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { Logger } from '../Logger.js';
|
|
13
|
+
|
|
14
|
+
// Framework default MI tolerance. Raised from 0.001 to 0.5 because real-world
|
|
15
|
+
// noise (Node-version churn, escomplex internal updates, typhonjs-escomplex
|
|
16
|
+
// rounding) routinely drifts +/- 0.05 to 0.3 on otherwise-unchanged files —
|
|
17
|
+
// well below the threshold of "actually less maintainable." A 0.5 floor
|
|
18
|
+
// stops the pre-push hook from auto-ratcheting the baseline on noise.
|
|
19
|
+
export const MI_DEFAULT_TOLERANCE = 0.5;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Pure helper: resolve the effective CRAP config by layering env-var
|
|
23
|
+
* overrides on top of the resolved `.agentrc.json` values. Exported so
|
|
24
|
+
* tests can assert the precedence + malformed-value behavior without
|
|
25
|
+
* spawning the CLI.
|
|
26
|
+
*
|
|
27
|
+
* @param {{ newMethodCeiling?: unknown, tolerance?: unknown, refreshTag?: unknown }} crapConfig
|
|
28
|
+
* @param {NodeJS.ProcessEnv} env
|
|
29
|
+
* @returns {{ newMethodCeiling: number, tolerance: number, refreshTag: string, overrides: string[] }}
|
|
30
|
+
*/
|
|
31
|
+
export function resolveCrapEnvOverrides(crapConfig, env) {
|
|
32
|
+
const overrides = [];
|
|
33
|
+
let newMethodCeiling = Number.isFinite(crapConfig?.newMethodCeiling)
|
|
34
|
+
? crapConfig.newMethodCeiling
|
|
35
|
+
: 30;
|
|
36
|
+
// Default 0.05 (raised from 0.001 in 5.36.1). CRAP scores are
|
|
37
|
+
// `c² · (1 − cov)³ + c`, so a sub-percent per-method coverage rounding
|
|
38
|
+
// shift across CI environments — same code, different escomplex /
|
|
39
|
+
// coverage build — moves the score by ~0.01 on its own. A 0.001
|
|
40
|
+
// tolerance flagged that as a regression; real regressions cross
|
|
41
|
+
// whole-integer thresholds (e.g. 8 → 12) and clear 0.05 trivially.
|
|
42
|
+
let tolerance = Number.isFinite(crapConfig?.tolerance)
|
|
43
|
+
? crapConfig.tolerance
|
|
44
|
+
: 0.05;
|
|
45
|
+
let refreshTag =
|
|
46
|
+
typeof crapConfig?.refreshTag === 'string' && crapConfig.refreshTag.length
|
|
47
|
+
? crapConfig.refreshTag
|
|
48
|
+
: 'baseline-refresh:';
|
|
49
|
+
|
|
50
|
+
const rawCeiling = env?.CRAP_NEW_METHOD_CEILING;
|
|
51
|
+
if (rawCeiling !== undefined && rawCeiling !== '') {
|
|
52
|
+
const parsed = Number(rawCeiling);
|
|
53
|
+
if (Number.isFinite(parsed) && parsed >= 0) {
|
|
54
|
+
newMethodCeiling = parsed;
|
|
55
|
+
overrides.push(`newMethodCeiling=${parsed} (CRAP_NEW_METHOD_CEILING)`);
|
|
56
|
+
} else {
|
|
57
|
+
Logger.warn(
|
|
58
|
+
`[CRAP] ⚠ ignoring malformed CRAP_NEW_METHOD_CEILING=${rawCeiling}; keeping config value ${newMethodCeiling}`,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const rawTolerance = env?.CRAP_TOLERANCE;
|
|
64
|
+
if (rawTolerance !== undefined && rawTolerance !== '') {
|
|
65
|
+
const parsed = Number(rawTolerance);
|
|
66
|
+
if (Number.isFinite(parsed) && parsed >= 0) {
|
|
67
|
+
tolerance = parsed;
|
|
68
|
+
overrides.push(`tolerance=${parsed} (CRAP_TOLERANCE)`);
|
|
69
|
+
} else {
|
|
70
|
+
Logger.warn(
|
|
71
|
+
`[CRAP] ⚠ ignoring malformed CRAP_TOLERANCE=${rawTolerance}; keeping config value ${tolerance}`,
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const rawRefreshTag = env?.CRAP_REFRESH_TAG;
|
|
77
|
+
if (typeof rawRefreshTag === 'string' && rawRefreshTag.length > 0) {
|
|
78
|
+
refreshTag = rawRefreshTag;
|
|
79
|
+
overrides.push(`refreshTag=${rawRefreshTag} (CRAP_REFRESH_TAG)`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return { newMethodCeiling, tolerance, refreshTag, overrides };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Pure helper: resolve the effective MI tolerance by layering precedence:
|
|
87
|
+
* 1. `CRAP_TOLERANCE` env-var (CI override — the baseline-refresh-
|
|
88
|
+
* guardrail uses this to force base-branch values on both gates).
|
|
89
|
+
* 2. `delivery.quality.gates.maintainability.tolerance` from the config.
|
|
90
|
+
* 3. `MI_DEFAULT_TOLERANCE` (0.5).
|
|
91
|
+
*
|
|
92
|
+
* Malformed env values warn and fall through to the next layer — a typo
|
|
93
|
+
* in CI must never silently relax the gate, but it also must not skip the
|
|
94
|
+
* configured project value.
|
|
95
|
+
*
|
|
96
|
+
* @param {NodeJS.ProcessEnv} env
|
|
97
|
+
* @param {{ tolerance?: number }} [maintainabilityConfig]
|
|
98
|
+
* @returns {{ tolerance: number, overrides: string[] }}
|
|
99
|
+
*/
|
|
100
|
+
export function resolveMaintainabilityEnvOverrides(env, maintainabilityConfig) {
|
|
101
|
+
const overrides = [];
|
|
102
|
+
let tolerance = MI_DEFAULT_TOLERANCE;
|
|
103
|
+
// Layer 2: config value (lower precedence than env, higher than default).
|
|
104
|
+
const configured = maintainabilityConfig?.tolerance;
|
|
105
|
+
if (
|
|
106
|
+
typeof configured === 'number' &&
|
|
107
|
+
Number.isFinite(configured) &&
|
|
108
|
+
configured >= 0
|
|
109
|
+
) {
|
|
110
|
+
tolerance = configured;
|
|
111
|
+
overrides.push(
|
|
112
|
+
`tolerance=${configured} (quality.maintainability.tolerance)`,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
// Layer 1: env override (highest precedence).
|
|
116
|
+
const raw = env?.CRAP_TOLERANCE;
|
|
117
|
+
if (raw !== undefined && raw !== '') {
|
|
118
|
+
const parsed = Number(raw);
|
|
119
|
+
if (Number.isFinite(parsed) && parsed >= 0) {
|
|
120
|
+
tolerance = parsed;
|
|
121
|
+
overrides.push(`tolerance=${parsed} (CRAP_TOLERANCE)`);
|
|
122
|
+
} else {
|
|
123
|
+
Logger.warn(
|
|
124
|
+
`[Maintainability] ⚠ ignoring malformed CRAP_TOLERANCE=${raw}; keeping ${tolerance}`,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return { tolerance, overrides };
|
|
129
|
+
}
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* envelope.js — assemble and validate baseline envelopes (Story #1891,
|
|
3
|
+
* Epic #1786).
|
|
4
|
+
*
|
|
5
|
+
* Every committed Mandrel baseline ships an envelope-shaped JSON with five
|
|
6
|
+
* top-level keys:
|
|
7
|
+
*
|
|
8
|
+
* {
|
|
9
|
+
* "$schema": ".agents/schemas/baselines/<kind>.schema.json",
|
|
10
|
+
* "kernelVersion": "<semver>",
|
|
11
|
+
* "generatedAt": "<ISO-8601>",
|
|
12
|
+
* "rollup": { "*": { ... }, [component]: { ... } },
|
|
13
|
+
* "rows": [ ... ]
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* The envelope contract is declared in
|
|
17
|
+
* `.agents/schemas/baselines/baseline-envelope.schema.json` and the
|
|
18
|
+
* per-kind schemas extend it via `allOf` (Story #1888).
|
|
19
|
+
*
|
|
20
|
+
* This module exposes:
|
|
21
|
+
*
|
|
22
|
+
* buildEnvelope({ kind, rollup, rows, kernelVersion, generatedAt? })
|
|
23
|
+
* Stamps `$schema`, `kernelVersion`, and `generatedAt` onto a freshly
|
|
24
|
+
* constructed envelope. When `generatedAt` is omitted, the
|
|
25
|
+
* `MANDREL_BASELINE_GENERATED_AT` env var overrides any other clock
|
|
26
|
+
* reading — this lets reproducible-build tests pin the timestamp
|
|
27
|
+
* without monkey-patching `Date`. When neither is provided, the
|
|
28
|
+
* envelope stamps `new Date().toISOString()`.
|
|
29
|
+
*
|
|
30
|
+
* assertEnvelope(envelope)
|
|
31
|
+
* Compiles every per-kind schema once (AJV) and validates the envelope
|
|
32
|
+
* against the schema named in its `$schema`. Throws on schema
|
|
33
|
+
* mismatch, missing top-level keys, or a `$schema` that doesn't
|
|
34
|
+
* correspond to one of the seven known per-kind schemas.
|
|
35
|
+
*
|
|
36
|
+
* The writer (`writer.js`) calls `buildEnvelope` then `assertEnvelope`
|
|
37
|
+
* before serialising — so every baseline written through the shared
|
|
38
|
+
* pipeline is schema-valid by construction.
|
|
39
|
+
*
|
|
40
|
+
* @module lib/baselines/envelope
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import fs from 'node:fs';
|
|
44
|
+
import path from 'node:path';
|
|
45
|
+
import { fileURLToPath } from 'node:url';
|
|
46
|
+
import Ajv from 'ajv';
|
|
47
|
+
import addFormats from 'ajv-formats';
|
|
48
|
+
|
|
49
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Repo-relative `.agents/schemas/baselines/` directory. Resolved off the
|
|
53
|
+
* module URL so the envelope works the same in the main checkout, in a
|
|
54
|
+
* worktree, and inside CI's bare clone — none of those have a stable
|
|
55
|
+
* `process.cwd()` relative to the schemas.
|
|
56
|
+
*/
|
|
57
|
+
const SCHEMAS_DIR = path.resolve(
|
|
58
|
+
__dirname,
|
|
59
|
+
'..',
|
|
60
|
+
'..',
|
|
61
|
+
'..',
|
|
62
|
+
'schemas',
|
|
63
|
+
'baselines',
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Canonical list of kinds the shared envelope supports. The writer's
|
|
68
|
+
* per-kind module list lives in `kinds/index.js`; this constant is the
|
|
69
|
+
* envelope's view of the same set, kept here to break the import cycle
|
|
70
|
+
* (`kinds/<kind>` imports envelope; envelope only needs the names).
|
|
71
|
+
*/
|
|
72
|
+
export const KNOWN_KINDS = Object.freeze([
|
|
73
|
+
'lint',
|
|
74
|
+
'coverage',
|
|
75
|
+
'crap',
|
|
76
|
+
'maintainability',
|
|
77
|
+
'mutation',
|
|
78
|
+
'lighthouse',
|
|
79
|
+
'bundle-size',
|
|
80
|
+
'duplication',
|
|
81
|
+
]);
|
|
82
|
+
|
|
83
|
+
function schemaRefFor(kind) {
|
|
84
|
+
return `.agents/schemas/baselines/${kind}.schema.json`;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function kernelVersionPattern() {
|
|
88
|
+
return /^[0-9]+\.[0-9]+\.[0-9]+$/;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function isoTimestampPattern() {
|
|
92
|
+
// RFC 3339 / ISO 8601 with optional fractional seconds and a `Z` or
|
|
93
|
+
// `±HH:MM` offset. AJV's `date-time` format does the heavy validation;
|
|
94
|
+
// this is a cheap pre-check so we can throw a friendlier error before
|
|
95
|
+
// AJV ever runs.
|
|
96
|
+
return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$/;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Resolve the effective `generatedAt` for an envelope. Priority:
|
|
101
|
+
*
|
|
102
|
+
* 1. Caller-supplied `generatedAt`.
|
|
103
|
+
* 2. `MANDREL_BASELINE_GENERATED_AT` env var (reproducible-build hook).
|
|
104
|
+
* 3. `new Date().toISOString()`.
|
|
105
|
+
*
|
|
106
|
+
* Validates the resulting string against an ISO-8601 shape and throws a
|
|
107
|
+
* clear error if it doesn't match — operators get the failure at write
|
|
108
|
+
* time, not when AJV runs.
|
|
109
|
+
*
|
|
110
|
+
* @param {string|undefined} explicit
|
|
111
|
+
* @returns {string}
|
|
112
|
+
*/
|
|
113
|
+
function resolveGeneratedAt(explicit) {
|
|
114
|
+
const candidate =
|
|
115
|
+
typeof explicit === 'string' && explicit.length > 0
|
|
116
|
+
? explicit
|
|
117
|
+
: (process.env.MANDREL_BASELINE_GENERATED_AT ?? new Date().toISOString());
|
|
118
|
+
if (typeof candidate !== 'string' || !isoTimestampPattern().test(candidate)) {
|
|
119
|
+
throw new Error(
|
|
120
|
+
`envelope.buildEnvelope: generatedAt must be an ISO-8601 timestamp (got ${JSON.stringify(candidate)})`,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
return candidate;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Construct an envelope. The caller supplies the per-kind row + rollup
|
|
128
|
+
* shape; this module stamps the envelope-level keys.
|
|
129
|
+
*
|
|
130
|
+
* @param {{
|
|
131
|
+
* kind: string,
|
|
132
|
+
* rollup: Record<string, object>,
|
|
133
|
+
* rows: Array<object>,
|
|
134
|
+
* kernelVersion: string,
|
|
135
|
+
* generatedAt?: string,
|
|
136
|
+
* }} params
|
|
137
|
+
* @returns {{
|
|
138
|
+
* $schema: string,
|
|
139
|
+
* kernelVersion: string,
|
|
140
|
+
* generatedAt: string,
|
|
141
|
+
* rollup: Record<string, object>,
|
|
142
|
+
* rows: Array<object>,
|
|
143
|
+
* }}
|
|
144
|
+
*/
|
|
145
|
+
export function buildEnvelope({
|
|
146
|
+
kind,
|
|
147
|
+
rollup,
|
|
148
|
+
rows,
|
|
149
|
+
kernelVersion,
|
|
150
|
+
generatedAt,
|
|
151
|
+
} = {}) {
|
|
152
|
+
if (typeof kind !== 'string' || !KNOWN_KINDS.includes(kind)) {
|
|
153
|
+
throw new TypeError(
|
|
154
|
+
`envelope.buildEnvelope: kind must be one of ${KNOWN_KINDS.join(', ')} (got ${JSON.stringify(kind)})`,
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
if (
|
|
158
|
+
typeof kernelVersion !== 'string' ||
|
|
159
|
+
!kernelVersionPattern().test(kernelVersion)
|
|
160
|
+
) {
|
|
161
|
+
throw new TypeError(
|
|
162
|
+
`envelope.buildEnvelope: kernelVersion must be semver-shaped (got ${JSON.stringify(kernelVersion)})`,
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
if (!rollup || typeof rollup !== 'object' || Array.isArray(rollup)) {
|
|
166
|
+
throw new TypeError(
|
|
167
|
+
'envelope.buildEnvelope: rollup must be an object keyed by component',
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
if (!Object.hasOwn(rollup, '*')) {
|
|
171
|
+
throw new Error(
|
|
172
|
+
'envelope.buildEnvelope: rollup["*"] (whole-repo rollup) is required',
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
if (!Array.isArray(rows)) {
|
|
176
|
+
throw new TypeError('envelope.buildEnvelope: rows must be an array');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
$schema: schemaRefFor(kind),
|
|
181
|
+
kernelVersion,
|
|
182
|
+
generatedAt: resolveGeneratedAt(generatedAt),
|
|
183
|
+
rollup,
|
|
184
|
+
rows,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Lazy AJV instance — compiled schemas are memoised so successive writes
|
|
190
|
+
* during a single Node process don't re-compile the seven schemas.
|
|
191
|
+
*/
|
|
192
|
+
let _ajv = null;
|
|
193
|
+
const _validators = new Map();
|
|
194
|
+
|
|
195
|
+
function getAjv() {
|
|
196
|
+
if (_ajv) return _ajv;
|
|
197
|
+
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
198
|
+
addFormats(ajv);
|
|
199
|
+
const envelopeSchema = JSON.parse(
|
|
200
|
+
fs.readFileSync(
|
|
201
|
+
path.join(SCHEMAS_DIR, 'baseline-envelope.schema.json'),
|
|
202
|
+
'utf8',
|
|
203
|
+
),
|
|
204
|
+
);
|
|
205
|
+
ajv.addSchema(envelopeSchema, 'baseline-envelope.schema.json');
|
|
206
|
+
_ajv = ajv;
|
|
207
|
+
return ajv;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function getValidator(kind) {
|
|
211
|
+
if (_validators.has(kind)) return _validators.get(kind);
|
|
212
|
+
const ajv = getAjv();
|
|
213
|
+
const schema = JSON.parse(
|
|
214
|
+
fs.readFileSync(path.join(SCHEMAS_DIR, `${kind}.schema.json`), 'utf8'),
|
|
215
|
+
);
|
|
216
|
+
const validate = ajv.compile(schema);
|
|
217
|
+
_validators.set(kind, validate);
|
|
218
|
+
return validate;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* The five top-level keys every envelope MUST carry. Pre-checked before
|
|
223
|
+
* AJV runs so the error names the missing key directly instead of
|
|
224
|
+
* surfacing as an AJV "required" violation.
|
|
225
|
+
*/
|
|
226
|
+
const REQUIRED_TOP_LEVEL_KEYS = Object.freeze([
|
|
227
|
+
'$schema',
|
|
228
|
+
'kernelVersion',
|
|
229
|
+
'generatedAt',
|
|
230
|
+
'rollup',
|
|
231
|
+
'rows',
|
|
232
|
+
]);
|
|
233
|
+
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
// Shared baseline compatibility axes (Story #2467, Task #2492).
|
|
236
|
+
//
|
|
237
|
+
// Every baseline-kind compatibility check shares the same universal
|
|
238
|
+
// invariants: the envelope must exist, its kernelVersion must match the
|
|
239
|
+
// running scorer, and (when published) its `generatedAt` must be monotonic
|
|
240
|
+
// vs the running clock. Per-kind axis tables (e.g. `CRAP_COMPAT_AXES`)
|
|
241
|
+
// compose these into their kind-specific axis list so the hoisted axes
|
|
242
|
+
// live in exactly one place.
|
|
243
|
+
//
|
|
244
|
+
// Each axis exposes `{ name, severity, check }`:
|
|
245
|
+
// - `name` — stable label used as `kind` in the failure envelope.
|
|
246
|
+
// - `severity` — `'fatal'` (short-circuit, exitCode 1) or `'warn'`
|
|
247
|
+
// (accumulate into `warnings`).
|
|
248
|
+
// - `check` — pure function over the compat context. Returns `null`
|
|
249
|
+
// when the axis passes, or a string message describing
|
|
250
|
+
// the failure.
|
|
251
|
+
// ---------------------------------------------------------------------------
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Universal "missing baseline" axis. Fires when the loader returned `null`
|
|
255
|
+
* / `undefined`. The operator message is parametrised by the kind label
|
|
256
|
+
* supplied at composition time so each kind keeps its own bootstrap hint.
|
|
257
|
+
*
|
|
258
|
+
* @param {string} kindLabel — operator-facing label (e.g. `CRAP`, `MI`).
|
|
259
|
+
* @returns {{name: string, severity: 'fatal', check: (ctx: {baseline: unknown}) => string|null}}
|
|
260
|
+
*/
|
|
261
|
+
export function missingBaselineAxis(kindLabel) {
|
|
262
|
+
return {
|
|
263
|
+
name: 'missing-baseline',
|
|
264
|
+
severity: 'fatal',
|
|
265
|
+
check: ({ baseline }) =>
|
|
266
|
+
baseline === null || baseline === undefined
|
|
267
|
+
? `[${kindLabel}] ❌ no baseline found — run the matching baseline-update command and commit with a 'baseline-refresh:' subject to bootstrap`
|
|
268
|
+
: null,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Universal "kernel-version drift" axis. Fires when the baseline's
|
|
274
|
+
* recorded `kernelVersion` differs from the running scorer's
|
|
275
|
+
* `kernelVersion`. Warn-only by default — kernel drift surfaces as a
|
|
276
|
+
* baseline-refresh nudge, not a close-validation failure.
|
|
277
|
+
*
|
|
278
|
+
* @param {string} kindLabel
|
|
279
|
+
* @returns {{name: string, severity: 'warn', check: (ctx: {baseline: {kernelVersion?: string}|null|undefined, runningKernelVersion: string}) => string|null}}
|
|
280
|
+
*/
|
|
281
|
+
export function kernelDriftAxis(kindLabel) {
|
|
282
|
+
return {
|
|
283
|
+
name: 'kernel-drift',
|
|
284
|
+
severity: 'warn',
|
|
285
|
+
check: ({ baseline, runningKernelVersion }) =>
|
|
286
|
+
baseline && baseline.kernelVersion !== runningKernelVersion
|
|
287
|
+
? `[${kindLabel}] ⚠ kernelVersion drift: baseline=${baseline.kernelVersion} running=${runningKernelVersion}. ` +
|
|
288
|
+
"Run the matching baseline-update command and commit with a 'baseline-refresh:' subject to refresh."
|
|
289
|
+
: null,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Reduce an axis list against a compat context, emitting either a fatal
|
|
295
|
+
* envelope `{ ok: false, exitCode: 1, kind, message }` (on the first
|
|
296
|
+
* 'fatal' match) or an accumulating `{ ok: true, warnings }` envelope.
|
|
297
|
+
*
|
|
298
|
+
* Shared by every per-kind `evaluateBaselineCompatibility` caller so the
|
|
299
|
+
* reduce body lives in one place and stays well below the project's
|
|
300
|
+
* cyclomatic-complexity ceiling.
|
|
301
|
+
*
|
|
302
|
+
* @template {object} Ctx
|
|
303
|
+
* @param {Array<{name: string, severity: 'fatal'|'warn', check: (ctx: Ctx) => string|null}>} axes
|
|
304
|
+
* @param {Ctx} ctx
|
|
305
|
+
* @returns {{ok: true, warnings: string[]} | {ok: false, exitCode: 1, kind: string, message: string}}
|
|
306
|
+
*/
|
|
307
|
+
export function reduceCompatAxes(axes, ctx) {
|
|
308
|
+
return axes.reduce(
|
|
309
|
+
(acc, axis) => {
|
|
310
|
+
if (!acc.ok) return acc;
|
|
311
|
+
const message = axis.check(ctx);
|
|
312
|
+
if (!message) return acc;
|
|
313
|
+
if (axis.severity === 'fatal') {
|
|
314
|
+
return { ok: false, exitCode: 1, kind: axis.name, message };
|
|
315
|
+
}
|
|
316
|
+
acc.warnings.push(message);
|
|
317
|
+
return acc;
|
|
318
|
+
},
|
|
319
|
+
{ ok: true, warnings: [] },
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Validate an envelope against its per-kind schema.
|
|
325
|
+
*
|
|
326
|
+
* Two-phase check:
|
|
327
|
+
* 1. Cheap structural pre-check — every top-level key present, `$schema`
|
|
328
|
+
* points at one of the seven known kinds. Throws with a clear
|
|
329
|
+
* message when violated.
|
|
330
|
+
* 2. AJV schema validation against the per-kind schema named in `$schema`.
|
|
331
|
+
* Throws with the AJV error list serialised as JSON.
|
|
332
|
+
*
|
|
333
|
+
* @param {object} envelope
|
|
334
|
+
* @returns {void}
|
|
335
|
+
* @throws {Error}
|
|
336
|
+
*/
|
|
337
|
+
export function assertEnvelope(envelope) {
|
|
338
|
+
if (!envelope || typeof envelope !== 'object' || Array.isArray(envelope)) {
|
|
339
|
+
throw new TypeError('envelope.assertEnvelope: expected an object envelope');
|
|
340
|
+
}
|
|
341
|
+
for (const key of REQUIRED_TOP_LEVEL_KEYS) {
|
|
342
|
+
if (!Object.hasOwn(envelope, key)) {
|
|
343
|
+
throw new Error(
|
|
344
|
+
`envelope.assertEnvelope: missing required top-level key "${key}"`,
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
const schemaRef = envelope.$schema;
|
|
349
|
+
if (typeof schemaRef !== 'string') {
|
|
350
|
+
throw new Error(
|
|
351
|
+
'envelope.assertEnvelope: $schema must be a string pointing at a per-kind schema',
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
const match = schemaRef.match(/baselines\/([^/]+)\.schema\.json$/);
|
|
355
|
+
if (!match || !KNOWN_KINDS.includes(match[1])) {
|
|
356
|
+
throw new Error(
|
|
357
|
+
`envelope.assertEnvelope: $schema "${schemaRef}" does not point at one of the known kinds (${KNOWN_KINDS.join(', ')})`,
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
const kind = match[1];
|
|
361
|
+
const validate = getValidator(kind);
|
|
362
|
+
const ok = validate(envelope);
|
|
363
|
+
if (!ok) {
|
|
364
|
+
throw new Error(
|
|
365
|
+
`envelope.assertEnvelope: ${kind} envelope failed schema validation: ${JSON.stringify(validate.errors)}`,
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// .agents/scripts/lib/baselines/exit-codes.js
|
|
2
|
+
//
|
|
3
|
+
// Story #1962 / Task #1968 — Unified exit-code contract for the baseline
|
|
4
|
+
// dispatcher (`check-baselines.js`) and every per-kind regression CLI that
|
|
5
|
+
// will land in Epic #1943.
|
|
6
|
+
//
|
|
7
|
+
// One shared source of truth keeps the dispatcher, the per-kind CLIs, and
|
|
8
|
+
// the test suites in lock-step. Numeric precedence is intentional: a
|
|
9
|
+
// higher number is a strictly worse outcome, so `aggregate(...)` collapses
|
|
10
|
+
// per-gate exit codes by taking the maximum. That contract lets the
|
|
11
|
+
// dispatcher fan out per-kind work in any order (parallel, sequential,
|
|
12
|
+
// streamed) and still produce a single deterministic process exit code.
|
|
13
|
+
//
|
|
14
|
+
// Precedence (lowest → highest severity):
|
|
15
|
+
//
|
|
16
|
+
// 0 EXIT_PASS — every enabled gate is green.
|
|
17
|
+
// 1 EXIT_FLOOR — at least one gate breached its floor / tolerance.
|
|
18
|
+
// 2 EXIT_SCHEMA — at least one baseline file failed schema
|
|
19
|
+
// validation (JSON shape / required fields wrong).
|
|
20
|
+
// 3 EXIT_CONFIG — config could not be resolved (missing
|
|
21
|
+
// `.agentrc.json`, unknown gate kind, malformed
|
|
22
|
+
// scope, etc). The gate could not even start.
|
|
23
|
+
// 4 EXIT_REGRESSION — head-vs-base regression detected on at least one
|
|
24
|
+
// gate. Highest severity because regression
|
|
25
|
+
// signals new debt being introduced rather than
|
|
26
|
+
// pre-existing debt failing a static floor.
|
|
27
|
+
//
|
|
28
|
+
// `aggregate(...codes)` takes the highest code in the input list and
|
|
29
|
+
// returns 0 (`EXIT_PASS`) for an empty input. It never throws — invalid
|
|
30
|
+
// codes are silently treated as 0 because the only sane response to a
|
|
31
|
+
// caller passing a garbage code is "do not regress the exit signal".
|
|
32
|
+
|
|
33
|
+
export const EXIT_PASS = 0;
|
|
34
|
+
export const EXIT_FLOOR = 1;
|
|
35
|
+
export const EXIT_SCHEMA = 2;
|
|
36
|
+
export const EXIT_CONFIG = 3;
|
|
37
|
+
export const EXIT_REGRESSION = 4;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The full set of valid exit codes, frozen so callers can use it as a
|
|
41
|
+
* lookup without worrying about mutation.
|
|
42
|
+
*/
|
|
43
|
+
export const EXIT_CODES = Object.freeze({
|
|
44
|
+
EXIT_PASS,
|
|
45
|
+
EXIT_FLOOR,
|
|
46
|
+
EXIT_SCHEMA,
|
|
47
|
+
EXIT_CONFIG,
|
|
48
|
+
EXIT_REGRESSION,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const VALID = new Set([
|
|
52
|
+
EXIT_PASS,
|
|
53
|
+
EXIT_FLOOR,
|
|
54
|
+
EXIT_SCHEMA,
|
|
55
|
+
EXIT_CONFIG,
|
|
56
|
+
EXIT_REGRESSION,
|
|
57
|
+
]);
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Collapse any number of per-gate exit codes into a single dispatcher
|
|
61
|
+
* exit code. The contract:
|
|
62
|
+
*
|
|
63
|
+
* - With no arguments, returns `EXIT_PASS` (0). An empty dispatcher run
|
|
64
|
+
* is success — there was nothing to fail.
|
|
65
|
+
* - With one or more arguments, returns the maximum of the valid codes.
|
|
66
|
+
* Higher numbers are strictly worse outcomes (see precedence table at
|
|
67
|
+
* the top of this file).
|
|
68
|
+
* - Unknown / non-numeric / negative codes are dropped from the input
|
|
69
|
+
* so a single garbage caller cannot lower the dispatcher's exit code
|
|
70
|
+
* past a real failure. If every input is invalid, the result is
|
|
71
|
+
* `EXIT_PASS` (the caller signalled nothing to report).
|
|
72
|
+
*
|
|
73
|
+
* Pure. No I/O. Cheap to call from a hot loop.
|
|
74
|
+
*
|
|
75
|
+
* @param {...number} codes - Per-gate exit codes to collapse.
|
|
76
|
+
* @returns {number} The most severe code in the input, or `EXIT_PASS`.
|
|
77
|
+
*/
|
|
78
|
+
export function aggregate(...codes) {
|
|
79
|
+
let max = EXIT_PASS;
|
|
80
|
+
for (const c of codes) {
|
|
81
|
+
if (typeof c !== 'number' || !VALID.has(c)) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (c > max) {
|
|
85
|
+
max = c;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return max;
|
|
89
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kernel.js — per-kind kernel-version resolution (Story #1891, Epic #1786).
|
|
3
|
+
*
|
|
4
|
+
* Every committed baseline stamps a `kernelVersion` semver string in its
|
|
5
|
+
* envelope. The version tracks the in-repo (or upstream) kernel that
|
|
6
|
+
* produced the rows — a bump invalidates every committed baseline of
|
|
7
|
+
* that kind, signalling consumers to regenerate. The version source is
|
|
8
|
+
* **per-kind**:
|
|
9
|
+
*
|
|
10
|
+
* - CRAP and Maintainability share the `typhonjs-escomplex` upstream
|
|
11
|
+
* package version; both modules' `kernelVersion()` read it from the
|
|
12
|
+
* nearest `node_modules/typhonjs-escomplex/package.json`.
|
|
13
|
+
* - Lint, Coverage, Mutation, Lighthouse, Bundle-Size carry a static
|
|
14
|
+
* in-repo semver bumped by hand whenever the scoring/rollup math
|
|
15
|
+
* changes. Their `kernelVersion()` just returns the constant.
|
|
16
|
+
*
|
|
17
|
+
* This module is the public surface: callers ask
|
|
18
|
+
* `currentKernelVersion(kind)` and get a single string back, no matter
|
|
19
|
+
* which strategy the kind uses internally.
|
|
20
|
+
*
|
|
21
|
+
* `checkKernelVersion(kind, baselineVersion)` is the drift-detection
|
|
22
|
+
* helper. It returns `{ match, current }` so a CI gate can compare the
|
|
23
|
+
* baseline's stamp against the running kernel and decide whether to
|
|
24
|
+
* regenerate or fail.
|
|
25
|
+
*
|
|
26
|
+
* @module lib/baselines/kernel
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import * as bundleSize from './kinds/bundle-size.js';
|
|
30
|
+
import * as coverage from './kinds/coverage.js';
|
|
31
|
+
import * as crap from './kinds/crap.js';
|
|
32
|
+
import * as duplication from './kinds/duplication.js';
|
|
33
|
+
import * as lighthouse from './kinds/lighthouse.js';
|
|
34
|
+
import * as lint from './kinds/lint.js';
|
|
35
|
+
import * as maintainability from './kinds/maintainability.js';
|
|
36
|
+
import * as mutation from './kinds/mutation.js';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Registry of every shipped kind module. Keys mirror the per-kind schema
|
|
40
|
+
* filenames so a future "list all kinds" iterator can stay declarative.
|
|
41
|
+
*/
|
|
42
|
+
const KIND_MODULES = Object.freeze({
|
|
43
|
+
lint,
|
|
44
|
+
coverage,
|
|
45
|
+
crap,
|
|
46
|
+
maintainability,
|
|
47
|
+
mutation,
|
|
48
|
+
lighthouse,
|
|
49
|
+
'bundle-size': bundleSize,
|
|
50
|
+
duplication,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Look up a kind module by name. Throws when the kind isn't registered so
|
|
55
|
+
* callers can't silently fall through to undefined behaviour.
|
|
56
|
+
*
|
|
57
|
+
* @param {string} kind
|
|
58
|
+
* @returns {{ name: string, kernelVersion: () => string, keyField: string,
|
|
59
|
+
* projectRow: (row: object) => object,
|
|
60
|
+
* sortRows: (rows: object[]) => object[],
|
|
61
|
+
* rollup: (rows: object[], components?: object[]) => object }}
|
|
62
|
+
*/
|
|
63
|
+
export function getKindModule(kind) {
|
|
64
|
+
const mod = KIND_MODULES[kind];
|
|
65
|
+
if (!mod) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
`kernel.getKindModule: unknown kind "${kind}" (known: ${Object.keys(KIND_MODULES).join(', ')})`,
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return mod;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Resolve the running kernel version for `kind`. Delegates to the per-kind
|
|
75
|
+
* module's `kernelVersion()` — see the module preamble for which strategy
|
|
76
|
+
* each kind uses.
|
|
77
|
+
*
|
|
78
|
+
* @param {string} kind
|
|
79
|
+
* @returns {string}
|
|
80
|
+
*/
|
|
81
|
+
export function currentKernelVersion(kind) {
|
|
82
|
+
return getKindModule(kind).kernelVersion();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Compare a baseline's stamped version against the currently running
|
|
87
|
+
* kernel for the same kind. Returns `{ match, current }` so callers can
|
|
88
|
+
* format a drift signal or trigger a regenerate.
|
|
89
|
+
*
|
|
90
|
+
* @param {string} kind
|
|
91
|
+
* @param {string} baselineVersion
|
|
92
|
+
* @returns {{ match: boolean, current: string }}
|
|
93
|
+
*/
|
|
94
|
+
export function checkKernelVersion(kind, baselineVersion) {
|
|
95
|
+
const current = currentKernelVersion(kind);
|
|
96
|
+
return {
|
|
97
|
+
match: baselineVersion === current,
|
|
98
|
+
current,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* List every kind registered with the kernel. Useful for the writer's
|
|
104
|
+
* envelope sanity check and for tests that want to iterate all shipped
|
|
105
|
+
* kinds.
|
|
106
|
+
*
|
|
107
|
+
* @returns {string[]}
|
|
108
|
+
*/
|
|
109
|
+
export function listKinds() {
|
|
110
|
+
return Object.keys(KIND_MODULES);
|
|
111
|
+
}
|