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,396 @@
|
|
|
1
|
+
// .agents/scripts/lib/dynamic-workflow/capability.js
|
|
2
|
+
/**
|
|
3
|
+
* Dynamic-workflow capability detection + audit-lens strategy selection.
|
|
4
|
+
*
|
|
5
|
+
* Originated as the `audit-clean-code` dynamic-workflow pilot (Story #3278)
|
|
6
|
+
* and generalized to five read-only, dimensionally-decomposable lenses
|
|
7
|
+
* (`audit-clean-code`, `audit-security`, `audit-performance`,
|
|
8
|
+
* `audit-architecture`, `audit-quality`) under Epic #3597. The one-shot pilot
|
|
9
|
+
* doc has been retired; this module docstring is the **canonical home for the
|
|
10
|
+
* capability-degradation rationale** (the "Why this is not a contract shim"
|
|
11
|
+
* section below), and `docs/roadmap.md` (Part 3 — Dynamic-Workflow
|
|
12
|
+
* Orchestration) holds the orchestrated-run evidence and per-lens
|
|
13
|
+
* cost/precision gate verdicts.
|
|
14
|
+
*
|
|
15
|
+
* Claude Code's [dynamic workflows](https://code.claude.com/docs/en/workflows)
|
|
16
|
+
* let a JS script orchestrate many subagents in the background. They are a
|
|
17
|
+
* Claude Code-only, paid-plan, research-preview feature (CC >= 2.1.154). Each
|
|
18
|
+
* generalized lens runs along **two execution paths**:
|
|
19
|
+
*
|
|
20
|
+
* 1. **orchestrated** — the per-lens dynamic-workflow script
|
|
21
|
+
* (`.claude/workflows/<lens>.workflow.js`) fans the lens dimensions out
|
|
22
|
+
* as parallel subagents with an adversarial cross-check stage, then emits
|
|
23
|
+
* the report contract.
|
|
24
|
+
* 2. **sequential** — the existing single-pass lens
|
|
25
|
+
* (`.agents/workflows/<lens>.md`) followed turn-by-turn.
|
|
26
|
+
*
|
|
27
|
+
* Both paths MUST emit the identical per-lens report contract
|
|
28
|
+
* (`{{auditOutputDir}}/<lens>-results.md`), so downstream consumers
|
|
29
|
+
* (`/epic-deliver` Phase 4 epic-audit, `audit-to-stories`) are agnostic to
|
|
30
|
+
* which path produced it.
|
|
31
|
+
*
|
|
32
|
+
* ## Why this is capability-degradation, not a contract shim
|
|
33
|
+
*
|
|
34
|
+
* The No-Shim / hard-cutover rule in `.agents/rules/git-conventions.md`
|
|
35
|
+
* governs *contract version* changes (config / schema / lifecycle shape) and
|
|
36
|
+
* forbids running two shapes of the **same contract** side by side. This
|
|
37
|
+
* module does the opposite: it keeps **one** report contract and selects an
|
|
38
|
+
* **execution strategy** from a runtime capability snapshot — the same
|
|
39
|
+
* pattern the protocol already endorses in `.agents/instructions.md`
|
|
40
|
+
* §1.C/§1.D (live-docs → in-repo → web fallback order). There is no second
|
|
41
|
+
* report shape, no version-windowed sunset, and no legacy reader to delete
|
|
42
|
+
* later.
|
|
43
|
+
*
|
|
44
|
+
* This module is **pure** — `detectDynamicWorkflowCapability` reads an
|
|
45
|
+
* injected environment snapshot (never `process` / `fs` directly) and
|
|
46
|
+
* `selectAuditStrategy` is a pure function of that snapshot. The split keeps
|
|
47
|
+
* strategy selection unit-testable without a live Claude Code runtime.
|
|
48
|
+
*
|
|
49
|
+
* @module dynamic-workflow/capability
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Constants
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Minimum Claude Code version that ships the dynamic-workflow runtime
|
|
58
|
+
* (research preview). Below this floor the orchestrated path is unavailable
|
|
59
|
+
* even on a paid Claude Code runtime.
|
|
60
|
+
*
|
|
61
|
+
* Source: https://code.claude.com/docs/en/workflows ("require Claude Code
|
|
62
|
+
* v2.1.154 or later").
|
|
63
|
+
*/
|
|
64
|
+
export const DYNAMIC_WORKFLOW_VERSION_FLOOR = '2.1.154';
|
|
65
|
+
|
|
66
|
+
/** The two execution strategies the lens can run under. */
|
|
67
|
+
export const AUDIT_STRATEGY = Object.freeze({
|
|
68
|
+
ORCHESTRATED: 'orchestrated',
|
|
69
|
+
SEQUENTIAL: 'sequential',
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Environment-variable names consulted when a caller does not inject an
|
|
74
|
+
* explicit snapshot. Kept as constants so the docs / tests reference the
|
|
75
|
+
* exact keys rather than hard-coding the strings.
|
|
76
|
+
*/
|
|
77
|
+
export const ENV_KEYS = Object.freeze({
|
|
78
|
+
/** Hard kill-switch documented at code.claude.com/docs/en/workflows. */
|
|
79
|
+
DISABLE: 'CLAUDE_CODE_DISABLE_WORKFLOWS',
|
|
80
|
+
/** Test/operator force-override: `orchestrated` | `sequential`. */
|
|
81
|
+
FORCE_STRATEGY: 'MANDREL_AUDIT_STRATEGY',
|
|
82
|
+
/** Runtime identity (`claude-code` when running under Claude Code). */
|
|
83
|
+
RUNTIME: 'CLAUDE_CODE_RUNTIME',
|
|
84
|
+
/** Claude Code version string (e.g. `2.1.160`). */
|
|
85
|
+
VERSION: 'CLAUDE_CODE_VERSION',
|
|
86
|
+
/** Entitlement hint (`pro` | `max` | `team` | `enterprise` | `api`). */
|
|
87
|
+
PLAN: 'CLAUDE_CODE_PLAN',
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
/** Reason codes attached to a strategy decision for observability. */
|
|
91
|
+
export const DECISION_REASON = Object.freeze({
|
|
92
|
+
FORCED_ORCHESTRATED: 'forced-orchestrated',
|
|
93
|
+
FORCED_SEQUENTIAL: 'forced-sequential',
|
|
94
|
+
CAPABILITY_PRESENT: 'capability-present',
|
|
95
|
+
NOT_CLAUDE_RUNTIME: 'not-claude-runtime',
|
|
96
|
+
DISABLED_SETTING: 'disabled-setting',
|
|
97
|
+
DISABLED_ENV: 'disabled-env',
|
|
98
|
+
VERSION_BELOW_FLOOR: 'version-below-floor',
|
|
99
|
+
UNPAID_PLAN: 'unpaid-plan',
|
|
100
|
+
RUNTIME_UNKNOWN: 'runtime-unknown',
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Truthy env-flag values (mirrors how Claude Code reads boolean env flags:
|
|
104
|
+
// the var is "set" when present and not an explicit falsey token).
|
|
105
|
+
const FALSEY_FLAG = new Set(['', '0', 'false', 'off', 'no']);
|
|
106
|
+
|
|
107
|
+
// Paid plan/entitlement tokens that unlock dynamic workflows.
|
|
108
|
+
const PAID_PLANS = new Set(['pro', 'max', 'team', 'enterprise', 'api']);
|
|
109
|
+
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Helpers
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Is an environment flag "set" in the truthy sense Claude Code uses for
|
|
116
|
+
* `CLAUDE_CODE_DISABLE_WORKFLOWS`? Present and not an explicit falsey token.
|
|
117
|
+
*
|
|
118
|
+
* @param {string|undefined|null} raw
|
|
119
|
+
* @returns {boolean}
|
|
120
|
+
*/
|
|
121
|
+
export function isFlagSet(raw) {
|
|
122
|
+
if (raw === undefined || raw === null) return false;
|
|
123
|
+
return !FALSEY_FLAG.has(String(raw).trim().toLowerCase());
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Compare two dotted numeric version strings. Returns a negative number when
|
|
128
|
+
* `a < b`, zero when equal, positive when `a > b`. Non-numeric / missing
|
|
129
|
+
* segments are treated as 0. Pre-release suffixes (e.g. `-rc1`) are ignored.
|
|
130
|
+
*
|
|
131
|
+
* @param {string} a
|
|
132
|
+
* @param {string} b
|
|
133
|
+
* @returns {number}
|
|
134
|
+
*/
|
|
135
|
+
export function compareVersions(a, b) {
|
|
136
|
+
const norm = (v) =>
|
|
137
|
+
String(v ?? '')
|
|
138
|
+
.trim()
|
|
139
|
+
.replace(/^v/i, '')
|
|
140
|
+
.split('-')[0]
|
|
141
|
+
.split('.')
|
|
142
|
+
.map((seg) => {
|
|
143
|
+
const n = Number.parseInt(seg, 10);
|
|
144
|
+
return Number.isNaN(n) ? 0 : n;
|
|
145
|
+
});
|
|
146
|
+
const av = norm(a);
|
|
147
|
+
const bv = norm(b);
|
|
148
|
+
const len = Math.max(av.length, bv.length);
|
|
149
|
+
for (let i = 0; i < len; i += 1) {
|
|
150
|
+
const diff = (av[i] ?? 0) - (bv[i] ?? 0);
|
|
151
|
+
if (diff !== 0) return diff;
|
|
152
|
+
}
|
|
153
|
+
return 0;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Does `version` meet or exceed the dynamic-workflow floor?
|
|
158
|
+
*
|
|
159
|
+
* @param {string} version
|
|
160
|
+
* @param {string} [floor=DYNAMIC_WORKFLOW_VERSION_FLOOR]
|
|
161
|
+
* @returns {boolean}
|
|
162
|
+
*/
|
|
163
|
+
export function meetsVersionFloor(
|
|
164
|
+
version,
|
|
165
|
+
floor = DYNAMIC_WORKFLOW_VERSION_FLOOR,
|
|
166
|
+
) {
|
|
167
|
+
if (!version) return false;
|
|
168
|
+
return compareVersions(version, floor) >= 0;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
// Capability detection
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* @typedef {object} CapabilitySnapshot
|
|
177
|
+
* @property {string|undefined} [runtime] - Runtime identity (`claude-code` …).
|
|
178
|
+
* @property {string|undefined} [version] - Claude Code version string.
|
|
179
|
+
* @property {string|undefined} [plan] - Plan/entitlement token.
|
|
180
|
+
* @property {boolean} [disableWorkflowsSetting] - `disableWorkflows` from settings.json.
|
|
181
|
+
* @property {string|undefined} [disableWorkflowsEnv] - Raw env value of CLAUDE_CODE_DISABLE_WORKFLOWS.
|
|
182
|
+
*/
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* @typedef {object} CapabilityResult
|
|
186
|
+
* @property {boolean} available - Whether the orchestrated path can run.
|
|
187
|
+
* @property {string} reason - One of {@link DECISION_REASON}.
|
|
188
|
+
* @property {object} detail - Echoed snapshot facts for logging.
|
|
189
|
+
*/
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Detect whether the dynamic-workflow orchestrated path is available, from an
|
|
193
|
+
* **injected** environment snapshot. The function is pure: callers resolve
|
|
194
|
+
* `process.env` / settings.json and pass the facts in, so the decision is
|
|
195
|
+
* reproducible in tests without a live runtime.
|
|
196
|
+
*
|
|
197
|
+
* Detection accounts for, in priority order:
|
|
198
|
+
* 1. Non-Claude runtime → unavailable (`not-claude-runtime`).
|
|
199
|
+
* 2. `disableWorkflows: true` in settings → unavailable (`disabled-setting`).
|
|
200
|
+
* 3. `CLAUDE_CODE_DISABLE_WORKFLOWS` set → unavailable (`disabled-env`).
|
|
201
|
+
* 4. CC version below {@link DYNAMIC_WORKFLOW_VERSION_FLOOR} → unavailable.
|
|
202
|
+
* 5. Non-paid plan (when the plan token is known) → unavailable.
|
|
203
|
+
* 6. Otherwise → available.
|
|
204
|
+
*
|
|
205
|
+
* When the runtime identifies as Claude Code but supplies no version, the
|
|
206
|
+
* function fails **closed** (`runtime-unknown`, unavailable): an undetectable
|
|
207
|
+
* version cannot be assumed to clear the research-preview floor, and the
|
|
208
|
+
* sequential lens is always a safe fallback.
|
|
209
|
+
*
|
|
210
|
+
* @param {CapabilitySnapshot} snapshot
|
|
211
|
+
* @returns {CapabilityResult}
|
|
212
|
+
*/
|
|
213
|
+
export function detectDynamicWorkflowCapability(snapshot = {}) {
|
|
214
|
+
const {
|
|
215
|
+
runtime,
|
|
216
|
+
version,
|
|
217
|
+
plan,
|
|
218
|
+
disableWorkflowsSetting,
|
|
219
|
+
disableWorkflowsEnv,
|
|
220
|
+
} = snapshot;
|
|
221
|
+
|
|
222
|
+
const detail = {
|
|
223
|
+
runtime: runtime ?? null,
|
|
224
|
+
version: version ?? null,
|
|
225
|
+
plan: plan ?? null,
|
|
226
|
+
disableWorkflowsSetting: Boolean(disableWorkflowsSetting),
|
|
227
|
+
disableWorkflowsEnv: isFlagSet(disableWorkflowsEnv),
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const isClaudeRuntime =
|
|
231
|
+
typeof runtime === 'string' && /claude[-_ ]?code/i.test(runtime);
|
|
232
|
+
if (!isClaudeRuntime) {
|
|
233
|
+
return {
|
|
234
|
+
available: false,
|
|
235
|
+
reason: DECISION_REASON.NOT_CLAUDE_RUNTIME,
|
|
236
|
+
detail,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (disableWorkflowsSetting === true) {
|
|
241
|
+
return {
|
|
242
|
+
available: false,
|
|
243
|
+
reason: DECISION_REASON.DISABLED_SETTING,
|
|
244
|
+
detail,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (isFlagSet(disableWorkflowsEnv)) {
|
|
249
|
+
return { available: false, reason: DECISION_REASON.DISABLED_ENV, detail };
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (!version) {
|
|
253
|
+
// Claude Code runtime but no resolvable version → fail closed.
|
|
254
|
+
return {
|
|
255
|
+
available: false,
|
|
256
|
+
reason: DECISION_REASON.RUNTIME_UNKNOWN,
|
|
257
|
+
detail,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (!meetsVersionFloor(version)) {
|
|
262
|
+
return {
|
|
263
|
+
available: false,
|
|
264
|
+
reason: DECISION_REASON.VERSION_BELOW_FLOOR,
|
|
265
|
+
detail,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Plan is only a gate when we actually know it. An absent plan token does
|
|
270
|
+
// not block — the runtime will refuse the launch itself if unentitled, and
|
|
271
|
+
// the sequential fallback covers that case.
|
|
272
|
+
if (typeof plan === 'string' && plan.trim().length > 0) {
|
|
273
|
+
if (!PAID_PLANS.has(plan.trim().toLowerCase())) {
|
|
274
|
+
return { available: false, reason: DECISION_REASON.UNPAID_PLAN, detail };
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return {
|
|
279
|
+
available: true,
|
|
280
|
+
reason: DECISION_REASON.CAPABILITY_PRESENT,
|
|
281
|
+
detail,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// ---------------------------------------------------------------------------
|
|
286
|
+
// Strategy selection
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* @typedef {object} StrategyDecision
|
|
291
|
+
* @property {('orchestrated'|'sequential')} strategy - The chosen execution path.
|
|
292
|
+
* @property {string} reason - One of {@link DECISION_REASON}.
|
|
293
|
+
* @property {boolean} forced - True when an explicit override drove the choice.
|
|
294
|
+
* @property {object} capability - The {@link CapabilityResult} that informed it.
|
|
295
|
+
*/
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Select the audit execution strategy for `audit-clean-code` from a capability
|
|
299
|
+
* snapshot and an optional explicit force-override.
|
|
300
|
+
*
|
|
301
|
+
* Decision order:
|
|
302
|
+
* 1. `forceStrategy === 'orchestrated'` → orchestrated (forced). Used to
|
|
303
|
+
* pin the dynamic path for testing even if detection is conservative;
|
|
304
|
+
* the runtime still refuses the launch if genuinely unentitled.
|
|
305
|
+
* 2. `forceStrategy === 'sequential'` → sequential (forced). Used to verify
|
|
306
|
+
* the fallback path (Acceptance: "running the lens with the feature
|
|
307
|
+
* disabled") without mutating the real environment.
|
|
308
|
+
* 3. Capability available → orchestrated.
|
|
309
|
+
* 4. Otherwise → sequential (graceful degradation).
|
|
310
|
+
*
|
|
311
|
+
* Pure function — no I/O, no side effects.
|
|
312
|
+
*
|
|
313
|
+
* @param {object} input
|
|
314
|
+
* @param {CapabilitySnapshot} [input.snapshot] - Environment facts.
|
|
315
|
+
* @param {('orchestrated'|'sequential'|null|undefined)} [input.forceStrategy] - Explicit override.
|
|
316
|
+
* @returns {StrategyDecision}
|
|
317
|
+
*/
|
|
318
|
+
export function selectAuditStrategy({ snapshot = {}, forceStrategy } = {}) {
|
|
319
|
+
const capability = detectDynamicWorkflowCapability(snapshot);
|
|
320
|
+
|
|
321
|
+
const normalizedForce =
|
|
322
|
+
typeof forceStrategy === 'string'
|
|
323
|
+
? forceStrategy.trim().toLowerCase()
|
|
324
|
+
: null;
|
|
325
|
+
|
|
326
|
+
if (normalizedForce === AUDIT_STRATEGY.ORCHESTRATED) {
|
|
327
|
+
return {
|
|
328
|
+
strategy: AUDIT_STRATEGY.ORCHESTRATED,
|
|
329
|
+
reason: DECISION_REASON.FORCED_ORCHESTRATED,
|
|
330
|
+
forced: true,
|
|
331
|
+
capability,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
if (normalizedForce === AUDIT_STRATEGY.SEQUENTIAL) {
|
|
335
|
+
return {
|
|
336
|
+
strategy: AUDIT_STRATEGY.SEQUENTIAL,
|
|
337
|
+
reason: DECISION_REASON.FORCED_SEQUENTIAL,
|
|
338
|
+
forced: true,
|
|
339
|
+
capability,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (capability.available) {
|
|
344
|
+
return {
|
|
345
|
+
strategy: AUDIT_STRATEGY.ORCHESTRATED,
|
|
346
|
+
reason: capability.reason,
|
|
347
|
+
forced: false,
|
|
348
|
+
capability,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return {
|
|
353
|
+
strategy: AUDIT_STRATEGY.SEQUENTIAL,
|
|
354
|
+
reason: capability.reason,
|
|
355
|
+
forced: false,
|
|
356
|
+
capability,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Build a {@link CapabilitySnapshot} from a raw environment bag (typically
|
|
362
|
+
* `process.env`) plus a resolved `disableWorkflows` settings value. Kept
|
|
363
|
+
* separate from `process.env` access so it stays testable; the caller decides
|
|
364
|
+
* where the env comes from.
|
|
365
|
+
*
|
|
366
|
+
* @param {Record<string,string|undefined>} env
|
|
367
|
+
* @param {{ disableWorkflows?: boolean }} [settings]
|
|
368
|
+
* @returns {CapabilitySnapshot}
|
|
369
|
+
*/
|
|
370
|
+
export function snapshotFromEnv(env = {}, settings = {}) {
|
|
371
|
+
return {
|
|
372
|
+
runtime: env[ENV_KEYS.RUNTIME],
|
|
373
|
+
version: env[ENV_KEYS.VERSION],
|
|
374
|
+
plan: env[ENV_KEYS.PLAN],
|
|
375
|
+
disableWorkflowsSetting: settings.disableWorkflows === true,
|
|
376
|
+
disableWorkflowsEnv: env[ENV_KEYS.DISABLE],
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Read the operator/test force-override from a raw environment bag. Returns
|
|
382
|
+
* `'orchestrated'` / `'sequential'` when the value is a recognised strategy,
|
|
383
|
+
* else `null`.
|
|
384
|
+
*
|
|
385
|
+
* @param {Record<string,string|undefined>} env
|
|
386
|
+
* @returns {('orchestrated'|'sequential'|null)}
|
|
387
|
+
*/
|
|
388
|
+
export function forceStrategyFromEnv(env = {}) {
|
|
389
|
+
const raw = env[ENV_KEYS.FORCE_STRATEGY];
|
|
390
|
+
if (typeof raw !== 'string') return null;
|
|
391
|
+
const v = raw.trim().toLowerCase();
|
|
392
|
+
if (v === AUDIT_STRATEGY.ORCHESTRATED || v === AUDIT_STRATEGY.SEQUENTIAL) {
|
|
393
|
+
return v;
|
|
394
|
+
}
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// .agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js
|
|
2
|
+
import { assertSectionsContract } from './report-contract-core.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The `audit-clean-code` report contract (Story #3278).
|
|
6
|
+
*
|
|
7
|
+
* This is the **single source of truth** for the report shape that BOTH the
|
|
8
|
+
* sequential lens (`.agents/workflows/audit-clean-code.md` Step 3) and the
|
|
9
|
+
* orchestrated dynamic-workflow path
|
|
10
|
+
* (`.claude/workflows/audit-clean-code.workflow.js`) MUST emit to
|
|
11
|
+
* `{{auditOutputDir}}/audit-clean-code-results.md`. Keeping it here lets the
|
|
12
|
+
* contract-tier test assert report conformance against one definition rather
|
|
13
|
+
* than re-deriving headings from prose in two places.
|
|
14
|
+
*
|
|
15
|
+
* This module documents the **existing** report shape; it does not introduce
|
|
16
|
+
* a new one. Changing the report contract is a separate, deliberate decision —
|
|
17
|
+
* not a side effect of the dual-path orchestration work.
|
|
18
|
+
*
|
|
19
|
+
* @module dynamic-workflow/clean-code-report-contract
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** The artifact filename the lens writes under `auditOutputDir`. */
|
|
23
|
+
export const REPORT_ARTIFACT_BASENAME = 'audit-clean-code-results.md';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The required top-level (`##`) section headings, in document order, that the
|
|
27
|
+
* lens markdown's Step 3 template defines. A conformant report MUST contain
|
|
28
|
+
* each of these headings; the orchestrated path assembles its sub-agent
|
|
29
|
+
* findings into exactly this skeleton.
|
|
30
|
+
*/
|
|
31
|
+
export const REQUIRED_SECTIONS = Object.freeze([
|
|
32
|
+
'Executive Summary',
|
|
33
|
+
'Detailed Findings',
|
|
34
|
+
'Dead Code Inventory',
|
|
35
|
+
'Technical Debt Backlog',
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
/** The H1 title the report opens with. */
|
|
39
|
+
export const REPORT_TITLE = 'Clean Code Audit Report';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The required field labels inside each `### <finding>` block under
|
|
43
|
+
* `## Detailed Findings`. Mirrors the strict per-finding structure in the
|
|
44
|
+
* lens template.
|
|
45
|
+
*/
|
|
46
|
+
export const FINDING_FIELDS = Object.freeze([
|
|
47
|
+
'Dimension',
|
|
48
|
+
'Impact',
|
|
49
|
+
'Current State',
|
|
50
|
+
'Recommendation & Rationale',
|
|
51
|
+
'Agent Prompt',
|
|
52
|
+
]);
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The Dead Code Inventory table column headers, in order.
|
|
56
|
+
*/
|
|
57
|
+
export const DEAD_CODE_COLUMNS = Object.freeze([
|
|
58
|
+
'File',
|
|
59
|
+
'Symbol / Block',
|
|
60
|
+
'Type',
|
|
61
|
+
'Estimated LOC',
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Assert that a rendered markdown report conforms to the contract: it has the
|
|
66
|
+
* H1 title and every required `##` section heading. Returns a structured
|
|
67
|
+
* result rather than throwing, so callers (tests, the orchestrated path's
|
|
68
|
+
* self-check) can report precisely which sections are missing.
|
|
69
|
+
*
|
|
70
|
+
* Pure function — string analysis only.
|
|
71
|
+
*
|
|
72
|
+
* @param {string} markdown - The rendered report body.
|
|
73
|
+
* @returns {{ conformant: boolean, missingSections: string[], hasTitle: boolean }}
|
|
74
|
+
*/
|
|
75
|
+
export function assertReportContract(markdown) {
|
|
76
|
+
return assertSectionsContract(markdown, {
|
|
77
|
+
title: REPORT_TITLE,
|
|
78
|
+
requiredSections: REQUIRED_SECTIONS,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// .agents/scripts/lib/dynamic-workflow/performance-report-contract.js
|
|
2
|
+
import { assertSectionsContract } from './report-contract-core.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The `audit-performance` report contract (Epic #3597, Story #3611).
|
|
6
|
+
*
|
|
7
|
+
* This is the **single source of truth** for the report shape that BOTH the
|
|
8
|
+
* sequential lens (`.agents/workflows/audit-performance.md` Step 3) and the
|
|
9
|
+
* orchestrated dynamic-workflow path
|
|
10
|
+
* (`.claude/workflows/audit-performance.workflow.js`) MUST emit to
|
|
11
|
+
* `{{auditOutputDir}}/audit-performance-results.md`. Keeping it here lets the
|
|
12
|
+
* contract-tier test assert report conformance against one definition rather
|
|
13
|
+
* than re-deriving headings from prose in two places.
|
|
14
|
+
*
|
|
15
|
+
* Changing the report contract is explicitly **out of scope** for this Story —
|
|
16
|
+
* this module documents the existing shape already declared by the lens
|
|
17
|
+
* markdown's Step 3 template, it does not introduce a new one.
|
|
18
|
+
*
|
|
19
|
+
* @module dynamic-workflow/performance-report-contract
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** The artifact filename the lens writes under `auditOutputDir`. */
|
|
23
|
+
export const REPORT_ARTIFACT_BASENAME = 'audit-performance-results.md';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The required top-level (`##`) section headings, in document order, that the
|
|
27
|
+
* lens markdown's Step 3 template defines. A conformant report MUST contain
|
|
28
|
+
* each of these headings; the orchestrated path assembles its cross-checked
|
|
29
|
+
* sub-agent findings into exactly this skeleton.
|
|
30
|
+
*
|
|
31
|
+
* The `Low-Hanging Fruit` section is the performance lens's distinguishing
|
|
32
|
+
* section — the quick-win backlog the synthesis stage must always emit.
|
|
33
|
+
*/
|
|
34
|
+
export const REQUIRED_SECTIONS = Object.freeze([
|
|
35
|
+
'Executive Summary',
|
|
36
|
+
'Detailed Findings',
|
|
37
|
+
'Low-Hanging Fruit',
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
/** The H1 title the report opens with. */
|
|
41
|
+
export const REPORT_TITLE = 'Performance Audit Report';
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The required field labels inside each `### <finding>` block under
|
|
45
|
+
* `## Detailed Findings`. Mirrors the strict per-finding structure in the
|
|
46
|
+
* lens template.
|
|
47
|
+
*/
|
|
48
|
+
export const FINDING_FIELDS = Object.freeze([
|
|
49
|
+
'Dimension',
|
|
50
|
+
'Impact',
|
|
51
|
+
'Current State',
|
|
52
|
+
'Recommendation & Rationale',
|
|
53
|
+
'Agent Prompt',
|
|
54
|
+
]);
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Assert that a rendered markdown report conforms to the contract: it has the
|
|
58
|
+
* H1 title and every required `##` section heading. Returns a structured
|
|
59
|
+
* result rather than throwing, so callers (tests, the orchestrated path's
|
|
60
|
+
* self-check) can report precisely which sections are missing.
|
|
61
|
+
*
|
|
62
|
+
* Pure function — string analysis only.
|
|
63
|
+
*
|
|
64
|
+
* @param {string} markdown - The rendered report body.
|
|
65
|
+
* @returns {{ conformant: boolean, missingSections: string[], hasTitle: boolean }}
|
|
66
|
+
*/
|
|
67
|
+
export function assertReportContract(markdown) {
|
|
68
|
+
return assertSectionsContract(markdown, {
|
|
69
|
+
title: REPORT_TITLE,
|
|
70
|
+
requiredSections: REQUIRED_SECTIONS,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// .agents/scripts/lib/dynamic-workflow/quality-report-contract.js
|
|
2
|
+
import { assertSectionsContract } from './report-contract-core.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The `audit-quality` report contract (Epic #3597, Story #3614).
|
|
6
|
+
*
|
|
7
|
+
* This is the **single source of truth** for the report shape that BOTH the
|
|
8
|
+
* sequential lens (`.agents/workflows/audit-quality.md` Step 3) and the
|
|
9
|
+
* orchestrated dynamic-workflow path
|
|
10
|
+
* (`.claude/workflows/audit-quality.workflow.js`) MUST emit to
|
|
11
|
+
* `{{auditOutputDir}}/audit-quality-results.md`. Keeping it here lets the
|
|
12
|
+
* contract-tier test assert report conformance against one definition rather
|
|
13
|
+
* than re-deriving headings from prose in two places.
|
|
14
|
+
*
|
|
15
|
+
* Generalising the orchestrated dual path to the quality lens is explicitly
|
|
16
|
+
* **report-contract-preserving** — this module documents the existing shape the
|
|
17
|
+
* sequential lens already emits, it does not introduce a new one.
|
|
18
|
+
*
|
|
19
|
+
* @module dynamic-workflow/quality-report-contract
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** The artifact filename the lens writes under `auditOutputDir`. */
|
|
23
|
+
export const REPORT_ARTIFACT_BASENAME = 'audit-quality-results.md';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The required top-level (`##`) section headings, in document order, that the
|
|
27
|
+
* lens markdown's Step 3 template defines. A conformant report MUST contain
|
|
28
|
+
* each of these headings; the orchestrated path assembles its cross-checked
|
|
29
|
+
* findings into exactly this skeleton.
|
|
30
|
+
*/
|
|
31
|
+
export const REQUIRED_SECTIONS = Object.freeze([
|
|
32
|
+
'Executive Summary',
|
|
33
|
+
'Test Strategy Assessment',
|
|
34
|
+
'Detailed Findings',
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
/** The H1 title the report opens with. */
|
|
38
|
+
export const REPORT_TITLE = 'Testing & Quality Assurance Audit';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The required field labels inside each `### <finding>` block under
|
|
42
|
+
* `## Detailed Findings`. Mirrors the strict per-finding structure in the
|
|
43
|
+
* lens template.
|
|
44
|
+
*/
|
|
45
|
+
export const FINDING_FIELDS = Object.freeze([
|
|
46
|
+
'Category',
|
|
47
|
+
'Impact',
|
|
48
|
+
'Current State',
|
|
49
|
+
'Recommendation & Rationale',
|
|
50
|
+
'Agent Prompt',
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The finding categories the per-finding `Category` field draws from. These
|
|
55
|
+
* mirror the lens's Step 3 template enumeration and the Step 2 analysis
|
|
56
|
+
* dimensions the quality audit decomposes into.
|
|
57
|
+
*/
|
|
58
|
+
export const FINDING_CATEGORIES = Object.freeze([
|
|
59
|
+
'Flakiness',
|
|
60
|
+
'Coverage',
|
|
61
|
+
'Performance',
|
|
62
|
+
'Mocking',
|
|
63
|
+
'Test Plans',
|
|
64
|
+
]);
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The impact buckets the Executive Summary and per-finding `Impact` field draw
|
|
68
|
+
* from. The lens speaks in High/Medium/Low; this list is the canonical
|
|
69
|
+
* taxonomy the downstream `audit-to-stories` consumer maps onto Story
|
|
70
|
+
* priority.
|
|
71
|
+
*/
|
|
72
|
+
export const IMPACT_LEVELS = Object.freeze(['High', 'Medium', 'Low']);
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Assert that a rendered markdown report conforms to the contract: it has the
|
|
76
|
+
* H1 title and every required `##` section heading. Returns a structured
|
|
77
|
+
* result rather than throwing, so callers (tests, the orchestrated path's
|
|
78
|
+
* self-check) can report precisely which sections are missing.
|
|
79
|
+
*
|
|
80
|
+
* Pure function — string analysis only.
|
|
81
|
+
*
|
|
82
|
+
* @param {string} markdown - The rendered report body.
|
|
83
|
+
* @returns {{ conformant: boolean, missingSections: string[], hasTitle: boolean }}
|
|
84
|
+
*/
|
|
85
|
+
export function assertReportContract(markdown) {
|
|
86
|
+
return assertSectionsContract(markdown, {
|
|
87
|
+
title: REPORT_TITLE,
|
|
88
|
+
requiredSections: REQUIRED_SECTIONS,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// .agents/scripts/lib/dynamic-workflow/report-contract-core.js
|
|
2
|
+
/**
|
|
3
|
+
* Shared markdown section contract assertions for audit report lenses.
|
|
4
|
+
*
|
|
5
|
+
* Individual lens modules own their report title and required section list;
|
|
6
|
+
* this helper owns the invariant string-analysis mechanics.
|
|
7
|
+
*
|
|
8
|
+
* @module dynamic-workflow/report-contract-core
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Assert that a rendered markdown report has the expected H1 title and every
|
|
13
|
+
* required `##` section heading. Returns a structured result rather than
|
|
14
|
+
* throwing, so callers can report precisely which sections are missing.
|
|
15
|
+
*
|
|
16
|
+
* Pure function — string analysis only.
|
|
17
|
+
*
|
|
18
|
+
* @param {string} markdown - The rendered report body.
|
|
19
|
+
* @param {{ title: string, requiredSections: readonly string[] }} contract
|
|
20
|
+
* - The per-lens report contract constants.
|
|
21
|
+
* @returns {{ conformant: boolean, missingSections: string[], hasTitle: boolean }}
|
|
22
|
+
*/
|
|
23
|
+
export function assertSectionsContract(markdown, { title, requiredSections }) {
|
|
24
|
+
const text = typeof markdown === 'string' ? markdown : '';
|
|
25
|
+
const hasTitle = new RegExp(`^#\\s+${escapeRegExp(title)}\\s*$`, 'm').test(
|
|
26
|
+
text,
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
const missingSections = requiredSections.filter(
|
|
30
|
+
(heading) =>
|
|
31
|
+
!new RegExp(`^##\\s+${escapeRegExp(heading)}\\s*$`, 'm').test(text),
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
conformant: hasTitle && missingSections.length === 0,
|
|
36
|
+
missingSections,
|
|
37
|
+
hasTitle,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function escapeRegExp(str) {
|
|
42
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
43
|
+
}
|