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,559 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/orchestration/ticketing/state.js — Per-ticket state mutators.
|
|
3
|
+
*
|
|
4
|
+
* Owns the one-ticket-at-a-time mutation surface: state-label
|
|
5
|
+
* transitions, tasklist checkbox toggling, and structured-comment
|
|
6
|
+
* post/upsert. Pulled out of `../ticketing.js` under Story #1848 so
|
|
7
|
+
* the read-side (`./reads.js`) and the cascade/bulk side (`./bulk.js`)
|
|
8
|
+
* each live behind a narrower import contract.
|
|
9
|
+
*
|
|
10
|
+
* Note on the cycle: `transitionTicketState` fires `cascadeCompletion`
|
|
11
|
+
* from `./bulk.js` whenever a ticket flips to `agent::done` with the
|
|
12
|
+
* default `cascade: true`. `./bulk.js` in turn imports
|
|
13
|
+
* `transitionTicketState` to walk the parent chain. ESM tolerates the
|
|
14
|
+
* cycle because neither side dereferences the other at
|
|
15
|
+
* module-evaluation time — both bindings are resolved at call-time
|
|
16
|
+
* once both modules have completed evaluation.
|
|
17
|
+
*
|
|
18
|
+
* Story #3661 — `_columnSyncRegistry` is a module-level WeakMap that
|
|
19
|
+
* retains one `ColumnSync` instance per provider for the lifetime of the
|
|
20
|
+
* process. `ColumnSync` already caches the project metadata (projectId,
|
|
21
|
+
* fieldId, option ids) inside the instance after the first GraphQL fetch
|
|
22
|
+
* (`this._meta`), but that cache was discarded on every label transition
|
|
23
|
+
* because `syncProjectStatusColumn` constructed a fresh instance each
|
|
24
|
+
* call. The registry lets the instance — and therefore its `_meta`
|
|
25
|
+
* cache — survive across transitions, so the invariant metadata is
|
|
26
|
+
* resolved exactly once per run rather than once per label flip.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { extractEpicIdFromBody } from '../../dependency-parser.js';
|
|
30
|
+
import { Logger } from '../../Logger.js';
|
|
31
|
+
import {
|
|
32
|
+
eventSeverity,
|
|
33
|
+
renderTransitionMessage,
|
|
34
|
+
} from '../../notifications/notifier.js';
|
|
35
|
+
import { ColumnSync } from '../column-sync.js';
|
|
36
|
+
// Story #1848 — cascade primitives live in `./bulk.js`. The ESM cycle
|
|
37
|
+
// between state.js ↔ bulk.js is safe because neither side dereferences
|
|
38
|
+
// the imported bindings at module-evaluation time — both are invoked at
|
|
39
|
+
// call-time once the cycle has fully resolved. Story #2676 — the entry
|
|
40
|
+
// point for upward propagation is now `cascadeParentState`, which
|
|
41
|
+
// delegates `agent::done` transitions to `cascadeCompletion` internally.
|
|
42
|
+
import { cascadeParentState, logCascadePartialFailures } from './bulk.js';
|
|
43
|
+
import {
|
|
44
|
+
ALL_STATES,
|
|
45
|
+
assertValidStructuredCommentType,
|
|
46
|
+
findStructuredComment,
|
|
47
|
+
getProviderCommentCache,
|
|
48
|
+
invalidateRawCommentsCache,
|
|
49
|
+
STATE_LABELS,
|
|
50
|
+
structuredCommentCacheKey,
|
|
51
|
+
structuredCommentMarker,
|
|
52
|
+
} from './reads.js';
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* One `ColumnSync` instance per provider, retained for the process
|
|
56
|
+
* lifetime so the invariant project metadata (`projectId`, `fieldId`,
|
|
57
|
+
* option ids) is fetched exactly once per run regardless of how many
|
|
58
|
+
* label transitions fire. The `ColumnSync` instance already caches
|
|
59
|
+
* the metadata internally (`_meta`), but that cache was thrown away on
|
|
60
|
+
* every call to `syncProjectStatusColumn` because the function
|
|
61
|
+
* constructed a fresh instance each time. Story #3661.
|
|
62
|
+
*
|
|
63
|
+
* `WeakMap` keys are GC-friendly: when a provider is collected the
|
|
64
|
+
* entry is automatically removed without a manual eviction step.
|
|
65
|
+
*/
|
|
66
|
+
const _columnSyncRegistry = new WeakMap();
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Drop the cached `ColumnSync` for a given provider. Exposed as a
|
|
70
|
+
* named export so unit tests that swap providers between assertions can
|
|
71
|
+
* reset the registry without reloading the module.
|
|
72
|
+
*
|
|
73
|
+
* @param {object} provider
|
|
74
|
+
*/
|
|
75
|
+
export function _resetColumnSyncCache(provider) {
|
|
76
|
+
_columnSyncRegistry.delete(provider);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Guard the inputs to {@link transitionTicketState}. Extracted from the
|
|
81
|
+
* outer function so that the per-method cyclomatic complexity of
|
|
82
|
+
* `transitionTicketState` lands below the CRAP-12 ceiling required by
|
|
83
|
+
* Story #1848 (was CRAP 16 prior to the split — see baselines/crap.json).
|
|
84
|
+
*
|
|
85
|
+
* Currently a single label-membership predicate, but extracting it as a
|
|
86
|
+
* named function lets future input guards (e.g. provider-shape checks,
|
|
87
|
+
* concurrency-token validation) accrete here without re-inflating the
|
|
88
|
+
* caller's complexity.
|
|
89
|
+
*
|
|
90
|
+
* @param {string} newState - Target `agent::*` label.
|
|
91
|
+
* @returns {string} The validated newState, returned for fluent reuse.
|
|
92
|
+
* @throws {Error} when `newState` is not a recognised state label.
|
|
93
|
+
*/
|
|
94
|
+
function validateTransitionInputs(newState) {
|
|
95
|
+
if (!ALL_STATES.includes(newState)) {
|
|
96
|
+
throw new Error(`Invalid state: ${newState}`);
|
|
97
|
+
}
|
|
98
|
+
return newState;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Resolve the pre-transition ticket snapshot that drives the notify
|
|
103
|
+
* payload and the provider's label-merge path. Honors the caller-supplied
|
|
104
|
+
* `opts.ticketSnapshot` (Story #1795) when present; otherwise issues a
|
|
105
|
+
* best-effort `getTicket` and returns `null` on transient failure.
|
|
106
|
+
*
|
|
107
|
+
* @param {object} provider
|
|
108
|
+
* @param {{ notify?: Function, ticketSnapshot?: object|null }} opts
|
|
109
|
+
* @param {number} ticketId
|
|
110
|
+
* @returns {Promise<object|null>}
|
|
111
|
+
*/
|
|
112
|
+
async function loadTicketSnapshot(provider, opts, ticketId) {
|
|
113
|
+
if (opts.ticketSnapshot) return opts.ticketSnapshot;
|
|
114
|
+
if (!opts.notify || typeof provider.getTicket !== 'function') return null;
|
|
115
|
+
try {
|
|
116
|
+
return await provider.getTicket(ticketId);
|
|
117
|
+
} catch (err) {
|
|
118
|
+
Logger.debug(
|
|
119
|
+
`[Ticketing] fromState lookup failed for #${ticketId}: ${err.message ?? err}`,
|
|
120
|
+
);
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Mirror the post-flip label set onto the GitHub Projects v2 Status
|
|
127
|
+
* column. Story #2548 — wiring this here makes every caller of
|
|
128
|
+
* `transitionTicketState` (story-init, story-close, story-phase,
|
|
129
|
+
* the LabelTransitioner lifecycle listener, the update-ticket-state CLI,
|
|
130
|
+
* batch transitions) update the board automatically. Prior to #2548 the
|
|
131
|
+
* sync was only wired from the epic-runner against the Epic ticket, so
|
|
132
|
+
* Stories and Tasks never had their `agent::executing` /
|
|
133
|
+
* `agent::blocked` flips reflected on the board.
|
|
134
|
+
*
|
|
135
|
+
* Best-effort: a project-board misconfig, missing scope, or transient
|
|
136
|
+
* GraphQL failure MUST NOT block the label transition itself. Errors
|
|
137
|
+
* surface via `Logger.warn` and the function resolves cleanly.
|
|
138
|
+
*
|
|
139
|
+
* The `_makeColumnSync` default param is a DIP seam: production callers
|
|
140
|
+
* accept the default (which constructs a real `ColumnSync`); tests inject
|
|
141
|
+
* a factory stub that avoids the GraphQL dependency without mocking the
|
|
142
|
+
* module. Story #3645.
|
|
143
|
+
*
|
|
144
|
+
* Story #3661 — when the caller uses the default factory (i.e. did not
|
|
145
|
+
* inject a stub), the function looks up or creates a `ColumnSync`
|
|
146
|
+
* instance in `_columnSyncRegistry` keyed by `provider`. This keeps the
|
|
147
|
+
* instance — and therefore its `_meta` cache — alive across transitions
|
|
148
|
+
* so the invariant project metadata is fetched exactly once per run.
|
|
149
|
+
* Test-injected factories bypass the registry entirely; their synthetic
|
|
150
|
+
* stubs are never stored in `_columnSyncRegistry`.
|
|
151
|
+
*
|
|
152
|
+
* @param {object} provider
|
|
153
|
+
* @param {number} ticketId
|
|
154
|
+
* @param {string} newState
|
|
155
|
+
* @param {(opts: object) => { sync: (id: number, labels: string[]) => Promise<object> }} [_makeColumnSync]
|
|
156
|
+
*/
|
|
157
|
+
async function syncProjectStatusColumn(
|
|
158
|
+
provider,
|
|
159
|
+
ticketId,
|
|
160
|
+
newState,
|
|
161
|
+
_makeColumnSync,
|
|
162
|
+
) {
|
|
163
|
+
try {
|
|
164
|
+
let sync;
|
|
165
|
+
if (_makeColumnSync) {
|
|
166
|
+
// Test-injected factory: bypass the registry so stubs are never
|
|
167
|
+
// accidentally cached and reused in subsequent calls.
|
|
168
|
+
sync = _makeColumnSync({ provider, logger: Logger });
|
|
169
|
+
} else {
|
|
170
|
+
// Production path: look up or create the per-provider instance.
|
|
171
|
+
// The instance's `_meta` cache survives across label transitions
|
|
172
|
+
// so the invariant project metadata (projectId, fieldId, options)
|
|
173
|
+
// is only fetched once per process run. Story #3661.
|
|
174
|
+
if (!_columnSyncRegistry.has(provider)) {
|
|
175
|
+
_columnSyncRegistry.set(
|
|
176
|
+
provider,
|
|
177
|
+
new ColumnSync({ provider, logger: Logger }),
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
sync = _columnSyncRegistry.get(provider);
|
|
181
|
+
}
|
|
182
|
+
await sync.sync(ticketId, [newState]);
|
|
183
|
+
} catch (err) {
|
|
184
|
+
Logger.warn(
|
|
185
|
+
`[Ticketing] column sync failed for #${ticketId} → ${newState}: ${err?.message ?? err}`,
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Dispatch the state-transition notification once the label flip has
|
|
192
|
+
* landed. Pulled out of `transitionTicketState` so the outer function
|
|
193
|
+
* stays below the CRAP-12 ceiling: this is where the severity gating,
|
|
194
|
+
* the ticket-type derivation, the level mapping, and the fire-and-forget
|
|
195
|
+
* dispatch all live.
|
|
196
|
+
*
|
|
197
|
+
* @param {{
|
|
198
|
+
* notify: Function,
|
|
199
|
+
* ticketId: number,
|
|
200
|
+
* ticketSnapshot: object|null,
|
|
201
|
+
* fromState: string|null,
|
|
202
|
+
* newState: string,
|
|
203
|
+
* }} args
|
|
204
|
+
*/
|
|
205
|
+
function dispatchTransitionNotification(args) {
|
|
206
|
+
const { notify, ticketId, ticketSnapshot, fromState, newState } = args;
|
|
207
|
+
const typeLabel =
|
|
208
|
+
ticketSnapshot?.labels?.find((l) => l.startsWith('type::')) ?? '';
|
|
209
|
+
const ticketType = typeLabel.replace(/^type::/, '') || 'ticket';
|
|
210
|
+
const epicId = extractEpicIdFromBody(ticketSnapshot?.body) ?? null;
|
|
211
|
+
const event = {
|
|
212
|
+
kind: 'state-transition',
|
|
213
|
+
ticket: {
|
|
214
|
+
id: ticketId,
|
|
215
|
+
title: ticketSnapshot?.title,
|
|
216
|
+
type: ticketType,
|
|
217
|
+
},
|
|
218
|
+
fromState,
|
|
219
|
+
toState: newState,
|
|
220
|
+
};
|
|
221
|
+
const severity = eventSeverity(event);
|
|
222
|
+
// Suppress the dispatch entirely for low-severity transitions (task-
|
|
223
|
+
// level, or non-terminal story / epic flips). Pre-migration the
|
|
224
|
+
// comment channel filtered these out via `commentMinLevel: medium`;
|
|
225
|
+
// post-migration the channel is event-allowlist gated and would
|
|
226
|
+
// surface every transition equally, so the noise filter moves to
|
|
227
|
+
// the emit point.
|
|
228
|
+
if (severity === 'low') return;
|
|
229
|
+
const message = renderTransitionMessage(event);
|
|
230
|
+
// Post to the epic so operators get a single timeline feed; fall back
|
|
231
|
+
// to the transitioned ticket itself when no epic reference is present.
|
|
232
|
+
// The dispatch is fire-and-forget by design (a failed notification must
|
|
233
|
+
// not block the state transition itself), but surfacing the failure via
|
|
234
|
+
// the logger preserves operator visibility — the previous empty-handler
|
|
235
|
+
// .catch swallowed network blips and webhook 5xxs without any signal.
|
|
236
|
+
const targetId = epicId ?? ticketId;
|
|
237
|
+
const level =
|
|
238
|
+
ticketType === 'epic' || ticketType === 'wave' || ticketType === 'story'
|
|
239
|
+
? ticketType
|
|
240
|
+
: 'task';
|
|
241
|
+
Promise.resolve(
|
|
242
|
+
notify(targetId, {
|
|
243
|
+
severity,
|
|
244
|
+
message,
|
|
245
|
+
event: 'state-transition',
|
|
246
|
+
level,
|
|
247
|
+
epicId: epicId ?? undefined,
|
|
248
|
+
}),
|
|
249
|
+
).catch((err) => {
|
|
250
|
+
Logger.warn(
|
|
251
|
+
`[Ticketing] notify dispatch failed for #${targetId}: ${err?.message ?? err}`,
|
|
252
|
+
);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Transitions a ticket's label to the new state.
|
|
258
|
+
* Removes other agent:: state labels.
|
|
259
|
+
*
|
|
260
|
+
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
261
|
+
* @param {number} ticketId
|
|
262
|
+
* @param {string} newState - Must be one of STATE_LABELS.
|
|
263
|
+
* @param {{ notify?: Function, cascade?: boolean, ticketSnapshot?: object, _makeColumnSync?: Function }} [opts]
|
|
264
|
+
* Optional notify function (the exported `notify(ticketId, payload, opts)`
|
|
265
|
+
* from `notify.js`, or any stub matching its shape). When provided, a
|
|
266
|
+
* state-transition notification fires after a successful transition.
|
|
267
|
+
* Story/Epic → `agent::done` events are dispatched as `medium`; all other
|
|
268
|
+
* transitions are `low` and filtered out at the default `medium` channel
|
|
269
|
+
* thresholds. The dispatched payload carries the typed envelope fields
|
|
270
|
+
* (`event: 'state-transition'`, `level: 'task'|'story'|'wave'|'epic'`,
|
|
271
|
+
* `epicId`) for routable webhook subscribers.
|
|
272
|
+
*
|
|
273
|
+
* `cascade` (default `true`) controls whether a `done` transition fans the
|
|
274
|
+
* `cascadeCompletion` upward to parents. Per-Task closes invoked mid-Story
|
|
275
|
+
* from the retired per-Task progress writer (4-tier era, removed under
|
|
276
|
+
* #3157) passed `cascade: false` so the Story/Epic only flipped to
|
|
277
|
+
* `agent::done` at story-close (after the merge lands), not when the
|
|
278
|
+
* last Task commit landed on the still-unmerged Story branch. The
|
|
279
|
+
* parameter is preserved for callers that still suppress cascade
|
|
280
|
+
* explicitly (e.g. batch-transition helpers).
|
|
281
|
+
*
|
|
282
|
+
* `ticketSnapshot` (Story #1795 / Epic #1788) is an optional pre-fetched
|
|
283
|
+
* ticket object. When the caller already holds the ticket (e.g.
|
|
284
|
+
* `batchTransitionTickets`, which loops over a list it just hydrated),
|
|
285
|
+
* passing the snapshot eliminates the two `getTicket` round-trips that
|
|
286
|
+
* `transitionTicketState` would otherwise issue — one for the notify
|
|
287
|
+
* `fromState` lookup and one inside `provider.updateTicket`'s label
|
|
288
|
+
* merge path. Backwards compatible: when omitted, behaviour is unchanged.
|
|
289
|
+
*
|
|
290
|
+
* `_makeColumnSync` (Story #3645 DIP seam) — factory for the board-sync
|
|
291
|
+
* object. Production callers omit it (the default constructs a real
|
|
292
|
+
* `ColumnSync`); tests inject a stub to avoid GraphQL calls without
|
|
293
|
+
* module-level mocking.
|
|
294
|
+
*/
|
|
295
|
+
export async function transitionTicketState(
|
|
296
|
+
provider,
|
|
297
|
+
ticketId,
|
|
298
|
+
newState,
|
|
299
|
+
opts = {},
|
|
300
|
+
) {
|
|
301
|
+
validateTransitionInputs(newState);
|
|
302
|
+
|
|
303
|
+
const toRemove = ALL_STATES.filter((state) => state !== newState);
|
|
304
|
+
|
|
305
|
+
// Snapshot prior state for the notification payload (best-effort; skip on
|
|
306
|
+
// error). A transient read failure MUST NOT block a label transition —
|
|
307
|
+
// the transition itself is idempotent and `fromState: null` is a valid
|
|
308
|
+
// payload value.
|
|
309
|
+
//
|
|
310
|
+
// Story #1795 — when the caller threads `opts.ticketSnapshot` we reuse
|
|
311
|
+
// it as the notify snapshot without issuing a fresh `getTicket`. The
|
|
312
|
+
// snapshot is also forwarded to `provider.updateTicket` so the label
|
|
313
|
+
// merge path skips its own `getTicket` call (the second of the two
|
|
314
|
+
// round-trips this seam eliminates).
|
|
315
|
+
const ticketSnapshot = await loadTicketSnapshot(provider, opts, ticketId);
|
|
316
|
+
const fromState =
|
|
317
|
+
ticketSnapshot?.labels?.find((l) => ALL_STATES.includes(l)) ?? null;
|
|
318
|
+
|
|
319
|
+
// Closing/reopening mirrors the label state so GitHub shows the correct
|
|
320
|
+
// issue state without requiring a separate manual close step.
|
|
321
|
+
const isDone = newState === STATE_LABELS.DONE;
|
|
322
|
+
|
|
323
|
+
await provider.updateTicket(ticketId, {
|
|
324
|
+
labels: {
|
|
325
|
+
add: [newState],
|
|
326
|
+
remove: toRemove,
|
|
327
|
+
},
|
|
328
|
+
state: isDone ? 'closed' : 'open',
|
|
329
|
+
state_reason: isDone ? 'completed' : null,
|
|
330
|
+
// Internal-only escape hatch threaded through `provider.updateTicket`
|
|
331
|
+
// to `_applyLabelMutations`. Honored by `providers/github.js`; ignored
|
|
332
|
+
// by providers that don't recognise it. Underscore-prefixed to mark
|
|
333
|
+
// it as a provider-internal contract rather than part of the public
|
|
334
|
+
// `mutations` shape.
|
|
335
|
+
_ticketSnapshot: ticketSnapshot,
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// Story #2548 — mirror the new state onto the Projects v2 Status
|
|
339
|
+
// column. Best-effort; never blocks the transition.
|
|
340
|
+
// Story #3645 — thread the DIP seam so callers can inject a stub.
|
|
341
|
+
await syncProjectStatusColumn(
|
|
342
|
+
provider,
|
|
343
|
+
ticketId,
|
|
344
|
+
newState,
|
|
345
|
+
opts._makeColumnSync,
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
// Automatically trigger upward cascade on every transition (Story
|
|
349
|
+
// #2676). The unified entry point is `cascadeParentState`, which:
|
|
350
|
+
// - delegates `agent::done` transitions to the legacy
|
|
351
|
+
// `cascadeCompletion` (preserving tasklist-checkbox toggling, the
|
|
352
|
+
// "All child tickets completed" progress comment, and the Epic
|
|
353
|
+
// close-exclusion);
|
|
354
|
+
// - for every other `agent::*` transition (`executing`, `blocked`,
|
|
355
|
+
// `closing`, …) walks the parent chain and updates each parent to
|
|
356
|
+
// the state derived from its children's current composition. This
|
|
357
|
+
// keeps the GitHub Project board accurate when work begins on a
|
|
358
|
+
// Task ("In Progress" surfaces up to the Story and Epic) or when a
|
|
359
|
+
// child enters the HITL pause state.
|
|
360
|
+
//
|
|
361
|
+
// Callers that intentionally suppress propagation (historically the
|
|
362
|
+
// per-Task progress writer, which closed Tasks at commit-time but
|
|
363
|
+
// deferred the Story flip to story-close after the branch was merged)
|
|
364
|
+
// opt out by passing `cascade: false`.
|
|
365
|
+
if (opts.cascade !== false) {
|
|
366
|
+
const cascade = await cascadeParentState(provider, ticketId, {
|
|
367
|
+
notify: opts.notify,
|
|
368
|
+
});
|
|
369
|
+
logCascadePartialFailures(ticketId, cascade);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Fire the state-transition notification (fire-and-forget).
|
|
373
|
+
if (typeof opts.notify === 'function') {
|
|
374
|
+
dispatchTransitionNotification({
|
|
375
|
+
notify: opts.notify,
|
|
376
|
+
ticketId,
|
|
377
|
+
ticketSnapshot,
|
|
378
|
+
fromState,
|
|
379
|
+
newState,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Transition a Story ticket directly to a new `agent::*` state without
|
|
386
|
+
* walking a Task cascade. Story #3097 (Wave-0 additive, Epic #3078
|
|
387
|
+
* Strategy B) — in the 3-tier hierarchy a Story has no Task children, so
|
|
388
|
+
* the canonical `transitionTicketState` upward-cascade path
|
|
389
|
+
* (`cascadeParentState`) is the only meaningful walk. This helper is a
|
|
390
|
+
* thin wrapper that pins `cascade: true` (so the parent Feature/Epic
|
|
391
|
+
* still receives derived-state updates) and is intentionally a no-op
|
|
392
|
+
* difference from `transitionTicketState` in 4-tier mode — the helper
|
|
393
|
+
* exists so 3-tier callers can opt into a name that documents intent
|
|
394
|
+
* (and so F8 can pivot the implementation to skip the now-impossible
|
|
395
|
+
* Task-fan-in without rewriting call sites). The wrapper preserves every
|
|
396
|
+
* `opts` field the caller supplies; only `cascade` defaults to `true`
|
|
397
|
+
* when omitted.
|
|
398
|
+
*
|
|
399
|
+
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
400
|
+
* @param {number} storyId
|
|
401
|
+
* @param {string} newState - Must be one of STATE_LABELS.
|
|
402
|
+
* @param {{ notify?: Function, cascade?: boolean, ticketSnapshot?: object }} [opts]
|
|
403
|
+
*/
|
|
404
|
+
export async function transitionStoryDirect(
|
|
405
|
+
provider,
|
|
406
|
+
storyId,
|
|
407
|
+
newState,
|
|
408
|
+
opts = {},
|
|
409
|
+
) {
|
|
410
|
+
const merged = { cascade: true, ...opts };
|
|
411
|
+
await transitionTicketState(provider, storyId, newState, merged);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Mutates the tasklist checkbox in the parent's body.
|
|
416
|
+
* E.g., `- [ ] #123` to `- [x] #123`
|
|
417
|
+
*
|
|
418
|
+
* Story #3645 — positional `checked` boolean replaced with a named
|
|
419
|
+
* `{ checked }` options bag to eliminate the boolean-trap smell (SRP /
|
|
420
|
+
* naming clarity audit finding). All call sites updated in the same PR
|
|
421
|
+
* per the No-Shim cutover rule.
|
|
422
|
+
*
|
|
423
|
+
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
424
|
+
* @param {number} ticketId - ID of parent ticket
|
|
425
|
+
* @param {number} subIssueId - ID of child ticket
|
|
426
|
+
* @param {{ checked: boolean }} opts
|
|
427
|
+
*/
|
|
428
|
+
export async function toggleTasklistCheckbox(
|
|
429
|
+
provider,
|
|
430
|
+
ticketId,
|
|
431
|
+
subIssueId,
|
|
432
|
+
{ checked },
|
|
433
|
+
) {
|
|
434
|
+
const ticket = await provider.getTicket(ticketId);
|
|
435
|
+
const body = ticket.body || '';
|
|
436
|
+
|
|
437
|
+
if (!body.includes(`#${subIssueId}`)) {
|
|
438
|
+
return; // sub-issue not directly referenced in body
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
const targetBox = checked ? '- [x]' : '- [ ]';
|
|
442
|
+
|
|
443
|
+
let newBody = body;
|
|
444
|
+
|
|
445
|
+
if (checked) {
|
|
446
|
+
// replace `- [ ] #123` or `- [] #123` with `- [x] #123`
|
|
447
|
+
const re = new RegExp(`-\\s*\\[\\s*\\]\\s+#${subIssueId}\\b`, 'g');
|
|
448
|
+
newBody = newBody.replace(re, `${targetBox} #${subIssueId}`);
|
|
449
|
+
} else {
|
|
450
|
+
// replace `- [x] #123` or `- [X] #123` with `- [ ] #123`
|
|
451
|
+
const re = new RegExp(`-\\s*\\[[xX]\\]\\s+#${subIssueId}\\b`, 'g');
|
|
452
|
+
newBody = newBody.replace(re, `${targetBox} #${subIssueId}`);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
if (newBody !== body) {
|
|
456
|
+
await provider.updateTicket(ticketId, {
|
|
457
|
+
body: newBody,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Post a structured comment to a ticket.
|
|
464
|
+
*
|
|
465
|
+
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
466
|
+
* @param {number} ticketId
|
|
467
|
+
* @param {'progress'|'friction'|'notification'} type
|
|
468
|
+
* @param {string} payload
|
|
469
|
+
*/
|
|
470
|
+
export async function postStructuredComment(provider, ticketId, type, payload) {
|
|
471
|
+
assertValidStructuredCommentType(type);
|
|
472
|
+
await provider.postComment(ticketId, {
|
|
473
|
+
type,
|
|
474
|
+
body: payload,
|
|
475
|
+
});
|
|
476
|
+
// Story #2465 — evict the raw-comments cache entry so the next
|
|
477
|
+
// `findStructuredComment` against this ticket re-fetches and sees the
|
|
478
|
+
// freshly-posted comment.
|
|
479
|
+
invalidateRawCommentsCache(provider, ticketId);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Idempotently post a structured comment identified by an embedded HTML
|
|
484
|
+
* marker. If an existing comment with the same `type` marker (and matching
|
|
485
|
+
* `attrs`, when supplied) exists it is deleted first, then the new one is
|
|
486
|
+
* posted. The marker is prepended to the body automatically.
|
|
487
|
+
*
|
|
488
|
+
* `attrs` lets the same `type` carry multiple in-place snapshots keyed by
|
|
489
|
+
* an additional dimension — e.g., one `wave-run-progress` comment per wave
|
|
490
|
+
* via `{ wave: N }` so the cross-wave rollup can read every wave's snapshot
|
|
491
|
+
* instead of only the most recent one.
|
|
492
|
+
*
|
|
493
|
+
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
494
|
+
* @param {number} ticketId
|
|
495
|
+
* @param {string} type - arbitrary structured-comment type (e.g.,
|
|
496
|
+
* `dispatch-manifest`, `retro`, `code-review`).
|
|
497
|
+
* @param {string} body - markdown payload.
|
|
498
|
+
* @param {Record<string, string|number>} [attrs]
|
|
499
|
+
* @returns {Promise<{ commentId: number }>}
|
|
500
|
+
*/
|
|
501
|
+
export async function upsertStructuredComment(
|
|
502
|
+
provider,
|
|
503
|
+
ticketId,
|
|
504
|
+
type,
|
|
505
|
+
body,
|
|
506
|
+
attrs = null,
|
|
507
|
+
) {
|
|
508
|
+
assertValidStructuredCommentType(type);
|
|
509
|
+
const marker = structuredCommentMarker(type, attrs);
|
|
510
|
+
const cacheKey = structuredCommentCacheKey(ticketId, type, attrs);
|
|
511
|
+
const cache = getProviderCommentCache(provider);
|
|
512
|
+
const existing = await findStructuredComment(provider, ticketId, type, attrs);
|
|
513
|
+
|
|
514
|
+
if (existing && typeof provider.deleteComment === 'function') {
|
|
515
|
+
try {
|
|
516
|
+
await provider.deleteComment(existing.id);
|
|
517
|
+
// Story #1795 — evict before the repost so a postComment failure
|
|
518
|
+
// doesn't leave the cache pointing at a deleted comment id.
|
|
519
|
+
cache.delete(cacheKey);
|
|
520
|
+
// Story #2465 — the raw-comments array still holds the
|
|
521
|
+
// just-deleted comment; drop it so subsequent reads re-fetch.
|
|
522
|
+
invalidateRawCommentsCache(provider, ticketId);
|
|
523
|
+
} catch (err) {
|
|
524
|
+
Logger.warn(
|
|
525
|
+
`[Ticketing] Failed to delete prior ${type} comment #${existing.id}: ${err.message}`,
|
|
526
|
+
);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
const annotated = `${marker}\n\n${body}`;
|
|
531
|
+
const result = await provider.postComment(ticketId, {
|
|
532
|
+
type,
|
|
533
|
+
body: annotated,
|
|
534
|
+
});
|
|
535
|
+
// Story #2465 — evict the raw-comments cache so a follow-up
|
|
536
|
+
// `findStructuredComment` for a different type on the same ticket
|
|
537
|
+
// re-fetches and observes the new comment.
|
|
538
|
+
invalidateRawCommentsCache(provider, ticketId);
|
|
539
|
+
// Story #1795 — refresh the cache to the freshly-posted comment so the
|
|
540
|
+
// next upsert short-circuits the `getTicketComments` list call. The
|
|
541
|
+
// post result carries the new comment id; we synthesise a minimal
|
|
542
|
+
// cached row that `findStructuredComment` callers can rely on (only
|
|
543
|
+
// `id` and `body` are read by upstream). Accept either `commentId`
|
|
544
|
+
// (production GitHubProvider shape) or `id` (test-fake shape) so the
|
|
545
|
+
// cache update fires uniformly across providers.
|
|
546
|
+
const newCommentId =
|
|
547
|
+
typeof result?.commentId === 'number'
|
|
548
|
+
? result.commentId
|
|
549
|
+
: typeof result?.id === 'number'
|
|
550
|
+
? result.id
|
|
551
|
+
: null;
|
|
552
|
+
if (newCommentId !== null) {
|
|
553
|
+
cache.set(cacheKey, {
|
|
554
|
+
id: newCommentId,
|
|
555
|
+
body: annotated,
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
return result;
|
|
559
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/orchestration/ticketing.js — Ticketing Operations SDK (facade).
|
|
3
|
+
*
|
|
4
|
+
* Stateless logic for updating ticket states, toggling checkboxes,
|
|
5
|
+
* posting comments, and cascading completions. This module delegates
|
|
6
|
+
* all API calls to the provided ITicketingProvider instance.
|
|
7
|
+
*
|
|
8
|
+
* Story #1848 — the implementation is split by verb family across the
|
|
9
|
+
* sibling `ticketing/` sub-directory:
|
|
10
|
+
*
|
|
11
|
+
* - `./ticketing/reads.js` — read-only helpers, validators, and the
|
|
12
|
+
* process-level structured-comment cache.
|
|
13
|
+
* - `./ticketing/state.js` — per-ticket mutators including
|
|
14
|
+
* `transitionTicketState` (below CRAP 12
|
|
15
|
+
* via predicate extraction).
|
|
16
|
+
* - `./ticketing/bulk.js` — cascade walk, per-parent serial lock,
|
|
17
|
+
* transient-error retry budget, and the
|
|
18
|
+
* partial-failure log helper.
|
|
19
|
+
*
|
|
20
|
+
* This file is a pure re-export facade: external callers continue to
|
|
21
|
+
* import every name from `./ticketing.js`, so the split is invisible at
|
|
22
|
+
* the import boundary.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
// Re-export the cascade + bulk surface.
|
|
26
|
+
export {
|
|
27
|
+
__resetParentCascadeLocks,
|
|
28
|
+
__setCascadeRetryDelays,
|
|
29
|
+
cascadeCompletion,
|
|
30
|
+
groupByAncestor,
|
|
31
|
+
logCascadePartialFailures,
|
|
32
|
+
} from './ticketing/bulk.js';
|
|
33
|
+
// Re-export the read surface.
|
|
34
|
+
export {
|
|
35
|
+
_peekStructuredCommentCache,
|
|
36
|
+
_resetStructuredCommentCache,
|
|
37
|
+
assertValidStructuredCommentType,
|
|
38
|
+
// Story #3097 (Wave-0 additive, Epic #3078) — Storyless snapshot helper.
|
|
39
|
+
buildStorylessTicketSnapshot,
|
|
40
|
+
findStructuredComment,
|
|
41
|
+
isValidStructuredCommentType,
|
|
42
|
+
STATE_LABELS,
|
|
43
|
+
STRUCTURED_COMMENT_TYPES,
|
|
44
|
+
structuredCommentMarker,
|
|
45
|
+
WAVE_TYPE_PATTERN,
|
|
46
|
+
} from './ticketing/reads.js';
|
|
47
|
+
// Re-export the per-ticket state-mutation surface.
|
|
48
|
+
export {
|
|
49
|
+
postStructuredComment,
|
|
50
|
+
toggleTasklistCheckbox,
|
|
51
|
+
// Story #3097 (Wave-0 additive, Epic #3078) — Storyless direct transition.
|
|
52
|
+
transitionStoryDirect,
|
|
53
|
+
transitionTicketState,
|
|
54
|
+
upsertStructuredComment,
|
|
55
|
+
} from './ticketing/state.js';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/orchestration/wave-marker.js — Wave-marker regex + parser.
|
|
3
|
+
*
|
|
4
|
+
* Centralizes the regex used to recognize `wave-N-start` / `wave-N-end`
|
|
5
|
+
* structured-comment types so call sites (`ticketing.js`, tool-registry
|
|
6
|
+
* descriptors, tests) all agree on the same bounded pattern.
|
|
7
|
+
*
|
|
8
|
+
* The wave index is bounded to 1-3 digits (0-999) so a malformed or
|
|
9
|
+
* malicious marker cannot trigger pathological regex backtracking on
|
|
10
|
+
* unbounded `\d+`.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export const WAVE_MARKER_RE = /^wave-([0-9]{1,3})-(start|end)$/;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Parse a wave-marker string into its components.
|
|
17
|
+
*
|
|
18
|
+
* @param {string} s
|
|
19
|
+
* @returns {{ index: number, phase: 'start' | 'end' } | null}
|
|
20
|
+
* `null` for any input that is not a string or does not match
|
|
21
|
+
* {@link WAVE_MARKER_RE}.
|
|
22
|
+
*/
|
|
23
|
+
export function parseWaveMarker(s) {
|
|
24
|
+
if (typeof s !== 'string') return null;
|
|
25
|
+
const m = WAVE_MARKER_RE.exec(s);
|
|
26
|
+
if (!m) return null;
|
|
27
|
+
return { index: Number(m[1]), phase: m[2] };
|
|
28
|
+
}
|