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,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* epic-plan-ideation.js — Phase 3/4 helpers for /epic-plan
|
|
3
|
+
*
|
|
4
|
+
* Phase 3: render an Epic body from a sharpened ideation one-pager
|
|
5
|
+
* using the canonical template at `.agents/templates/epic-from-idea.md`.
|
|
6
|
+
* Phase 4: open the GitHub Issue via an injected provider with the
|
|
7
|
+
* `type::epic` label only — no `state::draft` (the Epic carries only
|
|
8
|
+
* `type::epic` until PRD authoring writes `agent::review-spec`).
|
|
9
|
+
*
|
|
10
|
+
* The template is parsed from a string the caller has already loaded
|
|
11
|
+
* (typically via `fs.readFile`). The renderer is pure — no I/O — and
|
|
12
|
+
* the opener takes a tiny `createIssue` port so the test suite can
|
|
13
|
+
* mock the provider call without touching the GitHub HTTP client.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { TYPE_LABELS } from './label-constants.js';
|
|
17
|
+
|
|
18
|
+
// Canonical section keys match the rendered template at
|
|
19
|
+
// `.agents/templates/epic-from-idea.md`. The regex accepts both the
|
|
20
|
+
// new canonical headings and the pre-canonical-headings ideation shape
|
|
21
|
+
// so an in-flight one-pager parses cleanly during the transition. The
|
|
22
|
+
// older `assumptions` key is accepted as input but is no longer a
|
|
23
|
+
// canonical rendered section — it lands implicitly in `context` if the
|
|
24
|
+
// one-pager carries one.
|
|
25
|
+
const SECTION_RE = {
|
|
26
|
+
context:
|
|
27
|
+
/^##\s+(?:Context(?:\s+&\s+Problem)?|Background|Problem(?:\s+Statement)?)\s*$/im,
|
|
28
|
+
goal: /^##\s+(?:Goals?|Objectives?|(?:Recommended\s+)?Direction)\s*$/im,
|
|
29
|
+
nonGoals:
|
|
30
|
+
/^##\s+(?:Non[\s-]?Goals|Out\s+of\s+Scope|Not\s+Doing(?:\s+\(and\s+Why\))?)\s*$/im,
|
|
31
|
+
scope:
|
|
32
|
+
/^##\s+(?:MVP\s+|Proposed\s+)?Scope(?:\s+\([^)]+\))?\s*$|^##\s+Work\s+Breakdown\s*$/im,
|
|
33
|
+
acceptanceCriteria: /^##\s+(?:Acceptance(?:\s+Criteria)?|AC)\s*$/im,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const ORDER = ['context', 'goal', 'nonGoals', 'scope', 'acceptanceCriteria'];
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Extract the five canonical sections from an idea-refinement one-pager.
|
|
40
|
+
*
|
|
41
|
+
* @param {string} onePager - Markdown produced by Phase 3 of the
|
|
42
|
+
* `idea-refinement` skill.
|
|
43
|
+
* @returns {{
|
|
44
|
+
* title: string,
|
|
45
|
+
* context: string,
|
|
46
|
+
* goal: string,
|
|
47
|
+
* nonGoals: string,
|
|
48
|
+
* scope: string,
|
|
49
|
+
* acceptanceCriteria: string,
|
|
50
|
+
* }}
|
|
51
|
+
*/
|
|
52
|
+
export function parseOnePager(onePager) {
|
|
53
|
+
if (!onePager || typeof onePager !== 'string') {
|
|
54
|
+
throw new Error('parseOnePager: onePager must be a non-empty string');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const titleMatch = onePager.match(/^#\s+(.+?)\s*$/m);
|
|
58
|
+
const title = titleMatch ? titleMatch[1].trim() : 'Untitled Epic';
|
|
59
|
+
|
|
60
|
+
// Build a map of section name -> [headingMatch.index, headingLength].
|
|
61
|
+
const positions = [];
|
|
62
|
+
for (const key of ORDER) {
|
|
63
|
+
const m = onePager.match(SECTION_RE[key]);
|
|
64
|
+
if (m && typeof m.index === 'number') {
|
|
65
|
+
positions.push({ key, start: m.index, headingLength: m[0].length });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
positions.sort((a, b) => a.start - b.start);
|
|
69
|
+
|
|
70
|
+
const sections = {
|
|
71
|
+
context: '',
|
|
72
|
+
goal: '',
|
|
73
|
+
nonGoals: '',
|
|
74
|
+
scope: '',
|
|
75
|
+
acceptanceCriteria: '',
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// Generic next-heading regex — slice up to the next `## ` heading,
|
|
79
|
+
// not just the next canonical one, so non-canonical sections the
|
|
80
|
+
// author included (e.g. "Open Questions") don't get folded into the
|
|
81
|
+
// preceding canonical section.
|
|
82
|
+
const NEXT_HEADING_RE = /^##\s+/m;
|
|
83
|
+
for (let i = 0; i < positions.length; i += 1) {
|
|
84
|
+
const cur = positions[i];
|
|
85
|
+
const sliceStart = cur.start + cur.headingLength;
|
|
86
|
+
const rest = onePager.slice(sliceStart);
|
|
87
|
+
const nextMatch = rest.match(NEXT_HEADING_RE);
|
|
88
|
+
const sliceEnd =
|
|
89
|
+
nextMatch && typeof nextMatch.index === 'number'
|
|
90
|
+
? sliceStart + nextMatch.index
|
|
91
|
+
: onePager.length;
|
|
92
|
+
sections[cur.key] = onePager.slice(sliceStart, sliceEnd).trim();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return { title, ...sections };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Render the Epic body from a parsed one-pager and a template string.
|
|
100
|
+
* Substitutes `{{key}}` tokens for the matching section. Missing
|
|
101
|
+
* sections are rendered as `_(not specified)_` so the operator can spot
|
|
102
|
+
* gaps during the HITL review (Phase 3).
|
|
103
|
+
*
|
|
104
|
+
* @param {{
|
|
105
|
+
* onePager: string,
|
|
106
|
+
* template: string,
|
|
107
|
+
* }} args
|
|
108
|
+
* @returns {{ title: string, body: string }}
|
|
109
|
+
*/
|
|
110
|
+
export function renderEpicBody({ onePager, template }) {
|
|
111
|
+
if (!template || typeof template !== 'string') {
|
|
112
|
+
throw new Error('renderEpicBody: template must be a non-empty string');
|
|
113
|
+
}
|
|
114
|
+
const parsed = parseOnePager(onePager);
|
|
115
|
+
|
|
116
|
+
const body = template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
|
|
117
|
+
if (key === 'title') return parsed.title;
|
|
118
|
+
const value = parsed[key];
|
|
119
|
+
return value && value.length > 0 ? value : '_(not specified)_';
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
return { title: parsed.title, body };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Open a new GitHub Issue for the Epic. The label set is exactly
|
|
127
|
+
* `[type::epic]` — no `state::*` label is added at creation time.
|
|
128
|
+
*
|
|
129
|
+
* The `createIssue` port matches the shape
|
|
130
|
+
* `({ title, body, labels }) => Promise<{ id, nodeId?, url? }>` so the
|
|
131
|
+
* unit test can pass an in-memory mock and assert on the captured
|
|
132
|
+
* payload. In production the port delegates to the ticketing provider's
|
|
133
|
+
* `createIssue` (GitHub: `TicketGateway.createIssue`), which adds the
|
|
134
|
+
* new issue to the configured Projects V2 board via the shared
|
|
135
|
+
* `addIssueToBoard` helper — idempotent, non-fatal, and a no-op when no
|
|
136
|
+
* project number is configured (Story #3822) — so the Epic lands on the
|
|
137
|
+
* board without relying on GitHub's "Auto-add to project" workflow. The
|
|
138
|
+
* created issue's GraphQL `node_id` is surfaced as `nodeId` on the
|
|
139
|
+
* returned envelope for observability and follow-up board operations.
|
|
140
|
+
*
|
|
141
|
+
* @param {{
|
|
142
|
+
* onePager: string,
|
|
143
|
+
* template: string,
|
|
144
|
+
* createIssue: (payload: { title: string, body: string, labels: string[] }) => Promise<{ id: number, nodeId?: string, url?: string }>,
|
|
145
|
+
* }} args
|
|
146
|
+
* @returns {Promise<{ id: number, nodeId: string|null, title: string, body: string, labels: string[], url?: string, payload: { title: string, body: string, labels: string[] } }>}
|
|
147
|
+
*/
|
|
148
|
+
export async function openEpicFromOnePager({
|
|
149
|
+
onePager,
|
|
150
|
+
template,
|
|
151
|
+
createIssue,
|
|
152
|
+
}) {
|
|
153
|
+
if (typeof createIssue !== 'function') {
|
|
154
|
+
throw new Error('openEpicFromOnePager: createIssue must be a function');
|
|
155
|
+
}
|
|
156
|
+
const { title, body } = renderEpicBody({ onePager, template });
|
|
157
|
+
const labels = [TYPE_LABELS.EPIC];
|
|
158
|
+
const payload = { title, body, labels };
|
|
159
|
+
const created = await createIssue(payload);
|
|
160
|
+
if (!created || typeof created.id !== 'number') {
|
|
161
|
+
throw new Error(
|
|
162
|
+
'openEpicFromOnePager: createIssue must return { id: number, nodeId?, url? }',
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
id: created.id,
|
|
167
|
+
nodeId: created.nodeId ?? null,
|
|
168
|
+
title,
|
|
169
|
+
body,
|
|
170
|
+
labels,
|
|
171
|
+
url: created.url,
|
|
172
|
+
payload,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Update an existing Epic Issue's body from a sharpened one-pager. The
|
|
178
|
+
* single persistence path used by the Phase 6 Epic Clarity Gate.
|
|
179
|
+
*
|
|
180
|
+
* The `editIssue` port matches the shape
|
|
181
|
+
* `({ epicId, body }) => Promise<void|object>` so unit tests can pass an
|
|
182
|
+
* in-memory mock. Idempotent: when `currentBody` exactly matches the
|
|
183
|
+
* freshly rendered body, the port is **not** called and the function
|
|
184
|
+
* returns `{ changed: false }`.
|
|
185
|
+
*
|
|
186
|
+
* @param {{
|
|
187
|
+
* epicId: number,
|
|
188
|
+
* onePager: string,
|
|
189
|
+
* template: string,
|
|
190
|
+
* editIssue: (payload: { epicId: number, body: string }) => Promise<unknown>,
|
|
191
|
+
* currentBody?: string|null,
|
|
192
|
+
* }} args
|
|
193
|
+
* @returns {Promise<{
|
|
194
|
+
* epicId: number,
|
|
195
|
+
* title: string,
|
|
196
|
+
* body: string,
|
|
197
|
+
* changed: boolean,
|
|
198
|
+
* payload?: { epicId: number, body: string },
|
|
199
|
+
* }>}
|
|
200
|
+
*/
|
|
201
|
+
export async function updateEpicFromOnePager({
|
|
202
|
+
epicId,
|
|
203
|
+
onePager,
|
|
204
|
+
template,
|
|
205
|
+
editIssue,
|
|
206
|
+
currentBody = null,
|
|
207
|
+
}) {
|
|
208
|
+
if (typeof editIssue !== 'function') {
|
|
209
|
+
throw new Error('updateEpicFromOnePager: editIssue must be a function');
|
|
210
|
+
}
|
|
211
|
+
if (!Number.isInteger(epicId) || epicId <= 0) {
|
|
212
|
+
throw new Error(
|
|
213
|
+
'updateEpicFromOnePager: epicId must be a positive integer',
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const { title, body } = renderEpicBody({ onePager, template });
|
|
218
|
+
|
|
219
|
+
if (typeof currentBody === 'string' && currentBody === body) {
|
|
220
|
+
return { epicId, title, body, changed: false };
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const payload = { epicId, body };
|
|
224
|
+
await editIssue(payload);
|
|
225
|
+
return { epicId, title, body, changed: true, payload };
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export const __test = { ORDER, SECTION_RE };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story #1651 (CWE-209): error-envelope redactor for CLI scripts.
|
|
3
|
+
*
|
|
4
|
+
* Rewrites absolute filesystem paths to repo-relative form, elides
|
|
5
|
+
* `$HOME` / `$USERPROFILE` segments outside the repo, and scrubs
|
|
6
|
+
* token-shaped substrings before error envelopes hit the public CI log.
|
|
7
|
+
*
|
|
8
|
+
* Pure and dependency-free so callers (tests, ad-hoc loggers, the
|
|
9
|
+
* runAsCli default handler) can reuse it without standing up the rest
|
|
10
|
+
* of the cli-utils harness.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
|
|
16
|
+
const REPO_ROOT_CACHE = { value: null };
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Resolve the repository root the redactor rewrites against. The
|
|
20
|
+
* heuristic walks up from this file's directory; consumers may override
|
|
21
|
+
* via the `repoRoot` option on `redactErrorMessage`. The result is
|
|
22
|
+
* memoised because the redactor runs in the hot path of error-printing.
|
|
23
|
+
*
|
|
24
|
+
* @returns {string}
|
|
25
|
+
*/
|
|
26
|
+
export function resolveRepoRoot() {
|
|
27
|
+
if (REPO_ROOT_CACHE.value) return REPO_ROOT_CACHE.value;
|
|
28
|
+
// This file: .agents/scripts/lib/error-redactor.js → repo root is 3 up.
|
|
29
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
REPO_ROOT_CACHE.value = path.resolve(here, '..', '..', '..');
|
|
31
|
+
return REPO_ROOT_CACHE.value;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const TOKEN_SHAPED = /\b(?:gh[pousr]_[A-Za-z0-9_]{20,}|[A-Fa-f0-9]{32,})\b/g;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Normalise both Windows-style and POSIX-style absolute paths in
|
|
38
|
+
* `message` to repo-relative form, elide `$HOME` / `$USERPROFILE`
|
|
39
|
+
* outside the repo, and scrub token-shaped substrings (`ghp_*`,
|
|
40
|
+
* `gho_*`, `ghs_*`, `ghu_*`, `ghr_*`, 32+ hex chars).
|
|
41
|
+
*
|
|
42
|
+
* @param {string|undefined} message
|
|
43
|
+
* @param {object} [options]
|
|
44
|
+
* @param {string} [options.repoRoot] Override the auto-resolved repo root.
|
|
45
|
+
* @param {string} [options.home] Override the home directory.
|
|
46
|
+
* @returns {string}
|
|
47
|
+
*/
|
|
48
|
+
export function redactErrorMessage(message, options = {}) {
|
|
49
|
+
if (typeof message !== 'string' || message.length === 0) {
|
|
50
|
+
return message ?? '';
|
|
51
|
+
}
|
|
52
|
+
const repoRoot = options.repoRoot ?? resolveRepoRoot();
|
|
53
|
+
const home =
|
|
54
|
+
options.home ?? process.env.HOME ?? process.env.USERPROFILE ?? null;
|
|
55
|
+
|
|
56
|
+
let out = message;
|
|
57
|
+
|
|
58
|
+
for (const variant of pathVariants(repoRoot)) {
|
|
59
|
+
out = out.split(`${variant}\\`).join('');
|
|
60
|
+
out = out.split(`${variant}/`).join('');
|
|
61
|
+
out = out.split(variant).join('<repo>');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (home) {
|
|
65
|
+
for (const variant of pathVariants(home)) {
|
|
66
|
+
out = out.split(`${variant}\\`).join('~\\');
|
|
67
|
+
out = out.split(`${variant}/`).join('~/');
|
|
68
|
+
out = out.split(variant).join('~');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return out.replace(TOKEN_SHAPED, '[REDACTED]');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function pathVariants(p) {
|
|
76
|
+
if (!p) return [];
|
|
77
|
+
const back = p.replace(/\//g, '\\');
|
|
78
|
+
const forward = p.replace(/\\/g, '/');
|
|
79
|
+
return back === forward ? [back] : [back, forward];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Determine whether error-message redaction is enabled for this process.
|
|
84
|
+
*
|
|
85
|
+
* Precedence (any one is enough to opt in):
|
|
86
|
+
* 1. Explicit `--quiet-errors` flag in `argv`.
|
|
87
|
+
* 2. `AGENT_CLI_QUIET_ERRORS=1` (or `true`) in `env`.
|
|
88
|
+
* 3. `CI=true` (or any other truthy non-empty value) in `env`.
|
|
89
|
+
*
|
|
90
|
+
* Operator workstations stay verbose by default; CI runs (where logs
|
|
91
|
+
* are public on OSS forks) get redaction automatically.
|
|
92
|
+
*
|
|
93
|
+
* @param {string[]} [argv] Defaults to `process.argv.slice(2)`.
|
|
94
|
+
* @param {NodeJS.ProcessEnv} [env] Defaults to `process.env`.
|
|
95
|
+
* @returns {boolean}
|
|
96
|
+
*/
|
|
97
|
+
export function parseQuietErrorsFlag(argv, env) {
|
|
98
|
+
const _argv = argv ?? process.argv.slice(2);
|
|
99
|
+
const _env = env ?? process.env;
|
|
100
|
+
if (_argv.includes('--quiet-errors')) return true;
|
|
101
|
+
if (isTruthyEnv(_env.AGENT_CLI_QUIET_ERRORS)) return true;
|
|
102
|
+
if (isTruthyEnv(_env.CI)) return true;
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function isTruthyEnv(value) {
|
|
107
|
+
if (!value) return false;
|
|
108
|
+
if (value === '0') return false;
|
|
109
|
+
if (value.toLowerCase() === 'false') return false;
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Format a thrown error for stderr, applying redaction when
|
|
115
|
+
* `parseQuietErrorsFlag()` says we should. Extracted from `runAsCli` so
|
|
116
|
+
* the cli-utils default error handler stays a single expression and the
|
|
117
|
+
* redaction logic lives next to the redactor itself.
|
|
118
|
+
*
|
|
119
|
+
* @param {unknown} err
|
|
120
|
+
* @returns {string}
|
|
121
|
+
*/
|
|
122
|
+
export function formatCliError(err) {
|
|
123
|
+
const body = err?.stack ?? err?.message ?? err;
|
|
124
|
+
return parseQuietErrorsFlag() ? redactErrorMessage(body) : body;
|
|
125
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/errors/ — canonical home for custom Error subclasses used by the
|
|
3
|
+
* orchestration SDK.
|
|
4
|
+
*
|
|
5
|
+
* Consumers import by class so tests can match on `instanceof` rather than
|
|
6
|
+
* message substrings.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export class ConflictingTypeLabelsError extends Error {
|
|
10
|
+
constructor(message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'ConflictingTypeLabelsError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class ValidationError extends Error {
|
|
17
|
+
constructor(message, details = {}) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = 'ValidationError';
|
|
20
|
+
Object.assign(this, details);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Errors raised by the `gh` CLI bridge (currently the bootstrap preflight;
|
|
26
|
+
* later the `lib/gh-exec.js` shim outlined in Tech Spec #1350). Tests
|
|
27
|
+
* match on `instanceof` rather than message substrings so message text
|
|
28
|
+
* can evolve without churning the assertions.
|
|
29
|
+
*/
|
|
30
|
+
export class GhNotInstalledError extends Error {
|
|
31
|
+
constructor(message = 'gh CLI is not installed or not on PATH') {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = 'GhNotInstalledError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export class GhAuthError extends Error {
|
|
38
|
+
constructor(message = 'gh CLI is installed but not authenticated') {
|
|
39
|
+
super(message);
|
|
40
|
+
this.name = 'GhAuthError';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export class GhVersionError extends Error {
|
|
45
|
+
constructor(message, details = {}) {
|
|
46
|
+
super(message);
|
|
47
|
+
this.name = 'GhVersionError';
|
|
48
|
+
Object.assign(this, details);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Raised when a framework runtime dependency (e.g. `ajv`) cannot be
|
|
54
|
+
* resolved from the consumer's `node_modules/`. Surfaces during the
|
|
55
|
+
* `/agents-bootstrap-github` preflight to redirect operators to
|
|
56
|
+
* `/agents-bootstrap-project`, which is the workflow responsible for
|
|
57
|
+
* merging and installing the framework's runtime deps. `missing` carries
|
|
58
|
+
* the package specifiers that failed to resolve so the CLI can render an
|
|
59
|
+
* actionable hint.
|
|
60
|
+
*/
|
|
61
|
+
export class MissingRuntimeDepsError extends Error {
|
|
62
|
+
constructor(message, details = {}) {
|
|
63
|
+
super(message);
|
|
64
|
+
this.name = 'MissingRuntimeDepsError';
|
|
65
|
+
Object.assign(this, details);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* audit-results-graduator.js — Auto-graduate non-blocking audit findings
|
|
3
|
+
* from the Epic's `audit-results` structured comment into routed GitHub
|
|
4
|
+
* follow-up issues. Story #2615 / Epic #2586.
|
|
5
|
+
*
|
|
6
|
+
* As of Story #3845 / Epic #3823 the spawn helper, the path/idempotency
|
|
7
|
+
* probes, the `gh issue create` filer, the toggle reader, and the
|
|
8
|
+
* route → probe → file walk all live in the shared
|
|
9
|
+
* [`graduator-core.js`](./graduator-core.js). This module is the thin
|
|
10
|
+
* audit-specific shell: it owns the audit finding parser (lens detection
|
|
11
|
+
* plus the 🔵→low / 🟢→suggestion severity mapping), the audit label /
|
|
12
|
+
* title / body shape, and the audit idempotency marker. Behaviour is
|
|
13
|
+
* identical to the pre-consolidation graduator.
|
|
14
|
+
*
|
|
15
|
+
* - Read the `audit-results` structured comment off the Epic ticket
|
|
16
|
+
* via the injected provider (`getTicketComments`).
|
|
17
|
+
* - For each non-blocking finding (severity high/medium/low/suggestion
|
|
18
|
+
* — i.e. anything that is NOT a 🔴 Critical Blocker), check that
|
|
19
|
+
* the cited file still exists in the merged tree.
|
|
20
|
+
* - Route by source classification (framework vs consumer) using
|
|
21
|
+
* `classifyPathSource`. Cross-repo findings are recorded under
|
|
22
|
+
* `skipped: 'cross-repo-deferred'` and the would-be `gh issue
|
|
23
|
+
* create` invocation is logged — never shelled out across repos.
|
|
24
|
+
* - File a follow-up issue with `gh issue create` carrying:
|
|
25
|
+
* - `meta::audit-finding`
|
|
26
|
+
* - `meta::framework-gap` or `meta::consumer-improvement`
|
|
27
|
+
* - `audit-results::<severity>` (high|medium|low|suggestion)
|
|
28
|
+
* - `domain::<lens-name>` (e.g. `domain::audit-security`)
|
|
29
|
+
* - Embed an idempotency marker in each body:
|
|
30
|
+
* <!-- audit-results-followup: epic-<id>-finding-<idx> -->
|
|
31
|
+
* Before filing, probe via `gh search issues "<marker>"` and skip
|
|
32
|
+
* findings whose marker is already present.
|
|
33
|
+
* - Short-circuit when
|
|
34
|
+
* `config.delivery.feedbackLoop.auditResultsAutoFile` is `false` —
|
|
35
|
+
* return `{ filed: [], skipped: [{ reason: 'toggle-disabled' }],
|
|
36
|
+
* errors: [] }`.
|
|
37
|
+
* - NEVER throw. Every failure path is captured in `errors[]`.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
import {
|
|
41
|
+
graduate,
|
|
42
|
+
makeIsAutoFileEnabled,
|
|
43
|
+
probePathExists,
|
|
44
|
+
} from './graduator-core.js';
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Resolve the toggle from the resolved agentrc config. Defaults to `true`
|
|
48
|
+
* — the feature is opt-out, not opt-in (mirrors codeReviewAutoFile).
|
|
49
|
+
*
|
|
50
|
+
* @param {object|undefined|null} config
|
|
51
|
+
* @returns {boolean}
|
|
52
|
+
*/
|
|
53
|
+
export const isAutoFileEnabled = makeIsAutoFileEnabled('auditResultsAutoFile');
|
|
54
|
+
|
|
55
|
+
// Re-export the shared path probe so existing importers keep working.
|
|
56
|
+
export { probePathExists };
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Severity → label mapping. Only non-blocking severities have a route;
|
|
60
|
+
* 🔴 Critical Blocker is explicitly filtered out upstream.
|
|
61
|
+
*/
|
|
62
|
+
const SEVERITY_LABEL = Object.freeze({
|
|
63
|
+
high: 'audit-results::high',
|
|
64
|
+
medium: 'audit-results::medium',
|
|
65
|
+
low: 'audit-results::low',
|
|
66
|
+
suggestion: 'audit-results::suggestion',
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Map a classification source to its meta routing label.
|
|
71
|
+
*
|
|
72
|
+
* @param {string} source
|
|
73
|
+
* @returns {string}
|
|
74
|
+
*/
|
|
75
|
+
function metaSourceLabel(source) {
|
|
76
|
+
return source === 'framework'
|
|
77
|
+
? 'meta::framework-gap'
|
|
78
|
+
: 'meta::consumer-improvement';
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Build the idempotency marker for a given epicId / finding index. An
|
|
83
|
+
* HTML comment so it survives markdown rendering without leaking into
|
|
84
|
+
* the visible body, but stays indexable via `gh search`.
|
|
85
|
+
*
|
|
86
|
+
* @param {number} epicId
|
|
87
|
+
* @param {number} index — zero-based finding ordinal within the Epic.
|
|
88
|
+
* @returns {string}
|
|
89
|
+
*/
|
|
90
|
+
export function buildIdempotencyMarker(epicId, index) {
|
|
91
|
+
return `<!-- audit-results-followup: epic-${epicId}-finding-${index} -->`;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Parse the rendered audit-results markdown into a list of findings.
|
|
96
|
+
* The format produced by `epic-audit.md` Step 4 groups findings under
|
|
97
|
+
* `#### <lens-name>` headings; each finding line begins with a severity
|
|
98
|
+
* emoji and embeds the cited path inside backticks. 🔴 critical findings
|
|
99
|
+
* are filtered out (they're blocking — the Epic stops on those).
|
|
100
|
+
*
|
|
101
|
+
* Pure. Exported so the parser can be unit-tested in isolation.
|
|
102
|
+
*
|
|
103
|
+
* @param {string} body
|
|
104
|
+
* @returns {Array<{ severity: 'high'|'medium'|'low'|'suggestion', lens: string, path: string, summary: string, index: number }>}
|
|
105
|
+
*/
|
|
106
|
+
export function parseFindings(body) {
|
|
107
|
+
if (typeof body !== 'string' || body.length === 0) return [];
|
|
108
|
+
const findings = [];
|
|
109
|
+
const lines = body.split(/\r?\n/);
|
|
110
|
+
let idx = 0;
|
|
111
|
+
let lens = 'unknown';
|
|
112
|
+
for (const rawLine of lines) {
|
|
113
|
+
const trimmed = rawLine.trim();
|
|
114
|
+
if (trimmed.length === 0) continue;
|
|
115
|
+
|
|
116
|
+
// Detect a lens heading. We accept any heading-prefixed line that
|
|
117
|
+
// names a known audit family (`audit-*`).
|
|
118
|
+
const lensMatch = trimmed.match(/^#{2,6}\s+(audit-[a-z0-9-]+)/i);
|
|
119
|
+
if (lensMatch) {
|
|
120
|
+
lens = lensMatch[1];
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let severity = null;
|
|
125
|
+
if (trimmed.startsWith('🔴')) {
|
|
126
|
+
// Critical Blocker — skip; never graduates.
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (trimmed.startsWith('🟠')) severity = 'high';
|
|
130
|
+
else if (trimmed.startsWith('🟡')) severity = 'medium';
|
|
131
|
+
else if (trimmed.startsWith('🟢')) severity = 'suggestion';
|
|
132
|
+
else if (trimmed.startsWith('🔵')) severity = 'low';
|
|
133
|
+
else continue;
|
|
134
|
+
|
|
135
|
+
const pathMatch = trimmed.match(/`([^`]+)`/);
|
|
136
|
+
if (!pathMatch) continue;
|
|
137
|
+
const path = pathMatch[1];
|
|
138
|
+
|
|
139
|
+
findings.push({
|
|
140
|
+
severity,
|
|
141
|
+
lens,
|
|
142
|
+
path,
|
|
143
|
+
summary: trimmed,
|
|
144
|
+
index: idx,
|
|
145
|
+
});
|
|
146
|
+
idx += 1;
|
|
147
|
+
}
|
|
148
|
+
return findings;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Auto-graduate non-blocking audit-results findings into routed
|
|
153
|
+
* follow-up issues. Never throws. Thin wrapper around the shared
|
|
154
|
+
* `graduate()` walk with the audit-specific behaviour bundle.
|
|
155
|
+
*
|
|
156
|
+
* @param {object} opts
|
|
157
|
+
* @param {number} opts.epicId
|
|
158
|
+
* @param {object} opts.provider — ticketing provider exposing
|
|
159
|
+
* `getTicketComments(ticketId)`.
|
|
160
|
+
* @param {object} [opts.config] — resolved agentrc.
|
|
161
|
+
* @param {{owner: string, repo: string}} opts.currentRepo — repo the
|
|
162
|
+
* listener is running inside; used for the cross-repo guard.
|
|
163
|
+
* @param {{owner: string, repo: string}} [opts.frameworkRepo] — where
|
|
164
|
+
* framework-tagged findings route. Defaults to `currentRepo`.
|
|
165
|
+
* @param {string} [opts.gitRef='HEAD']
|
|
166
|
+
* @param {Function} [opts.classifier=classifyPathSource]
|
|
167
|
+
* @param {string} [opts.ghPath='gh']
|
|
168
|
+
* @param {Function} [opts.spawnImpl]
|
|
169
|
+
* @param {string} [opts.cwd]
|
|
170
|
+
* @param {{info?: Function, warn?: Function, debug?: Function}} [opts.logger]
|
|
171
|
+
* @returns {Promise<{
|
|
172
|
+
* filed: Array<{ index: number, severity: string, lens: string, path: string, source: string, repo: string, url: string|null }>,
|
|
173
|
+
* skipped: Array<{ index?: number, reason: string, path?: string, severity?: string, lens?: string }>,
|
|
174
|
+
* errors: string[],
|
|
175
|
+
* }>}
|
|
176
|
+
*/
|
|
177
|
+
export async function graduateAuditResults(opts = {}) {
|
|
178
|
+
return graduate({
|
|
179
|
+
...opts,
|
|
180
|
+
spec: {
|
|
181
|
+
fnName: 'graduateAuditResults',
|
|
182
|
+
isAutoFileEnabled,
|
|
183
|
+
commentMarker: '<!-- claude-managed: audit-results -->',
|
|
184
|
+
noCommentReason: 'no-audit-results-comment',
|
|
185
|
+
parseFindings,
|
|
186
|
+
buildIdempotencyMarker,
|
|
187
|
+
decorateRecord: (record, finding) => {
|
|
188
|
+
record.lens = finding.lens;
|
|
189
|
+
return record;
|
|
190
|
+
},
|
|
191
|
+
buildCrossRepoLog: ({ finding, routedRepo, source }) => {
|
|
192
|
+
const labels = [
|
|
193
|
+
'meta::audit-finding',
|
|
194
|
+
metaSourceLabel(source),
|
|
195
|
+
SEVERITY_LABEL[finding.severity],
|
|
196
|
+
`domain::${finding.lens}`,
|
|
197
|
+
];
|
|
198
|
+
return `[audit-results-graduator] cross-repo skip (would file in ${routedRepo.owner}/${routedRepo.repo}): gh issue create --repo ${routedRepo.owner}/${routedRepo.repo} --title "Audit follow-up (${finding.lens}): ${finding.path}" --label "${labels.join(',')}"`;
|
|
199
|
+
},
|
|
200
|
+
buildFollowUp: ({ finding, source, epicId, idMarker }) => {
|
|
201
|
+
const title = `Audit follow-up (${finding.lens}): ${finding.path}`;
|
|
202
|
+
const body = [
|
|
203
|
+
idMarker,
|
|
204
|
+
'',
|
|
205
|
+
`Auto-filed from the Epic #${epicId} audit-results pass.`,
|
|
206
|
+
'',
|
|
207
|
+
`**Lens**: ${finding.lens}`,
|
|
208
|
+
`**Severity**: ${finding.severity}`,
|
|
209
|
+
`**Source**: ${source}`,
|
|
210
|
+
`**Path**: \`${finding.path}\``,
|
|
211
|
+
'',
|
|
212
|
+
'### Finding',
|
|
213
|
+
'',
|
|
214
|
+
finding.summary,
|
|
215
|
+
'',
|
|
216
|
+
`_See Epic #${epicId} for the full audit-results report._`,
|
|
217
|
+
].join('\n');
|
|
218
|
+
const labels = [
|
|
219
|
+
'meta::audit-finding',
|
|
220
|
+
metaSourceLabel(source),
|
|
221
|
+
SEVERITY_LABEL[finding.severity],
|
|
222
|
+
`domain::${finding.lens}`,
|
|
223
|
+
];
|
|
224
|
+
return { title, body, labels };
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export default graduateAuditResults;
|