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,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolve-selection.js — scenario-selection resolver for the agent-driven
|
|
3
|
+
* QA harness (Epic #3214, Story #3296).
|
|
4
|
+
*
|
|
5
|
+
* The harness is invoked with a single selector that scopes a sweep to a
|
|
6
|
+
* concrete set of `.feature` files (and, for tag selectors, the specific
|
|
7
|
+
* scenarios within them) under the contract's `featureRoot`. This module
|
|
8
|
+
* turns one of three selector shapes into that concrete set:
|
|
9
|
+
*
|
|
10
|
+
* - **feature id** — `{ kind: 'feature', id: 'login' }` resolves to the
|
|
11
|
+
* single `.feature` file whose path stem (basename without the
|
|
12
|
+
* `.feature` extension) equals the id, or whose `featureRoot`-relative
|
|
13
|
+
* POSIX path (with or without the extension) equals the id. Matching is
|
|
14
|
+
* exact and case-insensitive; ambiguous ids (more than one match) throw.
|
|
15
|
+
*
|
|
16
|
+
* - **tag expression** — `{ kind: 'tag', expression: '@smoke and not @wip' }`
|
|
17
|
+
* resolves to the scenario set whose tag list satisfies the boolean
|
|
18
|
+
* expression. The expression grammar is the cucumber-common subset:
|
|
19
|
+
* `@tag` atoms, `and` / `or` / `not` operators (case-insensitive), and
|
|
20
|
+
* parentheses. A scenario inherits no implicit tags; only the tags the
|
|
21
|
+
* scanner attached to it (feature-level + scenario-level, as collected
|
|
22
|
+
* by `parseFeatureBody`) participate.
|
|
23
|
+
*
|
|
24
|
+
* - **domain** — `{ kind: 'domain', name: 'billing' }` resolves to every
|
|
25
|
+
* scenario under the `featureRoot`-relative subdirectory `name`. A
|
|
26
|
+
* domain is a first-level (or nested) directory grouping beneath the
|
|
27
|
+
* feature root; the selector matches any scenario whose file lives at
|
|
28
|
+
* or below `<featureRoot>/<name>/`.
|
|
29
|
+
*
|
|
30
|
+
* Determinism is load-bearing — the QA harness re-runs the same selector
|
|
31
|
+
* across sweeps and must scope the identical scenario set each time. All
|
|
32
|
+
* outputs are sorted by `(file, line)` so the order never depends on
|
|
33
|
+
* filesystem iteration order.
|
|
34
|
+
*
|
|
35
|
+
* This module is pure resolution: it does no browser work, reads no config
|
|
36
|
+
* beyond the `featureRoot` passed in, and never mutates state. The harness
|
|
37
|
+
* workflow (Story #3297) consumes the resolved set; this layer only answers
|
|
38
|
+
* "which scenarios does this selector name?".
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import path from 'node:path';
|
|
42
|
+
|
|
43
|
+
import { listFeatureFiles, scanBddScenarios } from '../bdd-scenario-scanner.js';
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Normalise a path to POSIX separators so `featureRoot`-relative matching
|
|
47
|
+
* behaves identically on Windows and POSIX hosts.
|
|
48
|
+
*
|
|
49
|
+
* @param {string} p
|
|
50
|
+
* @returns {string}
|
|
51
|
+
*/
|
|
52
|
+
function toPosix(p) {
|
|
53
|
+
return p.split(path.sep).join('/');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Compute a scenario's `featureRoot`-relative POSIX path. Used by the
|
|
58
|
+
* feature-id and domain matchers so selectors are written against the
|
|
59
|
+
* stable, repo-relative shape rather than absolute worktree paths.
|
|
60
|
+
*
|
|
61
|
+
* @param {string} featureRoot - Absolute path to the feature root.
|
|
62
|
+
* @param {string} file - Absolute path to a `.feature` file.
|
|
63
|
+
* @returns {string} POSIX-style path relative to `featureRoot`.
|
|
64
|
+
*/
|
|
65
|
+
function relFromRoot(featureRoot, file) {
|
|
66
|
+
return toPosix(path.relative(featureRoot, file));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Strip the trailing `.feature` extension (case-insensitive) from a
|
|
71
|
+
* relative path, leaving the path stem the feature-id selector matches on.
|
|
72
|
+
*
|
|
73
|
+
* @param {string} relPath
|
|
74
|
+
* @returns {string}
|
|
75
|
+
*/
|
|
76
|
+
function stripFeatureExt(relPath) {
|
|
77
|
+
return relPath.replace(/\.feature$/i, '');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Tag-expression evaluation
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Classify a single matched lexeme into a token. `@tag` atoms keep their
|
|
86
|
+
* raw value; `(` / `)` / `and` / `or` / `not` produce structural tokens.
|
|
87
|
+
* Anything else is a malformed expression and throws.
|
|
88
|
+
*
|
|
89
|
+
* @param {string} raw
|
|
90
|
+
* @returns {{ type: string, value?: string }}
|
|
91
|
+
*/
|
|
92
|
+
function classifyToken(raw) {
|
|
93
|
+
if (raw === '(' || raw === ')') {
|
|
94
|
+
return { type: raw };
|
|
95
|
+
}
|
|
96
|
+
if (raw.startsWith('@')) {
|
|
97
|
+
return { type: 'tag', value: raw };
|
|
98
|
+
}
|
|
99
|
+
const lower = raw.toLowerCase();
|
|
100
|
+
if (lower === 'and' || lower === 'or' || lower === 'not') {
|
|
101
|
+
return { type: lower };
|
|
102
|
+
}
|
|
103
|
+
throw new Error(
|
|
104
|
+
`[resolve-selection] unknown operator "${raw}" in tag expression`,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Tokenise a cucumber-style tag expression into a flat token stream.
|
|
110
|
+
* Recognised tokens: `(`, `)`, `and`, `or`, `not`, and `@tag` atoms.
|
|
111
|
+
* Whitespace separates tokens; parentheses need no surrounding space.
|
|
112
|
+
*
|
|
113
|
+
* @param {string} expression
|
|
114
|
+
* @returns {Array<{ type: string, value?: string }>}
|
|
115
|
+
*/
|
|
116
|
+
function tokenizeTagExpression(expression) {
|
|
117
|
+
const tokens = [];
|
|
118
|
+
const re = /\s*(\(|\)|@[\w-]+|[A-Za-z]+)/g;
|
|
119
|
+
let lastIndex = 0;
|
|
120
|
+
for (
|
|
121
|
+
let match = re.exec(expression);
|
|
122
|
+
match !== null;
|
|
123
|
+
match = re.exec(expression)
|
|
124
|
+
) {
|
|
125
|
+
// Guard against runs of unmatched garbage between tokens.
|
|
126
|
+
const between = expression.slice(lastIndex, match.index).trim();
|
|
127
|
+
if (between.length > 0) {
|
|
128
|
+
throw new Error(
|
|
129
|
+
`[resolve-selection] unexpected token "${between}" in tag expression`,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
lastIndex = re.lastIndex;
|
|
133
|
+
tokens.push(classifyToken(match[1]));
|
|
134
|
+
}
|
|
135
|
+
const tail = expression.slice(lastIndex).trim();
|
|
136
|
+
if (tail.length > 0) {
|
|
137
|
+
throw new Error(
|
|
138
|
+
`[resolve-selection] unexpected token "${tail}" in tag expression`,
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
return tokens;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Recursive-descent parser for the tag-expression grammar:
|
|
146
|
+
*
|
|
147
|
+
* expr := term ( 'or' term )*
|
|
148
|
+
* term := factor( 'and' factor)*
|
|
149
|
+
* factor := 'not' factor | '(' expr ')' | tag
|
|
150
|
+
*
|
|
151
|
+
* Produces a predicate `(tagSet: Set<string>) => boolean`. Tag atoms match
|
|
152
|
+
* case-insensitively against the scenario's tag set (which carries the
|
|
153
|
+
* leading `@`).
|
|
154
|
+
*
|
|
155
|
+
* @param {string} expression
|
|
156
|
+
* @returns {(tags: Set<string>) => boolean}
|
|
157
|
+
*/
|
|
158
|
+
export function parseTagExpression(expression) {
|
|
159
|
+
if (typeof expression !== 'string' || expression.trim().length === 0) {
|
|
160
|
+
throw new Error(
|
|
161
|
+
'[resolve-selection] tag expression must be a non-empty string',
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
const tokens = tokenizeTagExpression(expression);
|
|
165
|
+
let pos = 0;
|
|
166
|
+
|
|
167
|
+
const peek = () => tokens[pos];
|
|
168
|
+
const next = () => tokens[pos++];
|
|
169
|
+
|
|
170
|
+
function parseExpr() {
|
|
171
|
+
let left = parseTerm();
|
|
172
|
+
while (peek() && peek().type === 'or') {
|
|
173
|
+
next();
|
|
174
|
+
const right = parseTerm();
|
|
175
|
+
const l = left;
|
|
176
|
+
left = (tags) => l(tags) || right(tags);
|
|
177
|
+
}
|
|
178
|
+
return left;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function parseTerm() {
|
|
182
|
+
let left = parseFactor();
|
|
183
|
+
while (peek() && peek().type === 'and') {
|
|
184
|
+
next();
|
|
185
|
+
const right = parseFactor();
|
|
186
|
+
const l = left;
|
|
187
|
+
left = (tags) => l(tags) && right(tags);
|
|
188
|
+
}
|
|
189
|
+
return left;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function parseFactor() {
|
|
193
|
+
const tok = peek();
|
|
194
|
+
if (!tok) {
|
|
195
|
+
throw new Error('[resolve-selection] unexpected end of tag expression');
|
|
196
|
+
}
|
|
197
|
+
if (tok.type === 'not') {
|
|
198
|
+
next();
|
|
199
|
+
const operand = parseFactor();
|
|
200
|
+
return (tags) => !operand(tags);
|
|
201
|
+
}
|
|
202
|
+
if (tok.type === '(') {
|
|
203
|
+
next();
|
|
204
|
+
const inner = parseExpr();
|
|
205
|
+
const close = next();
|
|
206
|
+
if (!close || close.type !== ')') {
|
|
207
|
+
throw new Error('[resolve-selection] missing closing parenthesis');
|
|
208
|
+
}
|
|
209
|
+
return inner;
|
|
210
|
+
}
|
|
211
|
+
if (tok.type === 'tag') {
|
|
212
|
+
next();
|
|
213
|
+
const wanted = tok.value.toLowerCase();
|
|
214
|
+
return (tags) => tags.has(wanted);
|
|
215
|
+
}
|
|
216
|
+
throw new Error(
|
|
217
|
+
`[resolve-selection] unexpected token "${tok.type}" in tag expression`,
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const predicate = parseExpr();
|
|
222
|
+
if (pos !== tokens.length) {
|
|
223
|
+
throw new Error('[resolve-selection] trailing tokens in tag expression');
|
|
224
|
+
}
|
|
225
|
+
return predicate;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Build a lower-cased tag `Set` for a scanned scenario so the predicate can
|
|
230
|
+
* test membership case-insensitively.
|
|
231
|
+
*
|
|
232
|
+
* @param {{ tags?: string[] }} scenario
|
|
233
|
+
* @returns {Set<string>}
|
|
234
|
+
*/
|
|
235
|
+
function tagSetOf(scenario) {
|
|
236
|
+
return new Set((scenario.tags ?? []).map((t) => t.toLowerCase()));
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
// Public resolver
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Sort scanned scenarios deterministically by `(file, line)`.
|
|
245
|
+
*
|
|
246
|
+
* @param {Array<{ file: string, line: number }>} scenarios
|
|
247
|
+
* @returns {Array<object>}
|
|
248
|
+
*/
|
|
249
|
+
function sortScenarios(scenarios) {
|
|
250
|
+
return scenarios
|
|
251
|
+
.slice()
|
|
252
|
+
.sort((a, b) =>
|
|
253
|
+
a.file === b.file ? a.line - b.line : a.file < b.file ? -1 : 1,
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Resolve a selector into a concrete scenario set under `featureRoot`.
|
|
259
|
+
*
|
|
260
|
+
* @param {object} args
|
|
261
|
+
* @param {string} args.featureRoot - Absolute path to the contract's
|
|
262
|
+
* `.feature` root. The harness prefers the `qa.featureRoot` contract
|
|
263
|
+
* value over auto-detection; this resolver takes it as given.
|
|
264
|
+
* @param {object} args.selector - One of the three selector shapes:
|
|
265
|
+
* `{ kind: 'feature', id }`, `{ kind: 'tag', expression }`, or
|
|
266
|
+
* `{ kind: 'domain', name }`.
|
|
267
|
+
* @param {{ logger?: object }} [opts]
|
|
268
|
+
* @returns {{ kind: string, featureRoot: string, files: string[], scenarios: Array<object> }}
|
|
269
|
+
* `files` is the deduped, sorted set of absolute `.feature` paths the
|
|
270
|
+
* selection touches; `scenarios` is the sorted scenario rows (for tag
|
|
271
|
+
* selection it is the satisfying subset, for feature/domain it is every
|
|
272
|
+
* scenario in the matched files).
|
|
273
|
+
*/
|
|
274
|
+
export function resolveSelection(args = {}, opts = {}) {
|
|
275
|
+
const { featureRoot, selector } = args;
|
|
276
|
+
if (typeof featureRoot !== 'string' || featureRoot.length === 0) {
|
|
277
|
+
throw new Error('[resolve-selection] featureRoot is required');
|
|
278
|
+
}
|
|
279
|
+
if (!selector || typeof selector !== 'object') {
|
|
280
|
+
throw new Error('[resolve-selection] selector is required');
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
switch (selector.kind) {
|
|
284
|
+
case 'feature':
|
|
285
|
+
return resolveFeature(featureRoot, selector, opts);
|
|
286
|
+
case 'tag':
|
|
287
|
+
return resolveTag(featureRoot, selector, opts);
|
|
288
|
+
case 'domain':
|
|
289
|
+
return resolveDomain(featureRoot, selector, opts);
|
|
290
|
+
default:
|
|
291
|
+
throw new Error(
|
|
292
|
+
`[resolve-selection] unknown selector kind "${selector.kind}"`,
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function resolveFeature(featureRoot, selector, opts) {
|
|
298
|
+
const id = selector.id;
|
|
299
|
+
if (typeof id !== 'string' || id.trim().length === 0) {
|
|
300
|
+
throw new Error(
|
|
301
|
+
'[resolve-selection] feature selector requires a non-empty id',
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
const want = stripFeatureExt(toPosix(id.trim())).toLowerCase();
|
|
305
|
+
const files = listFeatureFiles([featureRoot], opts);
|
|
306
|
+
const matched = files.filter((file) => {
|
|
307
|
+
const rel = relFromRoot(featureRoot, file);
|
|
308
|
+
const relStem = stripFeatureExt(rel).toLowerCase();
|
|
309
|
+
const baseStem = stripFeatureExt(path.basename(rel)).toLowerCase();
|
|
310
|
+
return relStem === want || baseStem === want;
|
|
311
|
+
});
|
|
312
|
+
if (matched.length === 0) {
|
|
313
|
+
throw new Error(
|
|
314
|
+
`[resolve-selection] no .feature file matched feature id "${id}" under ${featureRoot}`,
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
if (matched.length > 1) {
|
|
318
|
+
throw new Error(
|
|
319
|
+
`[resolve-selection] feature id "${id}" is ambiguous; matched ${matched.length} files: ${matched
|
|
320
|
+
.map((f) => relFromRoot(featureRoot, f))
|
|
321
|
+
.join(', ')}. Qualify with a featureRoot-relative path.`,
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
const all = scanBddScenarios({ featureRoots: [featureRoot], ...opts });
|
|
325
|
+
const scenarios = sortScenarios(all.filter((s) => s.file === matched[0]));
|
|
326
|
+
return {
|
|
327
|
+
kind: 'feature',
|
|
328
|
+
featureRoot,
|
|
329
|
+
files: matched,
|
|
330
|
+
scenarios,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function resolveTag(featureRoot, selector, opts) {
|
|
335
|
+
const predicate = parseTagExpression(selector.expression);
|
|
336
|
+
const all = scanBddScenarios({ featureRoots: [featureRoot], ...opts });
|
|
337
|
+
const scenarios = sortScenarios(all.filter((s) => predicate(tagSetOf(s))));
|
|
338
|
+
const files = Array.from(new Set(scenarios.map((s) => s.file))).sort();
|
|
339
|
+
return {
|
|
340
|
+
kind: 'tag',
|
|
341
|
+
featureRoot,
|
|
342
|
+
files,
|
|
343
|
+
scenarios,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function resolveDomain(featureRoot, selector, opts) {
|
|
348
|
+
const name = selector.name;
|
|
349
|
+
if (typeof name !== 'string' || name.trim().length === 0) {
|
|
350
|
+
throw new Error(
|
|
351
|
+
'[resolve-selection] domain selector requires a non-empty name',
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
// Normalise to a trailing-slash POSIX prefix so "billing" matches
|
|
355
|
+
// "billing/checkout.feature" but not "billing-archive/x.feature".
|
|
356
|
+
const prefix = `${toPosix(name.trim()).replace(/\/+$/, '')}/`;
|
|
357
|
+
const all = scanBddScenarios({ featureRoots: [featureRoot], ...opts });
|
|
358
|
+
const scenarios = sortScenarios(
|
|
359
|
+
all.filter((s) => relFromRoot(featureRoot, s.file).startsWith(prefix)),
|
|
360
|
+
);
|
|
361
|
+
if (scenarios.length === 0) {
|
|
362
|
+
throw new Error(
|
|
363
|
+
`[resolve-selection] no scenarios found under domain "${name}" in ${featureRoot}`,
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
const files = Array.from(new Set(scenarios.map((s) => s.file))).sort();
|
|
367
|
+
return {
|
|
368
|
+
kind: 'domain',
|
|
369
|
+
featureRoot,
|
|
370
|
+
files,
|
|
371
|
+
scenarios,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runtime-deps/ensure-installed — fail-fast guard for framework runtime deps.
|
|
3
|
+
*
|
|
4
|
+
* Importing this module runs the dependency-presence check as a side effect:
|
|
5
|
+
* if any package in `.agents/runtime-deps.json`'s `dependencies` block cannot
|
|
6
|
+
* be resolved from the framework's `node_modules` (i.e. the consumer's
|
|
7
|
+
* install is missing, empty, or stale), it prints an actionable remediation
|
|
8
|
+
* message and exits non-zero — *before* the entry point's heavier imports
|
|
9
|
+
* reach the first `import 'ajv'` and throw an opaque `ERR_MODULE_NOT_FOUND`
|
|
10
|
+
* (Story #3432).
|
|
11
|
+
*
|
|
12
|
+
* Why a side-effect-on-import (rather than a function the entry point calls):
|
|
13
|
+
* ESM evaluates a module's imports in source order, depth-first, *before* the
|
|
14
|
+
* module body runs. A function call in `main()` would therefore execute only
|
|
15
|
+
* after the third-party-importing sibling modules had already been evaluated
|
|
16
|
+
* (and already thrown). By making each target entry point's *first* import a
|
|
17
|
+
* side-effect import of this module, the check runs first and short-circuits a
|
|
18
|
+
* broken install with a clear message.
|
|
19
|
+
*
|
|
20
|
+
* The guard only ever exits when a *required* dependency is genuinely
|
|
21
|
+
* missing. With a healthy install (CI, tests, normal runs) it is a no-op, so
|
|
22
|
+
* it is safe for entry points imported by the test suite. `optionalDependencies`
|
|
23
|
+
* are intentionally not checked — they sit behind graceful-degradation paths.
|
|
24
|
+
*
|
|
25
|
+
* Set `MANDREL_SKIP_DEP_PREFLIGHT=1` to disable the side effect (escape hatch
|
|
26
|
+
* for tooling that imports an entry point in an environment that deliberately
|
|
27
|
+
* lacks the framework deps).
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { createRequire } from 'node:module';
|
|
31
|
+
import { loadRuntimeDepsManifest } from './manifest.js';
|
|
32
|
+
import {
|
|
33
|
+
checkRuntimeDeps,
|
|
34
|
+
detectPackageManager,
|
|
35
|
+
formatMissingDepsMessage,
|
|
36
|
+
} from './preflight.js';
|
|
37
|
+
|
|
38
|
+
// `require.resolve` bound to this module's location walks `node_modules`
|
|
39
|
+
// upward from `.agents/scripts/lib/runtime-deps/` to the consumer root —
|
|
40
|
+
// exactly the resolution path the framework's third-party imports follow.
|
|
41
|
+
const frameworkRequire = createRequire(import.meta.url);
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Run the dependency-presence check and, on failure, write the remediation
|
|
45
|
+
* message and exit. Seams (`requireResolve`, `cwd`, `stderr`, `exit`,
|
|
46
|
+
* `manifest`) make it fully testable without touching the real process.
|
|
47
|
+
*
|
|
48
|
+
* @param {{
|
|
49
|
+
* requireResolve?: (specifier: string) => string,
|
|
50
|
+
* cwd?: string,
|
|
51
|
+
* stderr?: { write: (s: string) => void },
|
|
52
|
+
* exit?: (code: number) => void,
|
|
53
|
+
* manifest?: { required: string[] },
|
|
54
|
+
* }} [opts]
|
|
55
|
+
* @returns {{ ok: boolean, missing: string[] }}
|
|
56
|
+
*/
|
|
57
|
+
export function ensureRuntimeDepsInstalled(opts = {}) {
|
|
58
|
+
const {
|
|
59
|
+
requireResolve = (s) => frameworkRequire.resolve(s),
|
|
60
|
+
cwd = process.cwd(),
|
|
61
|
+
stderr = process.stderr,
|
|
62
|
+
exit = process.exit,
|
|
63
|
+
manifest = safeLoadManifest(),
|
|
64
|
+
} = opts;
|
|
65
|
+
|
|
66
|
+
// A manifest we cannot read is a packaging defect the drift test owns —
|
|
67
|
+
// never let the guard kill an otherwise-healthy process over it.
|
|
68
|
+
if (!manifest) return { ok: true, missing: [] };
|
|
69
|
+
|
|
70
|
+
const result = checkRuntimeDeps({
|
|
71
|
+
required: manifest.required,
|
|
72
|
+
resolve: requireResolve,
|
|
73
|
+
});
|
|
74
|
+
if (result.ok) return result;
|
|
75
|
+
|
|
76
|
+
const packageManager = detectPackageManager(cwd);
|
|
77
|
+
stderr.write(
|
|
78
|
+
`${formatMissingDepsMessage(result.missing, { root: cwd, packageManager })}\n`,
|
|
79
|
+
);
|
|
80
|
+
exit(1);
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Load the manifest, swallowing a read/parse failure to `null` so the guard
|
|
86
|
+
* stays inert on a packaging defect (see `ensureRuntimeDepsInstalled`).
|
|
87
|
+
*
|
|
88
|
+
* @returns {{ required: string[] } | null}
|
|
89
|
+
*/
|
|
90
|
+
function safeLoadManifest() {
|
|
91
|
+
try {
|
|
92
|
+
return loadRuntimeDepsManifest();
|
|
93
|
+
} catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (process.env.MANDREL_SKIP_DEP_PREFLIGHT !== '1') {
|
|
99
|
+
ensureRuntimeDepsInstalled();
|
|
100
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runtime-deps/manifest — loader for the framework's vendored runtime-dep SSOT.
|
|
3
|
+
*
|
|
4
|
+
* `.agents/runtime-deps.json` is the single source of truth for the
|
|
5
|
+
* third-party npm packages the framework scripts import at runtime
|
|
6
|
+
* (Story #3432). It ships *inside* `.agents/` so it travels with the
|
|
7
|
+
* `mandrel` package into consumer projects. This module is the only reader of that
|
|
8
|
+
* file — the bootstrap seeder (`project-bootstrap.js`), the preflight guard
|
|
9
|
+
* (`ensure-installed.js`), and the import-vs-manifest drift test all derive
|
|
10
|
+
* their dependency lists from `loadRuntimeDepsManifest()` so there is exactly
|
|
11
|
+
* one place the list lives.
|
|
12
|
+
*
|
|
13
|
+
* The loader stays on Node builtins only (`node:fs`, `node:path`,
|
|
14
|
+
* `node:url`) so it can run inside the preflight guard *before* any
|
|
15
|
+
* third-party package is imported — that is the whole point of the guard.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import fs from 'node:fs';
|
|
19
|
+
import path from 'node:path';
|
|
20
|
+
import { fileURLToPath } from 'node:url';
|
|
21
|
+
|
|
22
|
+
const HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Absolute path to the vendored manifest. `HERE` is
|
|
26
|
+
* `.agents/scripts/lib/runtime-deps/`; the manifest sits at the `.agents/`
|
|
27
|
+
* root, three directories up.
|
|
28
|
+
*/
|
|
29
|
+
export const MANIFEST_PATH = path.resolve(
|
|
30
|
+
HERE,
|
|
31
|
+
'..',
|
|
32
|
+
'..',
|
|
33
|
+
'..',
|
|
34
|
+
'runtime-deps.json',
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @typedef {object} RuntimeDepsManifest
|
|
39
|
+
* @property {Record<string,string>} dependencies — required runtime
|
|
40
|
+
* packages (name → semver range). Fail-fast enforced by the preflight.
|
|
41
|
+
* @property {Record<string,string>} optionalDependencies — packages imported
|
|
42
|
+
* behind graceful-degradation paths; declared but never preflight-blocked.
|
|
43
|
+
* @property {string[]} required — `Object.keys(dependencies)`.
|
|
44
|
+
* @property {string[]} optional — `Object.keys(optionalDependencies)`.
|
|
45
|
+
* @property {Set<string>} declared — union of required + optional names.
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Read, parse, and structurally validate the runtime-deps manifest.
|
|
50
|
+
*
|
|
51
|
+
* Throws a clear `Error` when the file is missing or malformed so the
|
|
52
|
+
* drift test and bootstrap seeder fail loudly on a packaging regression,
|
|
53
|
+
* rather than silently treating the dependency set as empty.
|
|
54
|
+
*
|
|
55
|
+
* @param {string} [manifestPath=MANIFEST_PATH]
|
|
56
|
+
* @returns {RuntimeDepsManifest}
|
|
57
|
+
*/
|
|
58
|
+
export function loadRuntimeDepsManifest(manifestPath = MANIFEST_PATH) {
|
|
59
|
+
let raw;
|
|
60
|
+
try {
|
|
61
|
+
raw = fs.readFileSync(manifestPath, 'utf8');
|
|
62
|
+
} catch (err) {
|
|
63
|
+
throw new Error(
|
|
64
|
+
`runtime-deps manifest not found at ${manifestPath}: ${err?.message ?? err}`,
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
let parsed;
|
|
68
|
+
try {
|
|
69
|
+
parsed = JSON.parse(raw);
|
|
70
|
+
} catch (err) {
|
|
71
|
+
throw new Error(
|
|
72
|
+
`runtime-deps manifest at ${manifestPath} is not valid JSON: ${err?.message ?? err}`,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
const dependencies = parsed.dependencies;
|
|
76
|
+
if (!dependencies || typeof dependencies !== 'object') {
|
|
77
|
+
throw new Error(
|
|
78
|
+
`runtime-deps manifest at ${manifestPath} is missing a "dependencies" object`,
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
const optionalDependencies =
|
|
82
|
+
parsed.optionalDependencies &&
|
|
83
|
+
typeof parsed.optionalDependencies === 'object'
|
|
84
|
+
? parsed.optionalDependencies
|
|
85
|
+
: {};
|
|
86
|
+
return {
|
|
87
|
+
dependencies,
|
|
88
|
+
optionalDependencies,
|
|
89
|
+
required: Object.keys(dependencies),
|
|
90
|
+
optional: Object.keys(optionalDependencies),
|
|
91
|
+
declared: new Set([
|
|
92
|
+
...Object.keys(dependencies),
|
|
93
|
+
...Object.keys(optionalDependencies),
|
|
94
|
+
]),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runtime-deps/preflight — pure helpers for the dependency-presence check.
|
|
3
|
+
*
|
|
4
|
+
* These functions hold no side effects so they are unit-testable in
|
|
5
|
+
* isolation: `checkRuntimeDeps` takes an injected `resolve` seam,
|
|
6
|
+
* `detectPackageManager` takes an injected `exists` seam, and
|
|
7
|
+
* `formatMissingDepsMessage` is a pure string builder. The side-effecting
|
|
8
|
+
* guard that wires them to the real process lives in `ensure-installed.js`.
|
|
9
|
+
*
|
|
10
|
+
* Builtins only — this module runs *before* any third-party package is
|
|
11
|
+
* imported, so importing a third-party here would defeat its own purpose.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import fs from 'node:fs';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Resolve each required package via the injected `resolve` seam and collect
|
|
19
|
+
* the ones that fail. `resolve` is typically `require.resolve` bound to the
|
|
20
|
+
* framework module location; it throws `MODULE_NOT_FOUND` when a package is
|
|
21
|
+
* absent from the resolvable `node_modules`.
|
|
22
|
+
*
|
|
23
|
+
* @param {{ required: string[], resolve: (specifier: string) => string }} opts
|
|
24
|
+
* @returns {{ ok: boolean, missing: string[] }}
|
|
25
|
+
*/
|
|
26
|
+
export function checkRuntimeDeps({ required, resolve }) {
|
|
27
|
+
const missing = [];
|
|
28
|
+
for (const dep of required) {
|
|
29
|
+
try {
|
|
30
|
+
resolve(dep);
|
|
31
|
+
} catch {
|
|
32
|
+
missing.push(dep);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { ok: missing.length === 0, missing };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Detect the consumer's package manager from lockfile presence so the
|
|
40
|
+
* remediation message names the right install command. Defaults to `npm`.
|
|
41
|
+
* Mirrors `bootstrap/project-bootstrap.js#detectPackageManager` but stays
|
|
42
|
+
* decoupled (and seam-injectable) so the preflight imports nothing heavy.
|
|
43
|
+
*
|
|
44
|
+
* @param {string} root
|
|
45
|
+
* @param {(p: string) => boolean} [exists=fs.existsSync]
|
|
46
|
+
* @returns {'pnpm'|'yarn'|'npm'}
|
|
47
|
+
*/
|
|
48
|
+
export function detectPackageManager(root, exists = fs.existsSync) {
|
|
49
|
+
if (exists(path.join(root, 'pnpm-lock.yaml'))) return 'pnpm';
|
|
50
|
+
if (exists(path.join(root, 'yarn.lock'))) return 'yarn';
|
|
51
|
+
return 'npm';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Map a detected package manager to its install command. */
|
|
55
|
+
function installCommand(packageManager) {
|
|
56
|
+
if (packageManager === 'pnpm') return 'pnpm install';
|
|
57
|
+
if (packageManager === 'yarn') return 'yarn install';
|
|
58
|
+
return 'npm install';
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Build the actionable remediation message naming the missing packages and
|
|
63
|
+
* the consumer's install command. This is what replaces the opaque raw
|
|
64
|
+
* `ERR_MODULE_NOT_FOUND` stack trace.
|
|
65
|
+
*
|
|
66
|
+
* @param {string[]} missing
|
|
67
|
+
* @param {{ root: string, packageManager: 'pnpm'|'yarn'|'npm' }} opts
|
|
68
|
+
* @returns {string}
|
|
69
|
+
*/
|
|
70
|
+
export function formatMissingDepsMessage(missing, { root, packageManager }) {
|
|
71
|
+
return [
|
|
72
|
+
'Framework runtime dependencies are not installed.',
|
|
73
|
+
`Missing from node_modules/: ${missing.join(', ')}.`,
|
|
74
|
+
`The .agents/ framework scripts require these packages (declared in ` +
|
|
75
|
+
`.agents/runtime-deps.json) to be installed in this repository.`,
|
|
76
|
+
`Run \`${installCommand(packageManager)}\` in ${root}, then re-run this command.`,
|
|
77
|
+
].join('\n');
|
|
78
|
+
}
|