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,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* story-init-not-backgrounded — refuse-and-print check.
|
|
3
|
+
*
|
|
4
|
+
* Detects orchestration call sites that invoke `story-init.js` via the
|
|
5
|
+
* Bash tool's `run_in_background: true` mode (with subsequent `Monitor`
|
|
6
|
+
* waiting on completion) instead of a synchronous Bash call with a
|
|
7
|
+
* 10-minute timeout. This guards the failure mode where `Monitor`'s wait
|
|
8
|
+
* is not equivalent to script exit — a sub-agent that exits during a
|
|
9
|
+
* Monitor wait kills `story-init.js` mid-batch, leaving a half-initialized
|
|
10
|
+
* worktree and a failed wave aggregator.
|
|
11
|
+
*
|
|
12
|
+
* Scope: 'epic-deliver', 'story-close', 'retro'. The check runs at every
|
|
13
|
+
* preflight surface that has the opportunity to invoke story-init —
|
|
14
|
+
* primarily `epic-deliver`'s wave loop — and surfaces as a retro audit
|
|
15
|
+
* signal if the failure mode resurfaces during a sprint.
|
|
16
|
+
*
|
|
17
|
+
* The check is `refuse-and-print`. Auto-rewriting an orchestration call
|
|
18
|
+
* site would change runtime behavior on a script the operator may be
|
|
19
|
+
* actively iterating on; the fixCommand prints the canonical
|
|
20
|
+
* synchronous-call replacement pattern so they can apply it deliberately.
|
|
21
|
+
*
|
|
22
|
+
* Implementation note: we scan `.agents/` (markdown + js) for the
|
|
23
|
+
* juxtaposition of a `story-init.js` reference and a backgrounding token
|
|
24
|
+
* (`run_in_background: true`, the literal `Monitor` tool name as a
|
|
25
|
+
* fan-out target, or `&` shell backgrounding) within a small line window.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
29
|
+
import path from 'node:path';
|
|
30
|
+
|
|
31
|
+
const SCAN_ROOT_DEFAULT = '.agents';
|
|
32
|
+
const WINDOW_LINES = 20;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Backgrounding tokens. We only match shapes that are unambiguously
|
|
36
|
+
* *invocation* syntax, never narrative prose like "do not use Monitor"
|
|
37
|
+
* (which legitimately appears in docs warning against the antipattern).
|
|
38
|
+
*
|
|
39
|
+
* - `run_in_background: true` — Bash tool's backgrounding flag.
|
|
40
|
+
* - `detached: true` — child_process.spawn options that detach the
|
|
41
|
+
* subprocess from the parent's lifecycle, equivalent to backgrounding.
|
|
42
|
+
* - `story-init.js &` — POSIX shell ampersand backgrounding.
|
|
43
|
+
*/
|
|
44
|
+
const BACKGROUND_TOKENS = [
|
|
45
|
+
/run_in_background\s*:\s*true/,
|
|
46
|
+
/detached\s*:\s*true/,
|
|
47
|
+
/story-init\.js[^\n`]*[ \t]&[ \t]*(?:#|$)/m,
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Walk a directory recursively, yielding absolute file paths for `.js`
|
|
52
|
+
* and `.md` sources. Skips `node_modules`, `.worktrees`, and directories
|
|
53
|
+
* starting with `.git`.
|
|
54
|
+
*
|
|
55
|
+
* @param {string} dir
|
|
56
|
+
* @returns {string[]}
|
|
57
|
+
*/
|
|
58
|
+
function walkSources(dir) {
|
|
59
|
+
const out = [];
|
|
60
|
+
let entries;
|
|
61
|
+
try {
|
|
62
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
63
|
+
} catch {
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
for (const entry of entries) {
|
|
67
|
+
const full = path.join(dir, entry.name);
|
|
68
|
+
if (entry.isDirectory()) {
|
|
69
|
+
if (
|
|
70
|
+
entry.name === 'node_modules' ||
|
|
71
|
+
entry.name === '.worktrees' ||
|
|
72
|
+
entry.name.startsWith('.git')
|
|
73
|
+
) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
out.push(...walkSources(full));
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (!entry.isFile()) continue;
|
|
80
|
+
if (!/\.(js|mjs|cjs|md)$/.test(entry.name)) continue;
|
|
81
|
+
out.push(full);
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* For one file, return an array of `{ line, kind }` offences: every line
|
|
88
|
+
* referencing `story-init.js` that has a backgrounding token in the same
|
|
89
|
+
* ±WINDOW_LINES window.
|
|
90
|
+
*
|
|
91
|
+
* The check explicitly excludes the `story-init.js` file itself and any
|
|
92
|
+
* dedicated check module (this file): the source-of-truth implementation
|
|
93
|
+
* legitimately mentions itself.
|
|
94
|
+
*
|
|
95
|
+
* @param {string} file
|
|
96
|
+
* @param {string} src
|
|
97
|
+
* @returns {Array<{ line: number, kind: string }>}
|
|
98
|
+
*/
|
|
99
|
+
function scanFile(file, src) {
|
|
100
|
+
const offences = [];
|
|
101
|
+
// Don't flag the actual story-init script, self-references, or the
|
|
102
|
+
// parallel-tooling helper — the helper documents both Rule 2
|
|
103
|
+
// (run_in_background) and the story-init.js anti-pattern in adjacent
|
|
104
|
+
// bullets, which collides with the scanner's ±20-line window even
|
|
105
|
+
// though there is no real invocation in the prose.
|
|
106
|
+
const basename = path.basename(file);
|
|
107
|
+
if (
|
|
108
|
+
basename === 'story-init.js' ||
|
|
109
|
+
basename === 'story-init-not-backgrounded.js' ||
|
|
110
|
+
basename === 'story-init-not-backgrounded.test.js' ||
|
|
111
|
+
basename === 'parallel-tooling.md'
|
|
112
|
+
) {
|
|
113
|
+
return offences;
|
|
114
|
+
}
|
|
115
|
+
const lines = src.split(/\r?\n/);
|
|
116
|
+
for (let i = 0; i < lines.length; i++) {
|
|
117
|
+
if (!/story-init\.js/.test(lines[i])) continue;
|
|
118
|
+
const start = Math.max(0, i - WINDOW_LINES);
|
|
119
|
+
const end = Math.min(lines.length, i + WINDOW_LINES + 1);
|
|
120
|
+
const window = lines.slice(start, end).join('\n');
|
|
121
|
+
for (const tok of BACKGROUND_TOKENS) {
|
|
122
|
+
if (tok.test(window)) {
|
|
123
|
+
offences.push({ line: i + 1, kind: tok.source });
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return offences;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const FIX_COMMAND = [
|
|
132
|
+
'# Invoke story-init.js synchronously with a 10-minute timeout. The',
|
|
133
|
+
'# script is idempotent on partial state, so re-running after a',
|
|
134
|
+
'# half-initialized worktree is safe — but blocking on the Bash call',
|
|
135
|
+
'# is what prevents the half-init state in the first place.',
|
|
136
|
+
'#',
|
|
137
|
+
'# Replacement pattern (Bash tool):',
|
|
138
|
+
'# Bash(timeout: 600000, command: "node .agents/scripts/story-init.js --story <id>")',
|
|
139
|
+
'#',
|
|
140
|
+
'# Do NOT use:',
|
|
141
|
+
'# Bash(run_in_background: true, ...) + Monitor(...)',
|
|
142
|
+
].join('\n');
|
|
143
|
+
|
|
144
|
+
export default {
|
|
145
|
+
id: 'story-init-not-backgrounded',
|
|
146
|
+
severity: 'blocker',
|
|
147
|
+
scope: ['epic-deliver', 'story-close', 'retro'],
|
|
148
|
+
autoCorrect: 'refuse-and-print',
|
|
149
|
+
|
|
150
|
+
detect(state) {
|
|
151
|
+
const cwd = state?.cwd ?? process.cwd();
|
|
152
|
+
const root = state?.scanRoot ?? path.join(cwd, SCAN_ROOT_DEFAULT);
|
|
153
|
+
const files = walkSources(root);
|
|
154
|
+
const offences = [];
|
|
155
|
+
for (const file of files) {
|
|
156
|
+
let src;
|
|
157
|
+
try {
|
|
158
|
+
src = readFileSync(file, 'utf8');
|
|
159
|
+
} catch {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (!/story-init\.js/.test(src)) continue;
|
|
163
|
+
const fileOffences = scanFile(file, src);
|
|
164
|
+
for (const o of fileOffences) {
|
|
165
|
+
offences.push({
|
|
166
|
+
file: path.relative(root, file).replace(/\\/g, '/'),
|
|
167
|
+
line: o.line,
|
|
168
|
+
kind: o.kind,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (offences.length === 0) return null;
|
|
173
|
+
const detail = offences
|
|
174
|
+
.map((o) => `${o.file}:${o.line} — backgrounding token /${o.kind}/`)
|
|
175
|
+
.join('\n');
|
|
176
|
+
return {
|
|
177
|
+
id: 'story-init-not-backgrounded',
|
|
178
|
+
severity: 'blocker',
|
|
179
|
+
scope: state?.scope ?? 'epic-deliver',
|
|
180
|
+
summary: `${offences.length} orchestration call site(s) invoke story-init.js with Monitor backgrounding`,
|
|
181
|
+
detail,
|
|
182
|
+
fixCommand: FIX_COMMAND,
|
|
183
|
+
autoCorrectable: false,
|
|
184
|
+
};
|
|
185
|
+
},
|
|
186
|
+
};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* subagent-agent-tool-required — refuse-and-print check.
|
|
3
|
+
*
|
|
4
|
+
* Detects sub-agent workflow definitions that declare access to the
|
|
5
|
+
* `Agent` tool (or otherwise document nested Agent dispatch). Nested
|
|
6
|
+
* Agent dispatch is not supported in this Claude Code, so any
|
|
7
|
+
* wave-runner-as-sub-agent or cascading fan-out design that declares
|
|
8
|
+
* `Agent` in its tool list will silently fail at runtime. The remediation
|
|
9
|
+
* is to flatten the fan-out back to the host agent and run sub-agents at
|
|
10
|
+
* one level only.
|
|
11
|
+
*
|
|
12
|
+
* Scope: 'epic-deliver', 'retro'. Surfaces as a blocker at preflight for
|
|
13
|
+
* `epic-deliver` (the fan-out site) and as audit signal at retro.
|
|
14
|
+
*
|
|
15
|
+
* The check is `refuse-and-print` — auto-rewriting a workflow's tool
|
|
16
|
+
* list would silently change runtime behavior in ways the operator may
|
|
17
|
+
* not have intended (the workflow's logic may depend on the missing
|
|
18
|
+
* tool). The fixCommand cites the flatten-fan-out remediation pattern.
|
|
19
|
+
*
|
|
20
|
+
* Implementation note: we scan `.agents/workflows/*.md` for workflow
|
|
21
|
+
* files whose frontmatter or body identifies them as a sub-agent role
|
|
22
|
+
* AND whose `tools:` declaration includes `Agent`. The marker for
|
|
23
|
+
* "sub-agent" is the phrase `sub-agent` appearing in the description /
|
|
24
|
+
* overview region. This keeps the check stable while the workflow
|
|
25
|
+
* surface evolves — the project doesn't yet have a structured
|
|
26
|
+
* `role: sub-agent` frontmatter field, and the textual marker is what
|
|
27
|
+
* the human contributors actually grep for.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
31
|
+
import path from 'node:path';
|
|
32
|
+
|
|
33
|
+
const WORKFLOWS_DIR_DEFAULT = path.join('.agents', 'workflows');
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Walk a workflow directory and return absolute `.md` file paths
|
|
37
|
+
* (non-recursive — the workflows surface is one level deep; helpers/
|
|
38
|
+
* sub-directory holds procedural modules that are not invoked as
|
|
39
|
+
* sub-agents in their own right).
|
|
40
|
+
*
|
|
41
|
+
* @param {string} dir
|
|
42
|
+
* @returns {string[]}
|
|
43
|
+
*/
|
|
44
|
+
function listWorkflowFiles(dir) {
|
|
45
|
+
let entries;
|
|
46
|
+
try {
|
|
47
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
48
|
+
} catch {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
return entries
|
|
52
|
+
.filter((e) => e.isFile() && e.name.endsWith('.md'))
|
|
53
|
+
.map((e) => path.join(dir, e.name));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Extract the frontmatter block (between leading `---` lines) and the
|
|
58
|
+
* body. Returns `{ frontmatter, body }` strings (either may be empty).
|
|
59
|
+
*
|
|
60
|
+
* @param {string} src
|
|
61
|
+
* @returns {{ frontmatter: string, body: string }}
|
|
62
|
+
*/
|
|
63
|
+
function splitFrontmatter(src) {
|
|
64
|
+
if (!src.startsWith('---')) return { frontmatter: '', body: src };
|
|
65
|
+
const end = src.indexOf('\n---', 3);
|
|
66
|
+
if (end === -1) return { frontmatter: '', body: src };
|
|
67
|
+
const frontmatter = src.slice(3, end);
|
|
68
|
+
// Skip past the closing `---` and the trailing newline.
|
|
69
|
+
const bodyStart = src.indexOf('\n', end + 4);
|
|
70
|
+
const body = bodyStart === -1 ? '' : src.slice(bodyStart + 1);
|
|
71
|
+
return { frontmatter, body };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* True if the workflow document declares itself as a sub-agent. We
|
|
76
|
+
* accept either the literal phrase `sub-agent` in the
|
|
77
|
+
* description/overview region or the explicit phrase `runs as a
|
|
78
|
+
* sub-agent`. The marker has to appear early in the document — past
|
|
79
|
+
* the first ~100 lines we treat the mention as historical context
|
|
80
|
+
* rather than a role declaration.
|
|
81
|
+
*
|
|
82
|
+
* @param {string} src
|
|
83
|
+
* @returns {boolean}
|
|
84
|
+
*/
|
|
85
|
+
function isSubAgentWorkflow(src) {
|
|
86
|
+
const head = src.split(/\r?\n/).slice(0, 100).join('\n');
|
|
87
|
+
return /\bsub-agent\b/.test(head);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Inspect a workflow's `tools:` declaration (frontmatter OR inline body
|
|
92
|
+
* note) for an `Agent` entry. Returns the offending textual fragment
|
|
93
|
+
* (for the finding's detail field), or `null` if no `Agent` tool is
|
|
94
|
+
* declared.
|
|
95
|
+
*
|
|
96
|
+
* @param {{ frontmatter: string, body: string }} parts
|
|
97
|
+
* @returns {string | null}
|
|
98
|
+
*/
|
|
99
|
+
function findAgentToolDeclaration(parts) {
|
|
100
|
+
const { frontmatter, body } = parts;
|
|
101
|
+
// Frontmatter YAML — match either `tools: [..., Agent, ...]` (flow
|
|
102
|
+
// style) or block style with `- Agent`.
|
|
103
|
+
const flowMatch = frontmatter.match(/tools\s*:\s*\[(.*?)\]/s);
|
|
104
|
+
if (flowMatch && /\bAgent\b/.test(flowMatch[1])) {
|
|
105
|
+
return `frontmatter tools: ${flowMatch[0].slice(0, 120)}`;
|
|
106
|
+
}
|
|
107
|
+
// Block-style: `tools:` followed by `- item` lines. Use `m` flag and
|
|
108
|
+
// tolerate the trailing item line having no newline before the
|
|
109
|
+
// frontmatter terminator.
|
|
110
|
+
const blockMatch = frontmatter.match(
|
|
111
|
+
/tools\s*:\s*\n((?:[ \t]*-[ \t]*[^\n]+\n?)+)/,
|
|
112
|
+
);
|
|
113
|
+
if (blockMatch && /^[ \t]*-[ \t]*Agent\b/m.test(blockMatch[1])) {
|
|
114
|
+
return `frontmatter tools (block): ${blockMatch[0].split('\n')[0]}`;
|
|
115
|
+
}
|
|
116
|
+
// Body: same shape, e.g. operators sometimes document the tool list
|
|
117
|
+
// in a "## Tools" section. We accept either of the YAML shapes
|
|
118
|
+
// appearing in fenced code or inline.
|
|
119
|
+
const bodyFlow = body.match(/tools\s*:\s*\[(.*?)\]/s);
|
|
120
|
+
if (bodyFlow && /\bAgent\b/.test(bodyFlow[1])) {
|
|
121
|
+
return `body tools: ${bodyFlow[0].slice(0, 120)}`;
|
|
122
|
+
}
|
|
123
|
+
const bodyBlock = body.match(/tools\s*:\s*\n((?:\s*-\s*[^\n]+\n)+)/);
|
|
124
|
+
if (bodyBlock && /^\s*-\s*Agent\b/m.test(bodyBlock[1])) {
|
|
125
|
+
return `body tools (block): ${bodyBlock[0].split('\n')[0]}`;
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const FIX_COMMAND = [
|
|
131
|
+
'# Flatten fan-out to the host. Sub-agents cannot dispatch other agents.',
|
|
132
|
+
"# Remove the `Agent` entry from this workflow's `tools:` declaration,",
|
|
133
|
+
'# move any fan-out logic up to the parent / host invocation, and have',
|
|
134
|
+
'# the parent dispatch the leaf sub-agents directly.',
|
|
135
|
+
'#',
|
|
136
|
+
'# Pattern (host workflow):',
|
|
137
|
+
'# for each child: Agent(prompt=<child workflow>, args=<id>)',
|
|
138
|
+
'#',
|
|
139
|
+
'# Pattern (sub-agent workflow):',
|
|
140
|
+
'# tools: [Bash, Read, Edit, Grep, Glob, Write] # NO Agent',
|
|
141
|
+
].join('\n');
|
|
142
|
+
|
|
143
|
+
export default {
|
|
144
|
+
id: 'subagent-agent-tool-required',
|
|
145
|
+
severity: 'blocker',
|
|
146
|
+
scope: ['epic-deliver', 'retro'],
|
|
147
|
+
autoCorrect: 'refuse-and-print',
|
|
148
|
+
|
|
149
|
+
detect(state) {
|
|
150
|
+
const cwd = state?.cwd ?? process.cwd();
|
|
151
|
+
const root = state?.scanRoot ?? path.join(cwd, WORKFLOWS_DIR_DEFAULT);
|
|
152
|
+
const files = listWorkflowFiles(root);
|
|
153
|
+
const offences = [];
|
|
154
|
+
for (const file of files) {
|
|
155
|
+
let src;
|
|
156
|
+
try {
|
|
157
|
+
src = readFileSync(file, 'utf8');
|
|
158
|
+
} catch {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (!isSubAgentWorkflow(src)) continue;
|
|
162
|
+
const parts = splitFrontmatter(src);
|
|
163
|
+
const where = findAgentToolDeclaration(parts);
|
|
164
|
+
if (!where) continue;
|
|
165
|
+
offences.push({
|
|
166
|
+
file: path.relative(root, file).replace(/\\/g, '/'),
|
|
167
|
+
where,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
if (offences.length === 0) return null;
|
|
171
|
+
const detail = offences.map((o) => `${o.file} — ${o.where}`).join('\n');
|
|
172
|
+
return {
|
|
173
|
+
id: 'subagent-agent-tool-required',
|
|
174
|
+
severity: 'blocker',
|
|
175
|
+
scope: state?.scope ?? 'epic-deliver',
|
|
176
|
+
summary: `${offences.length} sub-agent workflow(s) declare Agent in their tool list — nested Agent dispatch is unsupported`,
|
|
177
|
+
detail,
|
|
178
|
+
fixCommand: FIX_COMMAND,
|
|
179
|
+
autoCorrectable: false,
|
|
180
|
+
};
|
|
181
|
+
},
|
|
182
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* windows-coverage-noise-floor — refuse-and-print warning check.
|
|
3
|
+
*
|
|
4
|
+
* Detects coverage-gate deltas that are within the Windows / Node-22
|
|
5
|
+
* noise floor — i.e., tiny fractional branch-coverage swings that vary
|
|
6
|
+
* run-to-run and would chase the gate to a different file if the
|
|
7
|
+
* operator ratcheted from a flapping CI artifact. The canonical mistake
|
|
8
|
+
* is to fetch a failing run's coverage delta and bump the baseline by
|
|
9
|
+
* that delta, which simply moves the noise floor to another file rather
|
|
10
|
+
* than stabilising the gate.
|
|
11
|
+
*
|
|
12
|
+
* Scope: 'story-close', 'retro'. The check is `warning` severity (not
|
|
13
|
+
* `blocker`) because flapping is informational — the operator decides
|
|
14
|
+
* whether to ratchet, skip, or investigate. Coverage-blocking belongs
|
|
15
|
+
* to a separate baseline-refresh gate.
|
|
16
|
+
*
|
|
17
|
+
* The check is `refuse-and-print`. A `fix()` here would mean either
|
|
18
|
+
* suppressing the flap (which silently lowers signal) or ratcheting
|
|
19
|
+
* (which is the very mistake the check exists to prevent). The
|
|
20
|
+
* fixCommand advises against ratcheting from a flapping artifact.
|
|
21
|
+
*
|
|
22
|
+
* Input shape — the check reads `state.coverage`:
|
|
23
|
+
* {
|
|
24
|
+
* branchDelta: number, // signed fractional delta (e.g. 0.0015 = +0.15%)
|
|
25
|
+
* noiseFloor?: number, // optional override; default 0.0025
|
|
26
|
+
* file?: string, // optional file the delta is attributed to
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* Returns null when `state.coverage` is absent (the assembler does not
|
|
30
|
+
* always populate coverage; absent input is a no-op rather than a
|
|
31
|
+
* failure).
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
const DEFAULT_NOISE_FLOOR = 0.0025; // 0.25%
|
|
35
|
+
|
|
36
|
+
const FIX_COMMAND = [
|
|
37
|
+
'# Do NOT ratchet the coverage baseline from a flapping CI artifact.',
|
|
38
|
+
'# A delta within the Windows / Node-22 noise floor (< 0.25% by default)',
|
|
39
|
+
'# is run-to-run jitter, not real coverage loss. Ratcheting in response',
|
|
40
|
+
'# moves the noise floor to a different file rather than fixing it.',
|
|
41
|
+
'#',
|
|
42
|
+
'# Instead: re-run the gate. If the delta persists across multiple runs',
|
|
43
|
+
'# in the same file, investigate the specific test that flipped — most',
|
|
44
|
+
'# often a Date.now() / Math.random() leak into the branch decision.',
|
|
45
|
+
'#',
|
|
46
|
+
'# If the delta is real but small, capture a fresh baseline-refresh',
|
|
47
|
+
'# commit deliberately, separate from the failing PR.',
|
|
48
|
+
].join('\n');
|
|
49
|
+
|
|
50
|
+
export default {
|
|
51
|
+
id: 'windows-coverage-noise-floor',
|
|
52
|
+
severity: 'warning',
|
|
53
|
+
scope: ['story-close', 'retro'],
|
|
54
|
+
autoCorrect: 'refuse-and-print',
|
|
55
|
+
|
|
56
|
+
detect(state) {
|
|
57
|
+
const cov = state?.coverage;
|
|
58
|
+
if (!cov || typeof cov !== 'object') return null;
|
|
59
|
+
if (typeof cov.branchDelta !== 'number' || Number.isNaN(cov.branchDelta)) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const noiseFloor =
|
|
63
|
+
typeof cov.noiseFloor === 'number' && cov.noiseFloor > 0
|
|
64
|
+
? cov.noiseFloor
|
|
65
|
+
: DEFAULT_NOISE_FLOOR;
|
|
66
|
+
const absDelta = Math.abs(cov.branchDelta);
|
|
67
|
+
// Within (or equal to) the floor → flapping → warning.
|
|
68
|
+
// Above the floor → real signal → return null and let the actual
|
|
69
|
+
// coverage gate decide.
|
|
70
|
+
if (absDelta > noiseFloor) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const deltaPct = (cov.branchDelta * 100).toFixed(3);
|
|
74
|
+
const floorPct = (noiseFloor * 100).toFixed(3);
|
|
75
|
+
const fileNote = cov.file ? ` (file: ${cov.file})` : '';
|
|
76
|
+
return {
|
|
77
|
+
id: 'windows-coverage-noise-floor',
|
|
78
|
+
severity: 'warning',
|
|
79
|
+
scope: state?.scope ?? 'story-close',
|
|
80
|
+
summary: `Branch-coverage delta ${deltaPct}% is within the Windows noise floor (${floorPct}%) — likely flap, do not ratchet${fileNote}`,
|
|
81
|
+
detail: [
|
|
82
|
+
`branchDelta: ${cov.branchDelta}`,
|
|
83
|
+
`noiseFloor: ${noiseFloor}`,
|
|
84
|
+
cov.file ? `attributedFile: ${cov.file}` : null,
|
|
85
|
+
]
|
|
86
|
+
.filter(Boolean)
|
|
87
|
+
.join('\n'),
|
|
88
|
+
fixCommand: FIX_COMMAND,
|
|
89
|
+
autoCorrectable: false,
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worktree-bootstrap-env — refuse-and-print check.
|
|
3
|
+
*
|
|
4
|
+
* Detects active worktrees that are missing the `.env` or `.mcp.json`
|
|
5
|
+
* bootstrap files. These files are intentionally untracked in git, so a
|
|
6
|
+
* freshly-created worktree under `.worktrees/<story>/` does not get them
|
|
7
|
+
* unless the orchestration explicitly copies them. When they are missing,
|
|
8
|
+
* tests that read environment variables silently take a different code
|
|
9
|
+
* path.
|
|
10
|
+
*
|
|
11
|
+
* Surface: `epic-deliver` preflight and the `/diagnose` CLI. Surfaced as a
|
|
12
|
+
* warning rather than a blocker — the missing file may be a deliberate
|
|
13
|
+
* choice (e.g. a worktree that doesn't need MCP), but the operator should
|
|
14
|
+
* see the divergence from the main checkout.
|
|
15
|
+
*
|
|
16
|
+
* AutoCorrect is `refuse-and-print`. Copying `.env` between trees is
|
|
17
|
+
* defensible at the orchestration layer (`worktree.bootstrap` step) but
|
|
18
|
+
* not as a self-healing fix — the contents are project-specific and may
|
|
19
|
+
* include secrets the check explicitly never reads.
|
|
20
|
+
*
|
|
21
|
+
* Privacy: this check reads only the bootstrap *status* projection
|
|
22
|
+
* (`fs.worktreeBootstrapStatus`) which records presence per worktree, not
|
|
23
|
+
* file contents. The Finding's `detail` never exposes any env-var value.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
const ID = 'worktree-bootstrap-env';
|
|
27
|
+
|
|
28
|
+
export default {
|
|
29
|
+
id: ID,
|
|
30
|
+
severity: 'warning',
|
|
31
|
+
scope: ['epic-deliver', 'diagnose'],
|
|
32
|
+
autoCorrect: 'refuse-and-print',
|
|
33
|
+
detect(state) {
|
|
34
|
+
const status = state?.fs?.worktreeBootstrapStatus ?? {};
|
|
35
|
+
const entries = Object.entries(status);
|
|
36
|
+
if (entries.length === 0) return null;
|
|
37
|
+
const missing = entries
|
|
38
|
+
.map(([wtPath, files]) => {
|
|
39
|
+
const missingFiles = [];
|
|
40
|
+
if (!files.dotEnv) missingFiles.push('.env');
|
|
41
|
+
if (!files.dotMcp) missingFiles.push('.mcp.json');
|
|
42
|
+
return { wtPath, missingFiles };
|
|
43
|
+
})
|
|
44
|
+
.filter((entry) => entry.missingFiles.length > 0);
|
|
45
|
+
if (missing.length === 0) return null;
|
|
46
|
+
const detailLines = missing.map(
|
|
47
|
+
(m) => ` - ${m.wtPath}: missing ${m.missingFiles.join(', ')}`,
|
|
48
|
+
);
|
|
49
|
+
return {
|
|
50
|
+
id: ID,
|
|
51
|
+
severity: 'warning',
|
|
52
|
+
scope: state?.scope ?? '',
|
|
53
|
+
summary: `${missing.length} worktree(s) missing bootstrap files (.env / .mcp.json)`,
|
|
54
|
+
detail: [
|
|
55
|
+
'Worktrees with missing bootstrap files:',
|
|
56
|
+
...detailLines,
|
|
57
|
+
'',
|
|
58
|
+
'Tests that read these vars will silently degrade in the affected worktrees.',
|
|
59
|
+
].join('\n'),
|
|
60
|
+
fixCommand: buildFixCommand(missing),
|
|
61
|
+
autoCorrectable: false,
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Build a copy recipe the operator can run from the main checkout. Each
|
|
68
|
+
* missing file gets its own `cp` line targeting the affected worktree.
|
|
69
|
+
*
|
|
70
|
+
* @param {Array<{wtPath: string, missingFiles: string[]}>} missing
|
|
71
|
+
* @returns {string}
|
|
72
|
+
*/
|
|
73
|
+
function buildFixCommand(missing) {
|
|
74
|
+
const lines = [];
|
|
75
|
+
for (const { wtPath, missingFiles } of missing) {
|
|
76
|
+
for (const file of missingFiles) {
|
|
77
|
+
lines.push(`cp "${file}" "${wtPath}/${file}"`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return lines.join(' && ');
|
|
81
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worktree-residue-biome — refuse-and-print check.
|
|
3
|
+
*
|
|
4
|
+
* Detects partial-reap residue under `.worktrees/` where a previous Story's
|
|
5
|
+
* tree was deleted incompletely and left a nested `biome.json` behind. The
|
|
6
|
+
* root `npm run lint` walks into the orphan tree, hits the nested config,
|
|
7
|
+
* and fails. The close-time biome block is the canonical symptom.
|
|
8
|
+
*
|
|
9
|
+
* Surface: `epic-deliver` preflight, `story-close` preflight, and the
|
|
10
|
+
* `/diagnose` CLI. Surfaced as a blocker so the operator clears the residue
|
|
11
|
+
* with `rm -rf` before close re-runs the validation chain.
|
|
12
|
+
*
|
|
13
|
+
* AutoCorrect is `refuse-and-print`. Recursive deletion under `.worktrees/`
|
|
14
|
+
* is technically blessed by the README, but the residue may include
|
|
15
|
+
* partially-merged work the operator wants to inspect first. We print the
|
|
16
|
+
* exact `rm -rf` recipe rather than running it.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const ID = 'worktree-residue-biome';
|
|
20
|
+
|
|
21
|
+
export default {
|
|
22
|
+
id: ID,
|
|
23
|
+
severity: 'blocker',
|
|
24
|
+
scope: ['epic-deliver', 'story-close', 'diagnose', 'retro'],
|
|
25
|
+
autoCorrect: 'refuse-and-print',
|
|
26
|
+
detect(state) {
|
|
27
|
+
const orphans = state?.fs?.worktreeBiomeOrphans ?? [];
|
|
28
|
+
if (!Array.isArray(orphans) || orphans.length === 0) return null;
|
|
29
|
+
const lines = orphans.map((p) => ` - ${p}`).join('\n');
|
|
30
|
+
return {
|
|
31
|
+
id: ID,
|
|
32
|
+
severity: 'blocker',
|
|
33
|
+
scope: state?.scope ?? '',
|
|
34
|
+
summary: `${orphans.length} orphan worktree(s) with nested biome.json — root biome lint will fail`,
|
|
35
|
+
detail: `Nested biome.json files found under .worktrees/ subdirectories:\n${lines}\n\nThese block root \`npm run lint\` because biome walks into them and resolves the nested config.`,
|
|
36
|
+
fixCommand: buildFixCommand(orphans),
|
|
37
|
+
autoCorrectable: false,
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Build the `rm -rf` command(s) the operator should run to clear the
|
|
44
|
+
* residue. Multiple orphans get a single chained command so it can be
|
|
45
|
+
* copy-pasted as one line.
|
|
46
|
+
*
|
|
47
|
+
* @param {string[]} orphans
|
|
48
|
+
* @returns {string}
|
|
49
|
+
*/
|
|
50
|
+
function buildFixCommand(orphans) {
|
|
51
|
+
if (orphans.length === 0) return '';
|
|
52
|
+
// Each path is already an absolute orphan worktree directory; deleting
|
|
53
|
+
// the whole directory is the canonical reap recipe.
|
|
54
|
+
return orphans.map((p) => `rm -rf "${p}"`).join(' && ');
|
|
55
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* parse-numeric.js — shared CLI integer-flag validators (Story #2993).
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `lifecycle-emit-story-dispatch.js` so future scripts that
|
|
5
|
+
* need a strict positive-integer or non-negative-integer flag value share
|
|
6
|
+
* a single validator instead of hand-rolling another `Number.parseInt`
|
|
7
|
+
* dance. Both helpers throw with a clear "required" / "must be …" message
|
|
8
|
+
* shape so a `runAsCli` boundary surfaces a clean exit-1.
|
|
9
|
+
*
|
|
10
|
+
* Contract:
|
|
11
|
+
* - Empty / `null` / `undefined` raw values throw "is required".
|
|
12
|
+
* - Non-integer or out-of-range values throw "must be a … integer".
|
|
13
|
+
* - A leading `#` on the raw value is stripped (matches the ticket-ID
|
|
14
|
+
* ergonomic on the rest of the framework).
|
|
15
|
+
*
|
|
16
|
+
* @module lib/cli/parse-numeric
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Parse a flag value as a strict positive integer (≥ 1). Leading `#` is
|
|
21
|
+
* stripped to match the `parseTicketId` ergonomic.
|
|
22
|
+
*
|
|
23
|
+
* @param {string|number|null|undefined} raw
|
|
24
|
+
* @param {string} flag Flag label used in the thrown error message.
|
|
25
|
+
* @param {string} [tool='cli'] Optional tool prefix for the error message.
|
|
26
|
+
* @returns {number}
|
|
27
|
+
*/
|
|
28
|
+
export function parseRequiredPositiveInt(raw, flag, tool = 'cli') {
|
|
29
|
+
if (raw === undefined || raw === null || raw === '') {
|
|
30
|
+
throw new Error(`${tool}: ${flag} is required`);
|
|
31
|
+
}
|
|
32
|
+
const n = Number.parseInt(String(raw).replace(/^#/, ''), 10);
|
|
33
|
+
if (!Number.isInteger(n) || n < 1) {
|
|
34
|
+
throw new Error(`${tool}: ${flag} must be a positive integer (got ${raw})`);
|
|
35
|
+
}
|
|
36
|
+
return n;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Parse a flag value as a strict non-negative integer (≥ 0). Leading `#`
|
|
41
|
+
* is NOT stripped — non-negative use cases (wave index, attempt offset)
|
|
42
|
+
* do not carry the ticket-ID convention.
|
|
43
|
+
*
|
|
44
|
+
* @param {string|number|null|undefined} raw
|
|
45
|
+
* @param {string} flag
|
|
46
|
+
* @param {string} [tool='cli']
|
|
47
|
+
* @returns {number}
|
|
48
|
+
*/
|
|
49
|
+
export function parseRequiredNonNegativeInt(raw, flag, tool = 'cli') {
|
|
50
|
+
if (raw === undefined || raw === null || raw === '') {
|
|
51
|
+
throw new Error(`${tool}: ${flag} is required`);
|
|
52
|
+
}
|
|
53
|
+
const n = Number.parseInt(String(raw), 10);
|
|
54
|
+
if (!Number.isInteger(n) || n < 0) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
`${tool}: ${flag} must be a non-negative integer (got ${raw})`,
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
return n;
|
|
60
|
+
}
|