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,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bootstrap/gh-preflight — `gh` CLI + runtime-dependency preflight
|
|
3
|
+
*
|
|
4
|
+
* Provider-agnostic preflight helpers extracted from
|
|
5
|
+
* `agents-bootstrap-github.js` (Story #3349). Holds the version-comparison
|
|
6
|
+
* arithmetic (`parseGhVersion` / `compareSemver`), the `gh` CLI probe
|
|
7
|
+
* (`preflightGh`), and the runtime-dependency probe (`preflightRuntimeDeps`).
|
|
8
|
+
* Keeping these free of any provider coupling lets the bootstrap orchestrator
|
|
9
|
+
* stay focused on sequencing.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { spawnSync } from 'node:child_process';
|
|
13
|
+
import {
|
|
14
|
+
GhAuthError,
|
|
15
|
+
GhNotInstalledError,
|
|
16
|
+
GhVersionError,
|
|
17
|
+
MissingRuntimeDepsError,
|
|
18
|
+
} from '../errors/index.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Minimum `gh` version the bootstrap supports. Set conservatively per
|
|
22
|
+
* Tech Spec #1350 ("Risks & Mitigations → `gh` version skew"): older
|
|
23
|
+
* releases miss flags the eventual `gh-exec` shim relies on. Bumping this
|
|
24
|
+
* is a deliberate, operator-visible change — keep it tracked here.
|
|
25
|
+
*/
|
|
26
|
+
export const MIN_GH_VERSION = '2.40.0';
|
|
27
|
+
|
|
28
|
+
const GH_INSTALL_HINT =
|
|
29
|
+
'Install gh: https://cli.github.com/ — then re-run this command.';
|
|
30
|
+
const GH_AUTH_HINT =
|
|
31
|
+
'Run `gh auth login` (choose GitHub.com → HTTPS → login with a web browser), then re-run this command.';
|
|
32
|
+
const GH_PROJECT_SCOPE_NOTE =
|
|
33
|
+
'token lacks the "project" scope — skipping GitHub Projects V2 board provisioning (matches the runtime `resolveProject` graceful path). To enable board provisioning, run `gh auth refresh -s project` (re-auth in the browser when prompted) and re-run this command.';
|
|
34
|
+
const GH_SCOPES_UNREADABLE_NOTE =
|
|
35
|
+
'token scopes not reported by `gh auth status` (fine-grained PAT?) — skipping the classic project-scope assertion. If Projects V2 provisioning later fails, grant the Projects permission (fine-grained) or run `gh auth refresh -s project` (classic).';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Framework runtime deps the consumer must have installed in
|
|
39
|
+
* `node_modules/` before this script reaches the dynamic
|
|
40
|
+
* `config-resolver` import. `ajv` is the sentinel — if it cannot
|
|
41
|
+
* resolve, the operator skipped `/agents-bootstrap-project` (or its
|
|
42
|
+
* Step 2c/2d dependency-install never ran). The list mirrors the floor
|
|
43
|
+
* in `agents-bootstrap-project.md` Step 2c; keep them in sync.
|
|
44
|
+
*/
|
|
45
|
+
const REQUIRED_RUNTIME_DEPS = Object.freeze(['ajv']);
|
|
46
|
+
|
|
47
|
+
const RUNTIME_DEPS_HINT =
|
|
48
|
+
'Run `/agents-bootstrap-project` (or `node .agents/scripts/agents-bootstrap-project.js` when present) to merge the framework runtime dependencies into your package.json and install them, then re-run this command.';
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Default runner: synchronously execs `gh <args>` and returns
|
|
52
|
+
* `{ status, stdout, stderr, error }`. Extracted so the preflight tests
|
|
53
|
+
* can inject a stub without spawning a real child process. Forerunner of
|
|
54
|
+
* the `lib/gh-exec.js` shim described in Tech Spec #1350; once that
|
|
55
|
+
* lands, this helper deletes and the preflight calls `gh.exec(...)`.
|
|
56
|
+
*
|
|
57
|
+
* @param {string[]} args
|
|
58
|
+
* @returns {{ status: number|null, stdout: string, stderr: string,
|
|
59
|
+
* error?: NodeJS.ErrnoException }}
|
|
60
|
+
*/
|
|
61
|
+
// Story #2990: this preflight runner intentionally stays on raw
|
|
62
|
+
// `spawnSync('gh', …)` (not the `lib/gh-exec.js` facade) because it
|
|
63
|
+
// runs *before* auth is resolved — `gh --version` and `gh auth status`
|
|
64
|
+
// are the very probes that decide whether the facade can be used at
|
|
65
|
+
// all. Routing through the provider layer would create a circular
|
|
66
|
+
// dependency: the facade assumes a working, authenticated `gh`.
|
|
67
|
+
function defaultGhRunner(args) {
|
|
68
|
+
const result = spawnSync('gh', args, { encoding: 'utf8' });
|
|
69
|
+
return {
|
|
70
|
+
status: result.status,
|
|
71
|
+
stdout: typeof result.stdout === 'string' ? result.stdout : '',
|
|
72
|
+
stderr: typeof result.stderr === 'string' ? result.stderr : '',
|
|
73
|
+
error: result.error,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Parse the first `MAJOR.MINOR.PATCH` triple out of `gh --version` stdout.
|
|
79
|
+
* Returns `null` when the shape is unrecognized so callers can decide
|
|
80
|
+
* whether to surface an error or proceed.
|
|
81
|
+
*
|
|
82
|
+
* @param {string} stdout
|
|
83
|
+
* @returns {string|null}
|
|
84
|
+
*/
|
|
85
|
+
export function parseGhVersion(stdout) {
|
|
86
|
+
const match = /(\d+)\.(\d+)\.(\d+)/.exec(stdout || '');
|
|
87
|
+
return match ? `${match[1]}.${match[2]}.${match[3]}` : null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Numeric comparison of two `MAJOR.MINOR.PATCH` strings.
|
|
92
|
+
* Returns negative if `a < b`, positive if `a > b`, zero if equal.
|
|
93
|
+
* Missing segments are treated as `0`. Non-numeric segments compare as 0.
|
|
94
|
+
*
|
|
95
|
+
* @param {string} a
|
|
96
|
+
* @param {string} b
|
|
97
|
+
* @returns {number}
|
|
98
|
+
*/
|
|
99
|
+
export function compareSemver(a, b) {
|
|
100
|
+
const pa = String(a)
|
|
101
|
+
.split('.')
|
|
102
|
+
.map((n) => Number.parseInt(n, 10) || 0);
|
|
103
|
+
const pb = String(b)
|
|
104
|
+
.split('.')
|
|
105
|
+
.map((n) => Number.parseInt(n, 10) || 0);
|
|
106
|
+
for (let i = 0; i < 3; i++) {
|
|
107
|
+
const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
108
|
+
if (diff !== 0) return diff;
|
|
109
|
+
}
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Preflight the `gh` CLI before any provider call. Three failure modes,
|
|
115
|
+
* each surfaced as a typed error so callers (CLI `main`, future
|
|
116
|
+
* orchestrators, tests) can `instanceof`-match without parsing strings:
|
|
117
|
+
*
|
|
118
|
+
* - {@link GhNotInstalledError} — `gh` not on PATH (ENOENT) or the
|
|
119
|
+
* `--version` invocation reported a non-zero exit suggesting the
|
|
120
|
+
* binary is missing/broken.
|
|
121
|
+
* - {@link GhVersionError} — `gh` is present but older than
|
|
122
|
+
* {@link MIN_GH_VERSION}; carries `{ found, required }` for the
|
|
123
|
+
* CLI to render an upgrade hint.
|
|
124
|
+
* - {@link GhAuthError} — `gh auth status` exited non-zero, meaning
|
|
125
|
+
* no host is logged in.
|
|
126
|
+
*
|
|
127
|
+
* On success returns `{ version }` so the caller can log the resolved
|
|
128
|
+
* version. The `runner` seam defaults to a real `spawnSync('gh', …)`;
|
|
129
|
+
* tests inject a stub returning the canonical
|
|
130
|
+
* `{ status, stdout, stderr, error }` shape.
|
|
131
|
+
*
|
|
132
|
+
* @param {{ runner?: (args: string[]) => {
|
|
133
|
+
* status: number|null, stdout: string, stderr: string,
|
|
134
|
+
* error?: NodeJS.ErrnoException
|
|
135
|
+
* } }} [opts]
|
|
136
|
+
* @returns {Promise<{ version: string }>}
|
|
137
|
+
*/
|
|
138
|
+
export async function preflightGh(opts = {}) {
|
|
139
|
+
const runner = opts.runner ?? defaultGhRunner;
|
|
140
|
+
const version = resolveGhVersion(runner);
|
|
141
|
+
assertGhVersionFloor(version);
|
|
142
|
+
assertGhAuth(runner);
|
|
143
|
+
return { version };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Resolve the installed `gh` version via `gh --version`, throwing
|
|
148
|
+
* {@link GhNotInstalledError} for every "not installed correctly" shape
|
|
149
|
+
* (ENOENT, non-zero exit, unparseable output).
|
|
150
|
+
*
|
|
151
|
+
* @param {(args: string[]) => object} runner
|
|
152
|
+
* @returns {string}
|
|
153
|
+
*/
|
|
154
|
+
function resolveGhVersion(runner) {
|
|
155
|
+
const versionResult = runner(['--version']);
|
|
156
|
+
if (versionResult.error?.code === 'ENOENT') {
|
|
157
|
+
throw new GhNotInstalledError(
|
|
158
|
+
`gh CLI not found on PATH. ${GH_INSTALL_HINT}`,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
if (versionResult.status !== 0) {
|
|
162
|
+
// Non-ENOENT failure of `gh --version` is treated as "not installed
|
|
163
|
+
// correctly" — same remediation, same exit semantics.
|
|
164
|
+
const stderrSnippet = (versionResult.stderr || '').trim().slice(0, 200);
|
|
165
|
+
throw new GhNotInstalledError(
|
|
166
|
+
`gh --version failed (exit ${versionResult.status}): ${stderrSnippet}. ${GH_INSTALL_HINT}`,
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
const version = parseGhVersion(versionResult.stdout);
|
|
170
|
+
if (!version) {
|
|
171
|
+
throw new GhNotInstalledError(
|
|
172
|
+
`Could not parse gh version from output: ${(versionResult.stdout || '').slice(0, 200)}. ${GH_INSTALL_HINT}`,
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
return version;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Enforce the {@link MIN_GH_VERSION} floor, throwing {@link GhVersionError}
|
|
180
|
+
* with `{ found, required }` when the installed version is older.
|
|
181
|
+
*
|
|
182
|
+
* @param {string} version
|
|
183
|
+
*/
|
|
184
|
+
function assertGhVersionFloor(version) {
|
|
185
|
+
if (compareSemver(version, MIN_GH_VERSION) < 0) {
|
|
186
|
+
throw new GhVersionError(
|
|
187
|
+
`gh ${version} is older than required ${MIN_GH_VERSION}. Upgrade with your package manager (e.g. \`brew upgrade gh\`, \`winget upgrade GitHub.cli\`, or see https://cli.github.com/) and re-run this command.`,
|
|
188
|
+
{ found: version, required: MIN_GH_VERSION },
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Assert `gh auth status` reports a logged-in host, throwing
|
|
195
|
+
* {@link GhAuthError} (or {@link GhNotInstalledError} on a PATH race).
|
|
196
|
+
*
|
|
197
|
+
* @param {(args: string[]) => object} runner
|
|
198
|
+
*/
|
|
199
|
+
function assertGhAuth(runner) {
|
|
200
|
+
const authResult = runner(['auth', 'status']);
|
|
201
|
+
if (authResult.error?.code === 'ENOENT') {
|
|
202
|
+
// Defensive — `gh --version` already passed, so ENOENT here would be a
|
|
203
|
+
// PATH race. Treat the same as not-installed.
|
|
204
|
+
throw new GhNotInstalledError(
|
|
205
|
+
`gh CLI disappeared between version and auth check. ${GH_INSTALL_HINT}`,
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
if (authResult.status !== 0) {
|
|
209
|
+
throw new GhAuthError(
|
|
210
|
+
`gh auth status failed: not logged in. ${GH_AUTH_HINT}`,
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Check that the authenticated `gh` token carries the `project` scope, which
|
|
217
|
+
* the bootstrap needs to read and modify GitHub Projects V2. Parses the
|
|
218
|
+
* `Token scopes:` line from `gh auth status` (some gh versions print it to
|
|
219
|
+
* stderr, others to stdout — we scan both) and looks for a `project` scope.
|
|
220
|
+
*
|
|
221
|
+
* Returns a check record `{ name, ok, remedy?, detail? }` rather than
|
|
222
|
+
* throwing, so the preflight aggregator can surface it alongside the other
|
|
223
|
+
* checks. An unreadable scopes line — the normal case for fine-grained PATs
|
|
224
|
+
* and for `gh` builds that omit it — PASSES with a warning `detail` (Story
|
|
225
|
+
* #3690). A present-but-`project`-less scopes line — the normal case for a
|
|
226
|
+
* vanilla `gh auth login` token — also PASSES with a warning `detail`
|
|
227
|
+
* (Story #3893, Finding A.5): the bootstrap's runtime `resolveProject`
|
|
228
|
+
* already degrades to warn-and-skip-board for exactly this condition, so
|
|
229
|
+
* failing the preflight closed was stricter than the code it guards and
|
|
230
|
+
* created a guaranteed first-run → browser → re-run loop. The check never
|
|
231
|
+
* fails the gate on the project scope; the warning `detail` carries the
|
|
232
|
+
* `gh auth refresh -s project` remediation for operators who want boards.
|
|
233
|
+
*
|
|
234
|
+
* @param {{ runner?: (args: string[]) => {
|
|
235
|
+
* status: number|null, stdout: string, stderr: string,
|
|
236
|
+
* error?: NodeJS.ErrnoException
|
|
237
|
+
* } }} [opts]
|
|
238
|
+
* @returns {Promise<{ name: string, ok: boolean, remedy?: string,
|
|
239
|
+
* detail?: string }>}
|
|
240
|
+
*/
|
|
241
|
+
export async function checkProjectScopes(opts = {}) {
|
|
242
|
+
const runner = opts.runner ?? defaultGhRunner;
|
|
243
|
+
const result = runner(['auth', 'status']);
|
|
244
|
+
const text = `${result.stdout || ''}\n${result.stderr || ''}`;
|
|
245
|
+
return classifyProjectScopes(/Token scopes:([^\n]*)/i.exec(text));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Map a (possibly absent) `Token scopes:` match onto the check record.
|
|
250
|
+
* Pure — exported only through {@link checkProjectScopes}.
|
|
251
|
+
*
|
|
252
|
+
* @param {RegExpExecArray|null} scopeLine
|
|
253
|
+
* @returns {{ name: string, ok: boolean, remedy?: string, detail?: string }}
|
|
254
|
+
*/
|
|
255
|
+
function classifyProjectScopes(scopeLine) {
|
|
256
|
+
if (!scopeLine) {
|
|
257
|
+
return {
|
|
258
|
+
name: 'gh-project-scope',
|
|
259
|
+
ok: true,
|
|
260
|
+
detail: GH_SCOPES_UNREADABLE_NOTE,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
if (/\bproject\b/i.test(scopeLine[1])) {
|
|
264
|
+
return { name: 'gh-project-scope', ok: true };
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
name: 'gh-project-scope',
|
|
268
|
+
ok: true,
|
|
269
|
+
detail: GH_PROJECT_SCOPE_NOTE,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Preflight the framework's runtime dependencies before dynamic-importing
|
|
275
|
+
* `config-resolver.js` (which transitively pulls in `ajv` via
|
|
276
|
+
* `config-settings-schema.js`). A fresh consumer who skipped
|
|
277
|
+
* `/agents-bootstrap-project` will not have `ajv` installed, and the
|
|
278
|
+
* raw `ERR_MODULE_NOT_FOUND` from the dynamic import is opaque. This
|
|
279
|
+
* preflight converts that into a {@link MissingRuntimeDepsError} that
|
|
280
|
+
* names the missing packages and points the operator at the right
|
|
281
|
+
* workflow.
|
|
282
|
+
*
|
|
283
|
+
* The `resolver` seam lets tests inject a stub without touching the real
|
|
284
|
+
* module graph; production uses `import.meta.resolve(specifier)`.
|
|
285
|
+
*
|
|
286
|
+
* @param {{ resolver?: (specifier: string) => string | Promise<string> }} [opts]
|
|
287
|
+
* @returns {Promise<void>}
|
|
288
|
+
*/
|
|
289
|
+
export async function preflightRuntimeDeps(opts = {}) {
|
|
290
|
+
const resolver =
|
|
291
|
+
opts.resolver ?? ((specifier) => import.meta.resolve(specifier));
|
|
292
|
+
const missing = [];
|
|
293
|
+
for (const specifier of REQUIRED_RUNTIME_DEPS) {
|
|
294
|
+
try {
|
|
295
|
+
await resolver(specifier);
|
|
296
|
+
} catch {
|
|
297
|
+
missing.push(specifier);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (missing.length > 0) {
|
|
301
|
+
throw new MissingRuntimeDepsError(
|
|
302
|
+
`Framework runtime dependencies missing from node_modules/: ${missing.join(', ')}. ${RUNTIME_DEPS_HINT}`,
|
|
303
|
+
{ missing },
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bootstrap/hitl-confirm — Epic #1235 Story 5; consent-first opt-in (#3526)
|
|
3
|
+
*
|
|
4
|
+
* Renders a structured diff to stdout and prompts the operator y/N when
|
|
5
|
+
* stdout is a TTY. When not a TTY (CI, sub-agent, redirected pipe), the
|
|
6
|
+
* gate returns `false` and logs the canonical abort message to stderr —
|
|
7
|
+
* silent-apply is a non-feature. The `opts.assume` override lets tests
|
|
8
|
+
* and automation pin the answer deterministically:
|
|
9
|
+
*
|
|
10
|
+
* - `opts.assume === 'yes'` → returns true, skips the prompt entirely.
|
|
11
|
+
* - `opts.assume === 'no'` → returns false, skips the prompt.
|
|
12
|
+
*
|
|
13
|
+
* The default render is intentionally simple: a single-line summary
|
|
14
|
+
* followed by a JSON dump of `{ current, proposed }`. Callers that want
|
|
15
|
+
* a richer view (per-field colour, contextual unified diff) can wrap
|
|
16
|
+
* `confirm` and render their own preamble before calling.
|
|
17
|
+
*
|
|
18
|
+
* Consent-first install (Story #3526): the GitHub-admin phase group — the
|
|
19
|
+
* irreversible remote mutations (labels, Projects V2, branch protection,
|
|
20
|
+
* merge methods) — is gated by an explicit opt-in, not merely a TTY. A
|
|
21
|
+
* non-TTY run that has not opted in records every group as declined, so the
|
|
22
|
+
* abort hint names BOTH the dedicated `--approve-github-admin` flag (consent
|
|
23
|
+
* to just the remote mutations) and `--assume-yes` (accept every group).
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { createInterface } from 'node:readline';
|
|
27
|
+
|
|
28
|
+
const ABORT_MESSAGE =
|
|
29
|
+
'[bootstrap] aborting: no TTY available for HITL confirm (opt in with --approve-github-admin for GitHub-admin mutations, or --assume-yes to accept every phase group)';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param {object} args
|
|
33
|
+
* @param {string} args.summary - One-line description of the diff.
|
|
34
|
+
* @param {*} [args.current] - Live state (rendered as JSON).
|
|
35
|
+
* @param {*} [args.proposed] - Target state (rendered as JSON).
|
|
36
|
+
* @param {{
|
|
37
|
+
* assume?: 'yes' | 'no',
|
|
38
|
+
* stdin?: NodeJS.ReadableStream,
|
|
39
|
+
* stdout?: NodeJS.WritableStream,
|
|
40
|
+
* stderr?: NodeJS.WritableStream,
|
|
41
|
+
* isTTY?: boolean,
|
|
42
|
+
* }} [opts] - Overrides for tests / automation. `isTTY` defaults to
|
|
43
|
+
* `process.stdout.isTTY`. `stdin`/`stdout`/`stderr` default to the
|
|
44
|
+
* respective `process.*` streams.
|
|
45
|
+
* @returns {Promise<boolean>} - true ⇒ apply, false ⇒ abort.
|
|
46
|
+
*/
|
|
47
|
+
export async function confirm({ summary, current, proposed }, opts = {}) {
|
|
48
|
+
if (opts.assume === 'yes') return true;
|
|
49
|
+
if (opts.assume === 'no') return false;
|
|
50
|
+
|
|
51
|
+
const stdout = opts.stdout ?? process.stdout;
|
|
52
|
+
const stderr = opts.stderr ?? process.stderr;
|
|
53
|
+
const stdin = opts.stdin ?? process.stdin;
|
|
54
|
+
const isTTY = opts.isTTY ?? stdout?.isTTY ?? false;
|
|
55
|
+
|
|
56
|
+
if (!isTTY) {
|
|
57
|
+
stderr.write(`${ABORT_MESSAGE}\n`);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Render the diff. Single-line summary, then a JSON block so the
|
|
62
|
+
// operator can pipe the prompt to a logger and still recover the
|
|
63
|
+
// structured shape.
|
|
64
|
+
stdout.write(`\n[bootstrap] HITL confirm: ${summary}\n`);
|
|
65
|
+
stdout.write(
|
|
66
|
+
` current: ${JSON.stringify(current ?? null, null, 2)
|
|
67
|
+
.split('\n')
|
|
68
|
+
.join('\n ')}\n`,
|
|
69
|
+
);
|
|
70
|
+
stdout.write(
|
|
71
|
+
` proposed: ${JSON.stringify(proposed ?? null, null, 2)
|
|
72
|
+
.split('\n')
|
|
73
|
+
.join('\n ')}\n`,
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const rl = createInterface({ input: stdin, output: stdout, terminal: false });
|
|
77
|
+
try {
|
|
78
|
+
const answer = await new Promise((resolve) => {
|
|
79
|
+
rl.question(' apply? [y/N] ', resolve);
|
|
80
|
+
});
|
|
81
|
+
return /^y(es)?$/i.test(String(answer).trim());
|
|
82
|
+
} finally {
|
|
83
|
+
rl.close();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Re-export the abort message so tests can assert against the single
|
|
88
|
+
// source of truth.
|
|
89
|
+
export { ABORT_MESSAGE };
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bootstrap/install-ledger — durable record of what an install applied, for
|
|
3
|
+
* a future `mandrel uninstall` to consume (Story #3524, Feature #3515,
|
|
4
|
+
* Epic #3438).
|
|
5
|
+
*
|
|
6
|
+
* A successful bootstrap run writes a ledger to
|
|
7
|
+
* `<projectRoot>/.agents/.install-manifest.json` enumerating exactly the
|
|
8
|
+
* mutation-manifest entries that were APPROVED and applied (the approved
|
|
9
|
+
* subset of `buildMutationManifest`, never the full manifest). The ledger is
|
|
10
|
+
* the single artifact `mandrel uninstall` will later read to know which
|
|
11
|
+
* reversible mutations to undo and which irreversible (GitHub-admin) ones to
|
|
12
|
+
* surface for manual rollback.
|
|
13
|
+
*
|
|
14
|
+
* The ledger is gitignored (`.agents/.install-manifest.json` is added to the
|
|
15
|
+
* consumer `.gitignore` by the bootstrap) because it is a per-clone install
|
|
16
|
+
* record, not a checked-in source artifact.
|
|
17
|
+
*
|
|
18
|
+
* This module performs filesystem writes but no network I/O.
|
|
19
|
+
*
|
|
20
|
+
* @module bootstrap/install-ledger
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import fs from 'node:fs';
|
|
24
|
+
import path from 'node:path';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Path of the install ledger, relative to the project root. The bootstrap's
|
|
28
|
+
* `.gitignore` step keys its ignore entry off this exact POSIX path.
|
|
29
|
+
*
|
|
30
|
+
* @type {string}
|
|
31
|
+
*/
|
|
32
|
+
export const LEDGER_RELATIVE_PATH = '.agents/.install-manifest.json';
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Current ledger schema version. A future `mandrel uninstall` reads this to
|
|
36
|
+
* detect a ledger it cannot interpret (hard-cutover contract — no read-side
|
|
37
|
+
* tolerance branch, just a clean refusal).
|
|
38
|
+
*
|
|
39
|
+
* v2 (Story #3895): each entry now carries `executedAction` — the *live*
|
|
40
|
+
* outcome of the bootstrap phase that produced it (e.g. `seeded` vs
|
|
41
|
+
* `already-present` for `.agentrc.json`). Uninstall keys destructive reversal
|
|
42
|
+
* off this so a pre-existing, operator-authored file the install merely left
|
|
43
|
+
* in place (`already-present`) is never deleted.
|
|
44
|
+
*
|
|
45
|
+
* @type {number}
|
|
46
|
+
*/
|
|
47
|
+
export const LEDGER_SCHEMA_VERSION = 2;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Map a mutation-manifest `target` (POSIX-relative path) to the bootstrap
|
|
51
|
+
* **phase name** whose execution outcome describes that target. Only targets
|
|
52
|
+
* whose reversal is destructive enough to need the live outcome are mapped;
|
|
53
|
+
* everything else is reversed content-aware and needs no execution hint.
|
|
54
|
+
*
|
|
55
|
+
* The `.agentrc.json` `create` entry is produced by the `agentrc` phase
|
|
56
|
+
* (`ensureAgentrc`), which returns `{ action: 'seeded' }` when it wrote the
|
|
57
|
+
* file from the starter and `{ action: 'already-present' }` when an
|
|
58
|
+
* operator-authored file was left untouched. Recording that distinction lets
|
|
59
|
+
* uninstall skip deleting a file the install did not create (Story #3895).
|
|
60
|
+
*
|
|
61
|
+
* @type {Readonly<Record<string, string>>}
|
|
62
|
+
*/
|
|
63
|
+
const TARGET_TO_PHASE = Object.freeze({
|
|
64
|
+
'.agentrc.json': 'agentrc',
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Resolve the live executed action for a manifest entry from the bootstrap
|
|
69
|
+
* report, when one is available. Pure — derives entirely from the entry +
|
|
70
|
+
* report. Returns `undefined` when the target has no mapped phase, the report
|
|
71
|
+
* is absent, or the phase produced no `action` (so older callers/tests that
|
|
72
|
+
* omit the report degrade to "no hint" rather than throwing).
|
|
73
|
+
*
|
|
74
|
+
* The `.agentrc.json` quality-gates `merge` entry shares the same target as
|
|
75
|
+
* the repo-config `create` entry but is keyed by phase, not target — both
|
|
76
|
+
* manifest entries resolve to the same `agentrc` outcome, which is correct:
|
|
77
|
+
* reversal dedupes them to a single `revertAgentrc` call anyway.
|
|
78
|
+
*
|
|
79
|
+
* @param {{ target: string }} entry
|
|
80
|
+
* @param {Record<string, { action?: string }>} [report]
|
|
81
|
+
* @returns {string|undefined}
|
|
82
|
+
*/
|
|
83
|
+
export function resolveExecutedAction(entry, report) {
|
|
84
|
+
if (!report) return undefined;
|
|
85
|
+
const phaseName = TARGET_TO_PHASE[entry.target];
|
|
86
|
+
if (!phaseName) return undefined;
|
|
87
|
+
const action = report[phaseName]?.action;
|
|
88
|
+
return typeof action === 'string' ? action : undefined;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Resolve the absolute ledger path for a project root.
|
|
93
|
+
*
|
|
94
|
+
* @param {string} projectRoot
|
|
95
|
+
* @returns {string}
|
|
96
|
+
*/
|
|
97
|
+
export function ledgerPath(projectRoot) {
|
|
98
|
+
return path.join(projectRoot, '.agents', '.install-manifest.json');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Build the ledger record from the approved manifest entries. Pure helper —
|
|
103
|
+
* no I/O — so the shape is unit-testable in isolation. The `appliedAt`
|
|
104
|
+
* timestamp is injectable for deterministic tests.
|
|
105
|
+
*
|
|
106
|
+
* @param {object} args
|
|
107
|
+
* @param {import('./manifest.js').MutationManifestEntry[]} args.entries
|
|
108
|
+
* — the APPROVED subset of the mutation manifest that was applied.
|
|
109
|
+
* @param {string[]} args.approvedGroups — the phase groups the operator
|
|
110
|
+
* approved (sorted for stable output).
|
|
111
|
+
* @param {{ owner?: string, repo?: string }} [args.answers]
|
|
112
|
+
* @param {string} [args.appliedAt] — ISO-8601 timestamp (default: now).
|
|
113
|
+
* @param {Record<string, { action?: string }>} [args.report] — the live
|
|
114
|
+
* bootstrap execution report (phase name → outcome). When present, each
|
|
115
|
+
* entry whose target maps to a phase records that phase's `action` as
|
|
116
|
+
* `executedAction` so uninstall can distinguish `seeded` from
|
|
117
|
+
* `already-present` (Story #3895).
|
|
118
|
+
* @returns {{ schemaVersion: number, appliedAt: string,
|
|
119
|
+
* repo: string|null, approvedGroups: string[],
|
|
120
|
+
* entries: Array<import('./manifest.js').MutationManifestEntry
|
|
121
|
+
* & { executedAction?: string }> }}
|
|
122
|
+
*/
|
|
123
|
+
export function buildLedgerRecord(args) {
|
|
124
|
+
const { entries, approvedGroups, answers, appliedAt, report } = args;
|
|
125
|
+
const repo =
|
|
126
|
+
answers?.owner && answers?.repo ? `${answers.owner}/${answers.repo}` : null;
|
|
127
|
+
return {
|
|
128
|
+
schemaVersion: LEDGER_SCHEMA_VERSION,
|
|
129
|
+
appliedAt: appliedAt ?? new Date().toISOString(),
|
|
130
|
+
repo,
|
|
131
|
+
approvedGroups: [...approvedGroups].sort(),
|
|
132
|
+
entries: entries.map((e) => {
|
|
133
|
+
const executedAction = resolveExecutedAction(e, report);
|
|
134
|
+
return {
|
|
135
|
+
phaseGroup: e.phaseGroup,
|
|
136
|
+
target: e.target,
|
|
137
|
+
action: e.action,
|
|
138
|
+
reversible: e.reversible,
|
|
139
|
+
...(executedAction !== undefined ? { executedAction } : {}),
|
|
140
|
+
};
|
|
141
|
+
}),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Write the install ledger to `<projectRoot>/.agents/.install-manifest.json`,
|
|
147
|
+
* creating the `.agents/` directory if needed. The file is overwritten on
|
|
148
|
+
* each successful install so the ledger always reflects the most recent run
|
|
149
|
+
* (a re-install with a different approval set replaces, never appends).
|
|
150
|
+
*
|
|
151
|
+
* @param {string} projectRoot
|
|
152
|
+
* @param {ReturnType<typeof buildLedgerRecord>} record
|
|
153
|
+
* @returns {{ path: string, written: boolean, entryCount: number }}
|
|
154
|
+
*/
|
|
155
|
+
export function writeInstallLedger(projectRoot, record) {
|
|
156
|
+
const target = ledgerPath(projectRoot);
|
|
157
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
158
|
+
fs.writeFileSync(target, `${JSON.stringify(record, null, 2)}\n`, 'utf8');
|
|
159
|
+
return { path: target, written: true, entryCount: record.entries.length };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Read and parse the install ledger. Returns `null` when no ledger exists
|
|
164
|
+
* (never installed, or the ledger was removed). A future `mandrel uninstall`
|
|
165
|
+
* is the primary consumer.
|
|
166
|
+
*
|
|
167
|
+
* @param {string} projectRoot
|
|
168
|
+
* @returns {ReturnType<typeof buildLedgerRecord>|null}
|
|
169
|
+
*/
|
|
170
|
+
export function readInstallLedger(projectRoot) {
|
|
171
|
+
const target = ledgerPath(projectRoot);
|
|
172
|
+
if (!fs.existsSync(target)) return null;
|
|
173
|
+
return JSON.parse(fs.readFileSync(target, 'utf8'));
|
|
174
|
+
}
|