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,506 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* file-assumptions.js — Phase 8 path-assumption validator.
|
|
3
|
+
*
|
|
4
|
+
* Story #2635 added the Tech Spec freshness check at Phase 7. This module
|
|
5
|
+
* is the matching gate at Phase 8: every Story's `body.changes` /
|
|
6
|
+
* `body.references` entry that declares an explicit `assumption` is
|
|
7
|
+
* cross-checked against the actual state of `baseBranchRef`. Mismatches
|
|
8
|
+
* are batched per-Story and surfaced through the same error envelope the
|
|
9
|
+
* decompose loop already uses.
|
|
10
|
+
*
|
|
11
|
+
* Under the 3-tier hierarchy (Epic → Feature → Story; Epic #3078 / #3238)
|
|
12
|
+
* the Story is the implementation unit — there is no `type::task` ticket
|
|
13
|
+
* layer — so the gate scans `type === 'story'` tickets and reads the
|
|
14
|
+
* `{ path, assumption }` entries inlined on each Story body.
|
|
15
|
+
*
|
|
16
|
+
* Rules (one error per mismatched path):
|
|
17
|
+
* - `creates` + path **exists** → error (Story would clobber).
|
|
18
|
+
* - `refactors-existing` + path **absent** → error (no target to refactor).
|
|
19
|
+
* - `exists` + path **absent** → error (read dependency missing).
|
|
20
|
+
* - `deletes` + path **absent** → error (nothing to delete).
|
|
21
|
+
*
|
|
22
|
+
* Wave awareness (Story #3960): the base-branch-only rules above produce
|
|
23
|
+
* false signals once an earlier Story in the same epic creates (or deletes)
|
|
24
|
+
* a file before a later Story touches it. `validateStoryFileAssumptions`
|
|
25
|
+
* therefore validates each Story against the **simulated post-predecessor
|
|
26
|
+
* tree** — base-branch existence overlaid with the create/delete delta of
|
|
27
|
+
* the Story's transitive `depends_on` predecessors (the same reachability
|
|
28
|
+
* walk the conflict gate uses, imported from `ticket-validator-conflicts.js`
|
|
29
|
+
* rather than re-derived). Two extra wave-aware rules layer on top of the
|
|
30
|
+
* base-branch rules:
|
|
31
|
+
* - `creates` + path created by a **predecessor** → mismatch
|
|
32
|
+
* (`expected: 'refactors-existing'`) telling the planner to declare
|
|
33
|
+
* `refactors-existing` and naming the producing Story.
|
|
34
|
+
* - `refactors-existing` + path absent from base but created by a
|
|
35
|
+
* **predecessor** → validates clean (no false-positive base-branch
|
|
36
|
+
* "absent" mismatch).
|
|
37
|
+
* Concurrent same-path creates between Stories with no `depends_on` path are
|
|
38
|
+
* the shared-editor conflict gate's domain — that finding's rendering is
|
|
39
|
+
* cross-referenced (see `renderMismatch`), not duplicated here.
|
|
40
|
+
*
|
|
41
|
+
* Legacy compatibility: stories whose `body.changes` items are still bare
|
|
42
|
+
* strings carry no assumption and are skipped silently here. The
|
|
43
|
+
* deprecation signal is emitted *once* per validator invocation through
|
|
44
|
+
* `collectDeprecationWarnings`, so consumers running an older planner
|
|
45
|
+
* see a clear migration nudge without a hard failure mid-flight.
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
import { gitSpawn } from '../git-utils.js';
|
|
49
|
+
import { parse as parseStoryBody } from '../story-body/story-body.js';
|
|
50
|
+
import { FILE_ASSUMPTION_VALUES } from './file-assumption-enum.js';
|
|
51
|
+
import { isObjectPathEntry } from './task-body-validator.js';
|
|
52
|
+
import { computeStoryReachability } from './ticket-validator-conflicts.js';
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Default git probe — returns `true` when `path` exists at
|
|
56
|
+
* `baseBranchRef`. Mirrors the existence check used by
|
|
57
|
+
* {@link ./ticket-validator.js#validateAcFreshness} and
|
|
58
|
+
* {@link ./spec-freshness.js} so all three gates share semantics.
|
|
59
|
+
*
|
|
60
|
+
* @param {{ baseBranchRef: string, path: string, cwd?: string }} opts
|
|
61
|
+
* @returns {boolean}
|
|
62
|
+
*/
|
|
63
|
+
function defaultGitRunner({ baseBranchRef, path, cwd }) {
|
|
64
|
+
const result = gitSpawn(
|
|
65
|
+
cwd ?? process.cwd(),
|
|
66
|
+
'cat-file',
|
|
67
|
+
'-e',
|
|
68
|
+
`${baseBranchRef}:${path}`,
|
|
69
|
+
);
|
|
70
|
+
return result.status === 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Pull every `(path, assumption, source)` triple from a Story body.
|
|
75
|
+
* `source` is one of `'changes' | 'references'` so error messages can
|
|
76
|
+
* point the operator at the right list.
|
|
77
|
+
*
|
|
78
|
+
* Returns an empty array when the body is absent, a plain string, or
|
|
79
|
+
* carries no object-form entries — that's the legacy path. Callers use
|
|
80
|
+
* the resulting array's emptiness to decide whether to emit a
|
|
81
|
+
* deprecation warning for the Story.
|
|
82
|
+
*
|
|
83
|
+
* @param {object} story
|
|
84
|
+
* @returns {Array<{ path: string, assumption: string, source: 'changes' | 'references' }>}
|
|
85
|
+
*/
|
|
86
|
+
export function collectStoryAssumptionEntries(story) {
|
|
87
|
+
const out = [];
|
|
88
|
+
const body = story?.body;
|
|
89
|
+
|
|
90
|
+
// Story #3302: when the body is a markdown string (canonical serialized
|
|
91
|
+
// form emitted by `serialize()` from story-body.js), parse it first to
|
|
92
|
+
// extract the structured changes[] / references[] arrays. Without this,
|
|
93
|
+
// every story with a string body would be treated as the legacy case
|
|
94
|
+
// (no object-form entries) and the assumption gate would silently no-op.
|
|
95
|
+
let structuredBody;
|
|
96
|
+
if (typeof body === 'string' && body.trim().length > 0) {
|
|
97
|
+
try {
|
|
98
|
+
structuredBody = parseStoryBody(body).body;
|
|
99
|
+
} catch {
|
|
100
|
+
// Unparseable body — treat as legacy (no assumptions to check).
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
} else if (body !== null && typeof body === 'object') {
|
|
104
|
+
structuredBody = body;
|
|
105
|
+
} else {
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (Array.isArray(structuredBody.changes)) {
|
|
110
|
+
for (const entry of structuredBody.changes) {
|
|
111
|
+
if (isObjectPathEntry(entry)) {
|
|
112
|
+
out.push({
|
|
113
|
+
path: entry.path,
|
|
114
|
+
assumption: entry.assumption,
|
|
115
|
+
source: 'changes',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (Array.isArray(structuredBody.references)) {
|
|
121
|
+
for (const entry of structuredBody.references) {
|
|
122
|
+
if (isObjectPathEntry(entry)) {
|
|
123
|
+
out.push({
|
|
124
|
+
path: entry.path,
|
|
125
|
+
assumption: entry.assumption,
|
|
126
|
+
source: 'references',
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Predicate: does the story have any string-form `body.changes` bullets
|
|
136
|
+
* left over after a partial migration? Used to decide whether to emit a
|
|
137
|
+
* per-story deprecation warning even when at least one object entry is
|
|
138
|
+
* present.
|
|
139
|
+
*
|
|
140
|
+
* @param {object} story
|
|
141
|
+
* @returns {boolean}
|
|
142
|
+
*/
|
|
143
|
+
export function hasLegacyChangeBullets(story) {
|
|
144
|
+
const body = story?.body;
|
|
145
|
+
if (body === null || typeof body !== 'object') return false;
|
|
146
|
+
if (!Array.isArray(body.changes)) return false;
|
|
147
|
+
return body.changes.some((c) => typeof c === 'string');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Render a single mismatch into a stable error string. Kept pure so
|
|
152
|
+
* tests can pin the exact message shape downstream tooling parses.
|
|
153
|
+
*
|
|
154
|
+
* The `expected` discriminator selects the message shape:
|
|
155
|
+
* - `'present'` — base-branch read/refactor/delete target absent.
|
|
156
|
+
* - `'absent'` — base-branch `creates` target already exists.
|
|
157
|
+
* - `'refactors-existing'` — wave-aware: a transitive predecessor already
|
|
158
|
+
* creates this path, so the dependent Story should declare
|
|
159
|
+
* `refactors-existing` (Story #3960). Names the producing Story.
|
|
160
|
+
* - `'predecessor-conflict'` — wave-aware: a concurrent Story (no
|
|
161
|
+
* `depends_on` ordering) also creates this path. Cross-references the
|
|
162
|
+
* shared-editor conflict finding rather than re-deriving its prose.
|
|
163
|
+
*
|
|
164
|
+
* @param {{ slug: string, source: string, path: string, assumption: string, expected: string, producerSlug?: string }} mismatch
|
|
165
|
+
* @returns {string}
|
|
166
|
+
*/
|
|
167
|
+
function renderMismatch({
|
|
168
|
+
slug,
|
|
169
|
+
source,
|
|
170
|
+
path,
|
|
171
|
+
assumption,
|
|
172
|
+
expected,
|
|
173
|
+
producerSlug,
|
|
174
|
+
}) {
|
|
175
|
+
if (expected === 'refactors-existing') {
|
|
176
|
+
return `"${slug}" → body.${source} declares assumption="${assumption}" for ${path} but predecessor Story "${producerSlug}" already creates that path — declare assumption="refactors-existing" instead (the file exists in the simulated post-predecessor tree).`;
|
|
177
|
+
}
|
|
178
|
+
if (expected === 'predecessor-conflict') {
|
|
179
|
+
return `"${slug}" → body.${source} declares assumption="${assumption}" for ${path} but concurrent Story "${producerSlug}" also creates that path with no depends_on ordering between them — see the shared-editor conflict finding for the resolution (add a depends_on chain or split the create into a dedicated late-wave Story).`;
|
|
180
|
+
}
|
|
181
|
+
if (expected === 'present') {
|
|
182
|
+
return `"${slug}" → body.${source} declares assumption="${assumption}" for ${path} but the path is absent at the base branch.`;
|
|
183
|
+
}
|
|
184
|
+
return `"${slug}" → body.${source} declares assumption="${assumption}" for ${path} but the path already exists at the base branch.`;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Index, across every Story, which Stories declare a `creates` (and which
|
|
189
|
+
* declare a `deletes`) for each `changes`-sourced path. The maps drive the
|
|
190
|
+
* wave-aware simulated-tree overlay: a path created by a transitive
|
|
191
|
+
* predecessor is treated as present, a path deleted by one as absent.
|
|
192
|
+
*
|
|
193
|
+
* Only `changes`-sourced entries count — `references` describe read
|
|
194
|
+
* dependencies, never writes, so they cannot mutate the simulated tree.
|
|
195
|
+
*
|
|
196
|
+
* @param {object[]} stories
|
|
197
|
+
* @returns {{ creators: Map<string, string[]>, deleters: Map<string, string[]> }}
|
|
198
|
+
*/
|
|
199
|
+
function indexPathMutations(stories) {
|
|
200
|
+
const creators = new Map();
|
|
201
|
+
const deleters = new Map();
|
|
202
|
+
for (const story of stories) {
|
|
203
|
+
const slug = story.slug ?? story.title ?? '<unknown>';
|
|
204
|
+
for (const { path, assumption, source } of collectStoryAssumptionEntries(
|
|
205
|
+
story,
|
|
206
|
+
)) {
|
|
207
|
+
if (source !== 'changes') continue;
|
|
208
|
+
const bucket =
|
|
209
|
+
assumption === 'creates'
|
|
210
|
+
? creators
|
|
211
|
+
: assumption === 'deletes'
|
|
212
|
+
? deleters
|
|
213
|
+
: null;
|
|
214
|
+
if (!bucket) continue;
|
|
215
|
+
const existing = bucket.get(path);
|
|
216
|
+
if (existing) {
|
|
217
|
+
if (!existing.includes(slug)) existing.push(slug);
|
|
218
|
+
} else {
|
|
219
|
+
bucket.set(path, [slug]);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return { creators, deleters };
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Resolve the first transitive predecessor of `story` that mutates `path`
|
|
228
|
+
* in the requested way (`creators` or `deleters` index). Returns the
|
|
229
|
+
* producing Story's slug, or `null` when no predecessor mutates the path.
|
|
230
|
+
*
|
|
231
|
+
* @param {Map<string, string[]>} index
|
|
232
|
+
* @param {string} path
|
|
233
|
+
* @param {Set<string>} predecessors Transitive `depends_on` slug set.
|
|
234
|
+
* @returns {string|null}
|
|
235
|
+
*/
|
|
236
|
+
function predecessorMutator(index, path, predecessors) {
|
|
237
|
+
const slugs = index.get(path);
|
|
238
|
+
if (!slugs) return null;
|
|
239
|
+
for (const slug of slugs) {
|
|
240
|
+
if (predecessors.has(slug)) return slug;
|
|
241
|
+
}
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Validate every Story's declared file assumptions against the simulated
|
|
247
|
+
* post-predecessor tree: the actual state of `baseBranchRef` overlaid with
|
|
248
|
+
* the create/delete delta of the Story's transitive `depends_on`
|
|
249
|
+
* predecessors (Story #3960). Returns an envelope:
|
|
250
|
+
*
|
|
251
|
+
* {
|
|
252
|
+
* errors: string[] // one entry per mismatch, batched per Story
|
|
253
|
+
* warnings: string[] // legacy/no-assumption deprecation nudges
|
|
254
|
+
* mismatches: object[] // structured payload for downstream tooling
|
|
255
|
+
* }
|
|
256
|
+
*
|
|
257
|
+
* Under the 3-tier hierarchy the Story is the implementation unit, so the
|
|
258
|
+
* gate scans `type === 'story'` tickets and reads the inline
|
|
259
|
+
* `{ path, assumption }` entries on each Story body.
|
|
260
|
+
*
|
|
261
|
+
* The function never throws on a probe failure — the runner is expected
|
|
262
|
+
* to return `false` for any unreadable git ref, which surfaces the path
|
|
263
|
+
* as a mismatch (for `refactors-existing` / `exists` / `deletes`) or as
|
|
264
|
+
* fresh (for `creates`). This matches the non-blocking, advisory shape
|
|
265
|
+
* of the Phase 7 freshness check.
|
|
266
|
+
*
|
|
267
|
+
* @param {object} opts
|
|
268
|
+
* @param {object[]} opts.tickets
|
|
269
|
+
* @param {string} opts.baseBranchRef
|
|
270
|
+
* @param {Function} [opts.gitRunner]
|
|
271
|
+
* @param {string} [opts.cwd]
|
|
272
|
+
* @returns {{ errors: string[], warnings: string[], mismatches: Array }}
|
|
273
|
+
*/
|
|
274
|
+
export function validateStoryFileAssumptions(opts) {
|
|
275
|
+
const { tickets, baseBranchRef, gitRunner = defaultGitRunner, cwd } = opts;
|
|
276
|
+
if (!baseBranchRef || typeof baseBranchRef !== 'string') {
|
|
277
|
+
throw new Error(
|
|
278
|
+
'validateStoryFileAssumptions: baseBranchRef is required and must be a string.',
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
const stories = (tickets ?? []).filter((t) => t.type === 'story');
|
|
282
|
+
const errors = [];
|
|
283
|
+
const warnings = [];
|
|
284
|
+
const mismatches = [];
|
|
285
|
+
const probeCache = new Map();
|
|
286
|
+
|
|
287
|
+
// Wave-aware setup (Story #3960): transitive predecessor sets over the
|
|
288
|
+
// story-level `depends_on` graph, plus per-path create/delete indices so
|
|
289
|
+
// each Story is validated against the simulated post-predecessor tree
|
|
290
|
+
// rather than the base branch alone.
|
|
291
|
+
const reach = computeStoryReachability(stories);
|
|
292
|
+
const { creators, deleters } = indexPathMutations(stories);
|
|
293
|
+
|
|
294
|
+
for (const story of stories) {
|
|
295
|
+
const slug = story.slug ?? story.title ?? '<unknown>';
|
|
296
|
+
const entries = collectStoryAssumptionEntries(story);
|
|
297
|
+
|
|
298
|
+
if (entries.length === 0) {
|
|
299
|
+
// Legacy path: this Story carries no object-form entries. Emit a
|
|
300
|
+
// single deprecation warning so the operator sees the migration
|
|
301
|
+
// nudge once per Story rather than per-bullet.
|
|
302
|
+
if (hasLegacyChangeBullets(story)) {
|
|
303
|
+
warnings.push(
|
|
304
|
+
`"${slug}" → body.changes uses legacy string bullets without { path, assumption }. Migrate to object form so Phase 8 can verify file-state assumptions. See Story #2636.`,
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Partial-migration warning: some entries are object-form, some are
|
|
311
|
+
// still strings. Surface once so the operator notices the gap.
|
|
312
|
+
if (hasLegacyChangeBullets(story)) {
|
|
313
|
+
warnings.push(
|
|
314
|
+
`"${slug}" → body.changes mixes object-form entries with legacy string bullets. Migrate every bullet for full freshness coverage.`,
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const predecessors = reach.get(slug) ?? new Set();
|
|
319
|
+
|
|
320
|
+
for (const { path, assumption, source } of entries) {
|
|
321
|
+
let baseExists = probeCache.get(path);
|
|
322
|
+
if (baseExists === undefined) {
|
|
323
|
+
baseExists = Boolean(gitRunner({ baseBranchRef, path, cwd }));
|
|
324
|
+
probeCache.set(path, baseExists);
|
|
325
|
+
}
|
|
326
|
+
const predecessorCreator = predecessorMutator(
|
|
327
|
+
creators,
|
|
328
|
+
path,
|
|
329
|
+
predecessors,
|
|
330
|
+
);
|
|
331
|
+
const predecessorDeleter = predecessorMutator(
|
|
332
|
+
deleters,
|
|
333
|
+
path,
|
|
334
|
+
predecessors,
|
|
335
|
+
);
|
|
336
|
+
// Simulated post-predecessor existence: base state, then a
|
|
337
|
+
// predecessor `creates` makes the path present, a predecessor
|
|
338
|
+
// `deletes` (with no predecessor create) makes it absent.
|
|
339
|
+
let simulatedExists = baseExists;
|
|
340
|
+
if (predecessorCreator) simulatedExists = true;
|
|
341
|
+
else if (predecessorDeleter) simulatedExists = false;
|
|
342
|
+
const mismatch = checkAssumption({
|
|
343
|
+
slug,
|
|
344
|
+
source,
|
|
345
|
+
path,
|
|
346
|
+
assumption,
|
|
347
|
+
baseExists,
|
|
348
|
+
simulatedExists,
|
|
349
|
+
predecessorCreator,
|
|
350
|
+
});
|
|
351
|
+
if (mismatch !== null) {
|
|
352
|
+
mismatches.push(mismatch);
|
|
353
|
+
errors.push(renderMismatch(mismatch));
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
// Wave-aware concurrent-create check (Story #3960): two Stories with
|
|
357
|
+
// no `depends_on` ordering both declaring `creates` on the same path.
|
|
358
|
+
// The shared-editor conflict gate owns the canonical resolution; this
|
|
359
|
+
// gate surfaces the same signal in the assumption channel and
|
|
360
|
+
// cross-references that finding rather than re-deriving its prose.
|
|
361
|
+
// Only reached when `checkAssumption` returned clean — a base-branch
|
|
362
|
+
// clobber or a predecessor-create already produced a richer mismatch.
|
|
363
|
+
if (assumption === 'creates') {
|
|
364
|
+
const concurrent = concurrentCoCreator({
|
|
365
|
+
creators,
|
|
366
|
+
path,
|
|
367
|
+
slug,
|
|
368
|
+
reach,
|
|
369
|
+
});
|
|
370
|
+
if (concurrent) {
|
|
371
|
+
const conflict = {
|
|
372
|
+
slug,
|
|
373
|
+
source,
|
|
374
|
+
path,
|
|
375
|
+
assumption,
|
|
376
|
+
expected: 'predecessor-conflict',
|
|
377
|
+
actual: 'concurrent-creates',
|
|
378
|
+
producerSlug: concurrent,
|
|
379
|
+
};
|
|
380
|
+
mismatches.push(conflict);
|
|
381
|
+
errors.push(renderMismatch(conflict));
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return { errors, warnings, mismatches };
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Find the first *concurrent* co-creator of `path` for the Story `slug`:
|
|
391
|
+
* another Story that declares `creates` on the same path with no
|
|
392
|
+
* `depends_on` ordering in either direction. Returns that Story's slug, or
|
|
393
|
+
* `null` when every co-creator is ordered relative to `slug` (predecessor
|
|
394
|
+
* or successor) — those are handled by the predecessor-create rule, not the
|
|
395
|
+
* concurrent-conflict rule.
|
|
396
|
+
*
|
|
397
|
+
* @param {{ creators: Map<string, string[]>, path: string, slug: string, reach: Map<string, Set<string>> }} args
|
|
398
|
+
* @returns {string|null}
|
|
399
|
+
*/
|
|
400
|
+
function concurrentCoCreator({ creators, path, slug, reach }) {
|
|
401
|
+
const slugs = creators.get(path);
|
|
402
|
+
if (!slugs || slugs.length < 2) return null;
|
|
403
|
+
const myPredecessors = reach.get(slug) ?? new Set();
|
|
404
|
+
for (const other of slugs) {
|
|
405
|
+
if (other === slug) continue;
|
|
406
|
+
const otherPredecessors = reach.get(other) ?? new Set();
|
|
407
|
+
// Ordered in either direction → not concurrent.
|
|
408
|
+
if (myPredecessors.has(other)) continue;
|
|
409
|
+
if (otherPredecessors.has(slug)) continue;
|
|
410
|
+
return other;
|
|
411
|
+
}
|
|
412
|
+
return null;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Apply one assumption rule against the simulated post-predecessor tree and
|
|
417
|
+
* return a structured mismatch or `null` when the declared assumption
|
|
418
|
+
* matches. Extracted from `validateStoryFileAssumptions` so the rules table
|
|
419
|
+
* sits in one place that's trivially unit-testable.
|
|
420
|
+
*
|
|
421
|
+
* `baseExists` is the path's existence on the base branch; `simulatedExists`
|
|
422
|
+
* is `baseExists` overlaid with the create/delete delta of the Story's
|
|
423
|
+
* transitive predecessors. `predecessorCreator` (when non-null) is the slug
|
|
424
|
+
* of the predecessor Story that creates the path — used to distinguish a
|
|
425
|
+
* wave-aware `creates`-on-a-will-exist-path mismatch from the base-branch
|
|
426
|
+
* "already exists" mismatch, and to name the producing Story in the nudge.
|
|
427
|
+
*
|
|
428
|
+
* @param {{ slug: string, source: string, path: string, assumption: string, baseExists: boolean, simulatedExists: boolean, predecessorCreator: string|null }} args
|
|
429
|
+
* @returns {object|null}
|
|
430
|
+
*/
|
|
431
|
+
function checkAssumption({
|
|
432
|
+
slug,
|
|
433
|
+
source,
|
|
434
|
+
path,
|
|
435
|
+
assumption,
|
|
436
|
+
baseExists,
|
|
437
|
+
simulatedExists,
|
|
438
|
+
predecessorCreator,
|
|
439
|
+
}) {
|
|
440
|
+
switch (assumption) {
|
|
441
|
+
case 'creates':
|
|
442
|
+
// Base-branch clobber — the path already exists before any Story
|
|
443
|
+
// runs. Unchanged from the base-branch-only rule.
|
|
444
|
+
if (baseExists) {
|
|
445
|
+
return {
|
|
446
|
+
slug,
|
|
447
|
+
source,
|
|
448
|
+
path,
|
|
449
|
+
assumption,
|
|
450
|
+
expected: 'absent',
|
|
451
|
+
actual: 'present',
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
// Wave-aware (Story #3960): a transitive predecessor already creates
|
|
455
|
+
// this path, so it exists in the simulated tree. Nudge the planner to
|
|
456
|
+
// declare `refactors-existing` and name the producing Story.
|
|
457
|
+
if (predecessorCreator) {
|
|
458
|
+
return {
|
|
459
|
+
slug,
|
|
460
|
+
source,
|
|
461
|
+
path,
|
|
462
|
+
assumption,
|
|
463
|
+
expected: 'refactors-existing',
|
|
464
|
+
actual: 'predecessor-creates',
|
|
465
|
+
producerSlug: predecessorCreator,
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
return null;
|
|
469
|
+
case 'refactors-existing':
|
|
470
|
+
case 'exists':
|
|
471
|
+
case 'deletes':
|
|
472
|
+
// Validate against the simulated tree: a predecessor `creates` makes
|
|
473
|
+
// an otherwise-absent base path present, so `refactors-existing` /
|
|
474
|
+
// `exists` / `deletes` against it is no longer a false-positive
|
|
475
|
+
// mismatch (Story #3960).
|
|
476
|
+
if (!simulatedExists) {
|
|
477
|
+
return {
|
|
478
|
+
slug,
|
|
479
|
+
source,
|
|
480
|
+
path,
|
|
481
|
+
assumption,
|
|
482
|
+
expected: 'present',
|
|
483
|
+
actual: 'absent',
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
return null;
|
|
487
|
+
default:
|
|
488
|
+
// Unknown assumption values were already rejected by the body
|
|
489
|
+
// schema validator — defensive default so future enum additions
|
|
490
|
+
// surface as test failures rather than silent passes.
|
|
491
|
+
return {
|
|
492
|
+
slug,
|
|
493
|
+
source,
|
|
494
|
+
path,
|
|
495
|
+
assumption,
|
|
496
|
+
expected: 'unknown',
|
|
497
|
+
actual: simulatedExists ? 'present' : 'absent',
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* Re-export the canonical assumption enum so callers can reach for the
|
|
504
|
+
* list without depending on task-body-validator's internals.
|
|
505
|
+
*/
|
|
506
|
+
export { FILE_ASSUMPTION_VALUES };
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// .agents/scripts/lib/orchestration/finalize/close-planning-tickets.js
|
|
2
|
+
/**
|
|
3
|
+
* close-planning-tickets.js — finalize helper that closes the three
|
|
4
|
+
* planning context tickets (PRD / Tech Spec / Acceptance Spec) linked
|
|
5
|
+
* from the Epic body's `## Planning Artifacts` section.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from `/epic-deliver` Phase 7.1 prose (the `gh issue close`
|
|
8
|
+
* sequence) so the lifecycle Finalizer listener has a single async
|
|
9
|
+
* helper to call. Reuses `parseLinkedIssues` so the three planning ids
|
|
10
|
+
* are read from the same canonical body shape that `epic-plan` writes
|
|
11
|
+
* via `ensurePlanningArtifacts` and that `closePlanningArtifacts` (the
|
|
12
|
+
* existing post-merge close-tail helper) consumes.
|
|
13
|
+
*
|
|
14
|
+
* Story #2894 / Task #2904 (Epic #2880).
|
|
15
|
+
*
|
|
16
|
+
* Contract:
|
|
17
|
+
* - Input: { epicId, provider, transitionFn?, logger? }
|
|
18
|
+
* - Output: { closed, alreadyClosed, failed, details[] }
|
|
19
|
+
*
|
|
20
|
+
* Idempotency: a planning ticket that is already closed (provider
|
|
21
|
+
* `state === 'closed'`) is counted under `alreadyClosed` and not
|
|
22
|
+
* re-transitioned. A failed close on one ticket records a `failed`
|
|
23
|
+
* entry and the helper continues with the remaining tickets — finalize
|
|
24
|
+
* surfaces the count and the listener decides whether to escalate via
|
|
25
|
+
* `agent::blocked`.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { parseLinkedIssues } from '../../issue-link-parser.js';
|
|
29
|
+
import { Logger } from '../../Logger.js';
|
|
30
|
+
import { STATE_LABELS, transitionTicketState } from '../ticketing.js';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @param {object} args
|
|
34
|
+
* @param {number} args.epicId — numeric Epic ticket id.
|
|
35
|
+
* @param {object} args.provider — ITicketingProvider. Must implement
|
|
36
|
+
* `getTicket(id)` returning at least `{ body, state, linkedIssues? }`.
|
|
37
|
+
* @param {Function} [args.transitionFn] — override of
|
|
38
|
+
* `transitionTicketState` for tests.
|
|
39
|
+
* @param {object} [args.logger] — { info, warn, debug } surface.
|
|
40
|
+
* @returns {Promise<{
|
|
41
|
+
* closed: number,
|
|
42
|
+
* alreadyClosed: number,
|
|
43
|
+
* failed: number,
|
|
44
|
+
* details: Array<{ kind: 'prd'|'techSpec'|'acceptanceSpec', id: number|null, status: 'closed'|'already-closed'|'failed'|'skipped', detail?: string }>,
|
|
45
|
+
* }>}
|
|
46
|
+
*/
|
|
47
|
+
export async function closePlanningTickets({
|
|
48
|
+
epicId,
|
|
49
|
+
provider,
|
|
50
|
+
transitionFn = transitionTicketState,
|
|
51
|
+
logger = Logger,
|
|
52
|
+
} = {}) {
|
|
53
|
+
if (!Number.isInteger(epicId) || epicId < 1) {
|
|
54
|
+
throw new TypeError(
|
|
55
|
+
'closePlanningTickets: epicId must be a positive integer',
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
if (!provider || typeof provider.getTicket !== 'function') {
|
|
59
|
+
throw new TypeError(
|
|
60
|
+
'closePlanningTickets: provider must implement getTicket()',
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const epic = await provider.getTicket(epicId);
|
|
65
|
+
const linked = epic?.linkedIssues ?? parseLinkedIssues(epic?.body ?? '');
|
|
66
|
+
|
|
67
|
+
const kinds = /** @type {const} */ ([
|
|
68
|
+
['prd', linked?.prd ?? null],
|
|
69
|
+
['techSpec', linked?.techSpec ?? null],
|
|
70
|
+
['acceptanceSpec', linked?.acceptanceSpec ?? null],
|
|
71
|
+
]);
|
|
72
|
+
|
|
73
|
+
const settled = await Promise.all(
|
|
74
|
+
kinds.map(async ([kind, id]) => {
|
|
75
|
+
if (!Number.isInteger(id) || id <= 0) {
|
|
76
|
+
return { kind, id: null, status: 'skipped', detail: 'no-link' };
|
|
77
|
+
}
|
|
78
|
+
let snapshot;
|
|
79
|
+
try {
|
|
80
|
+
snapshot = await provider.getTicket(id);
|
|
81
|
+
} catch (err) {
|
|
82
|
+
const detail = err?.message ?? String(err);
|
|
83
|
+
logger.warn?.(
|
|
84
|
+
`[finalize/close-planning-tickets] read of ${kind} #${id} failed: ${detail}`,
|
|
85
|
+
);
|
|
86
|
+
return { kind, id, status: 'failed', detail };
|
|
87
|
+
}
|
|
88
|
+
if (snapshot?.state === 'closed') {
|
|
89
|
+
return { kind, id, status: 'already-closed' };
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
await transitionFn(provider, id, STATE_LABELS.DONE, { cascade: false });
|
|
93
|
+
logger.info?.(
|
|
94
|
+
`[finalize/close-planning-tickets] closed ${kind} #${id} for Epic #${epicId}`,
|
|
95
|
+
);
|
|
96
|
+
return { kind, id, status: 'closed' };
|
|
97
|
+
} catch (err) {
|
|
98
|
+
const detail = err?.message ?? String(err);
|
|
99
|
+
logger.warn?.(
|
|
100
|
+
`[finalize/close-planning-tickets] close of ${kind} #${id} failed: ${detail}`,
|
|
101
|
+
);
|
|
102
|
+
return { kind, id, status: 'failed', detail };
|
|
103
|
+
}
|
|
104
|
+
}),
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
let closed = 0;
|
|
108
|
+
let alreadyClosed = 0;
|
|
109
|
+
let failed = 0;
|
|
110
|
+
for (const row of settled) {
|
|
111
|
+
if (row.status === 'closed') closed += 1;
|
|
112
|
+
else if (row.status === 'already-closed') alreadyClosed += 1;
|
|
113
|
+
else if (row.status === 'failed') failed += 1;
|
|
114
|
+
}
|
|
115
|
+
return { closed, alreadyClosed, failed, details: settled };
|
|
116
|
+
}
|