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,379 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* node:coverage ignore file */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* check-lifecycle-lint.js — enforce the three Tech Spec lint rules for
|
|
6
|
+
* the lifecycle bus surface that biome's stock ruleset cannot express.
|
|
7
|
+
*
|
|
8
|
+
* Rule 1 — "No Promise.all over listener arrays".
|
|
9
|
+
* Files under `.agents/scripts/lib/orchestration/lifecycle/**` (the bus
|
|
10
|
+
* + listeners surface) MUST NOT contain `Promise.all(`. The bus is a
|
|
11
|
+
* strictly sequential mediator; parallelizing listeners breaks
|
|
12
|
+
* repeatability and idempotency by definition. Tests under
|
|
13
|
+
* `tests/lifecycle/**` are exempt — fixtures that prove the rule
|
|
14
|
+
* bites need to carry the pattern.
|
|
15
|
+
*
|
|
16
|
+
* Rule 2 — "Wildcard-observer firewall".
|
|
17
|
+
* Any module under `.agents/scripts/lib/orchestration/lifecycle/listeners/**`
|
|
18
|
+
* that calls `bus.on('*', …)` MUST NOT import a side-effecting module.
|
|
19
|
+
* The static blocklist is small (the modules that mutate GitHub state,
|
|
20
|
+
* the worktree, or write outside `temp/epic-<id>/`); we match by module
|
|
21
|
+
* specifier suffix to keep the rule simple and stable.
|
|
22
|
+
*
|
|
23
|
+
* Rule 3 — "Auto-merge lockout" (Story #2253 / Task #2255, Epic #2172
|
|
24
|
+
* review High-1).
|
|
25
|
+
* String literals containing the substring `gh pr merge` MUST NOT
|
|
26
|
+
* appear in any file under `.agents/scripts/**` EXCEPT
|
|
27
|
+
* `.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js`
|
|
28
|
+
* (Wave 7, Story #2256). The original safety hole was an
|
|
29
|
+
* unconditional `gh pr merge <pr> --auto --squash --delete-branch`
|
|
30
|
+
* call in `epic-deliver-finalize.js` that armed GitHub's native
|
|
31
|
+
* auto-merge BEFORE the framework's automerge predicate evaluated
|
|
32
|
+
* blocker / review state; the lockout backstops the deletion so a
|
|
33
|
+
* future refactor cannot quietly re-add it outside the armer.
|
|
34
|
+
*
|
|
35
|
+
* The rule scans STRING LITERALS only (single-quoted, double-quoted,
|
|
36
|
+
* or back-ticked) — comments are exempt because the deletion site
|
|
37
|
+
* needs prose explaining what was removed and why.
|
|
38
|
+
*
|
|
39
|
+
* The exempt path is matched by suffix so it bites even before the
|
|
40
|
+
* armer file lands (Wave 7); pre-existence is not required.
|
|
41
|
+
*
|
|
42
|
+
* Exit codes:
|
|
43
|
+
* 0 — clean.
|
|
44
|
+
* 1 — at least one violation; offending file + line printed to stderr.
|
|
45
|
+
*
|
|
46
|
+
* This script ships as part of `npm run lint`. It is intentionally
|
|
47
|
+
* Node-only (no ESLint dependency) because the repo's lint surface is
|
|
48
|
+
* biome + markdownlint; a custom rule fits cleanly alongside.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
52
|
+
import path from 'node:path';
|
|
53
|
+
import { fileURLToPath } from 'node:url';
|
|
54
|
+
|
|
55
|
+
import { runAsCli } from './lib/cli-utils.js';
|
|
56
|
+
|
|
57
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
58
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
59
|
+
|
|
60
|
+
const LIFECYCLE_DIR = path.join(
|
|
61
|
+
REPO_ROOT,
|
|
62
|
+
'.agents',
|
|
63
|
+
'scripts',
|
|
64
|
+
'lib',
|
|
65
|
+
'orchestration',
|
|
66
|
+
'lifecycle',
|
|
67
|
+
);
|
|
68
|
+
const LISTENERS_SUBDIR = path.join(LIFECYCLE_DIR, 'listeners');
|
|
69
|
+
const SCRIPTS_DIR = path.join(REPO_ROOT, '.agents', 'scripts');
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Files exempt from the merge-lockout rule. The path is matched by
|
|
73
|
+
* suffix against the absolute file path so the entry bites even before
|
|
74
|
+
* the file lands (Wave 7, Story #2256 / Task 8-3 adds
|
|
75
|
+
* `automerge-armer.js`; the rule still has to be in place beforehand
|
|
76
|
+
* so the lockout is enforced from the moment the deletion ships).
|
|
77
|
+
*
|
|
78
|
+
* Maintainers: do NOT widen this list without an architectural review
|
|
79
|
+
* — every additional exempt path is a new place an unauthorized
|
|
80
|
+
* auto-merge call could re-enter the codebase.
|
|
81
|
+
*/
|
|
82
|
+
const MERGE_LOCKOUT_ALLOWED_SUFFIXES = Object.freeze([
|
|
83
|
+
// Story #2256 / #2336 — the predicate-gated AutomergeArmer listener is
|
|
84
|
+
// now the SOLE production code path authorized to call `gh pr merge`.
|
|
85
|
+
// The legacy `.agents/scripts/epic-deliver-automerge.js` exemption was
|
|
86
|
+
// removed in Story #2336 / Task #2340 once the CLI was reduced to a
|
|
87
|
+
// pure `epic.automerge.start` emit shim.
|
|
88
|
+
path.join(
|
|
89
|
+
'lib',
|
|
90
|
+
'orchestration',
|
|
91
|
+
'lifecycle',
|
|
92
|
+
'listeners',
|
|
93
|
+
'automerge-armer.js',
|
|
94
|
+
),
|
|
95
|
+
]);
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Files exempt from the merge-lockout rule because they ARE the rule
|
|
99
|
+
* (fixtures + the lint runner itself necessarily carry the literal so
|
|
100
|
+
* they can match against it). Maintainers: do NOT add production code
|
|
101
|
+
* here — see `MERGE_LOCKOUT_ALLOWED_SUFFIXES`.
|
|
102
|
+
*/
|
|
103
|
+
const MERGE_LOCKOUT_INFRASTRUCTURE_SUFFIXES = Object.freeze([
|
|
104
|
+
// The lint script itself (this file).
|
|
105
|
+
path.join('.agents', 'scripts', 'check-lifecycle-lint.js'),
|
|
106
|
+
]);
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Static blocklist of modules that mutate state under orchestration.
|
|
110
|
+
* Matched by `import … from '<spec>'` specifier suffix so both
|
|
111
|
+
* relative and package imports are caught. The list is small by
|
|
112
|
+
* intent — wildcard observers should not need ANY of these.
|
|
113
|
+
*
|
|
114
|
+
* Maintainers: when a future module joins the "mutates real state"
|
|
115
|
+
* club, add it here. The lint rule is the wildcard-firewall contract;
|
|
116
|
+
* the listeners SHOULD NOT bypass it.
|
|
117
|
+
*/
|
|
118
|
+
const STATE_MUTATING_MODULES = Object.freeze([
|
|
119
|
+
// GitHub state writers
|
|
120
|
+
'update-ticket-state.js',
|
|
121
|
+
'post-structured-comment.js',
|
|
122
|
+
'lib/orchestration/ticketing/state.js',
|
|
123
|
+
'lib/orchestration/ticketing/bulk.js',
|
|
124
|
+
// git / worktree mutators
|
|
125
|
+
'lib/git-utils.js',
|
|
126
|
+
'lib/orchestration/worktree-manager.js',
|
|
127
|
+
// notification writers
|
|
128
|
+
'notify.js',
|
|
129
|
+
]);
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Walk a directory tree synchronously, yielding absolute paths of files
|
|
133
|
+
* matching `.js`. The lifecycle surface is small (< 50 files in the
|
|
134
|
+
* worst case); a streaming walker is unnecessary.
|
|
135
|
+
*/
|
|
136
|
+
function* walkJs(dir) {
|
|
137
|
+
let entries;
|
|
138
|
+
try {
|
|
139
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
140
|
+
} catch (err) {
|
|
141
|
+
if (err.code === 'ENOENT') return;
|
|
142
|
+
throw err;
|
|
143
|
+
}
|
|
144
|
+
for (const entry of entries) {
|
|
145
|
+
const p = path.join(dir, entry.name);
|
|
146
|
+
if (entry.isDirectory()) {
|
|
147
|
+
yield* walkJs(p);
|
|
148
|
+
} else if (entry.isFile() && entry.name.endsWith('.js')) {
|
|
149
|
+
yield p;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Rule 1 enforcement. Returns an array of `{ file, line, hint }`
|
|
156
|
+
* violations. Inline disable comments (`// lint-lifecycle-disable`) on
|
|
157
|
+
* the same line opt out — but reviewers should require justification.
|
|
158
|
+
*/
|
|
159
|
+
export function findPromiseAllViolations(
|
|
160
|
+
rootDir,
|
|
161
|
+
{ read = readFileSync } = {},
|
|
162
|
+
) {
|
|
163
|
+
const violations = [];
|
|
164
|
+
for (const file of walkJs(rootDir)) {
|
|
165
|
+
const text = read(file, 'utf8');
|
|
166
|
+
const lines = text.split('\n');
|
|
167
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
168
|
+
const line = lines[i];
|
|
169
|
+
// skip lines explicitly opting out
|
|
170
|
+
if (line.includes('lint-lifecycle-disable')) continue;
|
|
171
|
+
if (/\bPromise\.all\s*\(/.test(line)) {
|
|
172
|
+
violations.push({
|
|
173
|
+
file,
|
|
174
|
+
line: i + 1,
|
|
175
|
+
hint: 'Promise.all over listener arrays breaks bus repeatability. Listeners must run sequentially with await.',
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return violations;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Rule 2 enforcement. Returns violations for any file under
|
|
185
|
+
* `listenersDir` that BOTH (a) registers a wildcard observer
|
|
186
|
+
* (`bus.on('*', …)`) AND (b) imports a state-mutating module.
|
|
187
|
+
*
|
|
188
|
+
* Files that don't register a wildcard observer are not gated; files
|
|
189
|
+
* that wildcard-observe but only import safe modules are not gated.
|
|
190
|
+
*/
|
|
191
|
+
export function findWildcardObserverFirewallViolations(
|
|
192
|
+
listenersDir,
|
|
193
|
+
{ read = readFileSync, blocklist = STATE_MUTATING_MODULES } = {},
|
|
194
|
+
) {
|
|
195
|
+
const violations = [];
|
|
196
|
+
for (const file of walkJs(listenersDir)) {
|
|
197
|
+
const text = read(file, 'utf8');
|
|
198
|
+
const hasWildcard = /\bbus\s*\.\s*on\s*\(\s*['"`]\*['"`]/.test(text);
|
|
199
|
+
if (!hasWildcard) continue;
|
|
200
|
+
// Extract imported module specifiers — robust enough for ES module
|
|
201
|
+
// imports without parsing the full AST.
|
|
202
|
+
// `matchAll` returns an iterator of regex match arrays; using it
|
|
203
|
+
// sidesteps the assignment-in-`while` pattern biome flags as
|
|
204
|
+
// confusing.
|
|
205
|
+
for (const match of text.matchAll(/\bfrom\s+['"]([^'"]+)['"]/g)) {
|
|
206
|
+
const spec = match[1];
|
|
207
|
+
for (const banned of blocklist) {
|
|
208
|
+
if (spec === banned || spec.endsWith(`/${banned}`)) {
|
|
209
|
+
violations.push({
|
|
210
|
+
file,
|
|
211
|
+
spec,
|
|
212
|
+
hint: `Wildcard observers must not import state-mutating modules. Saw '${spec}'.`,
|
|
213
|
+
});
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return violations;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Strip block (`/* … */`) and line (`// …`) comments from a source
|
|
224
|
+
* string. Pure — exported for tests so the comment-stripping contract
|
|
225
|
+
* is explicit. Defends against the corner case where the literal
|
|
226
|
+
* `'gh pr merge'` appears INSIDE a justification comment at the
|
|
227
|
+
* deletion site (Story #2253 deliberately leaves a prose explanation
|
|
228
|
+
* referencing the removed CLI call).
|
|
229
|
+
*
|
|
230
|
+
* The implementation is a tiny state machine rather than a regex so it
|
|
231
|
+
* correctly handles the (legal) case of a string literal containing
|
|
232
|
+
* `//` or `/*` characters.
|
|
233
|
+
*
|
|
234
|
+
* @param {string} src
|
|
235
|
+
* @returns {string} source with comments replaced by spaces (line
|
|
236
|
+
* numbers preserved so violations report the original line).
|
|
237
|
+
*/
|
|
238
|
+
export function stripComments(src) {
|
|
239
|
+
let out = '';
|
|
240
|
+
let i = 0;
|
|
241
|
+
const n = src.length;
|
|
242
|
+
while (i < n) {
|
|
243
|
+
const ch = src[i];
|
|
244
|
+
const nx = src[i + 1];
|
|
245
|
+
// line comment
|
|
246
|
+
if (ch === '/' && nx === '/') {
|
|
247
|
+
while (i < n && src[i] !== '\n') {
|
|
248
|
+
i += 1;
|
|
249
|
+
}
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
// block comment
|
|
253
|
+
if (ch === '/' && nx === '*') {
|
|
254
|
+
i += 2;
|
|
255
|
+
while (i < n && !(src[i] === '*' && src[i + 1] === '/')) {
|
|
256
|
+
// preserve newlines so line numbers in violation reports stay
|
|
257
|
+
// aligned with the original file.
|
|
258
|
+
if (src[i] === '\n') out += '\n';
|
|
259
|
+
i += 1;
|
|
260
|
+
}
|
|
261
|
+
i += 2; // skip closing */
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
// string literal — copy through unchanged (we WANT to keep these
|
|
265
|
+
// so Rule 3 can flag them).
|
|
266
|
+
if (ch === '"' || ch === "'" || ch === '`') {
|
|
267
|
+
const quote = ch;
|
|
268
|
+
out += ch;
|
|
269
|
+
i += 1;
|
|
270
|
+
while (i < n) {
|
|
271
|
+
const c = src[i];
|
|
272
|
+
out += c;
|
|
273
|
+
if (c === '\\' && i + 1 < n) {
|
|
274
|
+
out += src[i + 1];
|
|
275
|
+
i += 2;
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
i += 1;
|
|
279
|
+
if (c === quote) break;
|
|
280
|
+
}
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
out += ch;
|
|
284
|
+
i += 1;
|
|
285
|
+
}
|
|
286
|
+
return out;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Rule 3 enforcement (Story #2253 / Task #2255, Epic #2172 review
|
|
291
|
+
* High-1). Returns an array of `{ file, line, hint }` violations for
|
|
292
|
+
* any file under `rootDir` (recursively) whose source — with comments
|
|
293
|
+
* stripped — contains a string literal carrying the substring
|
|
294
|
+
* `gh pr merge`. The allow-list (`automerge-armer.js`) and the
|
|
295
|
+
* infrastructure list (the lint script + fixtures it owns) are
|
|
296
|
+
* matched by absolute-path suffix.
|
|
297
|
+
*
|
|
298
|
+
* Exposed for unit tests so the lockout contract can be exercised
|
|
299
|
+
* against synthetic fixture trees without polluting the live source.
|
|
300
|
+
*/
|
|
301
|
+
export function findMergeLockoutViolations(
|
|
302
|
+
rootDir,
|
|
303
|
+
{
|
|
304
|
+
read = readFileSync,
|
|
305
|
+
allowSuffixes = MERGE_LOCKOUT_ALLOWED_SUFFIXES,
|
|
306
|
+
infrastructureSuffixes = MERGE_LOCKOUT_INFRASTRUCTURE_SUFFIXES,
|
|
307
|
+
} = {},
|
|
308
|
+
) {
|
|
309
|
+
const violations = [];
|
|
310
|
+
// The literal we forbid. Kept in a constant so we can refer to it in
|
|
311
|
+
// the violation `hint` without the literal appearing as a string in
|
|
312
|
+
// arbitrary positions. The space matters — `gh-pr-merge` is not the
|
|
313
|
+
// CLI, only the space-delimited form is.
|
|
314
|
+
const FORBIDDEN = 'gh pr merge';
|
|
315
|
+
const lineRe = /(['"`])((?:\\.|(?!\1).)*)\1/g;
|
|
316
|
+
for (const file of walkJs(rootDir)) {
|
|
317
|
+
// Skip the armer (intentional carrier) and the lint infrastructure.
|
|
318
|
+
const allExempt = [...allowSuffixes, ...infrastructureSuffixes];
|
|
319
|
+
if (allExempt.some((suffix) => file.endsWith(suffix))) continue;
|
|
320
|
+
|
|
321
|
+
const raw = read(file, 'utf8');
|
|
322
|
+
const rawLines = raw.split('\n');
|
|
323
|
+
const stripped = stripComments(raw);
|
|
324
|
+
const lines = stripped.split('\n');
|
|
325
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
326
|
+
const line = lines[i];
|
|
327
|
+
// Honour the opt-out marker; it lives in a comment (and is
|
|
328
|
+
// therefore stripped above), so consult the RAW line for the
|
|
329
|
+
// marker check. Kept consistent with Rule 1.
|
|
330
|
+
const rawLine = rawLines[i] ?? '';
|
|
331
|
+
if (rawLine.includes('lint-lifecycle-disable')) continue;
|
|
332
|
+
// Find every string literal on the (comment-stripped) line and
|
|
333
|
+
// inspect its body.
|
|
334
|
+
lineRe.lastIndex = 0;
|
|
335
|
+
let match = lineRe.exec(line);
|
|
336
|
+
while (match !== null) {
|
|
337
|
+
const literalBody = match[2];
|
|
338
|
+
if (literalBody.includes(FORBIDDEN)) {
|
|
339
|
+
violations.push({
|
|
340
|
+
file,
|
|
341
|
+
line: i + 1,
|
|
342
|
+
hint: `String literal containing '${FORBIDDEN}' is forbidden outside automerge-armer.js (Story #2253 review High-1). Auto-merge enablement must flow through the AutomergeArmer listener so blocker/review predicates gate the call.`,
|
|
343
|
+
});
|
|
344
|
+
break; // one violation per line is enough
|
|
345
|
+
}
|
|
346
|
+
match = lineRe.exec(line);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return violations;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
async function main() {
|
|
354
|
+
// Per-rule discovery.
|
|
355
|
+
const v1 = findPromiseAllViolations(LIFECYCLE_DIR);
|
|
356
|
+
const v2 = findWildcardObserverFirewallViolations(LISTENERS_SUBDIR);
|
|
357
|
+
const v3 = findMergeLockoutViolations(SCRIPTS_DIR);
|
|
358
|
+
const all = [
|
|
359
|
+
...v1.map((v) => ({ rule: 'no-promise-all-listeners', ...v })),
|
|
360
|
+
...v2.map((v) => ({ rule: 'wildcard-observer-firewall', ...v })),
|
|
361
|
+
...v3.map((v) => ({ rule: 'merge-lockout', ...v })),
|
|
362
|
+
];
|
|
363
|
+
if (all.length === 0) {
|
|
364
|
+
process.stdout.write(
|
|
365
|
+
'[lifecycle-lint] clean: no Promise.all over listeners; no wildcard-firewall breaches; no merge-lockout violations.\n',
|
|
366
|
+
);
|
|
367
|
+
return 0;
|
|
368
|
+
}
|
|
369
|
+
for (const v of all) {
|
|
370
|
+
const loc = v.line ? `${v.file}:${v.line}` : v.file;
|
|
371
|
+
process.stderr.write(`[lifecycle-lint][${v.rule}] ${loc}\n ${v.hint}\n`);
|
|
372
|
+
}
|
|
373
|
+
return 1;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
await runAsCli(import.meta.url, main, {
|
|
377
|
+
source: 'check-lifecycle-lint',
|
|
378
|
+
propagateExitCode: true,
|
|
379
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* check-prepush-recovery.js — gate decision for the pre-push coverage step.
|
|
4
|
+
*
|
|
5
|
+
* Story #3162. The pre-push hook normally runs `coverage-capture.js` +
|
|
6
|
+
* `crap:check` on every push. During a `story-close.js` recovery (operator
|
|
7
|
+
* pushing `epic/<id>` to unblock a run after a merge-orchestrator failure),
|
|
8
|
+
* a pre-existing coverage regression on `epic/<id>` — unrelated to the
|
|
9
|
+
* Story under recovery — hard-blocks the push and forces a `--no-verify`
|
|
10
|
+
* bypass, which violates the global "no hook bypass" rule.
|
|
11
|
+
*
|
|
12
|
+
* This script is the scoped escape hatch. It exits 0 ("skip coverage gate")
|
|
13
|
+
* only when BOTH conditions hold:
|
|
14
|
+
*
|
|
15
|
+
* 1. `STORY_CLOSE_RECOVERY=1` is set in the environment.
|
|
16
|
+
* 2. At least one ref being pushed has a local ref of the shape
|
|
17
|
+
* `refs/heads/epic/<id>` (parsed from the pre-push stdin protocol).
|
|
18
|
+
*
|
|
19
|
+
* Otherwise it exits 1 ("run coverage gate as today"). The narrow scope is
|
|
20
|
+
* deliberate: a generic env-var bypass would erode the gate; tying the
|
|
21
|
+
* skip to an epic-branch target keeps every other push honest.
|
|
22
|
+
*
|
|
23
|
+
* Stdin contract (git pre-push hook protocol): zero or more lines, each
|
|
24
|
+
* `<local_ref> <local_sha> <remote_ref> <remote_sha>`
|
|
25
|
+
* separated by whitespace. Empty stdin (no refs being pushed) yields exit 1.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { runAsCli } from './lib/cli-utils.js';
|
|
29
|
+
|
|
30
|
+
const EPIC_REF_PATTERN = /^refs\/heads\/epic\//;
|
|
31
|
+
const SKIP_LOG = '[pre-push] coverage gate skipped by STORY_CLOSE_RECOVERY';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Parse pre-push stdin into the list of local refs being pushed. Lines with
|
|
35
|
+
* fewer than four whitespace-separated tokens are tolerated (git in practice
|
|
36
|
+
* always emits four, but defensive parsing keeps the helper robust against
|
|
37
|
+
* empty pushes and trailing whitespace).
|
|
38
|
+
*
|
|
39
|
+
* @param {string} stdin
|
|
40
|
+
* @returns {string[]} local ref names (first token of each non-empty line)
|
|
41
|
+
*/
|
|
42
|
+
export function parsePrePushLocalRefs(stdin) {
|
|
43
|
+
if (typeof stdin !== 'string' || stdin.length === 0) return [];
|
|
44
|
+
return stdin
|
|
45
|
+
.split(/\r?\n/)
|
|
46
|
+
.map((line) => line.trim())
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.map((line) => line.split(/\s+/)[0])
|
|
49
|
+
.filter(Boolean);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Pure decision function. `true` means "skip the coverage gate".
|
|
54
|
+
*
|
|
55
|
+
* @param {object} input
|
|
56
|
+
* @param {string|undefined} input.env value of STORY_CLOSE_RECOVERY
|
|
57
|
+
* @param {string[]} input.localRefs parsed local refs
|
|
58
|
+
* @returns {boolean}
|
|
59
|
+
*/
|
|
60
|
+
export function shouldSkipCoverageGate({ env, localRefs }) {
|
|
61
|
+
if (env !== '1') return false;
|
|
62
|
+
if (!Array.isArray(localRefs) || localRefs.length === 0) return false;
|
|
63
|
+
return localRefs.some((ref) => EPIC_REF_PATTERN.test(ref));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function readStdin() {
|
|
67
|
+
if (process.stdin.isTTY) return '';
|
|
68
|
+
let data = '';
|
|
69
|
+
process.stdin.setEncoding('utf8');
|
|
70
|
+
for await (const chunk of process.stdin) data += chunk;
|
|
71
|
+
return data;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function main() {
|
|
75
|
+
const stdin = await readStdin();
|
|
76
|
+
const localRefs = parsePrePushLocalRefs(stdin);
|
|
77
|
+
const skip = shouldSkipCoverageGate({
|
|
78
|
+
env: process.env.STORY_CLOSE_RECOVERY,
|
|
79
|
+
localRefs,
|
|
80
|
+
});
|
|
81
|
+
if (skip) {
|
|
82
|
+
process.stdout.write(`${SKIP_LOG}\n`);
|
|
83
|
+
process.exit(0);
|
|
84
|
+
}
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
runAsCli(import.meta.url, main);
|
|
89
|
+
|
|
90
|
+
export const __testing = { EPIC_REF_PATTERN, SKIP_LOG };
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* check-windows-git-perf.js — Verify host-level git perf settings on Windows.
|
|
5
|
+
*
|
|
6
|
+
* The framework drives many git operations per Story (worktree create / fetch /
|
|
7
|
+
* status / branch deletes). On Windows, three settings shave seconds off every
|
|
8
|
+
* `git status`-shaped call across the lifecycle:
|
|
9
|
+
*
|
|
10
|
+
* - `core.fsmonitor true` (global) — built-in FS monitor daemon.
|
|
11
|
+
* - `feature.manyFiles true` (global) — commit-graph, untracked cache,
|
|
12
|
+
* sparse index defaults.
|
|
13
|
+
* - `git maintenance start` (per repo) — schedules background prefetch /
|
|
14
|
+
* commit-graph rebuilds / loose-object cleanup / incremental repack.
|
|
15
|
+
*
|
|
16
|
+
* This script is **warn-only and idempotent**. It probes the settings, prints
|
|
17
|
+
* the exact commands to run for any that are missing, and always exits 0.
|
|
18
|
+
* It is a no-op on non-Windows hosts (those settings are not meaningfully
|
|
19
|
+
* faster on macOS/Linux and `--global` mutation of someone's git config is
|
|
20
|
+
* out of scope for an automated check).
|
|
21
|
+
*
|
|
22
|
+
* Stdlib only — no new dependencies.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
// cli-opt-out: stdlib-only top-level script with no error path; runAsCli would force a Logger import that violates the "no new dependencies" contract documented above.
|
|
26
|
+
import { spawnSync } from 'node:child_process';
|
|
27
|
+
import path from 'node:path';
|
|
28
|
+
|
|
29
|
+
const TAG = '[check-windows-git-perf]';
|
|
30
|
+
|
|
31
|
+
if (process.platform !== 'win32') {
|
|
32
|
+
process.exit(0);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function gitOutput(args, { cwd } = {}) {
|
|
36
|
+
const result = spawnSync('git', args, {
|
|
37
|
+
cwd,
|
|
38
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
39
|
+
encoding: 'utf8',
|
|
40
|
+
});
|
|
41
|
+
if (result.error || result.status !== 0) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
return result.stdout.trim();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function gitMultiOutput(args, { cwd } = {}) {
|
|
48
|
+
const result = spawnSync('git', args, {
|
|
49
|
+
cwd,
|
|
50
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
51
|
+
encoding: 'utf8',
|
|
52
|
+
});
|
|
53
|
+
if (result.error || result.status !== 0) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
return result.stdout
|
|
57
|
+
.split(/\r?\n/)
|
|
58
|
+
.map((line) => line.trim())
|
|
59
|
+
.filter(Boolean);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const recommendations = [];
|
|
63
|
+
|
|
64
|
+
const fsmonitor = gitOutput(['config', '--global', 'core.fsmonitor']);
|
|
65
|
+
if (fsmonitor !== 'true') {
|
|
66
|
+
recommendations.push({
|
|
67
|
+
setting: 'core.fsmonitor',
|
|
68
|
+
current: fsmonitor ?? '(unset)',
|
|
69
|
+
command: 'git config --global core.fsmonitor true',
|
|
70
|
+
why: 'enables the FS-monitor daemon so `git status` skips full lstat walks',
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const manyFiles = gitOutput(['config', '--global', 'feature.manyFiles']);
|
|
75
|
+
if (manyFiles !== 'true') {
|
|
76
|
+
recommendations.push({
|
|
77
|
+
setting: 'feature.manyFiles',
|
|
78
|
+
current: manyFiles ?? '(unset)',
|
|
79
|
+
command: 'git config --global feature.manyFiles true',
|
|
80
|
+
why: 'opts into commit-graph, untracked cache, and sparse-index defaults',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const consumerRoot = process.cwd();
|
|
85
|
+
const repoTopLevel = gitOutput(['rev-parse', '--show-toplevel'], {
|
|
86
|
+
cwd: consumerRoot,
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (repoTopLevel) {
|
|
90
|
+
const registered = gitMultiOutput([
|
|
91
|
+
'config',
|
|
92
|
+
'--global',
|
|
93
|
+
'--get-all',
|
|
94
|
+
'maintenance.repo',
|
|
95
|
+
]);
|
|
96
|
+
const normalized = path.resolve(repoTopLevel).toLowerCase();
|
|
97
|
+
const isRegistered = registered
|
|
98
|
+
.map((entry) => path.resolve(entry).toLowerCase())
|
|
99
|
+
.some((entry) => entry === normalized);
|
|
100
|
+
|
|
101
|
+
if (!isRegistered) {
|
|
102
|
+
recommendations.push({
|
|
103
|
+
setting: 'maintenance.repo (per-repo schedule)',
|
|
104
|
+
current: '(this repo is not registered)',
|
|
105
|
+
command: 'git maintenance start',
|
|
106
|
+
why: 'schedules background prefetch, commit-graph, and incremental repack for this clone',
|
|
107
|
+
runFromRepo: true,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (recommendations.length === 0) {
|
|
113
|
+
console.log(`${TAG} OK — Windows git perf settings are configured.`);
|
|
114
|
+
process.exit(0);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
console.log(
|
|
118
|
+
`${TAG} Detected ${recommendations.length} missing setting(s) that materially speed up git operations on Windows.`,
|
|
119
|
+
);
|
|
120
|
+
console.log(
|
|
121
|
+
`${TAG} These are warnings only; the framework keeps working without them.`,
|
|
122
|
+
);
|
|
123
|
+
console.log('');
|
|
124
|
+
|
|
125
|
+
for (const rec of recommendations) {
|
|
126
|
+
console.log(` • ${rec.setting} — ${rec.why}`);
|
|
127
|
+
console.log(` current: ${rec.current}`);
|
|
128
|
+
console.log(
|
|
129
|
+
` apply: ${rec.command}${rec.runFromRepo ? ' (run from the consumer repo root)' : ''}`,
|
|
130
|
+
);
|
|
131
|
+
console.log('');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
console.log(
|
|
135
|
+
`${TAG} Re-run this script after applying to confirm. It exits 0 either way.`,
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
process.exit(0);
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* node:coverage ignore file */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Removes **test-reserved** per-Epic trees under `<repo>/temp/epic-<id>/` after
|
|
6
|
+
* test runs. Only Epic IDs in the band defined by
|
|
7
|
+
* `lib/test-reserved-epic-temp-ids.js` are deleted (999000–999999). Real Epic
|
|
8
|
+
* scratch (e.g. `temp/epic-1143/`) is never touched.
|
|
9
|
+
*
|
|
10
|
+
* Keeps sibling dirs like `temp/epic-runner-logs/`, loose files, and
|
|
11
|
+
* `temp/epic-<id>/` when `<id>` is outside that reserved band.
|
|
12
|
+
*
|
|
13
|
+
* Opt out:
|
|
14
|
+
* MANDREL_SKIP_POSTTEST_TEMP_CLEANUP=1
|
|
15
|
+
*
|
|
16
|
+
* Verbose line to stderr when something was removed:
|
|
17
|
+
* MANDREL_VERBOSE_TEST_TEMP_CLEANUP=1
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { existsSync, readdirSync, rmSync } from 'node:fs';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
import { runAsCli } from './lib/cli-utils.js';
|
|
23
|
+
import { isReservedTestEpicTempDirName } from './lib/test-reserved-epic-temp-ids.js';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @param {object} [opts]
|
|
27
|
+
* @param {string} [opts.repoRoot=process.cwd()]
|
|
28
|
+
* @returns {{ skipped: boolean, removed: string[] }}
|
|
29
|
+
*/
|
|
30
|
+
export function cleanupRepoTestTempArtifacts({
|
|
31
|
+
repoRoot = process.cwd(),
|
|
32
|
+
} = {}) {
|
|
33
|
+
if (process.env.MANDREL_SKIP_POSTTEST_TEMP_CLEANUP === '1') {
|
|
34
|
+
return { skipped: true, removed: [] };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const tempDir = path.join(repoRoot, 'temp');
|
|
38
|
+
if (!existsSync(tempDir)) {
|
|
39
|
+
return { skipped: false, removed: [] };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** @type {string[]} */
|
|
43
|
+
const removed = [];
|
|
44
|
+
for (const ent of readdirSync(tempDir, { withFileTypes: true })) {
|
|
45
|
+
if (!ent.isDirectory() || !isReservedTestEpicTempDirName(ent.name))
|
|
46
|
+
continue;
|
|
47
|
+
const full = path.join(tempDir, ent.name);
|
|
48
|
+
rmSync(full, { recursive: true, force: true });
|
|
49
|
+
removed.push(ent.name);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (
|
|
53
|
+
removed.length > 0 &&
|
|
54
|
+
process.env.MANDREL_VERBOSE_TEST_TEMP_CLEANUP === '1'
|
|
55
|
+
) {
|
|
56
|
+
const names = removed.slice().sort().join(', ');
|
|
57
|
+
process.stderr.write(
|
|
58
|
+
`[cleanup-repo-test-temp] removed ${removed.length} epic dir(s): ${names}\n`,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return { skipped: false, removed };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
runAsCli(import.meta.url, async () => {
|
|
66
|
+
cleanupRepoTestTempArtifacts();
|
|
67
|
+
});
|