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,513 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codebase-snapshot.js — Bounded structural view of the consumer repo.
|
|
3
|
+
*
|
|
4
|
+
* Story #2634 (sibling to #2635 spec-freshness). `/epic-plan` Phase 7
|
|
5
|
+
* authors PRD + Tech Spec from documentation alone — `architecture.md`,
|
|
6
|
+
* `data-dictionary.md`, `decisions.md`, `patterns.md`. When those docs
|
|
7
|
+
* drift from the real source tree, the Architect persona cites modules
|
|
8
|
+
* and paths that no longer exist, and the mismatch only surfaces at
|
|
9
|
+
* delivery time.
|
|
10
|
+
*
|
|
11
|
+
* `buildCodebaseSnapshot` produces a deterministic JSON view of the repo
|
|
12
|
+
* that gets threaded into the spec-author's authoring context alongside
|
|
13
|
+
* `docsContext`, so the Architect can prefer real module names over
|
|
14
|
+
* doc-only ones.
|
|
15
|
+
*
|
|
16
|
+
* Two tiers, picked from `planning.codebaseSnapshot.tier`:
|
|
17
|
+
*
|
|
18
|
+
* - `skinny` (default) — file tree (paths only) of the configured
|
|
19
|
+
* include globs, `package.json` exports + bin entries, the detected
|
|
20
|
+
* test runner, the BDD feature root, and the list of directories
|
|
21
|
+
* touched in the most recent `recentCommitWindow` commits.
|
|
22
|
+
*
|
|
23
|
+
* - `medium` — skinny + a single-line export signature per public
|
|
24
|
+
* `.js` / `.ts` / `.mjs` file in the include set. Signatures are
|
|
25
|
+
* extracted from a regex pass over the file body — deliberately not
|
|
26
|
+
* a full AST so the snapshot stays cheap to generate on every plan
|
|
27
|
+
* run. The regex catches the common shapes (`export function foo`,
|
|
28
|
+
* `export class Bar`, `export const baz`, `export default`).
|
|
29
|
+
*
|
|
30
|
+
* The snapshot never throws on a probe failure. A missing git ref,
|
|
31
|
+
* unreadable directory, or absent BDD root all degrade to an empty /
|
|
32
|
+
* sentinel value in the corresponding field so Phase 7 stays
|
|
33
|
+
* non-blocking.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import fs from 'node:fs';
|
|
37
|
+
import path from 'node:path';
|
|
38
|
+
|
|
39
|
+
import { gitSpawn } from './git-utils.js';
|
|
40
|
+
import { Logger } from './Logger.js';
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Allowed tier values for `planning.codebaseSnapshot.tier`. Mirrored
|
|
44
|
+
* in `agentrc.schema.json` so a typo lands as a schema-validation
|
|
45
|
+
* error before the runner is reached.
|
|
46
|
+
*/
|
|
47
|
+
export const CODEBASE_SNAPSHOT_TIERS = Object.freeze(['skinny', 'medium']);
|
|
48
|
+
|
|
49
|
+
const DEFAULT_INCLUDE = Object.freeze([
|
|
50
|
+
'.agents/scripts/**',
|
|
51
|
+
'src/**',
|
|
52
|
+
'lib/**',
|
|
53
|
+
'app/**',
|
|
54
|
+
'packages/**',
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
const DEFAULT_EXCLUDE = Object.freeze([
|
|
58
|
+
'**/node_modules/**',
|
|
59
|
+
'**/dist/**',
|
|
60
|
+
'**/build/**',
|
|
61
|
+
'**/.next/**',
|
|
62
|
+
'**/.turbo/**',
|
|
63
|
+
'**/coverage/**',
|
|
64
|
+
'**/*.test.*',
|
|
65
|
+
'**/*.spec.*',
|
|
66
|
+
]);
|
|
67
|
+
|
|
68
|
+
const DEFAULT_RECENT_COMMIT_WINDOW = 30;
|
|
69
|
+
|
|
70
|
+
const SIGNATURE_FILE_EXTS = new Set(['.js', '.mjs', '.cjs', '.ts', '.tsx']);
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Hard cap on the file list in the skinny tier. When the include set
|
|
74
|
+
* matches more than `MAX_FILES_SKINNY` tracked files, the result is
|
|
75
|
+
* truncated and `truncated: true` is set on the envelope so the
|
|
76
|
+
* Architect (and the Phase 7 authoring-context warning) sees that the
|
|
77
|
+
* snapshot is incomplete and can ask for `medium` (or narrow the
|
|
78
|
+
* include globs). 250 entries is roughly 4–6k tokens of paths on
|
|
79
|
+
* typical repos — the upper edge of the Phase 7 budget.
|
|
80
|
+
*/
|
|
81
|
+
const MAX_FILES_SKINNY = 250;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Group a sorted file list by its top-level directory. The top-level
|
|
85
|
+
* segment is the first path component (`.agents/scripts/lib/foo.js` →
|
|
86
|
+
* `.agents`, `src/index.ts` → `src`). Returns an insertion-ordered Map
|
|
87
|
+
* keyed by top-level dir whose values are the files under it, preserving
|
|
88
|
+
* the input order within each group. Because the input is pre-sorted
|
|
89
|
+
* lexicographically and we never reorder, group keys appear in sorted
|
|
90
|
+
* order and per-group file order is sorted too — the whole operation
|
|
91
|
+
* is deterministic for a given tree.
|
|
92
|
+
*
|
|
93
|
+
* @param {string[]} files - Lexicographically sorted relative paths.
|
|
94
|
+
* @returns {Map<string, string[]>}
|
|
95
|
+
*/
|
|
96
|
+
function groupByTopLevel(files) {
|
|
97
|
+
const groups = new Map();
|
|
98
|
+
for (const file of files) {
|
|
99
|
+
const slash = file.indexOf('/');
|
|
100
|
+
const top = slash === -1 ? file : file.slice(0, slash);
|
|
101
|
+
let bucket = groups.get(top);
|
|
102
|
+
if (!bucket) {
|
|
103
|
+
bucket = [];
|
|
104
|
+
groups.set(top, bucket);
|
|
105
|
+
}
|
|
106
|
+
bucket.push(file);
|
|
107
|
+
}
|
|
108
|
+
return groups;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Apply the skinny-tier cap with **per-top-level-dir proportional
|
|
113
|
+
* budgeting** so a large, dot-prefixed tree (e.g. `.agents/scripts/**`)
|
|
114
|
+
* can no longer monopolise the budget and truncate away the consumer's
|
|
115
|
+
* own source. The flat `filtered.slice(0, cap)` it replaces kept only
|
|
116
|
+
* the lexicographically-first `cap` paths, and dot-prefixed paths sort
|
|
117
|
+
* ahead of every consumer path — so in any consumer repo whose include
|
|
118
|
+
* set exceeds the cap, the snapshot devolved to mostly `.agents/**`.
|
|
119
|
+
*
|
|
120
|
+
* Algorithm (deterministic, no time/randomness):
|
|
121
|
+
* 1. Group the sorted file list by top-level directory.
|
|
122
|
+
* 2. Round-robin across the groups (in sorted key order), taking one
|
|
123
|
+
* file from each group per pass, until the cap is filled or every
|
|
124
|
+
* group is exhausted. Round-robin gives each top-level tree a fair,
|
|
125
|
+
* proportional share of the budget regardless of its absolute size.
|
|
126
|
+
* 3. Re-sort the selected subset so the emitted `files` array stays in
|
|
127
|
+
* stable lexicographic order (same shape the rest of the pipeline
|
|
128
|
+
* and the golden tests expect).
|
|
129
|
+
*
|
|
130
|
+
* When only one top-level group matches (the Mandrel-repo dogfood case,
|
|
131
|
+
* where `.agents/scripts/**` is the only matching tree), round-robin
|
|
132
|
+
* degenerates to "take the first `cap` from that one group" — identical
|
|
133
|
+
* to the old behaviour, so the Mandrel snapshot stays useful.
|
|
134
|
+
*
|
|
135
|
+
* @param {string[]} sortedFiles - Lexicographically sorted relative paths.
|
|
136
|
+
* @param {number} cap - Maximum number of files to keep.
|
|
137
|
+
* @returns {string[]} The kept subset, lexicographically sorted, length ≤ cap.
|
|
138
|
+
*/
|
|
139
|
+
function proportionalCap(sortedFiles, cap) {
|
|
140
|
+
if (sortedFiles.length <= cap) return sortedFiles;
|
|
141
|
+
const groups = [...groupByTopLevel(sortedFiles).values()];
|
|
142
|
+
const kept = [];
|
|
143
|
+
let exhausted = false;
|
|
144
|
+
for (let pass = 0; !exhausted && kept.length < cap; pass += 1) {
|
|
145
|
+
exhausted = true;
|
|
146
|
+
for (const bucket of groups) {
|
|
147
|
+
if (pass >= bucket.length) continue;
|
|
148
|
+
exhausted = false;
|
|
149
|
+
kept.push(bucket[pass]);
|
|
150
|
+
if (kept.length >= cap) break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
kept.sort();
|
|
154
|
+
return kept;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Resolve the snapshot configuration from a raw `.agentrc.json` block.
|
|
159
|
+
* Defaults fill in every absent field so callers can hand the result
|
|
160
|
+
* straight to `buildCodebaseSnapshot` without further normalisation.
|
|
161
|
+
*
|
|
162
|
+
* @param {object} [raw] - `planning.codebaseSnapshot` block (may be undefined).
|
|
163
|
+
* @returns {{ tier: string, include: string[], exclude: string[], recentCommitWindow: number }}
|
|
164
|
+
*/
|
|
165
|
+
export function resolveSnapshotConfig(raw) {
|
|
166
|
+
const cfg = raw && typeof raw === 'object' ? raw : {};
|
|
167
|
+
const tier = CODEBASE_SNAPSHOT_TIERS.includes(cfg.tier) ? cfg.tier : 'skinny';
|
|
168
|
+
const include =
|
|
169
|
+
Array.isArray(cfg.include) && cfg.include.length > 0
|
|
170
|
+
? cfg.include.map(String)
|
|
171
|
+
: [...DEFAULT_INCLUDE];
|
|
172
|
+
const exclude =
|
|
173
|
+
Array.isArray(cfg.exclude) && cfg.exclude.length > 0
|
|
174
|
+
? cfg.exclude.map(String)
|
|
175
|
+
: [...DEFAULT_EXCLUDE];
|
|
176
|
+
const recentCommitWindow =
|
|
177
|
+
Number.isInteger(cfg.recentCommitWindow) && cfg.recentCommitWindow > 0
|
|
178
|
+
? cfg.recentCommitWindow
|
|
179
|
+
: DEFAULT_RECENT_COMMIT_WINDOW;
|
|
180
|
+
return { tier, include, exclude, recentCommitWindow };
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Compile one glob entry into a per-segment regex. Supports `**`,
|
|
185
|
+
* `*`, and literal segments. Deliberately small — we don't pull
|
|
186
|
+
* `micromatch` so the snapshot stays self-contained.
|
|
187
|
+
*
|
|
188
|
+
* @param {string} glob
|
|
189
|
+
* @returns {RegExp}
|
|
190
|
+
*/
|
|
191
|
+
function compileGlob(glob) {
|
|
192
|
+
const escaped = glob.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
193
|
+
// `**` becomes `.*` (cross-segment), `*` becomes `[^/]*` (single segment).
|
|
194
|
+
// We replace `**` first via a placeholder so the single-`*` rule doesn't
|
|
195
|
+
// chew on its inner stars.
|
|
196
|
+
const pattern = escaped
|
|
197
|
+
.replace(/\*\*/g, 'DOUBLESTAR')
|
|
198
|
+
.replace(/\*/g, '[^/]*')
|
|
199
|
+
.replace(/DOUBLESTAR/g, '.*');
|
|
200
|
+
return new RegExp(`^${pattern}$`);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Compile a list of glob entries to RegExp once. Callers hoist this out
|
|
205
|
+
* of the per-file loop so the snapshot pays the (cheap but non-zero)
|
|
206
|
+
* compilation cost a fixed number of times per `buildCodebaseSnapshot`
|
|
207
|
+
* call — ~13 globs total — rather than recompiling every glob for every
|
|
208
|
+
* tracked file (thousands of RegExp constructions on a real repo).
|
|
209
|
+
*
|
|
210
|
+
* @param {string[]} globs
|
|
211
|
+
* @returns {RegExp[]}
|
|
212
|
+
*/
|
|
213
|
+
function compileGlobs(globs) {
|
|
214
|
+
return globs.map(compileGlob);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Match `path` against any precompiled glob RegExp. Both the candidate
|
|
219
|
+
* and the globs are normalized to forward slashes (the globs at compile
|
|
220
|
+
* time, the candidate here) so Windows callsites see the same shape as
|
|
221
|
+
* POSIX ones.
|
|
222
|
+
*
|
|
223
|
+
* @param {string} candidate
|
|
224
|
+
* @param {RegExp[]} compiledGlobs
|
|
225
|
+
* @returns {boolean}
|
|
226
|
+
*/
|
|
227
|
+
function matchesAny(candidate, compiledGlobs) {
|
|
228
|
+
const normalised = candidate.replace(/\\/g, '/');
|
|
229
|
+
for (const re of compiledGlobs) {
|
|
230
|
+
if (re.test(normalised)) return true;
|
|
231
|
+
}
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* List every tracked file under the repo via `git ls-files`. We avoid
|
|
237
|
+
* a node-level filesystem walk so `.gitignore` is naturally honoured
|
|
238
|
+
* and the snapshot is bounded by what's actually in the repo.
|
|
239
|
+
*
|
|
240
|
+
* Returns an empty array if git fails — non-blocking by design.
|
|
241
|
+
*
|
|
242
|
+
* @param {string} cwd
|
|
243
|
+
* @returns {string[]}
|
|
244
|
+
*/
|
|
245
|
+
function listTrackedFiles(cwd) {
|
|
246
|
+
const result = gitSpawn(cwd, 'ls-files');
|
|
247
|
+
if (result.status !== 0 || typeof result.stdout !== 'string') return [];
|
|
248
|
+
return result.stdout
|
|
249
|
+
.split(/\r?\n/)
|
|
250
|
+
.map((line) => line.trim())
|
|
251
|
+
.filter((line) => line.length > 0);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* List directories touched in the most recent `window` commits. Uses
|
|
256
|
+
* `git log -<N> --name-only` and reduces the result to a unique set
|
|
257
|
+
* of top-two-level directories (so `.agents/scripts/lib/foo.js` →
|
|
258
|
+
* `.agents/scripts/lib`). Caps the response at 25 entries so the
|
|
259
|
+
* field stays readable in the spec-author envelope.
|
|
260
|
+
*
|
|
261
|
+
* @param {string} cwd
|
|
262
|
+
* @param {number} window
|
|
263
|
+
* @returns {string[]}
|
|
264
|
+
*/
|
|
265
|
+
function listRecentlyTouchedDirs(cwd, window) {
|
|
266
|
+
const result = gitSpawn(
|
|
267
|
+
cwd,
|
|
268
|
+
'log',
|
|
269
|
+
`-${window}`,
|
|
270
|
+
'--name-only',
|
|
271
|
+
'--pretty=format:',
|
|
272
|
+
);
|
|
273
|
+
if (result.status !== 0 || typeof result.stdout !== 'string') return [];
|
|
274
|
+
const dirs = new Set();
|
|
275
|
+
for (const raw of result.stdout.split(/\r?\n/)) {
|
|
276
|
+
const file = raw.trim();
|
|
277
|
+
if (file.length === 0) continue;
|
|
278
|
+
const parts = file.replace(/\\/g, '/').split('/');
|
|
279
|
+
if (parts.length < 2) {
|
|
280
|
+
dirs.add(parts[0]);
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
// Top-two-level directory keeps the field useful for a planner
|
|
284
|
+
// ("activity recently concentrated in `.agents/scripts/lib/`")
|
|
285
|
+
// without devolving into a per-file list.
|
|
286
|
+
dirs.add(parts.slice(0, Math.min(3, parts.length - 1)).join('/'));
|
|
287
|
+
}
|
|
288
|
+
const out = [...dirs];
|
|
289
|
+
out.sort();
|
|
290
|
+
return out.slice(0, 25);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Read `package.json` and pull the entries Phase 7 actually needs:
|
|
295
|
+
* declared `exports`, `bin` keys, the `main` entry, and `scripts`
|
|
296
|
+
* names. Returns `{}` when the file is missing or unparsable.
|
|
297
|
+
*
|
|
298
|
+
* @param {string} cwd
|
|
299
|
+
* @returns {object}
|
|
300
|
+
*/
|
|
301
|
+
function readPackageManifestSurface(cwd, logger) {
|
|
302
|
+
const pkgPath = path.join(cwd, 'package.json');
|
|
303
|
+
if (!fs.existsSync(pkgPath)) return {};
|
|
304
|
+
let parsed;
|
|
305
|
+
try {
|
|
306
|
+
parsed = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
307
|
+
} catch (err) {
|
|
308
|
+
logger.debug(
|
|
309
|
+
`[codebase-snapshot] package.json read/parse failed for ${pkgPath}: ${err?.message ?? err}`,
|
|
310
|
+
);
|
|
311
|
+
return {};
|
|
312
|
+
}
|
|
313
|
+
const exportsField = parsed.exports;
|
|
314
|
+
const exportPaths =
|
|
315
|
+
typeof exportsField === 'string'
|
|
316
|
+
? [exportsField]
|
|
317
|
+
: exportsField && typeof exportsField === 'object'
|
|
318
|
+
? Object.keys(exportsField)
|
|
319
|
+
: [];
|
|
320
|
+
const binField = parsed.bin;
|
|
321
|
+
const binNames =
|
|
322
|
+
typeof binField === 'string'
|
|
323
|
+
? [path.basename(binField)]
|
|
324
|
+
: binField && typeof binField === 'object'
|
|
325
|
+
? Object.keys(binField)
|
|
326
|
+
: [];
|
|
327
|
+
return {
|
|
328
|
+
name: typeof parsed.name === 'string' ? parsed.name : null,
|
|
329
|
+
main: typeof parsed.main === 'string' ? parsed.main : null,
|
|
330
|
+
exports: exportPaths,
|
|
331
|
+
bin: binNames,
|
|
332
|
+
scripts:
|
|
333
|
+
parsed.scripts && typeof parsed.scripts === 'object'
|
|
334
|
+
? Object.keys(parsed.scripts)
|
|
335
|
+
: [],
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
const EXPORT_SIGNATURE_RE =
|
|
340
|
+
/^\s*export\s+(?:default\s+(?:async\s+)?(?:function\s*\*?\s*([A-Za-z_$][\w$]*)|class\s+([A-Za-z_$][\w$]*))|(?:async\s+)?function\s*\*?\s*([A-Za-z_$][\w$]*)|class\s+([A-Za-z_$][\w$]*)|(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=)/gm;
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Extract a sorted, deduped list of exported identifiers from one file.
|
|
344
|
+
* Deliberately regex-based (not an AST parse) so the snapshot is cheap.
|
|
345
|
+
*
|
|
346
|
+
* @param {string} body
|
|
347
|
+
* @returns {string[]}
|
|
348
|
+
*/
|
|
349
|
+
function extractExportSignatures(body) {
|
|
350
|
+
const names = new Set();
|
|
351
|
+
EXPORT_SIGNATURE_RE.lastIndex = 0;
|
|
352
|
+
let match = EXPORT_SIGNATURE_RE.exec(body);
|
|
353
|
+
while (match !== null) {
|
|
354
|
+
for (let i = 1; i < match.length; i += 1) {
|
|
355
|
+
if (match[i]) names.add(match[i]);
|
|
356
|
+
}
|
|
357
|
+
match = EXPORT_SIGNATURE_RE.exec(body);
|
|
358
|
+
}
|
|
359
|
+
// Also catch `export { a, b }` patterns separately — the omnibus
|
|
360
|
+
// regex above is busy enough without trying to absorb braces.
|
|
361
|
+
const braceRe = /export\s*\{\s*([^}]+)\s*\}/g;
|
|
362
|
+
let braceMatch = braceRe.exec(body);
|
|
363
|
+
while (braceMatch !== null) {
|
|
364
|
+
for (const piece of braceMatch[1].split(',')) {
|
|
365
|
+
const name = piece.trim().split(/\s+as\s+/)[0];
|
|
366
|
+
if (name && /^[A-Za-z_$][\w$]*$/.test(name)) names.add(name);
|
|
367
|
+
}
|
|
368
|
+
braceMatch = braceRe.exec(body);
|
|
369
|
+
}
|
|
370
|
+
return [...names].sort();
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Build the medium-tier signature map. Walks every tracked file that
|
|
375
|
+
* matches the include/exclude globs and pulls export names from each
|
|
376
|
+
* `.js` / `.ts` body. Skips files larger than 64 KiB so an accidentally
|
|
377
|
+
* checked-in bundle can't blow the snapshot budget.
|
|
378
|
+
*
|
|
379
|
+
* @param {string} cwd
|
|
380
|
+
* @param {string[]} tracked
|
|
381
|
+
* @returns {Array<{ path: string, exports: string[] }>}
|
|
382
|
+
*/
|
|
383
|
+
function collectSignatures(cwd, tracked, logger) {
|
|
384
|
+
const out = [];
|
|
385
|
+
for (const rel of tracked) {
|
|
386
|
+
const ext = path.extname(rel).toLowerCase();
|
|
387
|
+
if (!SIGNATURE_FILE_EXTS.has(ext)) continue;
|
|
388
|
+
const abs = path.join(cwd, rel);
|
|
389
|
+
let stat;
|
|
390
|
+
try {
|
|
391
|
+
stat = fs.statSync(abs);
|
|
392
|
+
} catch (err) {
|
|
393
|
+
logger.debug(
|
|
394
|
+
`[codebase-snapshot] stat failed for ${abs}: ${err?.message ?? err}`,
|
|
395
|
+
);
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
if (stat.size > 64 * 1024) continue;
|
|
399
|
+
let body;
|
|
400
|
+
try {
|
|
401
|
+
body = fs.readFileSync(abs, 'utf8');
|
|
402
|
+
} catch (err) {
|
|
403
|
+
logger.debug(
|
|
404
|
+
`[codebase-snapshot] readFile failed for ${abs}: ${err?.message ?? err}`,
|
|
405
|
+
);
|
|
406
|
+
continue;
|
|
407
|
+
}
|
|
408
|
+
const exports = extractExportSignatures(body);
|
|
409
|
+
if (exports.length === 0) continue;
|
|
410
|
+
out.push({ path: rel.replace(/\\/g, '/'), exports });
|
|
411
|
+
}
|
|
412
|
+
return out;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Detect the project's test framework + BDD feature root by reading
|
|
417
|
+
* `package.json` scripts and probing well-known directories. Returns
|
|
418
|
+
* a `{ runner, featureRoots }` envelope that the Architect can cite
|
|
419
|
+
* directly when authoring acceptance criteria.
|
|
420
|
+
*
|
|
421
|
+
* @param {string} cwd
|
|
422
|
+
* @param {{ scripts: string[] }} pkg
|
|
423
|
+
* @returns {{ runner: string|null, featureRoots: string[] }}
|
|
424
|
+
*/
|
|
425
|
+
function detectTestSurface(cwd, pkg) {
|
|
426
|
+
let runner = null;
|
|
427
|
+
if (Array.isArray(pkg.scripts)) {
|
|
428
|
+
if (pkg.scripts.includes('test')) runner = 'npm test';
|
|
429
|
+
}
|
|
430
|
+
// Probe canonical BDD feature locations. The actual scanner that
|
|
431
|
+
// Story #2637 will land does a more thorough scan; the snapshot
|
|
432
|
+
// just records the root so the Architect can cite it.
|
|
433
|
+
const featureRoots = [];
|
|
434
|
+
for (const candidate of ['tests/features', 'features']) {
|
|
435
|
+
if (fs.existsSync(path.join(cwd, candidate))) featureRoots.push(candidate);
|
|
436
|
+
}
|
|
437
|
+
return { runner, featureRoots };
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Build the codebase snapshot. Pure with respect to the args (no
|
|
442
|
+
* environment reads beyond the explicit `cwd`); never throws.
|
|
443
|
+
*
|
|
444
|
+
* @param {object} opts
|
|
445
|
+
* @param {string} [opts.cwd] - Repo root (defaults to process.cwd()).
|
|
446
|
+
* @param {string} [opts.tier] - `skinny` | `medium`.
|
|
447
|
+
* @param {string[]} [opts.include] - Glob allowlist.
|
|
448
|
+
* @param {string[]} [opts.exclude] - Glob blocklist (applied after include).
|
|
449
|
+
* @param {number} [opts.recentCommitWindow] - How many recent commits to scan.
|
|
450
|
+
* @returns {{
|
|
451
|
+
* tier: string,
|
|
452
|
+
* generatedAt: string,
|
|
453
|
+
* pkg: object,
|
|
454
|
+
* files: string[],
|
|
455
|
+
* recentlyTouched: string[],
|
|
456
|
+
* testSurface: { runner: string|null, featureRoots: string[] },
|
|
457
|
+
* signatures: Array<{ path: string, exports: string[] }> | null,
|
|
458
|
+
* }}
|
|
459
|
+
*/
|
|
460
|
+
export function buildCodebaseSnapshot(opts = {}) {
|
|
461
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
462
|
+
const logger = opts.logger ?? Logger;
|
|
463
|
+
const cfg = resolveSnapshotConfig({
|
|
464
|
+
tier: opts.tier,
|
|
465
|
+
include: opts.include,
|
|
466
|
+
exclude: opts.exclude,
|
|
467
|
+
recentCommitWindow: opts.recentCommitWindow,
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
const tracked = listTrackedFiles(cwd);
|
|
471
|
+
// Compile the include/exclude globs to RegExp exactly once per call
|
|
472
|
+
// (memoized here, hoisted out of the per-file loop) so a repo with
|
|
473
|
+
// thousands of tracked files doesn't trigger thousands of RegExp
|
|
474
|
+
// constructions. See `compileGlobs`.
|
|
475
|
+
const includeRes = compileGlobs(cfg.include);
|
|
476
|
+
const excludeRes = compileGlobs(cfg.exclude);
|
|
477
|
+
const filtered = tracked.filter(
|
|
478
|
+
(f) => matchesAny(f, includeRes) && !matchesAny(f, excludeRes),
|
|
479
|
+
);
|
|
480
|
+
filtered.sort();
|
|
481
|
+
|
|
482
|
+
const pkg = readPackageManifestSurface(cwd, logger);
|
|
483
|
+
const recentlyTouched = listRecentlyTouchedDirs(cwd, cfg.recentCommitWindow);
|
|
484
|
+
const testSurface = detectTestSurface(cwd, pkg);
|
|
485
|
+
|
|
486
|
+
let displayFiles = filtered;
|
|
487
|
+
let truncated = false;
|
|
488
|
+
if (cfg.tier === 'skinny' && filtered.length > MAX_FILES_SKINNY) {
|
|
489
|
+
// Proportional per-top-level-dir budgeting (not a flat lexicographic
|
|
490
|
+
// slice) so consumer source survives the cap even when a dot-prefixed
|
|
491
|
+
// tree like `.agents/scripts/**` sorts ahead of it. See `proportionalCap`.
|
|
492
|
+
displayFiles = proportionalCap(filtered, MAX_FILES_SKINNY);
|
|
493
|
+
truncated = true;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
const snapshot = {
|
|
497
|
+
tier: cfg.tier,
|
|
498
|
+
generatedAt: new Date().toISOString(),
|
|
499
|
+
pkg,
|
|
500
|
+
files: displayFiles,
|
|
501
|
+
fileCount: filtered.length,
|
|
502
|
+
truncated,
|
|
503
|
+
recentlyTouched,
|
|
504
|
+
testSurface,
|
|
505
|
+
signatures: null,
|
|
506
|
+
};
|
|
507
|
+
|
|
508
|
+
if (cfg.tier === 'medium') {
|
|
509
|
+
snapshot.signatures = collectSignatures(cwd, filtered, logger);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
return snapshot;
|
|
513
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// .agents/scripts/lib/command-header.js
|
|
2
|
+
/**
|
|
3
|
+
* Pure helper for projecting workflow `.md` files into slash commands:
|
|
4
|
+
* injects the AUTO-GENERATED provenance header without disturbing YAML
|
|
5
|
+
* frontmatter placement.
|
|
6
|
+
*
|
|
7
|
+
* Kept as its own module (rather than inline in `sync-claude-commands.js`,
|
|
8
|
+
* which runs its sync at import time via top-level await) so it can be unit
|
|
9
|
+
* tested directly.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Inject `header` into a workflow's `content`. When the source begins with a
|
|
14
|
+
* YAML frontmatter block, the header is inserted **after** the closing `---`
|
|
15
|
+
* so the frontmatter stays on line 1; sources without frontmatter keep the
|
|
16
|
+
* header prepended verbatim.
|
|
17
|
+
*
|
|
18
|
+
* Claude Code only parses a command's frontmatter (its `description`) when the
|
|
19
|
+
* `---` block is the very first thing in the file. Prepending the HTML comment
|
|
20
|
+
* above it made `claude plugin validate` report "No frontmatter block found"
|
|
21
|
+
* for every command and silently dropped all descriptions.
|
|
22
|
+
*
|
|
23
|
+
* @param {string} content - Raw workflow `.md` content.
|
|
24
|
+
* @param {string} header - Provenance header to inject (typically ends `\n\n`).
|
|
25
|
+
* @returns {string}
|
|
26
|
+
*/
|
|
27
|
+
export function applyHeader(content, header) {
|
|
28
|
+
const frontmatter = content.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n/);
|
|
29
|
+
if (!frontmatter) return header + content;
|
|
30
|
+
const block = frontmatter[0];
|
|
31
|
+
const body = content.slice(block.length).replace(/^\r?\n/, '');
|
|
32
|
+
return `${block}\n${header}${body}`;
|
|
33
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Acceptance self-eval accessor (Story #3819).
|
|
3
|
+
*
|
|
4
|
+
* Resolves `.agentrc.json → delivery.acceptanceEval` into the canonical
|
|
5
|
+
* shape the per-Story acceptance self-eval loop consumes. The loop scores
|
|
6
|
+
* the working diff against each inline `acceptance[]` item, redrafts the
|
|
7
|
+
* unmet items, and re-evaluates — capped at `maxRounds` redraft rounds,
|
|
8
|
+
* then escalates to `agent::blocked` when criteria remain unmet.
|
|
9
|
+
*
|
|
10
|
+
* ## The undisableable cap
|
|
11
|
+
*
|
|
12
|
+
* `maxRounds` is operator-tunable, but the cap itself can never be turned
|
|
13
|
+
* off. Two invariants enforce the open-loop token-burn guard:
|
|
14
|
+
*
|
|
15
|
+
* 1. A configured value is clamped into
|
|
16
|
+
* `[1, ACCEPTANCE_EVAL_MAX_ROUNDS_CEILING]`. `maxRounds: 0` (which
|
|
17
|
+
* would disable the loop) clamps up to 1; a pathological
|
|
18
|
+
* `maxRounds: 9999` clamps down to the ceiling.
|
|
19
|
+
* 2. Non-integer / non-finite / missing values fall back to the
|
|
20
|
+
* documented default. The AJV schema already rejects `maxRounds < 1`
|
|
21
|
+
* and non-integers before they reach this accessor, but the resolver
|
|
22
|
+
* stays defensive so unit-test fixtures and degraded configs never
|
|
23
|
+
* produce an unbounded or zero-round loop.
|
|
24
|
+
*
|
|
25
|
+
* There is intentionally no `enabled` flag — the loop is a hard cutover
|
|
26
|
+
* (always on) per `rules/git-conventions.md` (no parallel old-shape path,
|
|
27
|
+
* no toggle between "loop" and "no loop").
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Default redraft-round ceiling applied when `.agentrc.json` omits
|
|
32
|
+
* `delivery.acceptanceEval.maxRounds`. Frozen so downstream callers cannot
|
|
33
|
+
* mutate the resolver's defaults across processes.
|
|
34
|
+
*
|
|
35
|
+
* Keep in lockstep with the schema mirror in
|
|
36
|
+
* `agentrc.schema.json → $defs.acceptanceEval` and the AJV schema in
|
|
37
|
+
* `config-settings-schema-delivery.js → ACCEPTANCE_EVAL_SCHEMA`.
|
|
38
|
+
*/
|
|
39
|
+
export const ACCEPTANCE_EVAL_DEFAULTS = Object.freeze({
|
|
40
|
+
maxRounds: 2,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Hard, undisableable ceiling on the number of redraft rounds. No
|
|
45
|
+
* configuration can exceed this value — it is the open-loop token-burn
|
|
46
|
+
* guard. A configured `maxRounds` larger than the ceiling is clamped down
|
|
47
|
+
* to it.
|
|
48
|
+
*
|
|
49
|
+
* @type {number}
|
|
50
|
+
*/
|
|
51
|
+
export const ACCEPTANCE_EVAL_MAX_ROUNDS_CEILING = 5;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Clamp a candidate round count into the inviolable `[1, ceiling]` range.
|
|
55
|
+
* Non-integer / non-finite inputs fall back to the documented default.
|
|
56
|
+
*
|
|
57
|
+
* @param {unknown} value
|
|
58
|
+
* @param {number} fallback
|
|
59
|
+
* @returns {number}
|
|
60
|
+
*/
|
|
61
|
+
function clampRounds(value, fallback) {
|
|
62
|
+
const candidate =
|
|
63
|
+
typeof value === 'number' && Number.isInteger(value) ? value : fallback;
|
|
64
|
+
if (candidate < 1) return 1;
|
|
65
|
+
if (candidate > ACCEPTANCE_EVAL_MAX_ROUNDS_CEILING) {
|
|
66
|
+
return ACCEPTANCE_EVAL_MAX_ROUNDS_CEILING;
|
|
67
|
+
}
|
|
68
|
+
return candidate;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Read the merged acceptance-eval block. Returns the canonical shape:
|
|
73
|
+
*
|
|
74
|
+
* {
|
|
75
|
+
* maxRounds: number, // clamped into [1, ceiling]
|
|
76
|
+
* ceiling: number, // the undisableable hard cap
|
|
77
|
+
* }
|
|
78
|
+
*
|
|
79
|
+
* `maxRounds` is always a positive integer no greater than `ceiling`,
|
|
80
|
+
* regardless of what the resolved config carried.
|
|
81
|
+
*
|
|
82
|
+
* @param {object | null | undefined} config
|
|
83
|
+
* @returns {{ maxRounds: number, ceiling: number }}
|
|
84
|
+
*/
|
|
85
|
+
export function getAcceptanceEval(config) {
|
|
86
|
+
const user = config?.delivery?.acceptanceEval ?? {};
|
|
87
|
+
const maxRounds = clampRounds(
|
|
88
|
+
user.maxRounds,
|
|
89
|
+
ACCEPTANCE_EVAL_DEFAULTS.maxRounds,
|
|
90
|
+
);
|
|
91
|
+
return {
|
|
92
|
+
maxRounds,
|
|
93
|
+
ceiling: ACCEPTANCE_EVAL_MAX_ROUNDS_CEILING,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `delivery.quality.baselines` accessor (Epic #1720 Story #1737 — per-gate
|
|
3
|
+
* baselines). Every gate now carries its own `baselinePath` under
|
|
4
|
+
* `delivery.quality.gates.<tier>.baselinePath`. This module preserves the
|
|
5
|
+
* historical `{ lint, crap, maintainability }` envelope so existing call
|
|
6
|
+
* sites that read `getBaselines(config).lint.path` keep working.
|
|
7
|
+
* `refreshCommand` is no longer carried per-baseline — it stays in the
|
|
8
|
+
* envelope as `null` for shape stability.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export const BASELINES_DEFAULTS = Object.freeze({
|
|
12
|
+
lint: Object.freeze({ path: 'baselines/lint.json', refreshCommand: null }),
|
|
13
|
+
crap: Object.freeze({ path: 'baselines/crap.json', refreshCommand: null }),
|
|
14
|
+
maintainability: Object.freeze({
|
|
15
|
+
path: 'baselines/maintainability.json',
|
|
16
|
+
refreshCommand: null,
|
|
17
|
+
}),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Read the per-gate baseline paths and surface them under the historical
|
|
22
|
+
* flat envelope. Accepts the full resolved config — the canonical
|
|
23
|
+
* `delivery.quality.gates` path is the single supported shape.
|
|
24
|
+
*
|
|
25
|
+
* @param {object | null | undefined} config
|
|
26
|
+
* @returns {{ lint: { path: string, refreshCommand: null }, crap: { path: string, refreshCommand: null }, maintainability: { path: string, refreshCommand: null } }}
|
|
27
|
+
*/
|
|
28
|
+
export function getBaselines(config) {
|
|
29
|
+
const gates = config?.delivery?.quality?.gates ?? {};
|
|
30
|
+
const merge = (key) => {
|
|
31
|
+
const fallback = BASELINES_DEFAULTS[key];
|
|
32
|
+
const path = gates[key]?.baselinePath ?? fallback.path;
|
|
33
|
+
return { path, refreshCommand: null };
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
lint: merge('lint'),
|
|
37
|
+
crap: merge('crap'),
|
|
38
|
+
maintainability: merge('maintainability'),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Legacy entry point retained for backward-compatible imports. Story #1737
|
|
44
|
+
* retired the standalone `baselines.*` block; this helper now translates
|
|
45
|
+
* `{ lint: { path }, ... }` input onto synthetic `gates.<tier>.baselinePath`.
|
|
46
|
+
*
|
|
47
|
+
* @param {object|undefined} userBlock
|
|
48
|
+
*/
|
|
49
|
+
export function resolveBaselines(userBlock) {
|
|
50
|
+
const block = userBlock ?? {};
|
|
51
|
+
return getBaselines({
|
|
52
|
+
quality: {
|
|
53
|
+
gates: {
|
|
54
|
+
lint: { baselinePath: block.lint?.path },
|
|
55
|
+
crap: { baselinePath: block.crap?.path },
|
|
56
|
+
maintainability: { baselinePath: block.maintainability?.path },
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|