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,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git-utils.js — Shared Git Shell Utilities
|
|
3
|
+
*
|
|
4
|
+
* Centralizes all Git subprocess invocations for the orchestration
|
|
5
|
+
* engine, eliminating duplicated wrappers across the codebase.
|
|
6
|
+
*
|
|
7
|
+
* Two flavours are provided. Choose based on whether a non-zero git exit
|
|
8
|
+
* code represents a bug (use `gitSync`) or a recoverable runtime state
|
|
9
|
+
* (use `gitSpawn`):
|
|
10
|
+
*
|
|
11
|
+
* - `gitSync(cwd, ...args)` — throws on non-zero exit; returns trimmed
|
|
12
|
+
* stdout. Use when the operation must succeed for the caller to
|
|
13
|
+
* proceed (e.g. `rev-parse HEAD`, `merge-base --is-ancestor` inside a
|
|
14
|
+
* critical-path check). A non-zero exit is treated as a bug or a
|
|
15
|
+
* corrupted repo state, and the throw propagates to the caller's
|
|
16
|
+
* existing error path.
|
|
17
|
+
*
|
|
18
|
+
* - `gitSpawn(cwd, ...args)` — never throws; returns a {@link GitResult}
|
|
19
|
+
* object. Use when the caller needs to inspect or recover from the
|
|
20
|
+
* non-zero case (e.g. `merge-base --is-ancestor` as a boolean check,
|
|
21
|
+
* `branch -D` where "no such branch" is acceptable, fetch/push retry
|
|
22
|
+
* loops where the caller decides whether to retry on stderr content).
|
|
23
|
+
*
|
|
24
|
+
* The two functions are intentional siblings — they share argument shape so
|
|
25
|
+
* either can be substituted at a call site by changing the import. Do not
|
|
26
|
+
* unify into a single `git({ throwOnNonZero })` until the call-site split
|
|
27
|
+
* shows roughly even use of each contract.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { execFileSync, spawnSync } from 'node:child_process';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Result of a `gitSpawn` invocation. Field semantics match `child_process.spawnSync`
|
|
34
|
+
* with two normalisations: `status` is coerced to `1` when null (e.g. when
|
|
35
|
+
* the child terminated by signal), and stdout/stderr are trimmed.
|
|
36
|
+
*
|
|
37
|
+
* @typedef {object} GitResult
|
|
38
|
+
* @property {number} status - Process exit code (0 = success).
|
|
39
|
+
* @property {string} stdout - Trimmed stdout.
|
|
40
|
+
* @property {string} stderr - Trimmed stderr.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
let _execFileSync = execFileSync;
|
|
44
|
+
let _spawnSync = spawnSync;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Build a child-process env that drops every `GIT_*` variable inherited from
|
|
48
|
+
* the parent. When this module's helpers run inside a git hook (e.g. husky
|
|
49
|
+
* pre-push) the parent git invocation exports GIT_DIR / GIT_WORK_TREE /
|
|
50
|
+
* GIT_INDEX_FILE / GIT_PREFIX / GIT_COMMON_DIR / etc. Those env vars
|
|
51
|
+
* override the explicit `cwd` we pass, so a `gitSync(tmpdir, 'init')` ends
|
|
52
|
+
* up operating on the parent worktree's `.git` rather than `tmpdir`. Tests
|
|
53
|
+
* that spin up real git fixtures break reproducibly under that shape.
|
|
54
|
+
*
|
|
55
|
+
* Stripping every `GIT_*` is broader than strictly necessary but cheap and
|
|
56
|
+
* impossible to drift out of sync with future git releases. Author/committer
|
|
57
|
+
* identity is restored via per-call `env:` overrides where required.
|
|
58
|
+
*/
|
|
59
|
+
function cleanGitEnv() {
|
|
60
|
+
return Object.fromEntries(
|
|
61
|
+
Object.entries(process.env).filter(([k]) => !k.startsWith('GIT_')),
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Override git runners. Testing-only seam — not part of the stable API.
|
|
67
|
+
*
|
|
68
|
+
* Production code must not call this. The double-underscore prefix is the
|
|
69
|
+
* contract: `__setGitRunners` exists so the test suite can inject mock
|
|
70
|
+
* child-process runners without requiring a broader DI refactor of every
|
|
71
|
+
* `gitSync`/`gitSpawn` call site. If more injection points become needed,
|
|
72
|
+
* replace this seam with a proper `createGitRunner({exec, spawn})` factory
|
|
73
|
+
* and thread it through the module graph.
|
|
74
|
+
*
|
|
75
|
+
* @param {typeof execFileSync} exec - Mock for `execFileSync`.
|
|
76
|
+
* @param {typeof spawnSync} spawn - Mock for `spawnSync`.
|
|
77
|
+
*/
|
|
78
|
+
export function __setGitRunners(exec, spawn) {
|
|
79
|
+
_execFileSync = exec;
|
|
80
|
+
_spawnSync = spawn;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Run a git command synchronously, returning trimmed stdout.
|
|
85
|
+
* Throws an Error if the command exits with a non-zero code.
|
|
86
|
+
*
|
|
87
|
+
* @param {string} cwd - Working directory for the git process.
|
|
88
|
+
* @param {...string} args - Git sub-command and arguments.
|
|
89
|
+
* @returns {string} Trimmed stdout text.
|
|
90
|
+
*/
|
|
91
|
+
export function gitSync(cwd, ...args) {
|
|
92
|
+
return _execFileSync('git', args, {
|
|
93
|
+
cwd,
|
|
94
|
+
encoding: 'utf8',
|
|
95
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
96
|
+
shell: false,
|
|
97
|
+
env: cleanGitEnv(),
|
|
98
|
+
}).trim();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Run a git command synchronously, returning a result object.
|
|
103
|
+
* Never throws — callers must inspect `status` to detect failure.
|
|
104
|
+
*
|
|
105
|
+
* @param {string} cwd - Working directory for the git process.
|
|
106
|
+
* @param {...string} args - Git sub-command and arguments.
|
|
107
|
+
* @returns {GitResult}
|
|
108
|
+
*/
|
|
109
|
+
export function gitSpawn(cwd, ...args) {
|
|
110
|
+
const result = _spawnSync('git', args, {
|
|
111
|
+
cwd,
|
|
112
|
+
stdio: 'pipe',
|
|
113
|
+
encoding: 'utf-8',
|
|
114
|
+
shell: false,
|
|
115
|
+
env: cleanGitEnv(),
|
|
116
|
+
});
|
|
117
|
+
return {
|
|
118
|
+
status: result.status ?? 1,
|
|
119
|
+
stdout: (result.stdout ?? '').trim(),
|
|
120
|
+
stderr: (result.stderr ?? '').trim(),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Build a git interface closed over injected child-process runners. Preferred
|
|
126
|
+
* seam for callers that want explicit injection without touching the
|
|
127
|
+
* module-global `__setGitRunners` state (which is a test-only override that
|
|
128
|
+
* leaks between suites). The returned object has the same shape as this
|
|
129
|
+
* module's namespace exports (`gitSync`, `gitSpawn`, `gitFetchWithRetry`,
|
|
130
|
+
* `gitPullWithRetry`) so it is drop-in as a `ctx.git` replacement.
|
|
131
|
+
*
|
|
132
|
+
* @param {object} [deps]
|
|
133
|
+
* @param {typeof execFileSync} [deps.exec] - Defaults to real `execFileSync`.
|
|
134
|
+
* @param {typeof spawnSync} [deps.spawn] - Defaults to real `spawnSync`.
|
|
135
|
+
* @param {(ms: number) => Promise<void>} [deps.sleep] - Retry backoff sleep.
|
|
136
|
+
* @param {number} [deps.jitter] - Jitter factor for retry backoff.
|
|
137
|
+
*/
|
|
138
|
+
export function createGitInterface(deps = {}) {
|
|
139
|
+
const exec = deps.exec ?? execFileSync;
|
|
140
|
+
const spawn = deps.spawn ?? spawnSync;
|
|
141
|
+
const sleep =
|
|
142
|
+
deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
143
|
+
const jitterFactor = deps.jitter ?? 0.5;
|
|
144
|
+
|
|
145
|
+
const gitSync = (cwd, ...args) =>
|
|
146
|
+
exec('git', args, {
|
|
147
|
+
cwd,
|
|
148
|
+
encoding: 'utf8',
|
|
149
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
150
|
+
shell: false,
|
|
151
|
+
env: cleanGitEnv(),
|
|
152
|
+
}).trim();
|
|
153
|
+
|
|
154
|
+
const gitSpawn = (cwd, ...args) => {
|
|
155
|
+
const result = spawn('git', args, {
|
|
156
|
+
cwd,
|
|
157
|
+
stdio: 'pipe',
|
|
158
|
+
encoding: 'utf-8',
|
|
159
|
+
shell: false,
|
|
160
|
+
env: cleanGitEnv(),
|
|
161
|
+
});
|
|
162
|
+
return {
|
|
163
|
+
status: result.status ?? 1,
|
|
164
|
+
stdout: (result.stdout ?? '').trim(),
|
|
165
|
+
stderr: (result.stderr ?? '').trim(),
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
async function runWithRetry(leadingArgs, cwd, args) {
|
|
170
|
+
const backoff = [250, 500, 1000];
|
|
171
|
+
let attempt = 0;
|
|
172
|
+
let last;
|
|
173
|
+
for (;;) {
|
|
174
|
+
attempt++;
|
|
175
|
+
last = gitSpawn(cwd, ...leadingArgs, ...args);
|
|
176
|
+
if (last.status === 0) return { ...last, attempts: attempt };
|
|
177
|
+
if (!isPackedRefsContention(last.stderr))
|
|
178
|
+
return { ...last, attempts: attempt };
|
|
179
|
+
if (attempt > backoff.length) return { ...last, attempts: attempt };
|
|
180
|
+
const base = backoff[attempt - 1];
|
|
181
|
+
const jitter = Math.floor(Math.random() * base * jitterFactor);
|
|
182
|
+
await sleep(base + jitter);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
gitSync,
|
|
188
|
+
gitSpawn,
|
|
189
|
+
gitFetchWithRetry: (cwd, ...args) => runWithRetry(['fetch'], cwd, args),
|
|
190
|
+
gitPullWithRetry: (cwd, ...args) =>
|
|
191
|
+
runWithRetry(['pull', '--rebase'], cwd, args),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Known lock-contention error signatures that occur when two worktrees
|
|
197
|
+
* fetch concurrently against the same repo. Matching any of these is the
|
|
198
|
+
* only condition under which `gitFetchWithRetry` will re-attempt —
|
|
199
|
+
* unrelated fetch failures surface immediately.
|
|
200
|
+
*/
|
|
201
|
+
const PACKED_REFS_CONTENTION_PATTERNS = [
|
|
202
|
+
/packed-refs\.lock/i,
|
|
203
|
+
/cannot lock ref/i,
|
|
204
|
+
/Unable to create '.*\.lock'/i,
|
|
205
|
+
/another git process seems to be running/i,
|
|
206
|
+
];
|
|
207
|
+
|
|
208
|
+
function isPackedRefsContention(stderr) {
|
|
209
|
+
if (!stderr) return false;
|
|
210
|
+
return PACKED_REFS_CONTENTION_PATTERNS.some((p) => p.test(stderr));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Sleep helper for retry backoff. Overridable via `__setSleep` so tests
|
|
215
|
+
* can skip real wall-clock delays without relying on node:test timer mocks.
|
|
216
|
+
* @param {number} ms
|
|
217
|
+
* @returns {Promise<void>}
|
|
218
|
+
*/
|
|
219
|
+
let _sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
220
|
+
let _jitterFactor = 0.5;
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Test-only seam: replace the sleep implementation used by
|
|
224
|
+
* `gitFetchWithRetry` to avoid real backoff in unit tests.
|
|
225
|
+
* @param {(ms: number) => Promise<void>} fn
|
|
226
|
+
* @param {{ jitter?: number }} [opts] - Override jitter factor (default: 0 for mocks).
|
|
227
|
+
*/
|
|
228
|
+
export function __setSleep(fn, opts = {}) {
|
|
229
|
+
_sleep = fn;
|
|
230
|
+
_jitterFactor = opts.jitter ?? 0;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Run `git fetch …` with a bounded retry loop that only triggers on known
|
|
235
|
+
* packed-refs lock-contention signatures. Non-contention failures surface
|
|
236
|
+
* immediately (no retry). Success short-circuits the loop.
|
|
237
|
+
*
|
|
238
|
+
* Backoff schedule: 250ms, 500ms, 1000ms (3 retries → 4 attempts total).
|
|
239
|
+
* Deliberately no global lock — a mutex would erase the parallelism the
|
|
240
|
+
* worktree-isolation model is designed to enable.
|
|
241
|
+
*
|
|
242
|
+
* @param {string} cwd
|
|
243
|
+
* @param {...string} args - Arguments after `fetch` (e.g. `'origin'`).
|
|
244
|
+
* @returns {Promise<{ status: number, stdout: string, stderr: string, attempts: number }>}
|
|
245
|
+
*/
|
|
246
|
+
export async function gitFetchWithRetry(cwd, ...args) {
|
|
247
|
+
const backoff = [250, 500, 1000];
|
|
248
|
+
let attempt = 0;
|
|
249
|
+
let last;
|
|
250
|
+
for (;;) {
|
|
251
|
+
attempt++;
|
|
252
|
+
last = gitSpawn(cwd, 'fetch', ...args);
|
|
253
|
+
if (last.status === 0) return { ...last, attempts: attempt };
|
|
254
|
+
if (!isPackedRefsContention(last.stderr))
|
|
255
|
+
return { ...last, attempts: attempt };
|
|
256
|
+
if (attempt > backoff.length) return { ...last, attempts: attempt };
|
|
257
|
+
const base = backoff[attempt - 1];
|
|
258
|
+
const jitter = Math.floor(Math.random() * base * _jitterFactor);
|
|
259
|
+
await _sleep(base + jitter);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Run `git pull --rebase …` with the same bounded retry loop as
|
|
265
|
+
* `gitFetchWithRetry`. Packed-refs contention can occur during pulls
|
|
266
|
+
* just as during fetches — particularly in multi-worktree setups.
|
|
267
|
+
*
|
|
268
|
+
* @param {string} cwd
|
|
269
|
+
* @param {...string} args - Arguments after `pull --rebase` (e.g. `'origin', 'main'`).
|
|
270
|
+
* @returns {Promise<{ status: number, stdout: string, stderr: string, attempts: number }>}
|
|
271
|
+
*/
|
|
272
|
+
export async function gitPullWithRetry(cwd, ...args) {
|
|
273
|
+
const backoff = [250, 500, 1000];
|
|
274
|
+
let attempt = 0;
|
|
275
|
+
let last;
|
|
276
|
+
for (;;) {
|
|
277
|
+
attempt++;
|
|
278
|
+
last = gitSpawn(cwd, 'pull', '--rebase', ...args);
|
|
279
|
+
if (last.status === 0) return { ...last, attempts: attempt };
|
|
280
|
+
if (!isPackedRefsContention(last.stderr))
|
|
281
|
+
return { ...last, attempts: attempt };
|
|
282
|
+
if (attempt > backoff.length) return { ...last, attempts: attempt };
|
|
283
|
+
const base = backoff[attempt - 1];
|
|
284
|
+
const jitter = Math.floor(Math.random() * base * _jitterFactor);
|
|
285
|
+
await _sleep(base + jitter);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Resolves the canonical branch name for an Epic.
|
|
291
|
+
* v5 Standard: epic/[EPIC_ID]
|
|
292
|
+
* @param {string|number} epicId
|
|
293
|
+
* @returns {string}
|
|
294
|
+
*/
|
|
295
|
+
export function getEpicBranch(epicId) {
|
|
296
|
+
const id = typeof epicId === 'number' ? epicId : Number.parseInt(epicId, 10);
|
|
297
|
+
if (!Number.isFinite(id) || id <= 0) {
|
|
298
|
+
throw new Error(`getEpicBranch: invalid epicId: ${epicId}`);
|
|
299
|
+
}
|
|
300
|
+
return `epic/${id}`;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Sanitize a string into a URL/branch-safe slug.
|
|
305
|
+
* Lowercases, replaces non-alphanumeric characters with hyphens,
|
|
306
|
+
* collapses multiple hyphens, and trims leading/trailing hyphens.
|
|
307
|
+
*
|
|
308
|
+
* @param {string} text - Raw text to slugify.
|
|
309
|
+
* @returns {string} Sanitized slug.
|
|
310
|
+
*/
|
|
311
|
+
export function slugify(text) {
|
|
312
|
+
return text
|
|
313
|
+
.toLowerCase()
|
|
314
|
+
.replace(/[^a-z0-9_-]/g, '-')
|
|
315
|
+
.replace(/-+/g, '-')
|
|
316
|
+
.replace(/^-|-$/g, '');
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Resolves the canonical branch name for a Story.
|
|
321
|
+
* v5 Standard: story-[STORY_ID]
|
|
322
|
+
* @param {string|number} _epicId - Unused; retained for back-compat call sites.
|
|
323
|
+
* @param {string|number} storyId
|
|
324
|
+
* @returns {string}
|
|
325
|
+
*/
|
|
326
|
+
export function getStoryBranch(_epicId, storyId) {
|
|
327
|
+
const id =
|
|
328
|
+
typeof storyId === 'number' ? storyId : Number.parseInt(storyId, 10);
|
|
329
|
+
if (!Number.isFinite(id) || id <= 0) {
|
|
330
|
+
throw new Error(`getStoryBranch: invalid storyId: ${storyId}`);
|
|
331
|
+
}
|
|
332
|
+
return `story-${id}`;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Canonical `story-<id>` branch name matcher. Single source of truth for the
|
|
337
|
+
* Story-branch shape — `parseStoryBranch` and `isStoryBranch` both close over
|
|
338
|
+
* this so call sites never re-author the regex inline.
|
|
339
|
+
*/
|
|
340
|
+
const STORY_BRANCH_RE = /^story-(\d+)$/;
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Parse a canonical Story branch name into its numeric Story ID.
|
|
344
|
+
*
|
|
345
|
+
* @param {string} name - Branch name to inspect (e.g. `story-3334`).
|
|
346
|
+
* @returns {number|null} The Story ID when `name` matches `story-<id>`,
|
|
347
|
+
* otherwise `null`.
|
|
348
|
+
*/
|
|
349
|
+
export function parseStoryBranch(name) {
|
|
350
|
+
if (typeof name !== 'string') return null;
|
|
351
|
+
const match = STORY_BRANCH_RE.exec(name);
|
|
352
|
+
return match ? Number.parseInt(match[1], 10) : null;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Predicate: is `name` a canonical `story-<id>` branch name?
|
|
357
|
+
*
|
|
358
|
+
* @param {string} name - Branch name to test.
|
|
359
|
+
* @returns {boolean}
|
|
360
|
+
*/
|
|
361
|
+
export function isStoryBranch(name) {
|
|
362
|
+
return parseStoryBranch(name) !== null;
|
|
363
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// .agents/scripts/lib/github-url.js
|
|
2
|
+
/**
|
|
3
|
+
* Shared GitHub URL utilities. Consolidates the `parsePrNumberFromUrl` helper
|
|
4
|
+
* that was triplicated across `finalizer.js`, `watcher.js`, and
|
|
5
|
+
* `code-review.js`, each with a subtly different regex. Story #3649.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Extract the PR number from a GitHub PR URL.
|
|
10
|
+
*
|
|
11
|
+
* Accepts any URL whose path contains `/pull/<digits>` — the fragment
|
|
12
|
+
* (`#diff-…`), query string (`?diff=split`), and trailing slash are all
|
|
13
|
+
* ignored. Returns `null` when the URL is not a string, does not contain
|
|
14
|
+
* a `/pull/` segment, or when the parsed integer is ≤ 0.
|
|
15
|
+
*
|
|
16
|
+
* This is the canonical implementation; the inline copies in `finalizer.js`,
|
|
17
|
+
* `watcher.js`, and `code-review.js` have been deleted in favour of this
|
|
18
|
+
* function.
|
|
19
|
+
*
|
|
20
|
+
* @param {string|null|undefined} prUrl
|
|
21
|
+
* @returns {number|null}
|
|
22
|
+
*/
|
|
23
|
+
export function parsePrNumberFromUrl(prUrl) {
|
|
24
|
+
if (typeof prUrl !== 'string') return null;
|
|
25
|
+
const m = prUrl.match(/\/pull\/(\d+)(?:[/?#]|$)/);
|
|
26
|
+
if (!m) return null;
|
|
27
|
+
const n = Number.parseInt(m[1], 10);
|
|
28
|
+
return Number.isInteger(n) && n > 0 ? n : null;
|
|
29
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tokenize + spawn the operator-supplied install command in argv form
|
|
3
|
+
* (shell:true is only used on Windows because well-known package managers
|
|
4
|
+
* ship as `.cmd` shims and Node 18.20+/20.10+/22+ refuses to spawn them
|
|
5
|
+
* with shell:false under CVE-2024-27980). Tokenization removes the
|
|
6
|
+
* single-string injection vector — args are escaped individually even
|
|
7
|
+
* when shell:true is required for binary resolution.
|
|
8
|
+
*
|
|
9
|
+
* Whitespace tokenization (no quote handling) is deliberate: the input
|
|
10
|
+
* contract is a simple `binary arg arg …` form. Operators that need
|
|
11
|
+
* quoted args can pass a `runInstall` override directly.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { spawnSync as defaultSpawnSync } from 'node:child_process';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {string} installCmd
|
|
18
|
+
* @returns {{ bin: string, args: string[], shell: boolean }}
|
|
19
|
+
*/
|
|
20
|
+
export function parseInstallCmd(installCmd) {
|
|
21
|
+
const tokens = String(installCmd ?? '')
|
|
22
|
+
.trim()
|
|
23
|
+
.split(/\s+/)
|
|
24
|
+
.filter(Boolean);
|
|
25
|
+
if (tokens.length === 0) {
|
|
26
|
+
throw new RangeError(
|
|
27
|
+
'parseInstallCmd: install command must contain at least one token',
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
const [bin, ...args] = tokens;
|
|
31
|
+
return { bin, args, shell: process.platform === 'win32' };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Default runInstall implementation. Tokenizes `installCmd`, then spawns
|
|
36
|
+
* synchronously with the correct shell flag per platform.
|
|
37
|
+
*
|
|
38
|
+
* @param {string} installCmd
|
|
39
|
+
* @param {string} cwd
|
|
40
|
+
* @param {{ spawnSync?: typeof defaultSpawnSync }} [deps] — test seam
|
|
41
|
+
* @returns {{ status: number, stderr: string }}
|
|
42
|
+
*/
|
|
43
|
+
export function runInstallCommand(installCmd, cwd, deps = {}) {
|
|
44
|
+
const spawnSync = deps.spawnSync ?? defaultSpawnSync;
|
|
45
|
+
const { bin, args, shell } = parseInstallCmd(installCmd);
|
|
46
|
+
const r = spawnSync(bin, args, { cwd, stdio: 'inherit', shell });
|
|
47
|
+
return {
|
|
48
|
+
status: r.status ?? 1,
|
|
49
|
+
stderr: r.stderr ? String(r.stderr) : '',
|
|
50
|
+
};
|
|
51
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse PRD / Tech-Spec / Acceptance-Spec references from a GitHub epic body.
|
|
3
|
+
* Extracted from providers/github.js so link-parsing is not mixed with HTTP
|
|
4
|
+
* transport.
|
|
5
|
+
*
|
|
6
|
+
* Expected markdown conventions in an epic body (case-insensitive, tolerant
|
|
7
|
+
* of the `- [ ]` / `- [x]` checkbox prefix that `epic-plan-spec.js` emits in
|
|
8
|
+
* the `## Planning Artifacts` section):
|
|
9
|
+
* - "PRD: #42" or "prd #42"
|
|
10
|
+
* - "Tech Spec: #43" / "Technical Spec: #43" / "tech-spec: #43"
|
|
11
|
+
* - "Acceptance Spec: #44" / "acceptance-spec: #44" / "accept spec: #44"
|
|
12
|
+
*
|
|
13
|
+
* Story #2091 added the `acceptanceSpec` slot so the
|
|
14
|
+
* `closePlanningArtifacts()` cascade in `epic-deliver-finalize.js` can close
|
|
15
|
+
* the `context::acceptance-spec` ticket Epic #2001 introduces alongside the
|
|
16
|
+
* existing PRD / Tech-Spec pair.
|
|
17
|
+
*
|
|
18
|
+
* Story #3848: regexes are now scoped to the `## Planning Artifacts` section
|
|
19
|
+
* only. Prose elsewhere in the body (e.g. bundled-follow-up notes that
|
|
20
|
+
* mention a foreign Epic's spec ticket by number) can no longer collide with
|
|
21
|
+
* the machine-managed list items.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const PRD_RE = /(?:PRD|prd)[:\s]+#(\d+)/;
|
|
25
|
+
const TECH_SPEC_RE = /(?:Tech Spec|tech.?spec|technical.?spec)[:\s]+#(\d+)/i;
|
|
26
|
+
const ACCEPTANCE_SPEC_RE =
|
|
27
|
+
/(?:Acceptance Spec|acceptance.?spec|accept.?spec)[:\s]+#(\d+)/i;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Extract the `## Planning Artifacts` section text from an Epic body.
|
|
31
|
+
* Returns the slice from just after the heading line to the next `##`-level
|
|
32
|
+
* heading (exclusive), or to end-of-string when no following heading is
|
|
33
|
+
* present. Returns an empty string when the section is absent.
|
|
34
|
+
*
|
|
35
|
+
* @param {string} body
|
|
36
|
+
* @returns {string}
|
|
37
|
+
*/
|
|
38
|
+
function extractPlanningArtifactsSection(body) {
|
|
39
|
+
// Step 1: locate the heading.
|
|
40
|
+
const startMatch = body.match(/^##\s+Planning Artifacts[^\n]*/m);
|
|
41
|
+
if (!startMatch) return '';
|
|
42
|
+
// Step 2: slice from just after the heading to the next ## heading (or EOB).
|
|
43
|
+
const afterHeading = body.slice(startMatch.index + startMatch[0].length);
|
|
44
|
+
const nextHeadingMatch = afterHeading.match(/\n##\s/);
|
|
45
|
+
return nextHeadingMatch
|
|
46
|
+
? afterHeading.slice(0, nextHeadingMatch.index)
|
|
47
|
+
: afterHeading;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param {string|null|undefined} body
|
|
52
|
+
* @returns {{ prd: number|null, techSpec: number|null, acceptanceSpec: number|null }}
|
|
53
|
+
*/
|
|
54
|
+
export function parseLinkedIssues(body) {
|
|
55
|
+
const result = { prd: null, techSpec: null, acceptanceSpec: null };
|
|
56
|
+
if (typeof body !== 'string' || body.length === 0) return result;
|
|
57
|
+
|
|
58
|
+
// Scope all regex matching to the canonical Planning Artifacts section so
|
|
59
|
+
// prose references elsewhere in the body do not shadow the machine-managed
|
|
60
|
+
// list items. When the section is absent every slot stays null — the caller
|
|
61
|
+
// (plan-epic.js) treats null as "not yet linked" and creates fresh tickets.
|
|
62
|
+
const section = extractPlanningArtifactsSection(body);
|
|
63
|
+
if (section.length === 0) return result;
|
|
64
|
+
|
|
65
|
+
const prdMatch = section.match(PRD_RE);
|
|
66
|
+
if (prdMatch) result.prd = Number.parseInt(prdMatch[1], 10);
|
|
67
|
+
const specMatch = section.match(TECH_SPEC_RE);
|
|
68
|
+
if (specMatch) result.techSpec = Number.parseInt(specMatch[1], 10);
|
|
69
|
+
const acceptanceMatch = section.match(ACCEPTANCE_SPEC_RE);
|
|
70
|
+
if (acceptanceMatch) {
|
|
71
|
+
result.acceptanceSpec = Number.parseInt(acceptanceMatch[1], 10);
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* json-utils.js — shared JSON-shape helpers.
|
|
3
|
+
*
|
|
4
|
+
* Hoisted out of five callers (`lib/baselines/writer.js`,
|
|
5
|
+
* `lib/config/defaults.js`, `lib/observability/baseline-refresh-rate.js`,
|
|
6
|
+
* `lib/observability/perf-aggregator.js`, `lib/signals/schema.js`) which
|
|
7
|
+
* shipped functionally-equivalent copies of these predicates. See Story
|
|
8
|
+
* #2464.
|
|
9
|
+
*
|
|
10
|
+
* The helpers are scoped to JSON-shaped data — numbers, strings, booleans,
|
|
11
|
+
* null, arrays, and plain objects. They do not handle Dates, Maps, Sets,
|
|
12
|
+
* RegExps, or class instances; callers either JSON-roundtrip their inputs
|
|
13
|
+
* or only ever pass JSON-equivalent values (the on-disk baseline writer
|
|
14
|
+
* and the config defaults module both fall in the second bucket).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Return true when `v` is a plain object (not null, not an array). Used
|
|
19
|
+
* by readers and aggregators to defensively pre-flight record shapes.
|
|
20
|
+
*
|
|
21
|
+
* @param {unknown} v
|
|
22
|
+
* @returns {boolean}
|
|
23
|
+
*/
|
|
24
|
+
export function isObject(v) {
|
|
25
|
+
return v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Structural deep-equality for JSON-shaped data. Object key order is
|
|
30
|
+
* ignored. Array order is significant. NaN compares unequal (matches
|
|
31
|
+
* `===` semantics; callers must not pass NaN).
|
|
32
|
+
*
|
|
33
|
+
* @param {unknown} a
|
|
34
|
+
* @param {unknown} b
|
|
35
|
+
* @returns {boolean}
|
|
36
|
+
*/
|
|
37
|
+
export function deepEqual(a, b) {
|
|
38
|
+
if (a === b) return true;
|
|
39
|
+
if (a === null || b === null) return a === b;
|
|
40
|
+
if (typeof a !== typeof b) return false;
|
|
41
|
+
if (typeof a !== 'object') return false;
|
|
42
|
+
const aArr = Array.isArray(a);
|
|
43
|
+
const bArr = Array.isArray(b);
|
|
44
|
+
if (aArr !== bArr) return false;
|
|
45
|
+
if (aArr) {
|
|
46
|
+
if (a.length !== b.length) return false;
|
|
47
|
+
for (let i = 0; i < a.length; i += 1) {
|
|
48
|
+
if (!deepEqual(a[i], b[i])) return false;
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
const aKeys = Object.keys(a);
|
|
53
|
+
const bKeys = Object.keys(b);
|
|
54
|
+
if (aKeys.length !== bKeys.length) return false;
|
|
55
|
+
for (const k of aKeys) {
|
|
56
|
+
if (!Object.hasOwn(b, k)) return false;
|
|
57
|
+
if (!deepEqual(a[k], b[k])) return false;
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
}
|