mandrel 2.59.0 → 2.61.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 +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- 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 +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- 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 +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- 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 +57 -49
- 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 +7 -19
- 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 +39 -121
- 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 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- 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 +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- 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 +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- 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 -124
- 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 +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- 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 +123 -191
- 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 +22 -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 +28 -156
- 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 +121 -157
- 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 +118 -462
- 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 +37 -307
- 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/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- 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 +16 -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 +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- 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 -91
- 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 +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- 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 +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- 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 +136 -486
- 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 +96 -0
- 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 +180 -273
- 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 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- 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 -135
- 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 +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- 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 +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- 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 +67 -209
- 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 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- 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 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- 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/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- 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/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- 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 +60 -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 +326 -523
- 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 +17 -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 +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- 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/schemas/model-attribution.schema.json +0 -53
- 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 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- 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/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- 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 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,418 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* model-attribution.js — per-ticket model attribution comments + rollup
|
|
3
|
-
* (Story #2813).
|
|
4
|
-
*
|
|
5
|
-
* Records which Claude model executed a given ticket as a structured comment
|
|
6
|
-
* on that ticket. Epic-level mixes are computed at query time by walking the
|
|
7
|
-
* child tickets' comments — no Epic-scope emission is written.
|
|
8
|
-
*
|
|
9
|
-
* Surface:
|
|
10
|
-
*
|
|
11
|
-
* - {@link resolveModelIdentity} — pure resolver that picks an identity
|
|
12
|
-
* from the fallback chain (SDK metadata → env var → 'unknown'
|
|
13
|
-
* sentinel) and tags the source. Pure: no IO, no Date.now().
|
|
14
|
-
* - {@link buildModelAttributionPayload} — shape the canonical payload
|
|
15
|
-
* from a resolved identity + ticketId + timestamp.
|
|
16
|
-
* - {@link validateModelAttributionPayload} — hand-rolled validator
|
|
17
|
-
* matching `.agents/schemas/model-attribution.schema.json`. Returns
|
|
18
|
-
* `{ ok: true }` or `{ ok: false, errors: string[] }`.
|
|
19
|
-
* - {@link renderModelAttributionBody} — markdown body + fenced JSON
|
|
20
|
-
* block (same fence convention as the other structured comments in
|
|
21
|
-
* this repo so the shared `parseFencedJsonComment` can read it back).
|
|
22
|
-
* - {@link emitModelAttribution} — idempotent upsert against a Task
|
|
23
|
-
* ticket. Throws on validator failure (no comment written).
|
|
24
|
-
* - {@link parseModelAttributionComment} — readback helper for the
|
|
25
|
-
* rollup walker; returns `null` on missing/malformed payloads.
|
|
26
|
-
* - {@link rollupModelAttribution} — given a Story or Epic ticket id,
|
|
27
|
-
* walks `getSubTickets`, collects attribution comments, returns
|
|
28
|
-
* `{ totalChildren, byModel: {...}, missing: N }`.
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
import { parseFencedJsonComment } from './structured-comment-parser.js';
|
|
32
|
-
import { findStructuredComment, upsertStructuredComment } from './ticketing.js';
|
|
33
|
-
|
|
34
|
-
export const MODEL_ATTRIBUTION_TYPE = 'model-attribution';
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Sentinel returned by {@link resolveModelIdentity} when neither the SDK
|
|
38
|
-
* metadata nor the runtime env var supplied a model id. Exported so tests
|
|
39
|
-
* and downstream consumers can compare without re-spelling the literal.
|
|
40
|
-
*/
|
|
41
|
-
export const UNKNOWN_MODEL_ID = 'unknown';
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Env vars consulted as the second-priority resolver source. Listed in
|
|
45
|
-
* priority order — the first one set wins.
|
|
46
|
-
*/
|
|
47
|
-
const ENV_VAR_CANDIDATES = Object.freeze(['CLAUDE_MODEL', 'ANTHROPIC_MODEL']);
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Derive the coarse family label from a canonical model id. Used for the
|
|
51
|
-
* rollup-friendly `family` field. Returns `null` when the id does not
|
|
52
|
-
* match a recognised family pattern (the rollup helper falls back to the
|
|
53
|
-
* full id in that case so unknown models still aggregate distinctly).
|
|
54
|
-
*
|
|
55
|
-
* Recognises Anthropic Claude families: Opus, Sonnet, Haiku.
|
|
56
|
-
*
|
|
57
|
-
* @param {string} id
|
|
58
|
-
* @returns {string | null}
|
|
59
|
-
*/
|
|
60
|
-
export function deriveFamily(id) {
|
|
61
|
-
if (typeof id !== 'string') return null;
|
|
62
|
-
const lower = id.toLowerCase();
|
|
63
|
-
if (lower.includes('opus')) return 'Opus';
|
|
64
|
-
if (lower.includes('sonnet')) return 'Sonnet';
|
|
65
|
-
if (lower.includes('haiku')) return 'Haiku';
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Resolve the active model identity using the documented fallback chain:
|
|
71
|
-
*
|
|
72
|
-
* 1. `sdkMetadata.modelId` (or `.model`) when present and non-empty.
|
|
73
|
-
* 2. `CLAUDE_MODEL` / `ANTHROPIC_MODEL` env vars (first non-empty wins).
|
|
74
|
-
* 3. The `UNKNOWN_MODEL_ID` sentinel.
|
|
75
|
-
*
|
|
76
|
-
* Pure: accepts the env bag as an injectable argument so tests can pin
|
|
77
|
-
* the resolver without mutating `process.env`. Production callers default
|
|
78
|
-
* to `process.env`.
|
|
79
|
-
*
|
|
80
|
-
* @param {object} [opts]
|
|
81
|
-
* @param {object|null} [opts.sdkMetadata] — SDK response metadata.
|
|
82
|
-
* @param {Record<string, string|undefined>} [opts.env=process.env]
|
|
83
|
-
* @returns {{ id: string, family: string|null, source: 'sdk-metadata'|'env'|'unknown', sdkMetadata?: object }}
|
|
84
|
-
*/
|
|
85
|
-
export function resolveModelIdentity(opts = {}) {
|
|
86
|
-
const { sdkMetadata = null, env = process.env } = opts;
|
|
87
|
-
|
|
88
|
-
const sdkId =
|
|
89
|
-
sdkMetadata && typeof sdkMetadata === 'object'
|
|
90
|
-
? (typeof sdkMetadata.modelId === 'string' && sdkMetadata.modelId) ||
|
|
91
|
-
(typeof sdkMetadata.model === 'string' && sdkMetadata.model) ||
|
|
92
|
-
null
|
|
93
|
-
: null;
|
|
94
|
-
if (sdkId) {
|
|
95
|
-
return {
|
|
96
|
-
id: sdkId,
|
|
97
|
-
family: deriveFamily(sdkId),
|
|
98
|
-
source: 'sdk-metadata',
|
|
99
|
-
sdkMetadata,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
for (const name of ENV_VAR_CANDIDATES) {
|
|
104
|
-
const value = env?.[name];
|
|
105
|
-
if (typeof value === 'string' && value.length > 0) {
|
|
106
|
-
return {
|
|
107
|
-
id: value,
|
|
108
|
-
family: deriveFamily(value),
|
|
109
|
-
source: 'env',
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return {
|
|
115
|
-
id: UNKNOWN_MODEL_ID,
|
|
116
|
-
family: null,
|
|
117
|
-
source: 'unknown',
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Build the canonical payload object from a resolved identity. Separated
|
|
123
|
-
* from {@link emitModelAttribution} so callers (and tests) can shape the
|
|
124
|
-
* payload without triggering the upsert side-effect.
|
|
125
|
-
*
|
|
126
|
-
* @param {{
|
|
127
|
-
* ticketId: number,
|
|
128
|
-
* identity: ReturnType<typeof resolveModelIdentity>,
|
|
129
|
-
* recordedAt?: string,
|
|
130
|
-
* }} args
|
|
131
|
-
* @returns {object}
|
|
132
|
-
*/
|
|
133
|
-
export function buildModelAttributionPayload(args) {
|
|
134
|
-
const { ticketId, identity, recordedAt } = args ?? {};
|
|
135
|
-
const payload = {
|
|
136
|
-
kind: MODEL_ATTRIBUTION_TYPE,
|
|
137
|
-
ticketId,
|
|
138
|
-
model: identity?.family
|
|
139
|
-
? { id: identity.id, family: identity.family }
|
|
140
|
-
: { id: identity?.id },
|
|
141
|
-
source: identity?.source,
|
|
142
|
-
recordedAt: recordedAt ?? new Date().toISOString(),
|
|
143
|
-
};
|
|
144
|
-
if (identity?.sdkMetadata && typeof identity.sdkMetadata === 'object') {
|
|
145
|
-
payload.sdkMetadata = identity.sdkMetadata;
|
|
146
|
-
}
|
|
147
|
-
return payload;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const VALID_SOURCES = new Set(['sdk-metadata', 'env', 'unknown']);
|
|
151
|
-
const ISO_8601_RE =
|
|
152
|
-
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Per-field validators for {@link validateModelAttributionPayload}. Each
|
|
156
|
-
* returns an array of error strings for its field (empty when the field is
|
|
157
|
-
* valid), so the top-level validator collapses to a flat-map over the field
|
|
158
|
-
* list — no per-field branching in the orchestrating body. Story #4075
|
|
159
|
-
* (CLI-orchestration CC reduction): keeps each validator pure and
|
|
160
|
-
* single-responsibility.
|
|
161
|
-
*/
|
|
162
|
-
function validateKind(payload) {
|
|
163
|
-
return payload.kind === MODEL_ATTRIBUTION_TYPE
|
|
164
|
-
? []
|
|
165
|
-
: [`kind must be "${MODEL_ATTRIBUTION_TYPE}"`];
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
function validateTicketId(payload) {
|
|
169
|
-
return Number.isInteger(payload.ticketId) && payload.ticketId > 0
|
|
170
|
-
? []
|
|
171
|
-
: ['ticketId must be a positive integer'];
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
function validateModel(payload) {
|
|
175
|
-
const { model } = payload;
|
|
176
|
-
if (!model || typeof model !== 'object' || Array.isArray(model)) {
|
|
177
|
-
return ['model must be an object'];
|
|
178
|
-
}
|
|
179
|
-
const errors = [];
|
|
180
|
-
if (typeof model.id !== 'string' || model.id.length === 0) {
|
|
181
|
-
errors.push('model.id must be a non-empty string');
|
|
182
|
-
}
|
|
183
|
-
if (
|
|
184
|
-
model.family !== undefined &&
|
|
185
|
-
(typeof model.family !== 'string' || model.family.length === 0)
|
|
186
|
-
) {
|
|
187
|
-
errors.push('model.family, when present, must be a non-empty string');
|
|
188
|
-
}
|
|
189
|
-
return errors;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
function validateSource(payload) {
|
|
193
|
-
return typeof payload.source === 'string' && VALID_SOURCES.has(payload.source)
|
|
194
|
-
? []
|
|
195
|
-
: [`source must be one of: ${[...VALID_SOURCES].join(', ')}`];
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
function validateRecordedAt(payload) {
|
|
199
|
-
return typeof payload.recordedAt === 'string' &&
|
|
200
|
-
ISO_8601_RE.test(payload.recordedAt)
|
|
201
|
-
? []
|
|
202
|
-
: ['recordedAt must be an ISO-8601 timestamp string'];
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
function validateSdkMetadata(payload) {
|
|
206
|
-
const { sdkMetadata } = payload;
|
|
207
|
-
if (sdkMetadata === undefined) return [];
|
|
208
|
-
const valid =
|
|
209
|
-
sdkMetadata !== null &&
|
|
210
|
-
typeof sdkMetadata === 'object' &&
|
|
211
|
-
!Array.isArray(sdkMetadata);
|
|
212
|
-
return valid ? [] : ['sdkMetadata, when present, must be an object'];
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
const PAYLOAD_FIELD_VALIDATORS = Object.freeze([
|
|
216
|
-
validateKind,
|
|
217
|
-
validateTicketId,
|
|
218
|
-
validateModel,
|
|
219
|
-
validateSource,
|
|
220
|
-
validateRecordedAt,
|
|
221
|
-
validateSdkMetadata,
|
|
222
|
-
]);
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Hand-rolled validator matching
|
|
226
|
-
* `.agents/schemas/model-attribution.schema.json`. Returns
|
|
227
|
-
* `{ ok: true }` on success, `{ ok: false, errors: string[] }` on
|
|
228
|
-
* failure. The error strings are stable enough to assert against in
|
|
229
|
-
* tests.
|
|
230
|
-
*
|
|
231
|
-
* The codebase does not pull in `ajv` for runtime schema validation
|
|
232
|
-
* (signals + structured comments use hand-rolled shape guards — see
|
|
233
|
-
* `lib/signals/schema.js`). We follow the same pattern here so the
|
|
234
|
-
* schema file stays the documented SSOT and the validator is the
|
|
235
|
-
* runtime gate.
|
|
236
|
-
*
|
|
237
|
-
* @param {unknown} payload
|
|
238
|
-
* @returns {{ ok: true } | { ok: false, errors: string[] }}
|
|
239
|
-
*/
|
|
240
|
-
export function validateModelAttributionPayload(payload) {
|
|
241
|
-
if (
|
|
242
|
-
payload === null ||
|
|
243
|
-
typeof payload !== 'object' ||
|
|
244
|
-
Array.isArray(payload)
|
|
245
|
-
) {
|
|
246
|
-
return { ok: false, errors: ['payload must be a plain object'] };
|
|
247
|
-
}
|
|
248
|
-
const errors = PAYLOAD_FIELD_VALIDATORS.flatMap((validate) =>
|
|
249
|
-
validate(payload),
|
|
250
|
-
);
|
|
251
|
-
return errors.length ? { ok: false, errors } : { ok: true };
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* Render the markdown body that gets upserted as the structured comment.
|
|
256
|
-
* Body is a one-line summary followed by the canonical payload inside a
|
|
257
|
-
* fenced ```json``` block so downstream readers can use the shared
|
|
258
|
-
* `parseFencedJsonComment` helper without bespoke parsing.
|
|
259
|
-
*
|
|
260
|
-
* @param {object} payload — already validated.
|
|
261
|
-
* @returns {string}
|
|
262
|
-
*/
|
|
263
|
-
export function renderModelAttributionBody(payload) {
|
|
264
|
-
const id = payload.model?.id ?? UNKNOWN_MODEL_ID;
|
|
265
|
-
const family = payload.model?.family ? ` (${payload.model.family})` : '';
|
|
266
|
-
const sourceLabel =
|
|
267
|
-
payload.source === 'sdk-metadata'
|
|
268
|
-
? 'SDK metadata'
|
|
269
|
-
: payload.source === 'env'
|
|
270
|
-
? 'env var'
|
|
271
|
-
: 'unknown source';
|
|
272
|
-
const header = `🤖 Model attribution: \`${id}\`${family} · via ${sourceLabel}`;
|
|
273
|
-
return [header, '', '```json', JSON.stringify(payload, null, 2), '```'].join(
|
|
274
|
-
'\n',
|
|
275
|
-
);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* Emit (idempotently) the model-attribution comment onto a Task ticket.
|
|
280
|
-
* Validates the payload before any IO — a malformed payload throws and
|
|
281
|
-
* writes nothing to the provider.
|
|
282
|
-
*
|
|
283
|
-
* @param {{
|
|
284
|
-
* provider: import('../ITicketingProvider.js').ITicketingProvider,
|
|
285
|
-
* ticketId: number,
|
|
286
|
-
* sdkMetadata?: object|null,
|
|
287
|
-
* env?: Record<string, string|undefined>,
|
|
288
|
-
* recordedAt?: string,
|
|
289
|
-
* }} args
|
|
290
|
-
* @returns {Promise<{ payload: object, body: string }>}
|
|
291
|
-
*/
|
|
292
|
-
export async function emitModelAttribution(args) {
|
|
293
|
-
const { provider, ticketId, sdkMetadata, env, recordedAt } = args ?? {};
|
|
294
|
-
if (!provider || typeof provider.postComment !== 'function') {
|
|
295
|
-
throw new TypeError(
|
|
296
|
-
'emitModelAttribution requires a provider with postComment',
|
|
297
|
-
);
|
|
298
|
-
}
|
|
299
|
-
if (!Number.isInteger(ticketId) || ticketId <= 0) {
|
|
300
|
-
throw new TypeError(
|
|
301
|
-
'emitModelAttribution requires a positive integer ticketId',
|
|
302
|
-
);
|
|
303
|
-
}
|
|
304
|
-
const identity = resolveModelIdentity({ sdkMetadata, env });
|
|
305
|
-
const payload = buildModelAttributionPayload({
|
|
306
|
-
ticketId,
|
|
307
|
-
identity,
|
|
308
|
-
recordedAt,
|
|
309
|
-
});
|
|
310
|
-
const result = validateModelAttributionPayload(payload);
|
|
311
|
-
if (!result.ok) {
|
|
312
|
-
throw new Error(
|
|
313
|
-
`model-attribution payload failed validation: ${result.errors.join('; ')}`,
|
|
314
|
-
);
|
|
315
|
-
}
|
|
316
|
-
const body = renderModelAttributionBody(payload);
|
|
317
|
-
await upsertStructuredComment(
|
|
318
|
-
provider,
|
|
319
|
-
ticketId,
|
|
320
|
-
MODEL_ATTRIBUTION_TYPE,
|
|
321
|
-
body,
|
|
322
|
-
);
|
|
323
|
-
return { payload, body };
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
/**
|
|
327
|
-
* Read back a model-attribution comment from a ticket. Returns the
|
|
328
|
-
* parsed payload, or `null` when the comment is missing or its payload
|
|
329
|
-
* fails validation (malformed payloads are treated as "no attribution"
|
|
330
|
-
* so a single corrupt comment does not poison the whole rollup).
|
|
331
|
-
*
|
|
332
|
-
* @param {{
|
|
333
|
-
* provider: import('../ITicketingProvider.js').ITicketingProvider,
|
|
334
|
-
* ticketId: number,
|
|
335
|
-
* }} args
|
|
336
|
-
* @returns {Promise<object|null>}
|
|
337
|
-
*/
|
|
338
|
-
export async function parseModelAttributionComment(args) {
|
|
339
|
-
const { provider, ticketId } = args ?? {};
|
|
340
|
-
const comment = await findStructuredComment(
|
|
341
|
-
provider,
|
|
342
|
-
ticketId,
|
|
343
|
-
MODEL_ATTRIBUTION_TYPE,
|
|
344
|
-
);
|
|
345
|
-
if (!comment) return null;
|
|
346
|
-
const parsed = parseFencedJsonComment(comment);
|
|
347
|
-
if (!parsed) return null;
|
|
348
|
-
const result = validateModelAttributionPayload(parsed);
|
|
349
|
-
return result.ok ? parsed : null;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Walk the immediate child tickets of a parent (e.g. an Epic's Stories),
|
|
354
|
-
* read each child's model-attribution comment (when present), and
|
|
355
|
-
* aggregate per-model counts. Children with no attribution comment are
|
|
356
|
-
* counted under `missing`.
|
|
357
|
-
*
|
|
358
|
-
* Rollup is keyed by `model.family` when present, otherwise by
|
|
359
|
-
* `model.id` so unknown families still aggregate distinctly. The
|
|
360
|
-
* envelope also exposes the per-id breakdown for callers that want a
|
|
361
|
-
* finer-grained view.
|
|
362
|
-
*
|
|
363
|
-
* @param {{
|
|
364
|
-
* provider: import('../ITicketingProvider.js').ITicketingProvider,
|
|
365
|
-
* parentId: number,
|
|
366
|
-
* }} args
|
|
367
|
-
* @returns {Promise<{
|
|
368
|
-
* parentId: number,
|
|
369
|
-
* totalChildren: number,
|
|
370
|
-
* missing: number,
|
|
371
|
-
* byModel: Record<string, number>,
|
|
372
|
-
* byId: Record<string, number>,
|
|
373
|
-
* }>}
|
|
374
|
-
*/
|
|
375
|
-
export async function rollupModelAttribution(args) {
|
|
376
|
-
const { provider, parentId } = args ?? {};
|
|
377
|
-
if (!provider || typeof provider.getSubTickets !== 'function') {
|
|
378
|
-
throw new TypeError(
|
|
379
|
-
'rollupModelAttribution requires a provider with getSubTickets',
|
|
380
|
-
);
|
|
381
|
-
}
|
|
382
|
-
if (!Number.isInteger(parentId) || parentId <= 0) {
|
|
383
|
-
throw new TypeError(
|
|
384
|
-
'rollupModelAttribution requires a positive integer parentId',
|
|
385
|
-
);
|
|
386
|
-
}
|
|
387
|
-
const children = (await provider.getSubTickets(parentId)) ?? [];
|
|
388
|
-
const byModel = {};
|
|
389
|
-
const byId = {};
|
|
390
|
-
let missing = 0;
|
|
391
|
-
for (const child of children) {
|
|
392
|
-
const childId = Number(child?.id);
|
|
393
|
-
if (!Number.isInteger(childId) || childId <= 0) {
|
|
394
|
-
missing += 1;
|
|
395
|
-
continue;
|
|
396
|
-
}
|
|
397
|
-
const payload = await parseModelAttributionComment({
|
|
398
|
-
provider,
|
|
399
|
-
ticketId: childId,
|
|
400
|
-
});
|
|
401
|
-
if (!payload) {
|
|
402
|
-
missing += 1;
|
|
403
|
-
continue;
|
|
404
|
-
}
|
|
405
|
-
const familyKey =
|
|
406
|
-
payload.model?.family ?? payload.model?.id ?? UNKNOWN_MODEL_ID;
|
|
407
|
-
const idKey = payload.model?.id ?? UNKNOWN_MODEL_ID;
|
|
408
|
-
byModel[familyKey] = (byModel[familyKey] ?? 0) + 1;
|
|
409
|
-
byId[idKey] = (byId[idKey] ?? 0) + 1;
|
|
410
|
-
}
|
|
411
|
-
return {
|
|
412
|
-
parentId,
|
|
413
|
-
totalChildren: children.length,
|
|
414
|
-
missing,
|
|
415
|
-
byModel,
|
|
416
|
-
byId,
|
|
417
|
-
};
|
|
418
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* story-plan-state.js — read the v2 Story planning checkpoint.
|
|
3
|
-
*
|
|
4
|
-
* `plan-persist.js` upserts one `story-plan-state` structured comment per
|
|
5
|
-
* created Story carrying the persist receipt (when the plan completed, how many
|
|
6
|
-
* Stories it created, and their ids). Story #4542 removed the risk fields it
|
|
7
|
-
* used to carry: the planner-authored verdict, the envelope derived from it,
|
|
8
|
-
* and the review routing computed from that envelope. Nothing read any of them
|
|
9
|
-
* back — review depth is now derived from the diff at close time
|
|
10
|
-
* (`review-depth.js#deriveChangeLevel`), so no checkpoint read sits on the
|
|
11
|
-
* delivery path at all.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { parseFencedJsonComment } from './structured-comment-parser.js';
|
|
15
|
-
import { findStructuredComment } from './ticketing.js';
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Read the v2 Story planning checkpoint. Missing/malformed comments degrade
|
|
19
|
-
* to null — an unplanned Story simply has no persist receipt.
|
|
20
|
-
*/
|
|
21
|
-
export async function readStoryPlanState({
|
|
22
|
-
provider,
|
|
23
|
-
storyId,
|
|
24
|
-
findCommentFn = findStructuredComment,
|
|
25
|
-
}) {
|
|
26
|
-
const comment = await findCommentFn(
|
|
27
|
-
provider,
|
|
28
|
-
Number(storyId),
|
|
29
|
-
'story-plan-state',
|
|
30
|
-
);
|
|
31
|
-
const state = parseFencedJsonComment(comment);
|
|
32
|
-
return state && typeof state === 'object' ? state : null;
|
|
33
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* structured-comment-parser.js — shared parser for fenced-JSON structured
|
|
3
|
-
* comments.
|
|
4
|
-
*
|
|
5
|
-
* Several callers (the deleted epic-runner Checkpointer/ProgressReporter,
|
|
6
|
-
* `parseStoryRunProgressComment` / `parsePhaseTimingsComment`, wave-gate's
|
|
7
|
-
* local `extractJsonBlock`) need to extract the `{...}` payload from the
|
|
8
|
-
* fenced ```json``` block of a structured comment body. They had each open-
|
|
9
|
-
* coded the same `/```json\s*\n([\s\S]*?)\n```/` regex + `JSON.parse` +
|
|
10
|
-
* try/catch dance — small enough to copy, large enough to drift.
|
|
11
|
-
*
|
|
12
|
-
* This helper centralizes that single regex so a future change to the
|
|
13
|
-
* fence format (e.g. tolerating CRLF, surrounding whitespace, alternate
|
|
14
|
-
* fence languages) lives in exactly one place. The functions are
|
|
15
|
-
* deliberately permissive about input shape: anything that isn't the
|
|
16
|
-
* expected type returns `null` rather than throwing, matching what the
|
|
17
|
-
* existing callers already do — they all treat parse failure as "no
|
|
18
|
-
* payload available" and fall back to a default state.
|
|
19
|
-
*
|
|
20
|
-
* Acceptance contract for this helper:
|
|
21
|
-
* - returns the parsed JSON value when the body contains a valid fenced
|
|
22
|
-
* ```json``` block;
|
|
23
|
-
* - returns `null` for missing comment, missing body, missing fence, or
|
|
24
|
-
* malformed JSON inside the fence;
|
|
25
|
-
* - never throws.
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
const JSON_FENCE_RE = /```json\s*\n([\s\S]*?)\n```/;
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Extract the parsed JSON object from the first fenced ```json``` block in
|
|
32
|
-
* a raw string. Returns `null` for any malformed or missing input — callers
|
|
33
|
-
* treat that as "no payload" and fall back.
|
|
34
|
-
*
|
|
35
|
-
* Use this variant when the caller already holds the raw comment body as a
|
|
36
|
-
* string (e.g. after extracting `.body` themselves). Use
|
|
37
|
-
* `parseFencedJsonComment` when working with a comment-like object.
|
|
38
|
-
*
|
|
39
|
-
* @param {unknown} text — the raw string to scan.
|
|
40
|
-
* @returns {unknown | null} the parsed JSON value (typically an object),
|
|
41
|
-
* or `null` when extraction fails.
|
|
42
|
-
*/
|
|
43
|
-
export function parseFencedJson(text) {
|
|
44
|
-
if (typeof text !== 'string') return null;
|
|
45
|
-
const match = text.match(JSON_FENCE_RE);
|
|
46
|
-
if (!match) return null;
|
|
47
|
-
try {
|
|
48
|
-
return JSON.parse(match[1]);
|
|
49
|
-
} catch {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Extract the parsed JSON object from the first fenced ```json``` block in
|
|
56
|
-
* a structured comment's `body`. Returns `null` for any malformed or
|
|
57
|
-
* missing input — callers treat that as "no payload" and fall back.
|
|
58
|
-
*
|
|
59
|
-
* @param {{ body?: unknown } | null | undefined} comment — a comment-like
|
|
60
|
-
* object. Only the string `body` field is consulted.
|
|
61
|
-
* @returns {unknown | null} the parsed JSON value (typically an object),
|
|
62
|
-
* or `null` when extraction fails.
|
|
63
|
-
*/
|
|
64
|
-
export function parseFencedJsonComment(comment) {
|
|
65
|
-
if (!comment || typeof comment.body !== 'string') return null;
|
|
66
|
-
return parseFencedJson(comment.body);
|
|
67
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pinned-override-notes.js — keep a load-bearing dependency note honest.
|
|
3
|
-
*
|
|
4
|
-
* `package.json` carries a `"//"` block of prose notes keyed by dotted config
|
|
5
|
-
* path. Two of them are safety notes about a pinned `overrides` entry: they
|
|
6
|
-
* record WHY the pin exists, which advisories removing it reintroduces, and
|
|
7
|
-
* that the `overrides` range and the direct `dependencies` range MUST move in
|
|
8
|
-
* lockstep because npm has no way to reference one from the other.
|
|
9
|
-
*
|
|
10
|
-
* A note like that is consulted precisely when someone is deciding whether a
|
|
11
|
-
* bump is safe — so a stale version inside it hands out wrong premises about
|
|
12
|
-
* a coupling the note itself calls a trap. Nothing enforced either claim, and
|
|
13
|
-
* both had drifted: the note described `^4.2.0` while the pin had moved twice.
|
|
14
|
-
*
|
|
15
|
-
* This module derives the checks from the `"//"` keys themselves rather than
|
|
16
|
-
* naming any package, so a second pinned override gets the same guarantee by
|
|
17
|
-
* writing its note.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/** A `"//"` key that documents a pinned override, e.g. `overrides.js-yaml`. */
|
|
21
|
-
const OVERRIDE_NOTE_KEY = /^overrides\.(.+)$/;
|
|
22
|
-
|
|
23
|
-
import { resolvePin, scoreNote } from './pinned-override-resolve.js';
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Audit one package document's pinned-override notes.
|
|
27
|
-
*
|
|
28
|
-
* Findings per documented override, each naming the drift rather than just
|
|
29
|
-
* asserting a mismatch:
|
|
30
|
-
* - `lockstep` — `overrides.<name>` and `dependencies.<name>` disagree. The
|
|
31
|
-
* companion note declares they must not; a split silently gives the
|
|
32
|
-
* direct and transitive resolutions different floors.
|
|
33
|
-
* - `stale-note` — the note quotes at least one range but not the one in
|
|
34
|
-
* force, so its stated version is behind the pin it describes. A note
|
|
35
|
-
* quoting no range at all is not scored: prose that names no version
|
|
36
|
-
* cannot go stale.
|
|
37
|
-
* - `unsupported-shape` — the note's key resolves to something that is not a
|
|
38
|
-
* range (a nested override object, or a `$name` reference to a dependency
|
|
39
|
-
* that does not exist). Distinct from `orphan-note`: the pin is *there*,
|
|
40
|
-
* the note just does not name it, and telling an author to "delete the note
|
|
41
|
-
* or restore the pin" would be wrong advice.
|
|
42
|
-
*
|
|
43
|
-
* @param {{ '//'?: Record<string,string>, overrides?: Record<string,string>, dependencies?: Record<string,string> }} pkg
|
|
44
|
-
* @returns {{ findings: Array<{ kind: string, name: string, detail: string }>, checked: string[] }}
|
|
45
|
-
*/
|
|
46
|
-
export function auditPinnedOverrideNotes(pkg) {
|
|
47
|
-
const overrides = pkg?.overrides ?? {};
|
|
48
|
-
const dependencies = pkg?.dependencies ?? {};
|
|
49
|
-
const findings = [];
|
|
50
|
-
const checked = [];
|
|
51
|
-
|
|
52
|
-
for (const { key, name, text } of documentedOverrides(pkg)) {
|
|
53
|
-
const resolved = resolvePin({ overrides, dependencies, name });
|
|
54
|
-
if (isCheckable(resolved)) checked.push(name);
|
|
55
|
-
findings.push(
|
|
56
|
-
...scoreNote({ key, name, text, resolved, direct: dependencies[name] }),
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return { findings, checked };
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* The `"//"` entries that document an override, as `{ key, name, text }`.
|
|
65
|
-
* Every other note in the block — a peer-dependency rationale, say — is not
|
|
66
|
-
* this gate's business and is skipped rather than scored.
|
|
67
|
-
*
|
|
68
|
-
* @param {object} pkg
|
|
69
|
-
* @returns {Array<{ key: string, name: string, text: unknown }>}
|
|
70
|
-
*/
|
|
71
|
-
function documentedOverrides(pkg) {
|
|
72
|
-
return Object.entries(pkg?.['//'] ?? {})
|
|
73
|
-
.map(([key, text]) => ({ key, text, match: OVERRIDE_NOTE_KEY.exec(key) }))
|
|
74
|
-
.filter((entry) => entry.match !== null)
|
|
75
|
-
.map(({ key, text, match }) => ({ key, text, name: match[1] }));
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Was the note's override resolved to a range at all? Only then does the name
|
|
80
|
-
* belong in `checked` — the list is what tells a caller which pins this gate
|
|
81
|
-
* actually stands behind.
|
|
82
|
-
*
|
|
83
|
-
* @param {{ kind: string }} resolved
|
|
84
|
-
* @returns {boolean}
|
|
85
|
-
*/
|
|
86
|
-
function isCheckable(resolved) {
|
|
87
|
-
return resolved.kind !== 'missing' && resolved.kind !== 'unsupported';
|
|
88
|
-
}
|