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,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retro accessor (Story #3042 / Task #3043 — Epic #3019).
|
|
3
|
+
*
|
|
4
|
+
* Resolves `.agentrc.json → delivery.retro` into the canonical shape the
|
|
5
|
+
* retro-runner consumes. Currently exposes only `perfThresholds`, the
|
|
6
|
+
* operator-tunable gates for the perf-signals classifier in
|
|
7
|
+
* `lib/orchestration/retro-perf-heuristics.js`.
|
|
8
|
+
*
|
|
9
|
+
* Defaults mirror `DEFAULT_RETRO_PERF_THRESHOLDS` in the heuristics module
|
|
10
|
+
* (single source of behavioural truth; this resolver is a thin merge layer).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Default perf-threshold trio applied when `.agentrc.json` omits
|
|
15
|
+
* `delivery.retro.perfThresholds` (or any of its sub-keys). Frozen so
|
|
16
|
+
* downstream callers cannot accidentally mutate the resolver's defaults
|
|
17
|
+
* across processes.
|
|
18
|
+
*
|
|
19
|
+
* Keep in lockstep with `DEFAULT_RETRO_PERF_THRESHOLDS` in
|
|
20
|
+
* `lib/orchestration/retro-perf-heuristics.js` and the schema mirror in
|
|
21
|
+
* `agentrc.schema.json → $defs.retro.properties.perfThresholds`.
|
|
22
|
+
*/
|
|
23
|
+
export const DEFAULT_RETRO = Object.freeze({
|
|
24
|
+
perfThresholds: Object.freeze({
|
|
25
|
+
utilisation: 0.6,
|
|
26
|
+
bootstrapShare: 0.4,
|
|
27
|
+
capBindingRunLength: 2,
|
|
28
|
+
}),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Read the merged retro block. Returns the canonical shape:
|
|
33
|
+
*
|
|
34
|
+
* {
|
|
35
|
+
* perfThresholds: {
|
|
36
|
+
* utilisation: number,
|
|
37
|
+
* bootstrapShare: number,
|
|
38
|
+
* capBindingRunLength: number,
|
|
39
|
+
* },
|
|
40
|
+
* }
|
|
41
|
+
*
|
|
42
|
+
* Each sub-key falls back to its documented default when the resolved
|
|
43
|
+
* `.agentrc.json` omits it. Out-of-range values fall back to defaults too —
|
|
44
|
+
* the AJV schema rejects them before they reach this accessor, but the
|
|
45
|
+
* resolver stays defensive so unit-test fixtures and degraded configs
|
|
46
|
+
* never produce nonsensical thresholds.
|
|
47
|
+
*
|
|
48
|
+
* @param {object | null | undefined} config
|
|
49
|
+
* @returns {{ perfThresholds: { utilisation: number, bootstrapShare: number, capBindingRunLength: number } }}
|
|
50
|
+
*/
|
|
51
|
+
export function getRetro(config) {
|
|
52
|
+
const user = config?.delivery?.retro?.perfThresholds ?? {};
|
|
53
|
+
const defaults = DEFAULT_RETRO.perfThresholds;
|
|
54
|
+
return {
|
|
55
|
+
perfThresholds: {
|
|
56
|
+
utilisation: resolveUnit(user.utilisation, defaults.utilisation),
|
|
57
|
+
bootstrapShare: resolveUnit(user.bootstrapShare, defaults.bootstrapShare),
|
|
58
|
+
capBindingRunLength: resolvePositiveInt(
|
|
59
|
+
user.capBindingRunLength,
|
|
60
|
+
defaults.capBindingRunLength,
|
|
61
|
+
),
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function resolveUnit(value, fallback) {
|
|
67
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) return fallback;
|
|
68
|
+
if (value < 0 || value > 1) return fallback;
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function resolvePositiveInt(value, fallback) {
|
|
73
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {
|
|
74
|
+
return fallback;
|
|
75
|
+
}
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runner accessor (Epic #1720 Story #1739 — top-level reshape).
|
|
3
|
+
*
|
|
4
|
+
* Post-reshape, only `delivery.deliverRunner`, `delivery.epicAudit`, and
|
|
5
|
+
* `delivery.codeReview` are configurable; everything else lives in
|
|
6
|
+
* framework-internal constants exported alongside (`DEFAULT_STORY_MERGE_RETRY`,
|
|
7
|
+
* `DEFAULT_DECOMPOSER`).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** Hardcoded story-merge retry policy (was `orchestration.runners.storyMergeRetry`). */
|
|
11
|
+
export const DEFAULT_STORY_MERGE_RETRY = Object.freeze({
|
|
12
|
+
maxAttempts: 3,
|
|
13
|
+
backoffMs: Object.freeze([250, 500, 1000]),
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
/** Hardcoded decomposer concurrency cap (was `orchestration.runners.decomposer.concurrencyCap`). */
|
|
17
|
+
export const DEFAULT_DECOMPOSER = Object.freeze({
|
|
18
|
+
concurrencyCap: 3,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Hardcoded deliver-runner defaults. Operators override via
|
|
23
|
+
* `delivery.deliverRunner.*` in `.agentrc.json`.
|
|
24
|
+
*
|
|
25
|
+
* **Throughput tradeoff — `concurrencyCap`.**
|
|
26
|
+
* The default of 3 is intentionally conservative: it keeps host-quota
|
|
27
|
+
* consumption low for Epics with small waves and avoids saturating the
|
|
28
|
+
* GitHub API with concurrent label writes. For wide-wave Epics where the
|
|
29
|
+
* host has adequate parallel-agent quota, operators should raise
|
|
30
|
+
* `delivery.deliverRunner.concurrencyCap` — wall-clock time falls
|
|
31
|
+
* proportionally to the extra concurrency. The safe default is a tuning
|
|
32
|
+
* knob, not a performance ceiling. See `epic-deliver.md` § Phase 2b and
|
|
33
|
+
* `agentrc-reference.json` `delivery.deliverRunner.concurrencyCap` for details.
|
|
34
|
+
*
|
|
35
|
+
* **`verifyConcurrencyCap`** (Epic #3019 Tech Spec §1.4 / Story #3024) is a
|
|
36
|
+
* separate knob that bounds the `verifyWaveResults` loop independently of
|
|
37
|
+
* Story-dispatch concurrency, so operators can tune ticket-verify parallelism
|
|
38
|
+
* without raising the wave fan-out. Default 4.
|
|
39
|
+
*/
|
|
40
|
+
const DEFAULT_DELIVER_RUNNER = Object.freeze({
|
|
41
|
+
concurrencyCap: 3,
|
|
42
|
+
progressReportIntervalSec: 120,
|
|
43
|
+
verifyConcurrencyCap: 4,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Default auto-fix loop ceilings for /epic-deliver Phase 4 (epic-audit)
|
|
48
|
+
* and Phase 5 (code-review). Operators override via
|
|
49
|
+
* `delivery.epicAudit.*` and `delivery.codeReview.*` in `.agentrc.json`
|
|
50
|
+
* (Story #2611, Epic #2586).
|
|
51
|
+
*/
|
|
52
|
+
export const DEFAULT_EPIC_AUDIT = Object.freeze({
|
|
53
|
+
maxFixAttempts: 3,
|
|
54
|
+
maxFixScopeFiles: 5,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
export const DEFAULT_CODE_REVIEW = Object.freeze({
|
|
58
|
+
maxFixAttempts: 3,
|
|
59
|
+
maxFixScopeFiles: 5,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Read the merged deliver-runner block.
|
|
64
|
+
*
|
|
65
|
+
* @param {object | null | undefined} config
|
|
66
|
+
* @returns {{
|
|
67
|
+
* deliverRunner: { concurrencyCap: number, progressReportIntervalSec: number, verifyConcurrencyCap: number },
|
|
68
|
+
* epicAudit: { maxFixAttempts: number, maxFixScopeFiles: number },
|
|
69
|
+
* codeReview: { maxFixAttempts: number, maxFixScopeFiles: number },
|
|
70
|
+
* storyMergeRetry: { maxAttempts: number, backoffMs: readonly number[] },
|
|
71
|
+
* decomposer: { concurrencyCap: number },
|
|
72
|
+
* }}
|
|
73
|
+
*/
|
|
74
|
+
export function getRunners(config) {
|
|
75
|
+
const deliverRunnerUser = config?.delivery?.deliverRunner ?? {};
|
|
76
|
+
const epicAuditUser = config?.delivery?.epicAudit ?? {};
|
|
77
|
+
const codeReviewUser = config?.delivery?.codeReview ?? {};
|
|
78
|
+
return {
|
|
79
|
+
deliverRunner: {
|
|
80
|
+
concurrencyCap:
|
|
81
|
+
deliverRunnerUser.concurrencyCap ??
|
|
82
|
+
DEFAULT_DELIVER_RUNNER.concurrencyCap,
|
|
83
|
+
progressReportIntervalSec:
|
|
84
|
+
deliverRunnerUser.progressReportIntervalSec ??
|
|
85
|
+
DEFAULT_DELIVER_RUNNER.progressReportIntervalSec,
|
|
86
|
+
verifyConcurrencyCap:
|
|
87
|
+
deliverRunnerUser.verifyConcurrencyCap ??
|
|
88
|
+
DEFAULT_DELIVER_RUNNER.verifyConcurrencyCap,
|
|
89
|
+
},
|
|
90
|
+
epicAudit: {
|
|
91
|
+
maxFixAttempts:
|
|
92
|
+
epicAuditUser.maxFixAttempts ?? DEFAULT_EPIC_AUDIT.maxFixAttempts,
|
|
93
|
+
maxFixScopeFiles:
|
|
94
|
+
epicAuditUser.maxFixScopeFiles ?? DEFAULT_EPIC_AUDIT.maxFixScopeFiles,
|
|
95
|
+
},
|
|
96
|
+
codeReview: {
|
|
97
|
+
maxFixAttempts:
|
|
98
|
+
codeReviewUser.maxFixAttempts ?? DEFAULT_CODE_REVIEW.maxFixAttempts,
|
|
99
|
+
maxFixScopeFiles:
|
|
100
|
+
codeReviewUser.maxFixScopeFiles ?? DEFAULT_CODE_REVIEW.maxFixScopeFiles,
|
|
101
|
+
},
|
|
102
|
+
storyMergeRetry: DEFAULT_STORY_MERGE_RETRY,
|
|
103
|
+
decomposer: DEFAULT_DECOMPOSER,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime-environment resolution helpers (Epic #773 Story 6 — split out of
|
|
3
|
+
* config-resolver.js). Reads `process.env` to determine worktree-isolation
|
|
4
|
+
* state, the per-process session id, and the canonical working path the
|
|
5
|
+
* agent should `cd` into for a given Story.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import crypto from 'node:crypto';
|
|
9
|
+
import os from 'node:os';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
|
|
12
|
+
const SESSION_ID_LENGTH = 12;
|
|
13
|
+
const SESSION_ID_ALLOWED_CHAR_RE = /[^a-z0-9]/g;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Resolve whether worktree isolation is enabled for this process, with strict
|
|
17
|
+
* environment-variable precedence that outranks the committed config value.
|
|
18
|
+
*
|
|
19
|
+
* Precedence:
|
|
20
|
+
* 1. `env.AP_WORKTREE_ENABLED === 'true'` → true (explicit operator override)
|
|
21
|
+
* 2. `env.AP_WORKTREE_ENABLED === 'false'` → false (explicit operator override)
|
|
22
|
+
* 3. `env.CLAUDE_CODE_REMOTE === 'true'` → false (web session auto-detect)
|
|
23
|
+
* 4. else → Boolean(config.delivery.worktreeIsolation.enabled)
|
|
24
|
+
*
|
|
25
|
+
* String matching on `AP_WORKTREE_ENABLED` is deliberate: `""`, `"0"`, or any
|
|
26
|
+
* other truthy-ish shell expansion must not flip the flag.
|
|
27
|
+
*
|
|
28
|
+
* @param {{ config?: { delivery?: { worktreeIsolation?: { enabled?: boolean } } | null } }} [opts]
|
|
29
|
+
* @param {NodeJS.ProcessEnv} [env]
|
|
30
|
+
* @returns {boolean}
|
|
31
|
+
*/
|
|
32
|
+
export function resolveWorktreeEnabled(opts = {}, env = process.env) {
|
|
33
|
+
if (env.AP_WORKTREE_ENABLED === 'true') return true;
|
|
34
|
+
if (env.AP_WORKTREE_ENABLED === 'false') return false;
|
|
35
|
+
if (env.CLAUDE_CODE_REMOTE === 'true') return false;
|
|
36
|
+
return Boolean(opts.config?.delivery?.worktreeIsolation?.enabled);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Resolve the absolute working path the agent should `cd` into for a given
|
|
41
|
+
* Story. When worktree isolation is on, returns the per-story worktree path
|
|
42
|
+
* (`<repoRoot>/<wtRoot>/story-<id>`). When off, returns the repo root so
|
|
43
|
+
* init, close, and recovery converge on a single canonical path with no
|
|
44
|
+
* undefined-path access on the off-branch.
|
|
45
|
+
*
|
|
46
|
+
* Pure helper — no fs / git side effects. Path-traversal containment for
|
|
47
|
+
* `worktreeRoot` is enforced earlier by `validateOrchestrationConfig`.
|
|
48
|
+
*
|
|
49
|
+
* @param {object} opts
|
|
50
|
+
* @param {boolean} opts.worktreeEnabled
|
|
51
|
+
* @param {string} opts.repoRoot Absolute path to the main checkout.
|
|
52
|
+
* @param {number|string} [opts.storyId] Required when `worktreeEnabled` is true.
|
|
53
|
+
* @param {string} [opts.worktreeRoot] Worktree root relative to repoRoot. Defaults to `.worktrees`.
|
|
54
|
+
* @returns {string} Absolute path the agent should work from.
|
|
55
|
+
*/
|
|
56
|
+
export function resolveWorkingPath({
|
|
57
|
+
worktreeEnabled,
|
|
58
|
+
repoRoot,
|
|
59
|
+
storyId,
|
|
60
|
+
worktreeRoot = '.worktrees',
|
|
61
|
+
} = {}) {
|
|
62
|
+
if (typeof repoRoot !== 'string' || repoRoot.length === 0) {
|
|
63
|
+
throw new Error('resolveWorkingPath: repoRoot is required');
|
|
64
|
+
}
|
|
65
|
+
// Caller is responsible for passing an already-absolute repoRoot (every
|
|
66
|
+
// production caller threads `path.resolve(...)` upstream). We do not
|
|
67
|
+
// re-resolve here so unit-test fixtures that pass sentinel paths like
|
|
68
|
+
// `/repo` keep their semantics on Windows.
|
|
69
|
+
if (!worktreeEnabled) return repoRoot;
|
|
70
|
+
if (storyId == null) {
|
|
71
|
+
throw new Error(
|
|
72
|
+
'resolveWorkingPath: storyId is required when worktreeEnabled is true',
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
return path.join(repoRoot, worktreeRoot, `story-${storyId}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* One-shot environment-aware runtime resolution. Returns the trio of runtime
|
|
80
|
+
* signals consumed across `/epic-deliver`: whether worktree isolation is on
|
|
81
|
+
* for this process, the session id for claim labels, and whether we're in a
|
|
82
|
+
* Claude Code web session. Each signal also records its **source** so the
|
|
83
|
+
* `story-init` startup log can name why the value is what it is.
|
|
84
|
+
*
|
|
85
|
+
* @param {{ config?: object }} [opts]
|
|
86
|
+
* @param {NodeJS.ProcessEnv} [env]
|
|
87
|
+
* @returns {{
|
|
88
|
+
* worktreeEnabled: boolean,
|
|
89
|
+
* worktreeEnabledSource: 'env-override' | 'remote-auto' | 'config',
|
|
90
|
+
* sessionId: string,
|
|
91
|
+
* sessionIdSource: 'remote' | 'local',
|
|
92
|
+
* isRemote: boolean,
|
|
93
|
+
* }}
|
|
94
|
+
*/
|
|
95
|
+
export function resolveRuntime(opts = {}, env = process.env) {
|
|
96
|
+
const worktreeEnabled = resolveWorktreeEnabled(opts, env);
|
|
97
|
+
const worktreeEnabledSource =
|
|
98
|
+
env.AP_WORKTREE_ENABLED === 'true' || env.AP_WORKTREE_ENABLED === 'false'
|
|
99
|
+
? 'env-override'
|
|
100
|
+
: env.CLAUDE_CODE_REMOTE === 'true'
|
|
101
|
+
? 'remote-auto'
|
|
102
|
+
: 'config';
|
|
103
|
+
|
|
104
|
+
const remoteId = env.CLAUDE_CODE_REMOTE_SESSION_ID;
|
|
105
|
+
const remoteUsable =
|
|
106
|
+
typeof remoteId === 'string' &&
|
|
107
|
+
remoteId.toLowerCase().replace(SESSION_ID_ALLOWED_CHAR_RE, '').length > 0;
|
|
108
|
+
const sessionId = resolveSessionId(env);
|
|
109
|
+
const sessionIdSource = remoteUsable ? 'remote' : 'local';
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
worktreeEnabled,
|
|
113
|
+
worktreeEnabledSource,
|
|
114
|
+
sessionId,
|
|
115
|
+
sessionIdSource,
|
|
116
|
+
isRemote: env.CLAUDE_CODE_REMOTE === 'true',
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Resolve the per-process session-id used for claim labels and structured
|
|
122
|
+
* comments. Prefers the Anthropic-provided `CLAUDE_CODE_REMOTE_SESSION_ID`
|
|
123
|
+
* (sanitised and truncated) and falls back to a locally-generated short id
|
|
124
|
+
* derived from hostname + pid + random entropy.
|
|
125
|
+
*
|
|
126
|
+
* Sanitisation for the remote id:
|
|
127
|
+
* 1. Lower-case.
|
|
128
|
+
* 2. Strip every character outside `[a-z0-9]`.
|
|
129
|
+
* 3. Truncate to {@link SESSION_ID_LENGTH} (12) chars.
|
|
130
|
+
* 4. If the sanitised result is empty, fall back to the locally-generated id
|
|
131
|
+
* — an all-symbol remote id is not a usable label suffix.
|
|
132
|
+
*
|
|
133
|
+
* The return value is always a string of 1..12 chars matching `[a-z0-9]+`,
|
|
134
|
+
* suitable for inclusion in log lines and any future label suffixes without
|
|
135
|
+
* further escaping. See tech spec #670 § Security — Env-var injection.
|
|
136
|
+
*
|
|
137
|
+
* @param {NodeJS.ProcessEnv} [env]
|
|
138
|
+
* @returns {string}
|
|
139
|
+
*/
|
|
140
|
+
export function resolveSessionId(env = process.env) {
|
|
141
|
+
const remote = env.CLAUDE_CODE_REMOTE_SESSION_ID;
|
|
142
|
+
if (typeof remote === 'string' && remote.length > 0) {
|
|
143
|
+
const sanitised = remote
|
|
144
|
+
.toLowerCase()
|
|
145
|
+
.replace(SESSION_ID_ALLOWED_CHAR_RE, '')
|
|
146
|
+
.slice(0, SESSION_ID_LENGTH);
|
|
147
|
+
if (sanitised.length > 0) return sanitised;
|
|
148
|
+
}
|
|
149
|
+
return generateLocalSessionId();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function generateLocalSessionId() {
|
|
153
|
+
// Layout: 2 host chars + 2 pid chars + 8 random hex chars = 12 chars. The
|
|
154
|
+
// random suffix is load-bearing for uniqueness; host/pid hints are
|
|
155
|
+
// operator-friendly context, not identifiers.
|
|
156
|
+
const host = (os.hostname() || 'h')
|
|
157
|
+
.toLowerCase()
|
|
158
|
+
.replace(SESSION_ID_ALLOWED_CHAR_RE, '')
|
|
159
|
+
.slice(0, 2)
|
|
160
|
+
.padEnd(2, '0');
|
|
161
|
+
const pid = String(process.pid)
|
|
162
|
+
.replace(SESSION_ID_ALLOWED_CHAR_RE, '')
|
|
163
|
+
.slice(-2)
|
|
164
|
+
.padStart(2, '0');
|
|
165
|
+
const rand = crypto.randomBytes(4).toString('hex'); // 8 hex chars
|
|
166
|
+
return `${host}${pid}${rand}`.slice(0, SESSION_ID_LENGTH);
|
|
167
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-block helpers for the lib/config/* sub-modules (Epic #773 Story 6).
|
|
3
|
+
*
|
|
4
|
+
* Lives outside the per-sub-block files because more than one resolver needs
|
|
5
|
+
* the same merge primitives. Adding a helper here is appropriate when ≥ 2
|
|
6
|
+
* sub-block resolvers would otherwise duplicate the same logic; keep
|
|
7
|
+
* single-use helpers private to their own sub-block.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Deep-merge a list-valued config key with its framework default.
|
|
12
|
+
*
|
|
13
|
+
* Accepts:
|
|
14
|
+
* - `undefined` → return a copy of `defaultList`
|
|
15
|
+
* - plain array → replace wholesale (returns a copy)
|
|
16
|
+
* - `{ append, prepend }` → extend `defaultList`; items already present in
|
|
17
|
+
* the result are deduped so a consumer appending
|
|
18
|
+
* a framework entry does not produce a duplicate.
|
|
19
|
+
*
|
|
20
|
+
* @param {readonly string[]} defaultList
|
|
21
|
+
* @param {unknown} userValue
|
|
22
|
+
* @returns {string[]}
|
|
23
|
+
*/
|
|
24
|
+
export function resolveListValue(defaultList, userValue) {
|
|
25
|
+
if (userValue === undefined) return [...defaultList];
|
|
26
|
+
if (Array.isArray(userValue)) return [...userValue];
|
|
27
|
+
if (userValue !== null && typeof userValue === 'object') {
|
|
28
|
+
const result = [];
|
|
29
|
+
const seen = new Set();
|
|
30
|
+
const push = (item) => {
|
|
31
|
+
if (!seen.has(item)) {
|
|
32
|
+
result.push(item);
|
|
33
|
+
seen.add(item);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
if (Array.isArray(userValue.prepend)) {
|
|
37
|
+
for (const item of userValue.prepend) push(item);
|
|
38
|
+
}
|
|
39
|
+
for (const item of defaultList) push(item);
|
|
40
|
+
if (Array.isArray(userValue.append)) {
|
|
41
|
+
for (const item of userValue.append) push(item);
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
return [...defaultList];
|
|
46
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sync-agentrc — default-aware `.agentrc.json` reconciliation (Story #1995).
|
|
3
|
+
*
|
|
4
|
+
* Replaces the template-diff merge the helper procedure previously
|
|
5
|
+
* described. The new contract:
|
|
6
|
+
*
|
|
7
|
+
* 1. Validate the project config against the framework schema. Any
|
|
8
|
+
* failure aborts the run with a diagnostic — never silently strip.
|
|
9
|
+
* 2. Never auto-fill optional keys from the template. The runtime
|
|
10
|
+
* already layers `*_DEFAULTS` underneath the project config at
|
|
11
|
+
* read time, so an absent key resolves to the framework default
|
|
12
|
+
* without needing to be written into `.agentrc.json`.
|
|
13
|
+
* 3. For every project leaf whose value deep-equals the framework
|
|
14
|
+
* default at that path, emit a `[REDUNDANT]` advisory row.
|
|
15
|
+
* Advisories are informational only — the project file is left
|
|
16
|
+
* untouched. Operators who want a leaner config can prune the
|
|
17
|
+
* redundant keys by hand.
|
|
18
|
+
*
|
|
19
|
+
* Outcome: after `/agents-update`, `.agentrc.json` contains only keys
|
|
20
|
+
* that materially diverge from framework defaults, plus the
|
|
21
|
+
* consumer-identity keys with no sensible framework default (owner,
|
|
22
|
+
* repo, operatorHandle).
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import fs from 'node:fs';
|
|
26
|
+
import path from 'node:path';
|
|
27
|
+
import { AGENTRC_SCHEMA, getAgentrcValidator } from '../config-schema.js';
|
|
28
|
+
import { deepEqual } from '../json-utils.js';
|
|
29
|
+
import {
|
|
30
|
+
getAgentrcDefaults,
|
|
31
|
+
IDENTITY_PLACEHOLDER_PATHS,
|
|
32
|
+
iterDefaultLeaves,
|
|
33
|
+
lookupPath,
|
|
34
|
+
} from './defaults.js';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @typedef {Object} SyncChange
|
|
38
|
+
* @property {'REDUNDANT'|'ADDED'|'ERROR'} op
|
|
39
|
+
* @property {string} path
|
|
40
|
+
* @property {unknown} [value]
|
|
41
|
+
* @property {string} [reason]
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @typedef {Object} SyncResult
|
|
46
|
+
* @property {'noop'|'updated'|'invalid'|'missing-config'} status
|
|
47
|
+
* @property {SyncChange[]} changes
|
|
48
|
+
* @property {string[]} errors
|
|
49
|
+
* @property {string} configPath
|
|
50
|
+
* @property {boolean} wrote whether `.agentrc.json` was rewritten
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
const IDENTITY_SET = new Set(IDENTITY_PLACEHOLDER_PATHS);
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Run the reconciliation against a project root.
|
|
57
|
+
*
|
|
58
|
+
* @param {{ projectRoot: string, defaults?: object, fsImpl?: typeof fs }} opts
|
|
59
|
+
* @returns {SyncResult}
|
|
60
|
+
*/
|
|
61
|
+
export function syncAgentrc(opts) {
|
|
62
|
+
const projectRoot = path.resolve(opts.projectRoot);
|
|
63
|
+
const fsImpl = opts.fsImpl ?? fs;
|
|
64
|
+
const configPath = path.join(projectRoot, '.agentrc.json');
|
|
65
|
+
const defaults = opts.defaults ?? getAgentrcDefaults();
|
|
66
|
+
|
|
67
|
+
if (!fsImpl.existsSync(configPath)) {
|
|
68
|
+
return {
|
|
69
|
+
status: 'missing-config',
|
|
70
|
+
changes: [],
|
|
71
|
+
errors: [
|
|
72
|
+
`No .agentrc.json at ${configPath}. Run /agents-bootstrap-project first.`,
|
|
73
|
+
],
|
|
74
|
+
configPath,
|
|
75
|
+
wrote: false,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
let raw;
|
|
80
|
+
try {
|
|
81
|
+
raw = JSON.parse(fsImpl.readFileSync(configPath, 'utf8'));
|
|
82
|
+
} catch (err) {
|
|
83
|
+
return {
|
|
84
|
+
status: 'invalid',
|
|
85
|
+
changes: [],
|
|
86
|
+
errors: [`Failed to parse .agentrc.json: ${err.message}`],
|
|
87
|
+
configPath,
|
|
88
|
+
wrote: false,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const validate = getAgentrcValidator();
|
|
93
|
+
if (!validate(raw)) {
|
|
94
|
+
const errors = (validate.errors || []).map(
|
|
95
|
+
(e) => `${e.instancePath || '(root)'} ${e.message}`,
|
|
96
|
+
);
|
|
97
|
+
return {
|
|
98
|
+
status: 'invalid',
|
|
99
|
+
changes: [],
|
|
100
|
+
errors,
|
|
101
|
+
configPath,
|
|
102
|
+
wrote: false,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const changes = collectRedundantAdvisories(raw, defaults);
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
status: 'noop',
|
|
110
|
+
changes,
|
|
111
|
+
errors: [],
|
|
112
|
+
configPath,
|
|
113
|
+
wrote: false,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Walk every default leaf path. When the project carries the same path
|
|
119
|
+
* with a deep-equal value, emit a `[REDUNDANT]` advisory. Skip identity
|
|
120
|
+
* placeholder paths (those have no usable default) and skip leaves the
|
|
121
|
+
* schema requires at their immediate parent (deleting them would
|
|
122
|
+
* invalidate the config).
|
|
123
|
+
*
|
|
124
|
+
* @param {object} project
|
|
125
|
+
* @param {object} defaults
|
|
126
|
+
* @param {object} [schema] — schema to consult for `required` arrays.
|
|
127
|
+
* Defaults to the runtime AJV schema. Tests can inject a synthetic
|
|
128
|
+
* schema to exercise the walk in isolation.
|
|
129
|
+
* @returns {SyncChange[]}
|
|
130
|
+
*/
|
|
131
|
+
export function collectRedundantAdvisories(
|
|
132
|
+
project,
|
|
133
|
+
defaults,
|
|
134
|
+
schema = AGENTRC_SCHEMA,
|
|
135
|
+
) {
|
|
136
|
+
const out = [];
|
|
137
|
+
for (const [dotted, defValue] of iterDefaultLeaves(defaults)) {
|
|
138
|
+
if (IDENTITY_SET.has(dotted)) continue;
|
|
139
|
+
if (!isLeafSchemaRemovable(schema, dotted)) continue;
|
|
140
|
+
const found = lookupPath(project, dotted);
|
|
141
|
+
if (!found.present) continue;
|
|
142
|
+
if (deepEqual(found.value, defValue)) {
|
|
143
|
+
out.push({
|
|
144
|
+
op: 'REDUNDANT',
|
|
145
|
+
path: dotted,
|
|
146
|
+
value: defValue,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Walk a (pre-resolved, $ref-free) JSON Schema along a dotted path and
|
|
155
|
+
* report whether the leaf can be removed without invalidating its
|
|
156
|
+
* immediate parent. A leaf is schema-removable when it does NOT appear
|
|
157
|
+
* in its immediate-parent object's `required[]`.
|
|
158
|
+
*
|
|
159
|
+
* Only the leaf segment's membership in its parent's `required[]`
|
|
160
|
+
* matters. An ancestor being listed as required at a higher level
|
|
161
|
+
* (e.g. root requires `project`) does NOT prevent removing a
|
|
162
|
+
* non-required descendant (e.g. `project.baseBranch`) — the ancestor
|
|
163
|
+
* stays present, only the optional leaf disappears.
|
|
164
|
+
*
|
|
165
|
+
* The runtime AJV schema (`AGENTRC_SCHEMA`) is already fully inlined —
|
|
166
|
+
* no `$ref` indirection — so a simple `properties[key]` descent
|
|
167
|
+
* suffices. When the walk falls off the schema (the path isn't covered
|
|
168
|
+
* by any `properties` entry), the leaf is treated as removable: the
|
|
169
|
+
* advisory layer is purely informational and would-be advisories for
|
|
170
|
+
* keys the schema doesn't constrain are harmless.
|
|
171
|
+
*
|
|
172
|
+
* @param {object} rootSchema
|
|
173
|
+
* @param {string} dottedPath
|
|
174
|
+
* @returns {boolean}
|
|
175
|
+
*/
|
|
176
|
+
export function isLeafSchemaRemovable(rootSchema, dottedPath) {
|
|
177
|
+
if (!rootSchema || typeof rootSchema !== 'object') return true;
|
|
178
|
+
const parts = dottedPath.split('.');
|
|
179
|
+
let cursor = rootSchema;
|
|
180
|
+
for (let i = 0; i < parts.length; i += 1) {
|
|
181
|
+
const key = parts[i];
|
|
182
|
+
if (!cursor || typeof cursor !== 'object') return true;
|
|
183
|
+
const props = cursor.properties;
|
|
184
|
+
if (!props || !Object.hasOwn(props, key)) return true;
|
|
185
|
+
const isLeafSegment = i === parts.length - 1;
|
|
186
|
+
if (
|
|
187
|
+
isLeafSegment &&
|
|
188
|
+
Array.isArray(cursor.required) &&
|
|
189
|
+
cursor.required.includes(key)
|
|
190
|
+
) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
cursor = props[key];
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Format a sync result for terminal display.
|
|
200
|
+
*
|
|
201
|
+
* @param {SyncResult} result
|
|
202
|
+
* @returns {string}
|
|
203
|
+
*/
|
|
204
|
+
export function formatSyncReport(result) {
|
|
205
|
+
const lines = [];
|
|
206
|
+
if (result.status === 'missing-config') {
|
|
207
|
+
lines.push('[sync-agentrc] ❌ No project config found.');
|
|
208
|
+
for (const err of result.errors) lines.push(` - ${err}`);
|
|
209
|
+
return lines.join('\n');
|
|
210
|
+
}
|
|
211
|
+
if (result.status === 'invalid') {
|
|
212
|
+
lines.push('[sync-agentrc] ❌ Validation failed:');
|
|
213
|
+
for (const err of result.errors) lines.push(` - ${err}`);
|
|
214
|
+
return lines.join('\n');
|
|
215
|
+
}
|
|
216
|
+
const redundant = result.changes.filter((c) => c.op === 'REDUNDANT');
|
|
217
|
+
if (redundant.length === 0) {
|
|
218
|
+
lines.push('[sync-agentrc] ✅ No changes required.');
|
|
219
|
+
return lines.join('\n');
|
|
220
|
+
}
|
|
221
|
+
lines.push('[sync-agentrc] ✅ No changes required.');
|
|
222
|
+
lines.push(
|
|
223
|
+
`[sync-agentrc] Advisories: ${redundant.length} project key(s) match framework defaults — informational only.`,
|
|
224
|
+
);
|
|
225
|
+
for (const c of redundant) {
|
|
226
|
+
lines.push(` [REDUNDANT] ${c.path} = ${previewValue(c.value)}`);
|
|
227
|
+
}
|
|
228
|
+
lines.push(
|
|
229
|
+
'[sync-agentrc] Redundant keys are safe to delete — the runtime layers framework defaults at read time.',
|
|
230
|
+
);
|
|
231
|
+
return lines.join('\n');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function previewValue(value) {
|
|
235
|
+
let s;
|
|
236
|
+
try {
|
|
237
|
+
s = JSON.stringify(value);
|
|
238
|
+
} catch {
|
|
239
|
+
s = String(value);
|
|
240
|
+
}
|
|
241
|
+
if (s == null) return 'undefined';
|
|
242
|
+
return s.length > 80 ? `${s.slice(0, 77)}...` : s;
|
|
243
|
+
}
|