mandrel 2.60.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 +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/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 +83 -239
- 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 +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 +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 +25 -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,35 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Append-only
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `temp/run-<id>/stories/story-<sid>/signals.ndjson`. Every live emitter
|
|
6
|
-
* funnels through this writer so the on-disk shape stays under one schema
|
|
7
|
-
* and one set of robustness guarantees. The sibling `traces.ndjson` stream
|
|
8
|
-
* and its `appendTrace` entry point went in Story #5003 with the tool-trace
|
|
9
|
-
* hook that was its only producer.
|
|
10
|
-
*
|
|
11
|
-
* Robustness contract (Tech Spec #1032 §observability):
|
|
12
|
-
* - **Best-effort.** Every entry point swallows fs / JSON failures
|
|
13
|
-
* after logging via `Logger.warn`. Observability MUST NOT take down
|
|
14
|
-
* the runner — a failed write is a missing signal, not a halted
|
|
15
|
-
* wave.
|
|
16
|
-
* - **No buffering.** Each `appendSignal` opens the target file, writes
|
|
17
|
-
* one newline-terminated JSON line, and closes.
|
|
18
|
-
* The Tech Spec explicitly forbids in-process buffering: emitters
|
|
19
|
-
* fire from inside per-Story sub-agents that may exit abruptly, and
|
|
20
|
-
* a buffered tail would silently disappear on `process.exit`.
|
|
21
|
-
* - **Lazy directory creation.** The first write to a fresh Story
|
|
22
|
-
* creates `temp/run-<id>/stories/story-<sid>/` via `fs.mkdir(..., { recursive: true })`.
|
|
23
|
-
* `epicId` / `storyId` are required positive integers — the
|
|
24
|
-
* `temp-paths.js` helpers assert this before we touch the disk.
|
|
25
|
-
*
|
|
26
|
-
* Reader contract:
|
|
27
|
-
* - `forEachLine(epicId, storyId, cb)` streams `signals.ndjson` line
|
|
28
|
-
* by line, parses each line as JSON, and invokes `cb(parsed, lineNumber)`.
|
|
29
|
-
* Malformed lines are skipped with a `Logger.warn`; a missing file
|
|
30
|
-
* returns `{ linesRead: 0, linesParsed: 0, missing: true }` rather
|
|
31
|
-
* than throwing. This matches how the analyzer wants to consume
|
|
32
|
-
* partial streams from in-flight Stories.
|
|
2
|
+
* Append-only writer and readers for per-Story `signals.ndjson`. Best-effort:
|
|
3
|
+
* failures are logged, never thrown. No buffering — emitters run in
|
|
4
|
+
* sub-agents that may exit abruptly.
|
|
33
5
|
*/
|
|
34
6
|
|
|
35
7
|
import { createReadStream } from 'node:fs';
|
|
@@ -49,30 +21,8 @@ import { validateSignal } from './signal-validator.js';
|
|
|
49
21
|
import { classifySignalSource } from './source-classifier.js';
|
|
50
22
|
|
|
51
23
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* Post the Epic #4406 cutover `source` is reserved **exclusively** for
|
|
56
|
-
* this framework/consumer classification — a record's originating tool
|
|
57
|
-
* lives in `emitter`, never `source`. That freed the classifier to run
|
|
58
|
-
* for every friction record (pre-cutover a provenance object under the
|
|
59
|
-
* `source` key blocked it via `Object.hasOwn`).
|
|
60
|
-
*
|
|
61
|
-
* Rules:
|
|
62
|
-
* - If the record is not a plain object (string, number, null,
|
|
63
|
-
* undefined), return it unchanged.
|
|
64
|
-
* - If the caller pre-set `source` to exactly `"framework"` or
|
|
65
|
-
* `"consumer"`, preserve it verbatim — some detectors classify
|
|
66
|
-
* upstream and we MUST NOT overwrite their intentional tag.
|
|
67
|
-
* - Otherwise (absent, or any other value — defense in depth against a
|
|
68
|
-
* stray non-canonical `source`), invoke `classifySignalSource` against
|
|
69
|
-
* the whole record and inject/overwrite `source` with the result.
|
|
70
|
-
*
|
|
71
|
-
* Story #4824 moved the field extraction into the classifier. The writer
|
|
72
|
-
* used to hand it only `failingPath` / `command`, which meant every
|
|
73
|
-
* runtime-emitted record — which populates neither — took the `consumer`
|
|
74
|
-
* default and the framework limb of the feedback loop was unreachable. The
|
|
75
|
-
* classifier now sees the `category` and `details` it needs to resolve those.
|
|
24
|
+
* `source` means only framework/consumer (the tool lives in `emitter`); a
|
|
25
|
+
* caller-set canonical value is kept, anything else overwritten.
|
|
76
26
|
*
|
|
77
27
|
* @param {unknown} signal
|
|
78
28
|
* @returns {unknown}
|
|
@@ -98,15 +48,6 @@ function tagSignalSource(signal) {
|
|
|
98
48
|
}
|
|
99
49
|
|
|
100
50
|
/**
|
|
101
|
-
* Validate a record against the canonical `signal-event.schema.json`
|
|
102
|
-
* before it is appended. On failure the record is **dropped** (never
|
|
103
|
-
* appended) and a `Logger.warn` names the violating field. Never throws —
|
|
104
|
-
* the writer's best-effort contract is preserved.
|
|
105
|
-
*
|
|
106
|
-
* Story #5003 removed the persisted per-Epic reject tally this used to
|
|
107
|
-
* increment: v2 Stories are standalone (`epicId` is always null), so the
|
|
108
|
-
* tally was never written and its only reader could never see one.
|
|
109
|
-
*
|
|
110
51
|
* @param {unknown} record
|
|
111
52
|
* @param {string} label
|
|
112
53
|
* @returns {boolean} true when the record is valid (safe to append).
|
|
@@ -121,10 +62,6 @@ function validateOrDrop(record, label) {
|
|
|
121
62
|
}
|
|
122
63
|
|
|
123
64
|
/**
|
|
124
|
-
* Best-effort append of a single record as one newline-terminated JSON
|
|
125
|
-
* line. Caller-supplied record must be JSON-serialisable; circular refs
|
|
126
|
-
* or BigInt fields are reported via `Logger.warn` and dropped.
|
|
127
|
-
*
|
|
128
65
|
* @param {string} targetPath
|
|
129
66
|
* @param {unknown} record
|
|
130
67
|
* @returns {Promise<boolean>} true on success, false on any swallowed failure.
|
|
@@ -157,12 +94,6 @@ async function appendOne(targetPath, record) {
|
|
|
157
94
|
}
|
|
158
95
|
|
|
159
96
|
/**
|
|
160
|
-
* Append one signal record to `temp/run-<id>/stories/story-<sid>/signals.ndjson`.
|
|
161
|
-
*
|
|
162
|
-
* The `signal` is written verbatim — callers (detectors) own its shape
|
|
163
|
-
* (kind, severity, message, etc.). The writer adds nothing. Errors are
|
|
164
|
-
* logged via `Logger.warn` and never thrown.
|
|
165
|
-
*
|
|
166
97
|
* @param {{ epicId: number, storyId: number, signal: unknown, config?: object }} args
|
|
167
98
|
* @returns {Promise<boolean>}
|
|
168
99
|
*/
|
|
@@ -185,19 +116,11 @@ export async function appendSignal(args) {
|
|
|
185
116
|
}
|
|
186
117
|
|
|
187
118
|
/**
|
|
188
|
-
*
|
|
189
|
-
* `cb(parsed, lineNumber)` for each successfully parsed JSON line.
|
|
190
|
-
* `lineNumber` is 1-based to match operator log expectations. Malformed
|
|
191
|
-
* lines are skipped with a `Logger.warn`. A missing file resolves with
|
|
192
|
-
* `missing: true` rather than throwing.
|
|
193
|
-
*
|
|
194
|
-
* Shared spine for `forEachLine`
|
|
195
|
-
* (per-Epic stream) so the two readers cannot drift in their
|
|
196
|
-
* malformed-line / missing-file / cb-throw handling.
|
|
119
|
+
* Shared reader spine; malformed lines and callback throws are skipped.
|
|
197
120
|
*
|
|
198
121
|
* @param {string} target
|
|
199
122
|
* @param {(parsed: unknown, lineNumber: number) => unknown | Promise<unknown>} cb
|
|
200
|
-
* @param {string} label
|
|
123
|
+
* @param {string} label
|
|
201
124
|
* @returns {Promise<{ linesRead: number, linesParsed: number, missing: boolean }>}
|
|
202
125
|
*/
|
|
203
126
|
async function forEachLineIn(target, cb, label) {
|
|
@@ -215,7 +138,6 @@ async function forEachLineIn(target, cb, label) {
|
|
|
215
138
|
try {
|
|
216
139
|
for await (const rawLine of rl) {
|
|
217
140
|
linesRead += 1;
|
|
218
|
-
// Skip empty lines (trailing newline at EOF, accidental blanks).
|
|
219
141
|
if (rawLine.length === 0) continue;
|
|
220
142
|
let parsed;
|
|
221
143
|
try {
|
|
@@ -251,11 +173,6 @@ async function forEachLineIn(target, cb, label) {
|
|
|
251
173
|
}
|
|
252
174
|
|
|
253
175
|
/**
|
|
254
|
-
* Stream a per-Story `signals.ndjson` line by line, invoking
|
|
255
|
-
* `cb(parsed, lineNumber)` for each successfully parsed JSON line. A
|
|
256
|
-
* missing file resolves with `missing: true` rather than throwing — the
|
|
257
|
-
* analyzer treats absence as "no signals yet" and keeps walking.
|
|
258
|
-
*
|
|
259
176
|
* @param {number} epicId
|
|
260
177
|
* @param {number} storyId
|
|
261
178
|
* @param {(parsed: unknown, lineNumber: number) => unknown | Promise<unknown>} cb
|
|
@@ -283,18 +200,11 @@ export async function forEachLine(epicId, storyId, cb, config) {
|
|
|
283
200
|
return forEachLineIn(target, cb, 'forEachLine');
|
|
284
201
|
}
|
|
285
202
|
|
|
286
|
-
/** Matches an Epic run directory (`run-<eid>`) directly under `tempRoot`. */
|
|
287
203
|
const RUN_DIR_RE = /^run-\d+$/;
|
|
288
204
|
|
|
289
|
-
/** Matches a per-Story directory (`story-<sid>`) under a `stories/` parent. */
|
|
290
205
|
const STORY_DIR_RE = /^story-(\d+)$/;
|
|
291
206
|
|
|
292
207
|
/**
|
|
293
|
-
* List directory entries, or `[]` when the directory is absent/unreadable.
|
|
294
|
-
* Absence is the common case (a fresh checkout has no temp tree at all) and
|
|
295
|
-
* must not throw — the discovery walk feeds a roll-up that may not fail the
|
|
296
|
-
* land.
|
|
297
|
-
*
|
|
298
208
|
* @param {string} dir
|
|
299
209
|
* @returns {Promise<import('node:fs').Dirent[]>}
|
|
300
210
|
*/
|
|
@@ -307,18 +217,8 @@ async function readDirEntries(dir) {
|
|
|
307
217
|
}
|
|
308
218
|
|
|
309
219
|
/**
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
*
|
|
313
|
-
* Both canonical layouts are walked — `<tempRoot>/standalone/stories/story-<sid>/`
|
|
314
|
-
* (v2 standalone Stories, where every close writes) and
|
|
315
|
-
* `<tempRoot>/run-<eid>/stories/story-<sid>/` (Epic-attached streams). The
|
|
316
|
-
* walk is the **recurrence window** the follow-up composer reduces over: a
|
|
317
|
-
* defect that fires exactly once per Story is invisible inside a single
|
|
318
|
-
* Story's stream and only becomes a recurrence across the surviving ones.
|
|
319
|
-
*
|
|
320
|
-
* Sorted by absolute path so a given tree always yields the same order and
|
|
321
|
-
* the composed proposals stay byte-identical.
|
|
220
|
+
* Every surviving stream (both layouts) — the recurrence window. Sorted so
|
|
221
|
+
* composed proposals are deterministic.
|
|
322
222
|
*
|
|
323
223
|
* @param {object} [config]
|
|
324
224
|
* @returns {Promise<Array<{ storyId: number, file: string }>>}
|
|
@@ -361,18 +261,8 @@ async function listStorySignalStreams(config) {
|
|
|
361
261
|
}
|
|
362
262
|
|
|
363
263
|
/**
|
|
364
|
-
*
|
|
365
|
-
*
|
|
366
|
-
*
|
|
367
|
-
* `context` carries `{ storyId, file, lineNumber }` — `storyId` is the
|
|
368
|
-
* **stream owner** (from the directory name), used only as the fallback when
|
|
369
|
-
* a row carries no `storyId` of its own; `file` + `lineNumber` identify the
|
|
370
|
-
* physical row, which is what lets a caller de-duplicate a legacy row that
|
|
371
|
-
* predates `eventId`.
|
|
372
|
-
*
|
|
373
|
-
* Same robustness contract as `forEachLine`: a missing tree, an unreadable
|
|
374
|
-
* directory, a malformed line, or a throwing callback each degrade to a
|
|
375
|
-
* warning rather than a rejection.
|
|
264
|
+
* `context.storyId` is the stream owner (a fallback only); `file` +
|
|
265
|
+
* `lineNumber` de-duplicate legacy rows without `eventId`.
|
|
376
266
|
*
|
|
377
267
|
* @param {(parsed: unknown, context: { storyId: number, file: string, lineNumber: number }) => unknown | Promise<unknown>} cb
|
|
378
268
|
* @param {object} [config]
|
|
@@ -1,48 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* source-classifier.js —
|
|
3
|
-
*
|
|
4
|
-
* `"consumer"` (the host project that consumes the framework via the
|
|
5
|
-
* materialized `.agents/` directory).
|
|
6
|
-
*
|
|
7
|
-
* Used by `signals-writer.js#appendSignal` so every
|
|
8
|
-
* record in `temp/run-<id>/stories/story-<sid>/signals.ndjson` carries an
|
|
9
|
-
* authoritative `source` field, allowing downstream retro consumers to
|
|
10
|
-
* route framework signals back to mandrel and keep consumer signals in
|
|
11
|
-
* the host project (Epic #2547 / Story #2553).
|
|
12
|
-
*
|
|
13
|
-
* Heuristic (Tech Spec #2550):
|
|
14
|
-
* - A signal is `"framework"` when its `failingPath` or `command`
|
|
15
|
-
* mentions any path under the framework's own surface area:
|
|
16
|
-
* - `.agents/`
|
|
17
|
-
* - `.agentrc.json`
|
|
18
|
-
* - `.claude/`
|
|
19
|
-
* - `node .agents/scripts/`
|
|
20
|
-
* …or (Story #4916) names one of the CLI entry points shipped at the
|
|
21
|
-
* top level of `.agents/scripts/` by **bare basename**, so recognition
|
|
22
|
-
* does not depend on how the caller spelled the reference.
|
|
23
|
-
* - Anything else (or empty input) defaults to `"consumer"`. The default
|
|
24
|
-
* is intentional — most friction comes from consumer code touching
|
|
25
|
-
* framework tooling, and we'd rather under-tag than mis-route a
|
|
26
|
-
* consumer signal into the framework retro stream.
|
|
27
|
-
*
|
|
28
|
-
* Story #4824 adds {@link classifySignalSource} alongside it — the
|
|
29
|
-
* record-level entry point the writer now calls, which resolves a
|
|
30
|
-
* runtime-emitted record (no `failingPath`, no `command`) instead of letting
|
|
31
|
-
* the `consumer` default win unconditionally. `classifyPathSource` keeps its
|
|
32
|
-
* two-argument signature and behaviour verbatim.
|
|
33
|
-
*
|
|
34
|
-
* The classifier is pure: no I/O, no logging, no throws on weird input.
|
|
35
|
-
* Callers (the writer) are responsible for swallowing classifier-level
|
|
36
|
-
* faults — but the only way this function can throw is via a programmer
|
|
37
|
-
* error in this file, which would surface during unit testing.
|
|
2
|
+
* source-classifier.js — tag a friction signal `"framework"` or `"consumer"`.
|
|
3
|
+
* Defaults to consumer: under-tagging beats mis-routing. Pure.
|
|
38
4
|
*/
|
|
39
5
|
|
|
40
|
-
/**
|
|
41
|
-
* Framework prefixes, in declaration order. Order is significant only
|
|
42
|
-
* for documentation purposes — any one match returns `"framework"`.
|
|
43
|
-
*
|
|
44
|
-
* @type {readonly string[]}
|
|
45
|
-
*/
|
|
6
|
+
/** @type {readonly string[]} */
|
|
46
7
|
const FRAMEWORK_PREFIXES = Object.freeze([
|
|
47
8
|
'.agents/',
|
|
48
9
|
'.agentrc.json',
|
|
@@ -51,28 +12,9 @@ const FRAMEWORK_PREFIXES = Object.freeze([
|
|
|
51
12
|
]);
|
|
52
13
|
|
|
53
14
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* The prefix scan above recognises a framework script only when the caller
|
|
58
|
-
* spelled a path — `node .agents/scripts/acceptance-eval.js` classifies
|
|
59
|
-
* `framework`, while the same script named bare (`acceptance-eval.js --story
|
|
60
|
-
* 4901`) matched no prefix and fell through to `consumer`, so a real framework
|
|
61
|
-
* defect was routed as consumer-actionable and discarded. Recognition must not
|
|
62
|
-
* depend on how the caller spelled the reference.
|
|
63
|
-
*
|
|
64
|
-
* Kept as **static data**, not a directory read: `classifySignalSource` is
|
|
65
|
-
* called once per signal and MUST stay pure — no filesystem I/O at classify
|
|
66
|
-
* time. The sync test in
|
|
67
|
-
* `tests/lib/observability/source-classifier.test.js` reads the real directory
|
|
68
|
-
* and fails when a script is added, renamed, or removed without this list
|
|
69
|
-
* being updated, so the set cannot go stale and silently restore the blind
|
|
70
|
-
* spot.
|
|
71
|
-
*
|
|
72
|
-
* Scoped to the top level deliberately: those are the entry points a command
|
|
73
|
-
* line names. Library modules under `.agents/scripts/lib/` carry generic
|
|
74
|
-
* basenames (`index.js`, `config.js`) that a consumer command could plausibly
|
|
75
|
-
* name, and widening to them would trade one mis-route for another.
|
|
15
|
+
* Top-level `.agents/scripts/` CLIs, so a bare basename classifies like its
|
|
16
|
+
* path. Static (classification is I/O-free); a sync test pins it to the
|
|
17
|
+
* directory. `lib/` basenames are too generic to include.
|
|
76
18
|
*
|
|
77
19
|
* @type {readonly string[]}
|
|
78
20
|
*/
|
|
@@ -85,28 +27,15 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
|
|
|
85
27
|
'audit-to-stories.js',
|
|
86
28
|
'boot-sweep.js',
|
|
87
29
|
'bootstrap.js',
|
|
88
|
-
'check-action-pinning.js',
|
|
89
30
|
'check-arch-cycles.js',
|
|
90
|
-
'check-audit-attribution.js',
|
|
91
|
-
'check-baseline-drift.js',
|
|
92
|
-
'check-baseline-scope.js',
|
|
93
31
|
'check-baselines.js',
|
|
94
32
|
'check-context-budget.js',
|
|
95
33
|
'check-cyclomatic.js',
|
|
96
34
|
'check-dead-exports.js',
|
|
97
35
|
'check-doc-links.js',
|
|
98
|
-
'check-generated-validator.js',
|
|
99
36
|
'check-gherkin-corpus.js',
|
|
100
|
-
'check-knip-entries.js',
|
|
101
|
-
'check-lifecycle-lint.js',
|
|
102
|
-
'check-pinned-override-notes.js',
|
|
103
|
-
'check-schema-references.js',
|
|
104
|
-
'check-test-portability.js',
|
|
105
37
|
'check-test-temp-hygiene.js',
|
|
106
38
|
'check-windows-git-perf.js',
|
|
107
|
-
'check-workflow-citations.js',
|
|
108
|
-
'check-workflow-cli-lint.js',
|
|
109
|
-
'check-workflow-timeouts.js',
|
|
110
39
|
'ceremony-derive.js',
|
|
111
40
|
'cleanup-repo-test-temp.js',
|
|
112
41
|
'coverage-capture.js',
|
|
@@ -123,9 +52,7 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
|
|
|
123
52
|
'generate-skills-index.js',
|
|
124
53
|
'generate-workflows-doc.js',
|
|
125
54
|
'git-cleanup.js',
|
|
126
|
-
'install-matrix-assert.js',
|
|
127
55
|
'lint-issue-body.js',
|
|
128
|
-
'lint-label-vocabulary.js',
|
|
129
56
|
'mandrel-update-preflight.js',
|
|
130
57
|
'merge-baseline.js',
|
|
131
58
|
'nav-registry-diff.js',
|
|
@@ -134,21 +61,14 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
|
|
|
134
61
|
'plan-critics.js',
|
|
135
62
|
'plan-persist.js',
|
|
136
63
|
'plan-run-epilogue.js',
|
|
137
|
-
'post-structured-comment.js',
|
|
138
64
|
'pr-watch-with-update.js',
|
|
139
|
-
'provision-git-hooks.js',
|
|
140
|
-
'prune-baseline-orphans.js',
|
|
141
65
|
'prune-plan-run-labels.js',
|
|
142
66
|
'quality-preview.js',
|
|
143
67
|
'quality-watch.js',
|
|
144
68
|
'resolve-doc-tiers.js',
|
|
145
69
|
'resolve-stories.js',
|
|
146
70
|
'resync-status-column.js',
|
|
147
|
-
'run-coverage.js',
|
|
148
|
-
'run-lint.js',
|
|
149
|
-
'run-test-profile.js',
|
|
150
71
|
'run-tests.js',
|
|
151
|
-
'run-verify.js',
|
|
152
72
|
'single-story-close.js',
|
|
153
73
|
'single-story-confirm-merge.js',
|
|
154
74
|
'single-story-init.js',
|
|
@@ -156,38 +76,22 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
|
|
|
156
76
|
'sync-agentrc.js',
|
|
157
77
|
'sync-claude-agents.js',
|
|
158
78
|
'sync-claude-commands.js',
|
|
159
|
-
'test-isolate.js',
|
|
160
79
|
'test-wrapper.js',
|
|
161
80
|
'update-coverage-baseline.js',
|
|
162
81
|
'update-crap-baseline.js',
|
|
163
|
-
'update-dead-exports-baseline.js',
|
|
164
82
|
'update-duplication-baseline.js',
|
|
165
83
|
'update-maintainability-baseline.js',
|
|
166
84
|
'update-ticket-state.js',
|
|
167
85
|
'validate-skills.js',
|
|
168
86
|
]);
|
|
169
87
|
|
|
170
|
-
/**
|
|
171
|
-
* Membership index over {@link FRAMEWORK_SCRIPT_BASENAMES}, built once at
|
|
172
|
-
* module load so the per-signal scan is a hash lookup.
|
|
173
|
-
*
|
|
174
|
-
* @type {ReadonlySet<string>}
|
|
175
|
-
*/
|
|
88
|
+
/** @type {ReadonlySet<string>} */
|
|
176
89
|
const FRAMEWORK_SCRIPT_BASENAME_SET = new Set(FRAMEWORK_SCRIPT_BASENAMES);
|
|
177
90
|
|
|
178
|
-
/**
|
|
179
|
-
* Characters a shell-ish command line can wrap a token in. Stripped from both
|
|
180
|
-
* ends before the membership test so `"acceptance-eval.js",` still resolves.
|
|
181
|
-
*
|
|
182
|
-
* @type {RegExp}
|
|
183
|
-
*/
|
|
91
|
+
/** @type {RegExp} */
|
|
184
92
|
const TOKEN_TRIM = /^[\s'"`(,;:]+|[\s'"`),;:]+$/g;
|
|
185
93
|
|
|
186
94
|
/**
|
|
187
|
-
* Normalise a value to a string for prefix scanning. Anything that is not
|
|
188
|
-
* a string (undefined, null, numbers, objects) becomes the empty string,
|
|
189
|
-
* which scans clean against every framework prefix.
|
|
190
|
-
*
|
|
191
95
|
* @param {unknown} value
|
|
192
96
|
* @returns {string}
|
|
193
97
|
*/
|
|
@@ -197,11 +101,7 @@ function toScanString(value) {
|
|
|
197
101
|
}
|
|
198
102
|
|
|
199
103
|
/**
|
|
200
|
-
*
|
|
201
|
-
* substring. We use `includes` (not `startsWith`) because a command line
|
|
202
|
-
* like `node .agents/scripts/single-story-init.js` carries the prefix in the
|
|
203
|
-
* middle, and a failing-path like `repo/.agents/foo.js` may carry an
|
|
204
|
-
* absolute prefix.
|
|
104
|
+
* Substring match: prefixes appear mid-command and under absolute paths.
|
|
205
105
|
*
|
|
206
106
|
* @param {string} haystack
|
|
207
107
|
* @returns {boolean}
|
|
@@ -215,14 +115,7 @@ function containsFrameworkPrefix(haystack) {
|
|
|
215
115
|
}
|
|
216
116
|
|
|
217
117
|
/**
|
|
218
|
-
*
|
|
219
|
-
* basename** — no path segment at all (Story #4916).
|
|
220
|
-
*
|
|
221
|
-
* Whitespace-tokenised and matched whole: only a token that *equals* a known
|
|
222
|
-
* basename counts. A token carrying any path segment is deliberately left to
|
|
223
|
-
* {@link containsFrameworkPrefix} — `./tools/notify.js` is the consumer's own
|
|
224
|
-
* script and must stay `consumer`, while `.agents/scripts/notify.js` already
|
|
225
|
-
* matches a prefix. Likewise `my-notify.js` is not `notify.js`.
|
|
118
|
+
* Exact token match only: `./tools/notify.js` is the consumer's own script.
|
|
226
119
|
*
|
|
227
120
|
* @param {string} haystack
|
|
228
121
|
* @returns {boolean}
|
|
@@ -237,13 +130,6 @@ function containsFrameworkScriptBasename(haystack) {
|
|
|
237
130
|
}
|
|
238
131
|
|
|
239
132
|
/**
|
|
240
|
-
* True when `haystack` names the framework's own surface, by either
|
|
241
|
-
* recognition route: a path prefix, or a bare framework-script basename.
|
|
242
|
-
*
|
|
243
|
-
* Purely additive over {@link containsFrameworkPrefix} — every string that
|
|
244
|
-
* matched a prefix still matches here, so widening can only ever move a
|
|
245
|
-
* classification from `consumer` to `framework`, never the reverse.
|
|
246
|
-
*
|
|
247
133
|
* @param {string} haystack
|
|
248
134
|
* @returns {boolean}
|
|
249
135
|
*/
|
|
@@ -253,27 +139,10 @@ function namesFrameworkSurface(haystack) {
|
|
|
253
139
|
}
|
|
254
140
|
|
|
255
141
|
/**
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
* Both arguments are best-effort: pass whatever the detector already has
|
|
259
|
-
* (the failing file path, the failing command line, or both). When both
|
|
260
|
-
* are empty / non-string, returns `"consumer"` — the safe default for
|
|
261
|
-
* routing.
|
|
262
|
-
*
|
|
263
|
-
* Framework-wins: if either input matches a framework prefix, the result
|
|
264
|
-
* is `"framework"` even when the other input looks consumer-shaped. This
|
|
265
|
-
* matters for mixed cases like a consumer test invoking
|
|
266
|
-
* `node .agents/scripts/single-story-init.js` — that's framework friction even
|
|
267
|
-
* though the failing test path lives under the consumer.
|
|
268
|
-
*
|
|
269
|
-
* Either input matches on a framework path prefix **or** on a bare framework
|
|
270
|
-
* script basename (Story #4916), so `single-story-close.js --story 4906` is
|
|
271
|
-
* recognised exactly like its fully-pathed spelling.
|
|
142
|
+
* Framework wins if either input names it.
|
|
272
143
|
*
|
|
273
|
-
* @param {unknown} failingPath
|
|
274
|
-
*
|
|
275
|
-
* @param {unknown} command The command line the signal blames
|
|
276
|
-
* (e.g. `"node .agents/scripts/single-story-init.js"`).
|
|
144
|
+
* @param {unknown} failingPath
|
|
145
|
+
* @param {unknown} command
|
|
277
146
|
* @returns {"framework"|"consumer"}
|
|
278
147
|
*/
|
|
279
148
|
export function classifyPathSource(failingPath, command) {
|
|
@@ -285,33 +154,17 @@ export function classifyPathSource(failingPath, command) {
|
|
|
285
154
|
}
|
|
286
155
|
|
|
287
156
|
/**
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
*
|
|
291
|
-
* Kept as a local literal rather than imported from
|
|
292
|
-
* `RUNTIME_FRICTION_CATEGORIES.TOOL_DEGRADED` because `runtime-friction.js`
|
|
293
|
-
* imports `signals-writer.js`, which imports this module — the import would
|
|
294
|
-
* close a cycle for a single string. The unit test asserts the two spellings
|
|
295
|
-
* agree, so the duplication cannot drift silently.
|
|
157
|
+
* Literal copy of `RUNTIME_FRICTION_CATEGORIES.TOOL_DEGRADED` (importing it
|
|
158
|
+
* would close a cycle); a test pins them together.
|
|
296
159
|
*
|
|
297
160
|
* @type {string}
|
|
298
161
|
*/
|
|
299
162
|
const TOOL_DEGRADED_CATEGORY = 'tool-degraded';
|
|
300
163
|
|
|
301
|
-
/**
|
|
302
|
-
* Detail keys whose free text names the surface a runtime record blames.
|
|
303
|
-
* Scanned (step 2 below) because a runtime emitter puts the framework path
|
|
304
|
-
* it was executing here, not in `failingPath` / `command`.
|
|
305
|
-
*
|
|
306
|
-
* @type {readonly string[]}
|
|
307
|
-
*/
|
|
164
|
+
/** @type {readonly string[]} */
|
|
308
165
|
const DETAIL_SCAN_KEYS = Object.freeze(['reason', 'surface', 'phase']);
|
|
309
166
|
|
|
310
167
|
/**
|
|
311
|
-
* True when `value` is a non-empty string — the test for "the operator (or a
|
|
312
|
-
* detector) actually supplied this field", as opposed to a runtime emitter
|
|
313
|
-
* that leaves it absent.
|
|
314
|
-
*
|
|
315
168
|
* @param {unknown} value
|
|
316
169
|
* @returns {boolean}
|
|
317
170
|
*/
|
|
@@ -320,8 +173,6 @@ function isSupplied(value) {
|
|
|
320
173
|
}
|
|
321
174
|
|
|
322
175
|
/**
|
|
323
|
-
* Concatenate the scannable free text out of a record's `details` payload.
|
|
324
|
-
*
|
|
325
176
|
* @param {unknown} details
|
|
326
177
|
* @returns {string}
|
|
327
178
|
*/
|
|
@@ -337,45 +188,12 @@ function detailsScanText(details) {
|
|
|
337
188
|
}
|
|
338
189
|
|
|
339
190
|
/**
|
|
340
|
-
*
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
*
|
|
344
|
-
* prefix in an operator-supplied `failingPath` / `command`. Every
|
|
345
|
-
* runtime-emitted friction record (`runtime-friction.js`) populates neither
|
|
346
|
-
* field, so the `consumer` default always won and the framework limb of the
|
|
347
|
-
* feedback loop was unreachable — 78% of real records mis-tagged.
|
|
348
|
-
*
|
|
349
|
-
* The naive repair — "runtime-emitted means framework" — is measurably
|
|
350
|
-
* **wrong**. `close-failed` records from `single-story-close` carry
|
|
351
|
-
* consumer-owned failures (a base-sync conflict in the consumer's own source
|
|
352
|
-
* tree, a consumer `npm run test:coverage` exiting non-zero); tagging those
|
|
353
|
-
* `framework` would flood the framework repo with consumer test failures,
|
|
354
|
-
* which is worse than the current silence.
|
|
355
|
-
*
|
|
356
|
-
* So the discriminator is resolved in four steps, first match wins:
|
|
357
|
-
*
|
|
358
|
-
* 1. An operator-supplied `failingPath` / `path` / `command` /
|
|
359
|
-
* `emitter.command` → the existing {@link classifyPathSource} prefix scan,
|
|
360
|
-
* **unchanged**. A consumer command invoked through `diagnose-friction.js`
|
|
361
|
-
* stays `consumer`.
|
|
362
|
-
* 2. Else the `details` payload's free text (`reason`, `surface`, `phase`)
|
|
363
|
-
* naming a framework prefix → `framework`. A runtime emitter blames its
|
|
364
|
-
* surface here, not in a `command` field.
|
|
365
|
-
* 3. Else `category === "tool-degraded"` → `framework`.
|
|
366
|
-
* `RUNTIME_FRICTION_CATEGORIES.TOOL_DEGRADED` is defined as a tool that
|
|
367
|
-
* failed to *execute* — an operational degradation, not a code finding.
|
|
368
|
-
* The framework's own tooling could not run, which says nothing about
|
|
369
|
-
* consumer code.
|
|
370
|
-
* 4. Else `consumer` — the existing safe default, unchanged.
|
|
371
|
-
*
|
|
372
|
-
* Steps 1, 2 and 4 leave every currently-exercised input byte-identical;
|
|
373
|
-
* step 3 is the limb that was unreachable. There is deliberately no emitter
|
|
374
|
-
* allowlist: nothing to maintain, nothing to rot.
|
|
375
|
-
*
|
|
376
|
-
* Pure, and never throws — the writer's `tagSignalSource` still guards it.
|
|
191
|
+
* First match wins: a supplied path/command → {@link classifyPathSource};
|
|
192
|
+
* `details` text naming a framework prefix; `tool-degraded`; else consumer.
|
|
193
|
+
* "Runtime-emitted means framework" is wrong — `close-failed` often blames
|
|
194
|
+
* consumer code.
|
|
377
195
|
*
|
|
378
|
-
* @param {unknown} record
|
|
196
|
+
* @param {unknown} record
|
|
379
197
|
* @returns {"framework"|"consumer"}
|
|
380
198
|
*/
|
|
381
199
|
export function classifySignalSource(record) {
|
|
@@ -5,34 +5,14 @@ import { orchestrationLogDir } from '../config/temp-paths.js';
|
|
|
5
5
|
import { Logger } from '../Logger.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* (`single-story-init`, `single-story-close`, `single-story-confirm-merge`)
|
|
12
|
-
* historically dumped their whole result object to stdout as pretty-printed
|
|
13
|
-
* JSON:
|
|
14
|
-
*
|
|
15
|
-
* --- STORY CLOSE RESULT ---
|
|
16
|
-
* { ... every field, 2-space indented ... }
|
|
17
|
-
* --- END RESULT ---
|
|
18
|
-
*
|
|
19
|
-
* That blob stays resident for the rest of the session and is re-read as
|
|
20
|
-
* cache every subsequent turn, yet the agent acts on only a handful of its
|
|
21
|
-
* fields (the machine contract is the separate terminal envelope). This helper
|
|
22
|
-
* routes the full detail to a temp log the agent can read on demand and emits
|
|
23
|
-
* a single structured summary line in its place.
|
|
24
|
-
*
|
|
25
|
-
* The escape hatch `MANDREL_RESULT_DETAIL=inline` restores the old inline
|
|
26
|
-
* pretty dump for interactive debugging.
|
|
8
|
+
* Hot-path CLIs log their full result and print one summary line, keeping a
|
|
9
|
+
* pretty JSON blob out of the agent's resident context.
|
|
10
|
+
* `MANDREL_RESULT_DETAIL=inline` restores the inline dump.
|
|
27
11
|
*/
|
|
28
12
|
|
|
29
|
-
/** Env var that restores the legacy inline pretty dump when set to `inline`. */
|
|
30
13
|
const RESULT_DETAIL_ENV = 'MANDREL_RESULT_DETAIL';
|
|
31
14
|
|
|
32
15
|
/**
|
|
33
|
-
* Turn a human label (`STORY CLOSE RESULT`) into a filesystem-safe log
|
|
34
|
-
* basename fragment (`story-close-result`).
|
|
35
|
-
*
|
|
36
16
|
* @param {string} label
|
|
37
17
|
* @returns {string}
|
|
38
18
|
*/
|
|
@@ -46,10 +26,6 @@ function slugify(label) {
|
|
|
46
26
|
}
|
|
47
27
|
|
|
48
28
|
/**
|
|
49
|
-
* The full detail block, byte-compatible with the legacy dump the hot-path
|
|
50
|
-
* scripts used to write to stdout — same markers, same pretty JSON — so a log
|
|
51
|
-
* a human opens reads exactly as the old inline dump did.
|
|
52
|
-
*
|
|
53
29
|
* @param {string} label
|
|
54
30
|
* @param {unknown} result
|
|
55
31
|
* @returns {string}
|
|
@@ -59,24 +35,17 @@ function detailBlock(label, result) {
|
|
|
59
35
|
}
|
|
60
36
|
|
|
61
37
|
/**
|
|
62
|
-
* Route a verbose result object off the agent's turn-resident stdout: write the
|
|
63
|
-
* full pretty detail to a temp log and emit a single-line structured summary in
|
|
64
|
-
* its place.
|
|
65
|
-
*
|
|
66
38
|
* @param {object} args
|
|
67
|
-
* @param {string} args.label
|
|
68
|
-
* @param {unknown} args.result
|
|
69
|
-
* @param {Record<string, unknown>} [args.summary]
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* @param {
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* @param {
|
|
77
|
-
* @param {typeof nodeFs} [args.fs] Filesystem seam (tests).
|
|
78
|
-
* @param {{ info: (m: string) => void }} [args.log] Logger seam (tests).
|
|
79
|
-
* @param {NodeJS.ProcessEnv} [args.env] Environment seam (tests).
|
|
39
|
+
* @param {string} args.label
|
|
40
|
+
* @param {unknown} args.result
|
|
41
|
+
* @param {Record<string, unknown>} [args.summary]
|
|
42
|
+
* @param {string|number} [args.scope] Log-name suffix so concurrent
|
|
43
|
+
* deliveries don't clobber one file.
|
|
44
|
+
* @param {string} [args.logDir]
|
|
45
|
+
* @param {object} [args.config]
|
|
46
|
+
* @param {typeof nodeFs} [args.fs]
|
|
47
|
+
* @param {{ info: (m: string) => void }} [args.log]
|
|
48
|
+
* @param {NodeJS.ProcessEnv} [args.env]
|
|
80
49
|
* @returns {{ logPath: string|null, inline: boolean, error?: string }}
|
|
81
50
|
*/
|
|
82
51
|
export function emitTerseResult({
|
|
@@ -92,7 +61,6 @@ export function emitTerseResult({
|
|
|
92
61
|
} = {}) {
|
|
93
62
|
const body = detailBlock(label, result);
|
|
94
63
|
|
|
95
|
-
// Escape hatch: restore the full inline pretty dump for interactive debugging.
|
|
96
64
|
if (String(env[RESULT_DETAIL_ENV] ?? '').toLowerCase() === 'inline') {
|
|
97
65
|
log.info?.(`\n${body}\n`);
|
|
98
66
|
return { logPath: null, inline: true };
|
|
@@ -110,8 +78,7 @@ export function emitTerseResult({
|
|
|
110
78
|
);
|
|
111
79
|
return { logPath, inline: false };
|
|
112
80
|
} catch (err) {
|
|
113
|
-
// Never lose detail:
|
|
114
|
-
// so the result is still recoverable from the transcript.
|
|
81
|
+
// Never lose detail: fall back to the inline dump.
|
|
115
82
|
log.info?.(`\n${body}\n`);
|
|
116
83
|
return { logPath: null, inline: true, error: err?.message ?? String(err) };
|
|
117
84
|
}
|