mandrel 2.60.0 → 2.62.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 +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,54 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Single source of truth for every path under `project.paths.tempRoot`:
|
|
3
|
+
* `run-<eid>/…` and `run-<eid>/stories/story-<sid>/…`, with standalone
|
|
4
|
+
* Stories under `standalone/stories/story-<sid>/`.
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
*
|
|
7
|
-
* these helpers. The Tech Spec (#1032) names this module as the cutover
|
|
8
|
-
* grep target — `temp/.*-epic-` should be empty across `.agents/scripts`
|
|
9
|
-
* once the migration Stories land.
|
|
10
|
-
*
|
|
11
|
-
* Layout:
|
|
12
|
-
* temp/run-<eid>/
|
|
13
|
-
* ├─ techspec.md
|
|
14
|
-
* ├─ manifest.md (dispatch manifest)
|
|
15
|
-
* ├─ retro.md (mirror of GitHub retro at Epic close)
|
|
16
|
-
* ├─ lifecycle.ndjson (lifecycle ledger)
|
|
17
|
-
* ├─ checkpoints/... (pre-v2 epic-runner state store; retained layout)
|
|
18
|
-
* ├─ <name> (runArtifactPath escape hatch)
|
|
19
|
-
* └─ stories/
|
|
20
|
-
* └─ story-<sid>/
|
|
21
|
-
* ├─ manifest.md (story dispatch manifest)
|
|
22
|
-
* ├─ signals.ndjson (append-only signals writer)
|
|
23
|
-
* └─ <name> (storyArtifactPath escape hatch)
|
|
24
|
-
*
|
|
25
|
-
* Standalone Stories (no parent Epic) follow the same shape under
|
|
26
|
-
* `<tempRoot>/standalone/stories/story-<sid>/`. The `stories/` segment
|
|
27
|
-
* was introduced by Story #2940 to visually separate per-Epic artifacts
|
|
28
|
-
* from per-Story siblings.
|
|
29
|
-
*
|
|
30
|
-
* tempRoot resolution: the helper accepts an optional `config` argument
|
|
31
|
-
* (the full resolved config or a partial bag with `project.paths.tempRoot`);
|
|
32
|
-
* when omitted it lazy-loads via `resolveConfig()` so
|
|
33
|
-
* call sites already inside the resolver can pass their own bag and avoid the
|
|
34
|
-
* round-trip. The missing-tempRoot fallback resolves to `'temp'` — the
|
|
35
|
-
* framework default shipped in `.agents/docs/agentrc-reference.json`. Note that the
|
|
36
|
-
* AJV schema marks `tempRoot` as required for any loaded `.agentrc.json`, so
|
|
37
|
-
* the fallback only matters in zero-config callers (tests, ad-hoc scripts).
|
|
38
|
-
*
|
|
39
|
-
* Main-checkout anchoring (Story #3900): the Epic/Story directory helpers
|
|
40
|
-
* resolve a *relative* `tempRoot` against the **main checkout root** (the
|
|
41
|
-
* parent of `git rev-parse --git-common-dir`) rather than `process.cwd()`.
|
|
42
|
-
* Without this, a story child that `cd`s into `.worktrees/story-<id>/` before
|
|
43
|
-
* emitting a lifecycle record would append it to
|
|
44
|
-
* `<worktree>/temp/run-N/lifecycle.ndjson`, while the `/mandrel-deliver` host
|
|
45
|
-
* (running from the main checkout) reads the main-checkout copy — so the
|
|
46
|
-
* host never sees the child's records (the audit-#3513 bug class; its
|
|
47
|
-
* original `story.heartbeat` instance is gone with that emitter, but the
|
|
48
|
-
* divergence applies to every ledger writer). Anchoring the
|
|
49
|
-
* ledger to the git common dir makes the worktree child writer and the
|
|
50
|
-
* main-checkout host reader converge on a single file regardless of cwd. An
|
|
51
|
-
* absolute `tempRoot` is honoured verbatim; only relative roots are anchored.
|
|
6
|
+
* A relative tempRoot is anchored to the main checkout root (parent of
|
|
7
|
+
* `git rev-parse --git-common-dir`), not cwd, so a writer inside a Story
|
|
8
|
+
* worktree and the host reading from the main checkout converge on one file.
|
|
52
9
|
*/
|
|
53
10
|
|
|
54
11
|
import { execFileSync } from 'node:child_process';
|
|
@@ -58,35 +15,20 @@ import path from 'node:path';
|
|
|
58
15
|
|
|
59
16
|
import { reapOnExit } from '../test-temp.js';
|
|
60
17
|
|
|
61
|
-
/**
|
|
62
|
-
* Cache the resolved main-checkout root per spawn cwd so the
|
|
63
|
-
* `git rev-parse` shell-out runs at most once per distinct working
|
|
64
|
-
* directory in a process. The cache key is the `cwd` the resolution ran
|
|
65
|
-
* against (defaulting to `process.cwd()`); a `null` value records a prior
|
|
66
|
-
* miss so we don't re-spawn git on a non-repo path.
|
|
67
|
-
*/
|
|
18
|
+
/** Keyed by cwd; a cached `null` records a non-repo miss. */
|
|
68
19
|
const _mainCheckoutRootCache = new Map();
|
|
69
20
|
|
|
70
21
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* In a linked worktree (`git worktree add`), `--git-common-dir` returns the
|
|
75
|
-
* *parent* repo's `.git/` (the shared object store), so its parent directory
|
|
76
|
-
* is the main checkout root — exactly the anchor we want for cwd-independent
|
|
77
|
-
* lifecycle ledger paths. In the main checkout itself it returns `.git`, so
|
|
78
|
-
* the parent is the main checkout root too. The two cases converge.
|
|
79
|
-
*
|
|
80
|
-
* Returns `null` when the path is not a git repository or git is
|
|
81
|
-
* unavailable, so callers fall back to the relative (cwd-anchored) path.
|
|
22
|
+
* Parent of `--git-common-dir`, which is the main checkout root from both the
|
|
23
|
+
* main checkout and any linked worktree. `null` outside a repo.
|
|
82
24
|
*
|
|
83
25
|
* @param {string} [cwd=process.cwd()]
|
|
84
|
-
* @param {{ exec?: typeof execFileSync }} [deps]
|
|
26
|
+
* @param {{ exec?: typeof execFileSync }} [deps]
|
|
85
27
|
* @returns {string|null}
|
|
86
28
|
*/
|
|
87
29
|
export function mainCheckoutRoot(cwd = process.cwd(), deps = {}) {
|
|
88
30
|
const exec = deps.exec ?? execFileSync;
|
|
89
|
-
// Only
|
|
31
|
+
// Only the real resolver is memoized.
|
|
90
32
|
const memoize = !deps.exec;
|
|
91
33
|
if (memoize && _mainCheckoutRootCache.has(cwd)) {
|
|
92
34
|
return _mainCheckoutRootCache.get(cwd);
|
|
@@ -103,43 +45,26 @@ export function mainCheckoutRoot(cwd = process.cwd(), deps = {}) {
|
|
|
103
45
|
resolved = path.dirname(commonDir);
|
|
104
46
|
}
|
|
105
47
|
} catch {
|
|
106
|
-
// Not a git repo, or git unavailable — fall back to the relative path.
|
|
107
48
|
resolved = null;
|
|
108
49
|
}
|
|
109
50
|
if (memoize) _mainCheckoutRootCache.set(cwd, resolved);
|
|
110
51
|
return resolved;
|
|
111
52
|
}
|
|
112
53
|
|
|
113
|
-
/**
|
|
114
|
-
* Test-only: clear the main-checkout-root memoization cache so a suite can
|
|
115
|
-
* exercise multiple repo roots in one process without cross-test bleed.
|
|
116
|
-
*/
|
|
54
|
+
/** Test-only. */
|
|
117
55
|
export function _clearMainCheckoutRootCache() {
|
|
118
56
|
_mainCheckoutRootCache.clear();
|
|
119
57
|
}
|
|
120
58
|
|
|
121
59
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
* The shared test bootstrap (`lib/test-env.js`) sets this to a fresh
|
|
126
|
-
* `os.tmpdir()` directory before spawning the test runner, so any test that
|
|
127
|
-
* reaches a writer (`signals-writer`, `appendLedgerEvent`, etc.)
|
|
128
|
-
* *without* explicitly injecting an absolute tempRoot still resolves under
|
|
129
|
-
* scratch instead of the repo's real `temp/` tree. This is the single
|
|
130
|
-
* injection seam: because every path helper funnels a relative root through
|
|
131
|
-
* `anchorTempRoot`, one redirect here covers all writers regardless of how
|
|
132
|
-
* each one resolved its root.
|
|
60
|
+
* Absolute scratch tempRoot the test bootstrap arms, so any writer reaching a
|
|
61
|
+
* relative root under test lands in scratch, not the repo's `temp/`.
|
|
133
62
|
*/
|
|
134
63
|
export const TEST_TEMP_ROOT_ENV = 'MANDREL_TEST_TEMP_ROOT';
|
|
135
64
|
|
|
136
65
|
/**
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* would re-anchor against the repo tree and defeat the isolation, so it is
|
|
140
|
-
* ignored (treated as unset). Module-internal: the behaviour is exercised
|
|
141
|
-
* through `anchorTempRoot`, so it is deliberately not exported (keeps the
|
|
142
|
-
* public seam to `anchorTempRoot` + `TEST_TEMP_ROOT_ENV`).
|
|
66
|
+
* Only an absolute override is honoured; a relative one would re-anchor
|
|
67
|
+
* into the repo and defeat the isolation.
|
|
143
68
|
*
|
|
144
69
|
* @param {NodeJS.ProcessEnv} [env=process.env]
|
|
145
70
|
* @returns {string|null}
|
|
@@ -153,41 +78,19 @@ function testScratchTempRoot(env = process.env) {
|
|
|
153
78
|
: null;
|
|
154
79
|
}
|
|
155
80
|
|
|
156
|
-
/**
|
|
157
|
-
* Environment variable that opts a test-context process back into the real
|
|
158
|
-
* `temp/` tree (Story #4711). The `anchorTempRoot` test-context fallback
|
|
159
|
-
* refuses to anchor a relative root into the repo's telemetry tree when the
|
|
160
|
-
* process is a node:test context; a test that genuinely needs the real tree
|
|
161
|
-
* sets this to `'1'` on its own spawn — an explicit, greppable opt-out
|
|
162
|
-
* instead of a silent bypass.
|
|
163
|
-
*/
|
|
81
|
+
/** `'1'` opts a test-context process back into the real `temp/` tree. */
|
|
164
82
|
export const TEST_ALLOW_REAL_TEMP_ENV = 'MANDREL_TEST_ALLOW_REAL_TEMP';
|
|
165
83
|
|
|
166
|
-
/**
|
|
167
|
-
* Per-process memo for the lazily-created test-context scratch dir, so every
|
|
168
|
-
* relative-root resolution in one test process converges on a single scratch
|
|
169
|
-
* tree (mirrors the `_mainCheckoutRootCache` pattern above).
|
|
170
|
-
*/
|
|
171
84
|
let _testContextScratchDir = null;
|
|
172
85
|
|
|
173
|
-
/**
|
|
174
|
-
* Test-only: clear the test-context scratch memo so a suite can exercise the
|
|
175
|
-
* lazy-arming branch repeatedly in one process.
|
|
176
|
-
*/
|
|
86
|
+
/** Test-only. */
|
|
177
87
|
export function _clearTestContextScratchCache() {
|
|
178
88
|
_testContextScratchDir = null;
|
|
179
89
|
}
|
|
180
90
|
|
|
181
91
|
/**
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
* child, regardless of how the runner itself was launched) or when the
|
|
185
|
-
* process was started with the `--test` flag (a direct `node --test <file>`
|
|
186
|
-
* runner process, or in-process isolation modes).
|
|
187
|
-
*
|
|
188
|
-
* Exported since Story #4837: the feedback loop's issue-filing path guards
|
|
189
|
-
* live GitHub writes on this same signal, and a second hand-rolled copy of
|
|
190
|
-
* the detection is exactly how the two would drift apart.
|
|
92
|
+
* `NODE_TEST_CONTEXT` (set on every node:test child) or a `--test` execArgv.
|
|
93
|
+
* The single shared detector — the live-filing guard uses it too.
|
|
191
94
|
*
|
|
192
95
|
* @param {NodeJS.ProcessEnv} [env=process.env]
|
|
193
96
|
* @param {string[]} [execArgv=process.execArgv]
|
|
@@ -204,39 +107,14 @@ export function inNodeTestContext(
|
|
|
204
107
|
}
|
|
205
108
|
|
|
206
109
|
/**
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
* main checkout cannot be resolved (non-repo, git unavailable) the relative
|
|
212
|
-
* root is returned unchanged so behaviour degrades to the prior
|
|
213
|
-
* cwd-relative semantics rather than throwing.
|
|
214
|
-
*
|
|
215
|
-
* Test isolation (Story #4696): when the scratch override
|
|
216
|
-
* (`MANDREL_TEST_TEMP_ROOT`) is set, a relative root is joined onto the
|
|
217
|
-
* scratch dir instead of the main checkout root, so a writer that reaches
|
|
218
|
-
* the default (or any relative) root under the test bootstrap lands in
|
|
219
|
-
* scratch and never pollutes the repo's real `temp/` telemetry tree. An
|
|
220
|
-
* absolute root injected by a well-behaved test still bypasses the redirect
|
|
221
|
-
* verbatim.
|
|
222
|
-
*
|
|
223
|
-
* Process-level arming (Story #4711): the wrapper-armed override above only
|
|
224
|
-
* covers processes spawned by `run-tests.js` — a direct `node --test <file>`
|
|
225
|
-
* run used to bypass it and append fixture records to the real tree. When no
|
|
226
|
-
* override is armed but the process *is* a node:test context (see
|
|
227
|
-
* `inNodeTestContext`), a per-process scratch dir is created lazily and the
|
|
228
|
-
* relative root anchors there instead. The scratch dir is memoized and — for
|
|
229
|
-
* the real `process.env` — written back to `MANDREL_TEST_TEMP_ROOT` so child
|
|
230
|
-
* processes the test spawns inherit the same scratch tree. Escape hatch: a
|
|
231
|
-
* test that genuinely needs the real tree sets
|
|
232
|
-
* `MANDREL_TEST_ALLOW_REAL_TEMP=1` (`TEST_ALLOW_REAL_TEMP_ENV`) to restore
|
|
233
|
-
* main-checkout anchoring; the `check-test-temp-hygiene` guard remains the
|
|
234
|
-
* backstop either way.
|
|
110
|
+
* Absolute roots pass verbatim. A relative root joins, in order: the armed
|
|
111
|
+
* scratch override; a lazily-created per-process scratch dir when this is a
|
|
112
|
+
* node:test context (published to children via the env) unless
|
|
113
|
+
* `TEST_ALLOW_REAL_TEMP_ENV=1`; the main checkout root; else stays relative.
|
|
235
114
|
*
|
|
236
115
|
* @param {string} tempRoot
|
|
237
116
|
* @param {NodeJS.ProcessEnv} [env=process.env]
|
|
238
117
|
* @param {{ mkdtemp?: typeof mkdtempSync, execArgv?: string[], onExit?: (fn: () => void) => void }} [deps]
|
|
239
|
-
* Injectable for tests.
|
|
240
118
|
* @returns {string}
|
|
241
119
|
*/
|
|
242
120
|
export function anchorTempRoot(tempRoot, env = process.env, deps = {}) {
|
|
@@ -255,15 +133,13 @@ export function anchorTempRoot(tempRoot, env = process.env, deps = {}) {
|
|
|
255
133
|
_testContextScratchDir = mkdtemp(
|
|
256
134
|
path.join(os.tmpdir(), 'mandrel-test-temp-'),
|
|
257
135
|
);
|
|
258
|
-
// Creator-only reaping
|
|
259
|
-
//
|
|
260
|
-
// so it can never remove a root its parent is still writing to.
|
|
136
|
+
// Creator-only reaping: a process that inherited the root returned at
|
|
137
|
+
// `scratch` above, so it never removes a root its parent still uses.
|
|
261
138
|
reapOnExit(
|
|
262
139
|
_testContextScratchDir,
|
|
263
140
|
deps.onExit ? { onExit: deps.onExit } : {},
|
|
264
141
|
);
|
|
265
142
|
if (env === process.env) {
|
|
266
|
-
// Children spawned by this test process inherit the same scratch.
|
|
267
143
|
process.env[TEST_TEMP_ROOT_ENV] = _testContextScratchDir;
|
|
268
144
|
}
|
|
269
145
|
}
|
|
@@ -274,47 +150,23 @@ export function anchorTempRoot(tempRoot, env = process.env, deps = {}) {
|
|
|
274
150
|
}
|
|
275
151
|
|
|
276
152
|
/**
|
|
277
|
-
*
|
|
278
|
-
* config (`{ project, ... }`) and reads `project.paths.tempRoot`.
|
|
279
|
-
*
|
|
280
|
-
* Returns `'temp'` for `undefined` / non-object input or when
|
|
281
|
-
* `project.paths.tempRoot` is missing / empty / non-string.
|
|
282
|
-
*
|
|
283
|
-
* Cross-script callers that already hold a resolved config should pass it
|
|
284
|
-
* here; bare callers omit the argument and accept the framework default.
|
|
153
|
+
* `project.paths.tempRoot`, defaulting to `'temp'`.
|
|
285
154
|
*
|
|
286
155
|
* @param {object} [config]
|
|
287
156
|
* @returns {string}
|
|
288
157
|
*/
|
|
289
158
|
export function tempRootFrom(config) {
|
|
290
159
|
if (!config || typeof config !== 'object') return 'temp';
|
|
291
|
-
// Post-reshape canonical shape: paths live under `project.paths.*`.
|
|
292
160
|
const tempRoot = config.project?.paths?.tempRoot;
|
|
293
161
|
return typeof tempRoot === 'string' && tempRoot.length > 0
|
|
294
162
|
? tempRoot
|
|
295
163
|
: 'temp';
|
|
296
164
|
}
|
|
297
165
|
|
|
298
|
-
/**
|
|
299
|
-
* Directory segment (under `tempRoot`) holding every orchestration run log —
|
|
300
|
-
* the close gate transcripts (`close-gates-<sid>.log`) and the terse-result
|
|
301
|
-
* detail dumps (`story-init-result-<sid>.log`, `sync-result-<branch>.log`, …).
|
|
302
|
-
*
|
|
303
|
-
* Story #4794: the four writers that land here each hand-rolled the temp path
|
|
304
|
-
* from a literal `temp` segment joined onto their own cwd, which ignores
|
|
305
|
-
* `project.paths.tempRoot` entirely. On a consumer that relocates its temp
|
|
306
|
-
* root, the writers wrote to `<cwd>/temp/` while every reader — including the
|
|
307
|
-
* retention purge — resolved the configured root, so the artifacts were
|
|
308
|
-
* invisible to the tooling meant to manage them. Routing all four through this
|
|
309
|
-
* helper also picks up main-checkout anchoring for free, so a close running
|
|
310
|
-
* from a Story worktree lands its logs in the same tree the host reads.
|
|
311
|
-
*/
|
|
166
|
+
/** Holds close gate logs and terse-result detail dumps. */
|
|
312
167
|
export const ORCHESTRATION_DIRNAME = 'orchestration';
|
|
313
168
|
|
|
314
169
|
/**
|
|
315
|
-
* `<tempRoot>/orchestration/` — resolved against the configured temp root and
|
|
316
|
-
* anchored to the main checkout, like every other helper in this module.
|
|
317
|
-
*
|
|
318
170
|
* @param {object} [config]
|
|
319
171
|
* @returns {string}
|
|
320
172
|
*/
|
|
@@ -323,16 +175,8 @@ export function orchestrationLogDir(config) {
|
|
|
323
175
|
}
|
|
324
176
|
|
|
325
177
|
/**
|
|
326
|
-
*
|
|
327
|
-
*
|
|
328
|
-
*
|
|
329
|
-
* The writer that appends this file and the reader that uses its **freshness**
|
|
330
|
-
* to tell a live close from a dead one (`deliver-recover.js`) sit in different
|
|
331
|
-
* subtrees, and the reader importing the writer is the wrong edge to draw for
|
|
332
|
-
* a filename. Both take it from the module that already owns every other
|
|
333
|
-
* tempRoot path instead.
|
|
334
|
-
*
|
|
335
|
-
* `null` is the sink's no-Story sentinel and keeps its `unknown` spelling.
|
|
178
|
+
* Shared by the gate-log writer and `deliver-recover.js`, which reads its
|
|
179
|
+
* freshness to tell a live close from a dead one.
|
|
336
180
|
*
|
|
337
181
|
* @param {number|null} sid
|
|
338
182
|
* @returns {string}
|
|
@@ -342,8 +186,6 @@ function closeGateLogName(sid) {
|
|
|
342
186
|
}
|
|
343
187
|
|
|
344
188
|
/**
|
|
345
|
-
* `<tempRoot>/orchestration/close-gates-<sid>.log`.
|
|
346
|
-
*
|
|
347
189
|
* @param {number|null} sid
|
|
348
190
|
* @param {object} [config]
|
|
349
191
|
* @returns {string}
|
|
@@ -353,8 +195,6 @@ export function closeGateLogPath(sid, config) {
|
|
|
353
195
|
}
|
|
354
196
|
|
|
355
197
|
/**
|
|
356
|
-
* Basename of the persisted terminal envelope for one Story (Story #4816).
|
|
357
|
-
*
|
|
358
198
|
* @param {number} sid
|
|
359
199
|
* @returns {string}
|
|
360
200
|
*/
|
|
@@ -363,18 +203,8 @@ function storyTerminalEnvelopeName(sid) {
|
|
|
363
203
|
}
|
|
364
204
|
|
|
365
205
|
/**
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
* #4816).
|
|
369
|
-
*
|
|
370
|
-
* Deliberately a sibling of the gate log rather than a per-Story temp dir
|
|
371
|
-
* entry: the envelope is a run artifact of the same close that writes
|
|
372
|
-
* `close-gates-<sid>.log`, and `deliver-recover.js` reads the pair together to
|
|
373
|
-
* tell a finished close from a live one. Sharing `orchestrationLogDir` also
|
|
374
|
-
* means it inherits main-checkout anchoring for free — the close runs inside
|
|
375
|
-
* `.worktrees/story-<sid>/` while the `/mandrel-deliver` host reads from the main
|
|
376
|
-
* checkout, and an un-anchored path would put the envelope somewhere the
|
|
377
|
-
* router never looks.
|
|
206
|
+
* A sibling of the gate log: `deliver-recover.js` reads the pair together to
|
|
207
|
+
* tell a finished close from a live one.
|
|
378
208
|
*
|
|
379
209
|
* @param {number} sid
|
|
380
210
|
* @param {object} [config]
|
|
@@ -391,13 +221,7 @@ const runId = (id) => {
|
|
|
391
221
|
return id;
|
|
392
222
|
};
|
|
393
223
|
|
|
394
|
-
/**
|
|
395
|
-
* Story #2874 — accept `null` as the standalone-story sentinel.
|
|
396
|
-
* Story-level helpers (storyTempDir, signalsFile, etc.) route
|
|
397
|
-
* `eid === null` to `<tempRoot>/standalone/story-<sid>/` so that
|
|
398
|
-
* standalone Stories (no parent Epic) still get a stable on-disk
|
|
399
|
-
* home for signals + traces. All other invalid values still throw.
|
|
400
|
-
*/
|
|
224
|
+
/** `null` is the standalone-Story sentinel. */
|
|
401
225
|
const storyEpicId = (id) => {
|
|
402
226
|
if (id === null) return null;
|
|
403
227
|
if (!Number.isInteger(id) || id <= 0) {
|
|
@@ -421,9 +245,7 @@ const artifactName = (name) => {
|
|
|
421
245
|
if (typeof name !== 'string' || name.length === 0) {
|
|
422
246
|
throw new Error('[temp-paths] artifact name must be a non-empty string');
|
|
423
247
|
}
|
|
424
|
-
// Reject
|
|
425
|
-
// resolved Epic / Story dir. Forward slashes and back slashes alike are
|
|
426
|
-
// rejected so Windows callers can't sneak `..\foo` past the guard.
|
|
248
|
+
// Reject traversal; backslashes too, so `..\foo` cannot pass on Windows.
|
|
427
249
|
if (name.includes('/') || name.includes('\\') || name === '..') {
|
|
428
250
|
throw new Error(
|
|
429
251
|
`[temp-paths] artifact name must not contain path separators; got ${JSON.stringify(name)}`,
|
|
@@ -433,8 +255,6 @@ const artifactName = (name) => {
|
|
|
433
255
|
};
|
|
434
256
|
|
|
435
257
|
/**
|
|
436
|
-
* `temp/run-<id>/` — every run-scoped artifact lives under here.
|
|
437
|
-
*
|
|
438
258
|
* @param {number} rid
|
|
439
259
|
* @param {object} [config]
|
|
440
260
|
* @returns {string}
|
|
@@ -444,19 +264,7 @@ export function runTempDir(rid, config) {
|
|
|
444
264
|
}
|
|
445
265
|
|
|
446
266
|
/**
|
|
447
|
-
* `
|
|
448
|
-
* lives under here.
|
|
449
|
-
*
|
|
450
|
-
* Story #2874: accepts `eid === null` for standalone Stories (no
|
|
451
|
-
* parent Epic). The standalone variant routes to
|
|
452
|
-
* `<tempRoot>/standalone/stories/story-<sid>/` so signals + traces from
|
|
453
|
-
* `/single-story-deliver` runs still land in a stable, scannable
|
|
454
|
-
* location instead of being dropped on the floor.
|
|
455
|
-
*
|
|
456
|
-
* Story #2940 introduced the intermediate `stories/` segment so that
|
|
457
|
-
* per-Epic top-level artifacts (`techspec.md`, `manifest.md`,
|
|
458
|
-
* `retro.md`, `lifecycle.ndjson`, `baselines/`, `checkpoints/`) are
|
|
459
|
-
* visually and structurally separated from the per-Story siblings.
|
|
267
|
+
* `eid === null` routes to `<tempRoot>/standalone/stories/story-<sid>/`.
|
|
460
268
|
*
|
|
461
269
|
* @param {number|null} eid
|
|
462
270
|
* @param {number} sid
|
|
@@ -472,18 +280,10 @@ export function storyTempDir(eid, sid, config) {
|
|
|
472
280
|
return path.join(parent, STORIES_DIRNAME, `story-${storyId(sid)}`);
|
|
473
281
|
}
|
|
474
282
|
|
|
475
|
-
/**
|
|
476
|
-
* Basename of a per-Story signal stream. Exported so the reader that
|
|
477
|
-
* *discovers* streams by walking the temp tree (`signals-writer.js`'s
|
|
478
|
-
* cross-Story gather, Story #4824) names the same file the writer does,
|
|
479
|
-
* instead of re-spelling the literal in a second module.
|
|
480
|
-
*/
|
|
283
|
+
/** Exported so stream discovery names the same file the writer does. */
|
|
481
284
|
export const SIGNALS_BASENAME = 'signals.ndjson';
|
|
482
285
|
|
|
483
286
|
/**
|
|
484
|
-
* `temp/run-<eid>/stories/story-<sid>/signals.ndjson` — append-only
|
|
485
|
-
* signal stream consumed by the analyzer (Epic #1030 AC1).
|
|
486
|
-
*
|
|
487
287
|
* @param {number} eid
|
|
488
288
|
* @param {number} sid
|
|
489
289
|
* @param {object} [config]
|
|
@@ -493,24 +293,12 @@ export function signalsFile(eid, sid, config) {
|
|
|
493
293
|
return path.join(storyTempDir(eid, sid, config), SIGNALS_BASENAME);
|
|
494
294
|
}
|
|
495
295
|
|
|
496
|
-
/**
|
|
497
|
-
* Directory segment holding the standalone-Story subtree —
|
|
498
|
-
* `<tempRoot>/standalone/stories/story-<sid>/`. Named here (rather than
|
|
499
|
-
* inlined in `storyTempDir`) so the cross-Story stream discovery in
|
|
500
|
-
* `signals-writer.js` can recognise it without re-spelling the literal.
|
|
501
|
-
*/
|
|
502
296
|
export const STANDALONE_DIRNAME = 'standalone';
|
|
503
297
|
|
|
504
|
-
/**
|
|
505
|
-
* Directory segment holding the per-Story subtree under either an Epic run
|
|
506
|
-
* dir or the standalone dir (Story #2940's separator).
|
|
507
|
-
*/
|
|
508
298
|
export const STORIES_DIRNAME = 'stories';
|
|
509
299
|
|
|
510
300
|
/**
|
|
511
|
-
*
|
|
512
|
-
* walk needs the root the named helpers are built from; every other consumer
|
|
513
|
-
* should keep using a named helper.
|
|
301
|
+
* For the discovery walk only; everything else uses a named helper.
|
|
514
302
|
*
|
|
515
303
|
* @param {object} [config]
|
|
516
304
|
* @returns {string}
|
|
@@ -520,20 +308,7 @@ export function resolvedTempRoot(config) {
|
|
|
520
308
|
}
|
|
521
309
|
|
|
522
310
|
/**
|
|
523
|
-
* `
|
|
524
|
-
* ledger destination for lifecycle events emitted directly by a Story
|
|
525
|
-
* (rather than routed through the Epic-scoped bus ledger). Story #4426
|
|
526
|
-
* (Epic #4425) introduces the first consumer: a standalone
|
|
527
|
-
* `single-story-close` run (no parent Epic) emitting `merge.unlanded`
|
|
528
|
-
* needs an on-disk home even though there is no `run-<id>/` directory to
|
|
529
|
-
* anchor the event to.
|
|
530
|
-
*
|
|
531
|
-
* Mirrors `runLedgerPath` exactly, one level down: `eid === null` routes
|
|
532
|
-
* through `storyTempDir`'s standalone branch to
|
|
533
|
-
* `<tempRoot>/standalone/stories/story-<sid>/lifecycle.ndjson`; a real
|
|
534
|
-
* `eid` routes to `<tempRoot>/run-<eid>/stories/story-<sid>/lifecycle.ndjson`,
|
|
535
|
-
* so an Epic-attached Story's story-scope ledger sits alongside its
|
|
536
|
-
* `signals.ndjson` sibling.
|
|
311
|
+
* Story-scope ledger; `eid === null` routes to the standalone subtree.
|
|
537
312
|
*
|
|
538
313
|
* @param {number|null} eid
|
|
539
314
|
* @param {number} sid
|
|
@@ -544,10 +319,7 @@ export const storyLedgerPath = (eid, sid, config) =>
|
|
|
544
319
|
storyArtifactPath(eid, sid, 'lifecycle.ndjson', config);
|
|
545
320
|
|
|
546
321
|
/**
|
|
547
|
-
* Escape hatch for
|
|
548
|
-
* canonical layout (one of the per-Epic perf surfaces, retro mirror, etc.).
|
|
549
|
-
* Use the named helpers below for the canonical files; reserve this one
|
|
550
|
-
* for ad-hoc additions.
|
|
322
|
+
* Escape hatch for a non-canonical run-level artifact.
|
|
551
323
|
*
|
|
552
324
|
* @param {number} eid
|
|
553
325
|
* @param {string} name
|
|
@@ -559,9 +331,6 @@ export function runArtifactPath(eid, name, config) {
|
|
|
559
331
|
}
|
|
560
332
|
|
|
561
333
|
/**
|
|
562
|
-
* Escape hatch for a Story-level artifact whose name isn't part of the
|
|
563
|
-
* canonical layout (signals.ndjson + manifest.md ship named helpers).
|
|
564
|
-
*
|
|
565
334
|
* @param {number} eid
|
|
566
335
|
* @param {number} sid
|
|
567
336
|
* @param {string} name
|
|
@@ -573,14 +342,7 @@ function storyArtifactPath(eid, sid, name, config) {
|
|
|
573
342
|
}
|
|
574
343
|
|
|
575
344
|
/**
|
|
576
|
-
*
|
|
577
|
-
* (Story #2510). `appendLedgerEvent` persists one `emitted` record here per
|
|
578
|
-
* merge-terminal outcome; Story #5024 retired the `LedgerWriter` listener and
|
|
579
|
-
* the `TraceLogger` markdown companion that preceded it.
|
|
580
|
-
*
|
|
581
|
-
* The path is also the canonical input the standalone `lifecycle-emit`
|
|
582
|
-
* CLI feeds to `buildDefaultListenerChain` when assembling the default
|
|
583
|
-
* listener roster for an out-of-runner emit.
|
|
345
|
+
* Append-only lifecycle ledger; one record per merge-terminal outcome.
|
|
584
346
|
*
|
|
585
347
|
* @param {number} eid
|
|
586
348
|
* @param {object} [config]
|
|
@@ -589,7 +351,5 @@ function storyArtifactPath(eid, sid, name, config) {
|
|
|
589
351
|
export const runLedgerPath = (eid, config) =>
|
|
590
352
|
runArtifactPath(eid, 'lifecycle.ndjson', config);
|
|
591
353
|
|
|
592
|
-
// --- Canonical Story-level filenames ---
|
|
593
|
-
|
|
594
354
|
export const storyManifestPath = (eid, sid, config) =>
|
|
595
355
|
storyArtifactPath(eid, sid, 'manifest.md', config);
|
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* The structural validation now lives in the top-level AJV schema (run by
|
|
6
|
-
* `resolveConfig` against the full `.agentrc.json` document). This module
|
|
7
|
-
* carries the security checks that JSON Schema cannot express:
|
|
8
|
-
*
|
|
9
|
-
* - Shell-metacharacter injection on `github.{owner, repo, operatorHandle}`.
|
|
10
|
-
* - Path-traversal containment on `delivery.worktreeIsolation.root`.
|
|
11
|
-
*
|
|
12
|
-
* Accepts either the full resolved config (`{ project, github, planning,
|
|
13
|
-
* delivery }`) or `null` (zero-config callers — no checks needed).
|
|
2
|
+
* Security checks JSON Schema cannot express: shell metacharacters in
|
|
3
|
+
* `github.{owner, repo, operatorHandle}` and path containment of
|
|
4
|
+
* `delivery.worktreeIsolation.root`.
|
|
14
5
|
*/
|
|
15
6
|
|
|
16
7
|
import path from 'node:path';
|
|
@@ -23,11 +14,8 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
23
14
|
const PROJECT_ROOT = path.resolve(__dirname, '../../../..');
|
|
24
15
|
|
|
25
16
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* @param {object|null} config - The resolved config (`{ project, github, ... }`)
|
|
29
|
-
* or `null` for zero-config callers.
|
|
30
|
-
* @throws {Error} If any security check fails.
|
|
17
|
+
* @param {object|null} config - `null` for zero-config callers.
|
|
18
|
+
* @throws {Error}
|
|
31
19
|
*/
|
|
32
20
|
export function validateOrchestrationConfig(config) {
|
|
33
21
|
if (config == null) return;
|
|
@@ -1,23 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `delivery.worktreeIsolation`
|
|
3
|
-
*
|
|
4
|
-
* Several consumers read this block directly (runtime.js,
|
|
5
|
-
* worktree-manager.js, workspace-provisioner.js) and previously each
|
|
6
|
-
* carried its own fallback constant. Centralising the defaults here
|
|
7
|
-
* lets `applyDefaults()` in `config-resolver.js` enrich the canonical
|
|
8
|
-
* block once, so consumers never see `undefined` for a defaulted field
|
|
9
|
-
* (which previously meant, e.g., `Boolean(undefined) === false`
|
|
10
|
-
* silently disabling worktrees when the operator omitted the block).
|
|
2
|
+
* `delivery.worktreeIsolation` defaults, applied once so no consumer reads
|
|
3
|
+
* `undefined` (e.g. `Boolean(undefined)` silently disabling worktrees).
|
|
11
4
|
*/
|
|
12
5
|
|
|
13
6
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* darwin/linux default to `clone` — a copy-on-write (clonefile/reflink) clone
|
|
17
|
-
* of the donor's `node_modules` that is effectively free in time and disk on
|
|
18
|
-
* APFS / reflink-capable filesystems, with a clean fall-back to `per-worktree`
|
|
19
|
-
* on any failure (unsupported fs, cross-volume, etc.). Windows has no reflink
|
|
20
|
-
* equivalent on this path, so it keeps the `per-worktree` install default.
|
|
7
|
+
* `clone` is a copy-on-write clone (falls back to `per-worktree` on failure);
|
|
8
|
+
* Windows has no reflink path.
|
|
21
9
|
*
|
|
22
10
|
* @param {NodeJS.Platform} [platform]
|
|
23
11
|
* @returns {'clone' | 'per-worktree'}
|
|
@@ -33,15 +21,10 @@ export const WORKTREE_ISOLATION_DEFAULTS = Object.freeze({
|
|
|
33
21
|
primeFromPath: null,
|
|
34
22
|
allowSymlinkOnWindows: false,
|
|
35
23
|
reapOnSuccess: true,
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
// committed `.agentrc.json` placeholders — the gap that left
|
|
41
|
-
// `github.operatorHandle` unset inside worktrees and broke Story-lease
|
|
42
|
-
// release at close. Missing sources are skipped by the provisioner, so
|
|
43
|
-
// listing files that may be absent is safe. Keep in sync with
|
|
44
|
-
// `DEFAULT_WORKSPACE_FILES` in `../workspace-provisioner.js`.
|
|
24
|
+
// Local overrides must reach the worktree, or e.g. `operatorHandle` reads
|
|
25
|
+
// the committed placeholder and lease release breaks at close. Absent
|
|
26
|
+
// files are skipped. Keep in sync with `DEFAULT_WORKSPACE_FILES` in
|
|
27
|
+
// `../workspace-provisioner.js`.
|
|
45
28
|
bootstrapFiles: Object.freeze([
|
|
46
29
|
'.env',
|
|
47
30
|
'.mcp.json',
|
|
@@ -51,9 +34,7 @@ export const WORKTREE_ISOLATION_DEFAULTS = Object.freeze({
|
|
|
51
34
|
});
|
|
52
35
|
|
|
53
36
|
/**
|
|
54
|
-
*
|
|
55
|
-
* defaults for any field the operator omitted. Accepts the full resolved
|
|
56
|
-
* config, the bare delivery bag, or the bare worktreeIsolation bag.
|
|
37
|
+
* Accepts the full config, the `delivery` bag, or the block itself.
|
|
57
38
|
*
|
|
58
39
|
* @param {object | null | undefined} config
|
|
59
40
|
* @returns {typeof WORKTREE_ISOLATION_DEFAULTS}
|