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,56 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Doc-tier resolver
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - `alwaysLoaded` — `CLAUDE.md` plus the transitive closure of its
|
|
9
|
-
* `@`-import references (`@AGENTS.md`,
|
|
10
|
-
* `@.agents/instructions.md`, the always-on rules, …).
|
|
11
|
-
* This is the context every session re-pays
|
|
12
|
-
* on every subagent spawn (instructions.md § 4), so it is
|
|
13
|
-
* the primary budget the context-budget ratchet gates.
|
|
14
|
-
* - `mandatoryRead` — the resolved `project.docsContextFiles` set (prefixed
|
|
15
|
-
* by `project.paths.docsRoot`), existing files only. This
|
|
16
|
-
* is the `docsContextFiles` half the Epic AC gates; it
|
|
17
|
-
* skips silently when the set is unconfigured or its
|
|
18
|
-
* files are absent.
|
|
19
|
-
* - `digestVisible` — the situational **Conditional Reads** docs from
|
|
20
|
-
* instructions.md § 3 (`docs/style-guide.md`,
|
|
21
|
-
* `docs/web-routes.md`) — surfaced only when a task
|
|
22
|
-
* touches UI/routing, i.e. visible through the docs
|
|
23
|
-
* digest rather than always read. Existing files only.
|
|
24
|
-
* - `onDemand` — the on-demand `.agents/rules/*.md` set (instructions.md
|
|
25
|
-
* § 1.F): every rule file that is **not** part of the
|
|
26
|
-
* always-on core already captured in `alwaysLoaded`.
|
|
27
|
-
* - `agentBoot` — the role-scoped boot contexts `.agents/agents/*.md`
|
|
28
|
-
* (issue #4478). Each is a standalone system prompt a
|
|
29
|
-
* converted spawn boots on **instead of** the always-loaded
|
|
30
|
-
* closure, so it is budgeted independently (per-file ≤8KB
|
|
31
|
-
* ceiling gated by `check-context-budget.js`).
|
|
32
|
-
* - `workflow` / — the `.agents/workflows/**` read-tier (Story #4752),
|
|
33
|
-
* `workflowOnDemand` resolved as each entry point's transitive
|
|
34
|
-
* markdown-link closure by
|
|
35
|
-
* [`workflow-closure.js`](workflow-closure.js): the files
|
|
36
|
-
* an entry point's `mandatoryReads:` frontmatter forces
|
|
37
|
-
* you to read (`workflow`, gated) versus the reachable
|
|
38
|
-
* remainder (`workflowOnDemand`, recorded only).
|
|
39
|
-
*
|
|
40
|
-
* A file that could appear in more than one tier is kept in its **highest**
|
|
41
|
-
* tier only (alwaysLoaded > mandatoryRead > digestVisible > onDemand), so the
|
|
42
|
-
* arrays partition the doc set with no double-counting. `agentBoot` is disjoint
|
|
43
|
-
* from the read-tiers (it lives under `.agents/agents/`, not the doc/rules set),
|
|
44
|
-
* and so are the workflow tiers (confined to `.agents/workflows/`).
|
|
45
|
-
*
|
|
46
|
-
* The closure is discovered by parsing `@`-import references and following
|
|
47
|
-
* them recursively (cycle-safe via a visited set). A candidate `@`-token only
|
|
48
|
-
* counts as an import when it resolves to an existing repo file, which
|
|
49
|
-
* naturally filters prose mentions (`@[USERNAME]`, `noreply@example.com`,
|
|
50
|
-
* backtick-wrapped `` `@`-imported `` phrasing).
|
|
51
|
-
*
|
|
52
|
-
* Security (security-baseline § 5 — Data Leakage & Logging): every function
|
|
53
|
-
* emits only repo-relative paths and byte counts — never file contents.
|
|
2
|
+
* Doc-tier resolver: partition the repo's docs into read-tiers with byte
|
|
3
|
+
* sizes for the context-budget ratchet (`alwaysLoaded` = CLAUDE.md's
|
|
4
|
+
* `@`-import closure; `agentBoot` and `workflowOnDemand` are recorded, not
|
|
5
|
+
* gated). A path lives only in its highest tier. Emits paths and byte
|
|
6
|
+
* counts, never file contents.
|
|
54
7
|
*/
|
|
55
8
|
|
|
56
9
|
import nodeFs from 'node:fs';
|
|
@@ -58,38 +11,24 @@ import path from 'node:path';
|
|
|
58
11
|
import { resolveWorkflowClosures } from './workflow-closure.js';
|
|
59
12
|
|
|
60
13
|
/**
|
|
61
|
-
* Basename of the always-loaded entry document (the root of the closure).
|
|
62
14
|
* @type {string}
|
|
63
15
|
*/
|
|
64
16
|
const ENTRY_DOC = 'CLAUDE.md';
|
|
65
17
|
|
|
66
18
|
/**
|
|
67
|
-
* Always-on core rule files (instructions.md § 1.F). These live in the
|
|
68
|
-
* `alwaysLoaded` closure (imported by `CLAUDE.md`); every other
|
|
69
|
-
* `.agents/rules/*.md` file is `onDemand`.
|
|
70
19
|
* @type {string[]}
|
|
71
20
|
*/
|
|
72
21
|
const ALWAYS_ON_RULES = ['security-baseline.md', 'git-conventions.md'];
|
|
73
22
|
|
|
74
23
|
/**
|
|
75
|
-
* Conditional-read docs (instructions.md § 3 — "Conditional Reads"), resolved
|
|
76
|
-
* against `project.paths.docsRoot`. Present in the `digestVisible` tier when
|
|
77
|
-
* they exist.
|
|
78
24
|
* @type {string[]}
|
|
79
25
|
*/
|
|
80
26
|
const CONDITIONAL_DOCS = ['style-guide.md', 'web-routes.md'];
|
|
81
27
|
|
|
82
|
-
/**
|
|
83
|
-
* Match `@`-import tokens: an `@` at start-of-line or after whitespace,
|
|
84
|
-
* followed by a path token that stops at whitespace or common closing
|
|
85
|
-
* punctuation. The resolved-file existence check downstream is the real
|
|
86
|
-
* filter; this regex only harvests candidates.
|
|
87
|
-
*/
|
|
28
|
+
/** Candidates only; the file-existence check filters out prose `@` tokens. */
|
|
88
29
|
const IMPORT_RE = /(?:^|\s)@([^\s'"`)\]}>,]+)/gm;
|
|
89
30
|
|
|
90
31
|
/**
|
|
91
|
-
* Default fs surface — a small subset of `node:fs` so callers can inject a
|
|
92
|
-
* fixture double in tests without touching the real filesystem.
|
|
93
32
|
* @typedef {{
|
|
94
33
|
* existsSync: (p: string) => boolean,
|
|
95
34
|
* readFileSync: (p: string, enc: string) => string,
|
|
@@ -98,17 +37,15 @@ const IMPORT_RE = /(?:^|\s)@([^\s'"`)\]}>,]+)/gm;
|
|
|
98
37
|
*/
|
|
99
38
|
|
|
100
39
|
/**
|
|
101
|
-
*
|
|
102
|
-
* or `:` (sentence punctuation) is trimmed so `@AGENTS.md.` still resolves.
|
|
40
|
+
* Trailing `.`/`:` is trimmed so `@AGENTS.md.` still resolves.
|
|
103
41
|
*
|
|
104
42
|
* @param {string} source
|
|
105
|
-
* @returns {string[]}
|
|
43
|
+
* @returns {string[]}
|
|
106
44
|
*/
|
|
107
45
|
export function parseImportSpecifiers(source) {
|
|
108
46
|
const specs = [];
|
|
109
47
|
for (const m of String(source ?? '').matchAll(IMPORT_RE)) {
|
|
110
48
|
let spec = m[1];
|
|
111
|
-
// Strip trailing sentence punctuation that the greedy class allowed in.
|
|
112
49
|
while (spec.length > 0 && (spec.endsWith('.') || spec.endsWith(':'))) {
|
|
113
50
|
spec = spec.slice(0, -1);
|
|
114
51
|
}
|
|
@@ -118,10 +55,8 @@ export function parseImportSpecifiers(source) {
|
|
|
118
55
|
}
|
|
119
56
|
|
|
120
57
|
/**
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
* @param {string} root absolute repo root
|
|
124
|
-
* @param {string} abs absolute path
|
|
58
|
+
* @param {string} root
|
|
59
|
+
* @param {string} abs
|
|
125
60
|
* @returns {string}
|
|
126
61
|
*/
|
|
127
62
|
function toRepoRel(root, abs) {
|
|
@@ -129,11 +64,8 @@ function toRepoRel(root, abs) {
|
|
|
129
64
|
}
|
|
130
65
|
|
|
131
66
|
/**
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
* @param {string} root absolute repo root
|
|
136
|
-
* @param {string} rel repo-relative path
|
|
67
|
+
* @param {string} root
|
|
68
|
+
* @param {string} rel
|
|
137
69
|
* @param {FsLike} fs
|
|
138
70
|
* @returns {{ path: string, bytes: number } | null}
|
|
139
71
|
*/
|
|
@@ -150,16 +82,11 @@ function fileEntry(root, rel, fs) {
|
|
|
150
82
|
}
|
|
151
83
|
|
|
152
84
|
/**
|
|
153
|
-
*
|
|
154
|
-
* recursively parsing `@`-import references. Cycle-safe (a visited set keyed
|
|
155
|
-
* by repo-relative path). Nested imports resolve relative to the importing
|
|
156
|
-
* file's directory (Claude Code `@`-import semantics). Non-resolving `@`-tokens
|
|
157
|
-
* are ignored, so prose mentions never pollute the closure.
|
|
85
|
+
* Cycle-safe; nested imports resolve relative to the importing file.
|
|
158
86
|
*
|
|
159
|
-
* @param {string} root
|
|
87
|
+
* @param {string} root
|
|
160
88
|
* @param {{ fs?: FsLike }} [opts]
|
|
161
|
-
* @returns {Array<{ path: string, bytes: number }>}
|
|
162
|
-
* `CLAUDE.md` is absent
|
|
89
|
+
* @returns {Array<{ path: string, bytes: number }>}
|
|
163
90
|
*/
|
|
164
91
|
export function resolveAlwaysLoadedClosure(root, { fs = nodeFs } = {}) {
|
|
165
92
|
const entryAbs = path.resolve(root, ENTRY_DOC);
|
|
@@ -200,13 +127,10 @@ export function resolveAlwaysLoadedClosure(root, { fs = nodeFs } = {}) {
|
|
|
200
127
|
}
|
|
201
128
|
|
|
202
129
|
/**
|
|
203
|
-
*
|
|
204
|
-
* prefixed by `project.paths.docsRoot`. Resolves new-shape
|
|
205
|
-
* `project.docsContextFiles` first and falls back to the legacy top-level
|
|
206
|
-
* key, so a config written against either shape yields the same list.
|
|
130
|
+
* Reads `project.*` first, then the legacy top-level keys.
|
|
207
131
|
*
|
|
208
|
-
* @param {object} config
|
|
209
|
-
* @returns {string[]}
|
|
132
|
+
* @param {object} config
|
|
133
|
+
* @returns {string[]}
|
|
210
134
|
*/
|
|
211
135
|
export function docsContextPaths(config) {
|
|
212
136
|
const project = config?.project ?? config;
|
|
@@ -221,13 +145,7 @@ export function docsContextPaths(config) {
|
|
|
221
145
|
}
|
|
222
146
|
|
|
223
147
|
/**
|
|
224
|
-
*
|
|
225
|
-
* partitioned so no path appears in more than one tier (highest tier wins).
|
|
226
|
-
* `workflowClosure` rides alongside the tiers as the per-entry-point workflow
|
|
227
|
-
* measurement (Story #4752) — its `reachableTotalBytes` is a recorded drift
|
|
228
|
-
* signal, never a gate.
|
|
229
|
-
*
|
|
230
|
-
* @param {object} config resolved config (`resolveConfig()` output)
|
|
148
|
+
* @param {object} config
|
|
231
149
|
* @param {{ root?: string, fs?: FsLike }} [opts]
|
|
232
150
|
* @returns {{
|
|
233
151
|
* tiers: {
|
|
@@ -264,33 +182,22 @@ export function resolveDocTiers(
|
|
|
264
182
|
return out.sort((a, b) => a.path.localeCompare(b.path));
|
|
265
183
|
};
|
|
266
184
|
|
|
267
|
-
//
|
|
268
|
-
// a lower tier never re-lists a closure member.
|
|
185
|
+
// Pre-claim the closure so a lower tier never re-lists a member.
|
|
269
186
|
const alwaysLoaded = resolveAlwaysLoadedClosure(root, { fs });
|
|
270
187
|
for (const e of alwaysLoaded) claimed.add(e.path);
|
|
271
188
|
|
|
272
|
-
// 2. mandatory-read: resolved docsContextFiles (existing files only).
|
|
273
189
|
const docsRoot =
|
|
274
190
|
config?.project?.paths?.docsRoot ?? config?.paths?.docsRoot ?? 'docs';
|
|
275
191
|
const mandatoryRead = collect(docsContextPaths(config));
|
|
276
192
|
|
|
277
|
-
// 3. digest-visible: situational Conditional-Read docs.
|
|
278
193
|
const digestVisible = collect(
|
|
279
194
|
CONDITIONAL_DOCS.map((f) => path.posix.join(docsRoot, f)),
|
|
280
195
|
);
|
|
281
196
|
|
|
282
|
-
// 4. on-demand: every .agents/rules/*.md that is not an always-on core rule
|
|
283
|
-
// (the always-on ones already live in the alwaysLoaded closure).
|
|
284
197
|
const onDemand = collect(listOnDemandRules(root, fs));
|
|
285
198
|
|
|
286
|
-
// 5. agent-boot: role-scoped boot contexts .agents/agents/*.md (#4478). These
|
|
287
|
-
// are standalone system prompts, disjoint from the doc read-tiers.
|
|
288
199
|
const agentBoot = collect(listAgentDefs(root, fs));
|
|
289
200
|
|
|
290
|
-
// 6. workflow: each entry point's transitive markdown-link closure (#4752),
|
|
291
|
-
// split into the gated mandatory set and the recorded on-demand remainder.
|
|
292
|
-
// The walk is confined to `.agents/workflows/**`, and `collect` still
|
|
293
|
-
// de-dupes, so no path is counted against two tiers.
|
|
294
201
|
const closure = resolveWorkflowClosures(root, { fs });
|
|
295
202
|
const workflow = collect(closure.mandatoryFiles.map((e) => e.path));
|
|
296
203
|
const workflowOnDemand = collect(closure.onDemandFiles.map((e) => e.path));
|
|
@@ -314,10 +221,7 @@ export function resolveDocTiers(
|
|
|
314
221
|
}
|
|
315
222
|
|
|
316
223
|
/**
|
|
317
|
-
*
|
|
318
|
-
* `.agents/agents/*.md`. Returns [] when the directory is absent.
|
|
319
|
-
*
|
|
320
|
-
* @param {string} root absolute repo root
|
|
224
|
+
* @param {string} root
|
|
321
225
|
* @param {FsLike} fs
|
|
322
226
|
* @returns {string[]}
|
|
323
227
|
*/
|
|
@@ -336,11 +240,7 @@ function listAgentDefs(root, fs) {
|
|
|
336
240
|
}
|
|
337
241
|
|
|
338
242
|
/**
|
|
339
|
-
*
|
|
340
|
-
* *.md` whose basename is not an always-on core rule. Returns [] when the
|
|
341
|
-
* rules directory is absent.
|
|
342
|
-
*
|
|
343
|
-
* @param {string} root absolute repo root
|
|
243
|
+
* @param {string} root
|
|
344
244
|
* @param {FsLike} fs
|
|
345
245
|
* @returns {string[]}
|
|
346
246
|
*/
|
|
@@ -359,8 +259,6 @@ function listOnDemandRules(root, fs) {
|
|
|
359
259
|
}
|
|
360
260
|
|
|
361
261
|
/**
|
|
362
|
-
* Sum the `bytes` of every entry in a tier array.
|
|
363
|
-
*
|
|
364
262
|
* @param {Array<{ bytes: number }>} entries
|
|
365
263
|
* @returns {number}
|
|
366
264
|
*/
|
|
@@ -1,31 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* duplicate-search.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* seed / seed-file / tickets corpus before new Stories are created.
|
|
6
|
-
* Returns ranked candidates with an overlap score and URL so the host
|
|
7
|
-
* LLM can pause for HITL confirmation.
|
|
8
|
-
*
|
|
9
|
-
* Design notes:
|
|
10
|
-
* - Prefer `provider.searchIssues` to narrow open Stories server-side
|
|
11
|
-
* (`label:"type::story" state:open` + top seed tokens), capped at
|
|
12
|
-
* ~100 hits, then rank that set. Fall back to `listIssuesByLabel`
|
|
13
|
-
* when search errors, is unavailable, or returns **nothing** (same
|
|
14
|
-
* try/catch pattern as `TicketGateway.getTickets`).
|
|
15
|
-
* - The narrowing query is deliberately weak (Story #4541). GitHub ANDs
|
|
16
|
-
* free-text terms, so the former 8-token query demanded that a candidate
|
|
17
|
-
* contain all eight of a multi-sentence seed's longest words — which no
|
|
18
|
-
* real Story does. Gate #1 duplicate triage therefore reported "no
|
|
19
|
-
* candidates" on every realistic seed while looking perfectly healthy.
|
|
20
|
-
* Search is now a cheap best-case narrowing over a handful of tokens; an
|
|
21
|
-
* empty result is treated as "search did not help", not "no duplicates",
|
|
22
|
-
* and falls through to the label listing whose Jaccard ranker has real
|
|
23
|
-
* recall.
|
|
24
|
-
* - Scoring is intentionally simple (token Jaccard over title + body).
|
|
25
|
-
* It is a triage signal, not a semantic-search replacement.
|
|
26
|
-
* - Provider errors on the list fallback propagate verbatim — the
|
|
27
|
-
* caller is responsible for translating them into a friction comment
|
|
28
|
-
* or operator-visible failure.
|
|
2
|
+
* duplicate-search.js — rank open Stories overlapping a planning seed (token
|
|
3
|
+
* Jaccard over title + body: a triage signal, not semantic search). List
|
|
4
|
+
* fallback errors propagate verbatim to the caller.
|
|
29
5
|
*/
|
|
30
6
|
|
|
31
7
|
import { Logger } from './Logger.js';
|
|
@@ -88,23 +64,11 @@ const STOPWORDS = new Set([
|
|
|
88
64
|
|
|
89
65
|
const DEFAULT_MIN_SCORE = 0.15;
|
|
90
66
|
const DEFAULT_MAX_RESULTS = 5;
|
|
91
|
-
/**
|
|
92
|
-
* How many seed tokens to pass as free-text search terms.
|
|
93
|
-
*
|
|
94
|
-
* GitHub ANDs these, so the cap is a precision/recall dial pointing the
|
|
95
|
-
* wrong way: every extra token shrinks the candidate set. Three is a
|
|
96
|
-
* best-case narrowing that can plausibly hit on a focused seed; anything
|
|
97
|
-
* beyond that reliably matched nothing on a multi-sentence one (Story
|
|
98
|
-
* #4541). Recall does not rest on this number — an empty result falls back
|
|
99
|
-
* to label-listing plus client-side ranking.
|
|
100
|
-
*/
|
|
67
|
+
/** GitHub ANDs terms, so more tokens match nothing; recall is the fallback's. */
|
|
101
68
|
const DEFAULT_SEARCH_TOKEN_CAP = 3;
|
|
102
|
-
/** Hard cap on search hits ranked client-side (~one Search API page). */
|
|
103
69
|
const SEARCH_RESULT_CAP = 100;
|
|
104
70
|
|
|
105
71
|
/**
|
|
106
|
-
* Tokenize freeform text into a deduplicated set of meaningful words.
|
|
107
|
-
*
|
|
108
72
|
* @param {string} text
|
|
109
73
|
* @returns {Set<string>}
|
|
110
74
|
*/
|
|
@@ -119,8 +83,7 @@ export function tokenize(text) {
|
|
|
119
83
|
}
|
|
120
84
|
|
|
121
85
|
/**
|
|
122
|
-
*
|
|
123
|
-
* Longer tokens first (specificity proxy), then alphabetical for stability.
|
|
86
|
+
* Longest first (specificity), then alphabetical.
|
|
124
87
|
*
|
|
125
88
|
* @param {string} seed
|
|
126
89
|
* @param {number} [maxTokens]
|
|
@@ -134,9 +97,6 @@ export function pickSearchTokens(seed, maxTokens = DEFAULT_SEARCH_TOKEN_CAP) {
|
|
|
134
97
|
}
|
|
135
98
|
|
|
136
99
|
/**
|
|
137
|
-
* Build the `/search/issues` query for open Stories overlapping a seed.
|
|
138
|
-
* Repo scoping is left to `provider.searchIssues`.
|
|
139
|
-
*
|
|
140
100
|
* @param {string} seed
|
|
141
101
|
* @returns {string}
|
|
142
102
|
*/
|
|
@@ -146,8 +106,6 @@ export function buildOpenStorySearchQuery(seed) {
|
|
|
146
106
|
}
|
|
147
107
|
|
|
148
108
|
/**
|
|
149
|
-
* Compute the Jaccard overlap between two token sets.
|
|
150
|
-
*
|
|
151
109
|
* @param {Set<string>} a
|
|
152
110
|
* @param {Set<string>} b
|
|
153
111
|
* @returns {number} 0..1
|
|
@@ -161,9 +119,6 @@ export function overlapScore(a, b) {
|
|
|
161
119
|
}
|
|
162
120
|
|
|
163
121
|
/**
|
|
164
|
-
* Build the issue URL for an id. The candidate exposes the URL so the
|
|
165
|
-
* HITL pause can render clickable links without a second round-trip.
|
|
166
|
-
*
|
|
167
122
|
* @param {number|string} id
|
|
168
123
|
* @param {{ owner?: string, repo?: string }} [opts]
|
|
169
124
|
* @returns {string}
|
|
@@ -178,8 +133,6 @@ function buildIssueUrl(id, opts = {}) {
|
|
|
178
133
|
}
|
|
179
134
|
|
|
180
135
|
/**
|
|
181
|
-
* Normalize a provider issue (list or search hit) into the ranking shape.
|
|
182
|
-
*
|
|
183
136
|
* @param {object} issue
|
|
184
137
|
* @returns {{ id: number, title: string, body: string, url?: string }}
|
|
185
138
|
*/
|
|
@@ -193,9 +146,6 @@ function normalizeIssue(issue) {
|
|
|
193
146
|
}
|
|
194
147
|
|
|
195
148
|
/**
|
|
196
|
-
* Rank a pre-fetched open-Story list against a seed corpus.
|
|
197
|
-
* Pure helper shared by the provider-backed search and tests.
|
|
198
|
-
*
|
|
199
149
|
* @param {{
|
|
200
150
|
* seed: string,
|
|
201
151
|
* openStories: Array<{ id:number, title?:string, body?:string, url?:string }>,
|
|
@@ -253,8 +203,6 @@ function rankOpenStoryDuplicates({
|
|
|
253
203
|
}
|
|
254
204
|
|
|
255
205
|
/**
|
|
256
|
-
* Server-narrowed open-Story fetch via `/search/issues`.
|
|
257
|
-
*
|
|
258
206
|
* @param {object} provider
|
|
259
207
|
* @param {string} seed
|
|
260
208
|
* @returns {Promise<Array<{ id:number, title:string, body:string, url?:string }>>}
|
|
@@ -267,8 +215,6 @@ async function fetchOpenStoriesViaSearch(provider, seed) {
|
|
|
267
215
|
}
|
|
268
216
|
|
|
269
217
|
/**
|
|
270
|
-
* Full open-Story backlog via label listing (fallback path).
|
|
271
|
-
*
|
|
272
218
|
* @param {object} provider
|
|
273
219
|
* @returns {Promise<Array<{ id:number, title:string, body:string, url?:string }>>}
|
|
274
220
|
*/
|
|
@@ -287,16 +233,9 @@ async function fetchOpenStoriesViaList(provider) {
|
|
|
287
233
|
}
|
|
288
234
|
|
|
289
235
|
/**
|
|
290
|
-
*
|
|
291
|
-
*
|
|
292
|
-
*
|
|
293
|
-
*
|
|
294
|
-
* The empty-result fallback is the load-bearing one (Story #4541). The
|
|
295
|
-
* narrowing query ANDs seed tokens, so on any real multi-sentence seed it
|
|
296
|
-
* matches nothing — and treating that as an authoritative "no duplicates
|
|
297
|
-
* exist" is what made Gate #1 triage report a clean bill of health while
|
|
298
|
-
* never actually looking. An empty search is evidence about the *query*, not
|
|
299
|
-
* about the backlog.
|
|
236
|
+
* Search first; fall back to the label listing when search errors, is
|
|
237
|
+
* unavailable, or returns no hits. An empty search is evidence about the
|
|
238
|
+
* AND-ed query, not about the backlog.
|
|
300
239
|
*
|
|
301
240
|
* @param {object} provider
|
|
302
241
|
* @param {string} seed
|
|
@@ -337,9 +276,6 @@ async function fetchOpenStoryCandidates(provider, seed) {
|
|
|
337
276
|
}
|
|
338
277
|
|
|
339
278
|
/**
|
|
340
|
-
* Find open Stories whose title + body overlap with the supplied seed
|
|
341
|
-
* above a configurable threshold.
|
|
342
|
-
*
|
|
343
279
|
* @param {{
|
|
344
280
|
* seed: string,
|
|
345
281
|
* provider: import('./ITicketingProvider.js').ITicketingProvider,
|
|
@@ -3,21 +3,9 @@ import path from 'node:path';
|
|
|
3
3
|
import { Logger } from './Logger.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* - **Quoted** (`"…"` / `'…'`): the contents between the opening quote and
|
|
11
|
-
* its matching closing quote are kept **verbatim** — a `#` inside quotes is
|
|
12
|
-
* part of the value, not a comment. Anything after the closing quote is
|
|
13
|
-
* trailing commentary and is discarded.
|
|
14
|
-
* - **Unquoted**: the value ends at the first **unescaped** `#`. A `\#`
|
|
15
|
-
* escape emits a literal `#` and keeps the scan going, so a value that
|
|
16
|
-
* genuinely contains a hash can still be written without quotes.
|
|
17
|
-
*
|
|
18
|
-
* An opening quote with no closing partner is not a quoted value — it falls
|
|
19
|
-
* through to the unquoted rule so a malformed line still yields something
|
|
20
|
-
* rather than swallowing the rest of the file's intent.
|
|
6
|
+
* Quoted values are kept verbatim up to the matching quote (text after it is
|
|
7
|
+
* dropped); unquoted values end at the first unescaped `#` (`\#` is a
|
|
8
|
+
* literal). An unclosed quote falls through to the unquoted rule.
|
|
21
9
|
*
|
|
22
10
|
* @param {string} raw — the text after the `=`, unparsed.
|
|
23
11
|
* @returns {string} The value with any inline comment removed.
|
|
@@ -29,7 +17,6 @@ function parseEnvValue(raw) {
|
|
|
29
17
|
const quote = trimmed.charAt(0);
|
|
30
18
|
if (quote === '"' || quote === "'") {
|
|
31
19
|
const closing = trimmed.indexOf(quote, 1);
|
|
32
|
-
// Verbatim contents: no comment stripping, no unescaping.
|
|
33
20
|
if (closing !== -1) return trimmed.slice(1, closing);
|
|
34
21
|
}
|
|
35
22
|
|
|
@@ -47,23 +34,14 @@ function parseEnvValue(raw) {
|
|
|
47
34
|
return value.trim();
|
|
48
35
|
}
|
|
49
36
|
|
|
50
|
-
/**
|
|
51
|
-
* Auto-load .env from the project root if it exists
|
|
52
|
-
*/
|
|
53
37
|
export function loadEnv(projectRoot) {
|
|
54
38
|
const envPath = path.resolve(projectRoot, '.env');
|
|
55
39
|
let envContent;
|
|
56
40
|
try {
|
|
57
|
-
//
|
|
58
|
-
// TOCTOU race (the file can vanish between the two calls) and double-stats
|
|
59
|
-
// the path. A single read with code-based error handling is both correct
|
|
60
|
-
// and cheaper.
|
|
41
|
+
// A single read, not existsSync + read, avoids a TOCTOU race.
|
|
61
42
|
envContent = fs.readFileSync(envPath, 'utf8');
|
|
62
43
|
} catch (err) {
|
|
63
|
-
// A missing .env is
|
|
64
|
-
// other means, so stay silent. Any other failure (permissions, a
|
|
65
|
-
// directory in place of the file, I/O error) is worth surfacing so the
|
|
66
|
-
// operator gets a one-line hint instead of an opaque silent skip.
|
|
44
|
+
// A missing .env is expected; anything else deserves a one-line hint.
|
|
67
45
|
if (err.code !== 'ENOENT') {
|
|
68
46
|
Logger.warn(
|
|
69
47
|
`env-loader: failed to read ${envPath} (${err.code ?? err.message}); skipping .env load.`,
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Rewrites absolute filesystem paths to repo-relative form, elides
|
|
5
|
-
* `$HOME` / `$USERPROFILE` segments outside the repo, and scrubs
|
|
6
|
-
* token-shaped substrings before error envelopes hit the public CI log.
|
|
7
|
-
*
|
|
8
|
-
* Pure and dependency-free so callers (tests, ad-hoc loggers, the
|
|
9
|
-
* runAsCli default handler) can reuse it without standing up the rest
|
|
10
|
-
* of the cli-utils harness.
|
|
2
|
+
* Error-envelope redactor (CWE-209): repo-relative paths, elided home dir,
|
|
3
|
+
* scrubbed token-shaped strings. Dependency-free.
|
|
11
4
|
*/
|
|
12
5
|
|
|
13
6
|
import path from 'node:path';
|
|
@@ -16,10 +9,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
16
9
|
const REPO_ROOT_CACHE = { value: null };
|
|
17
10
|
|
|
18
11
|
/**
|
|
19
|
-
*
|
|
20
|
-
* heuristic walks up from this file's directory; consumers may override
|
|
21
|
-
* via the `repoRoot` option on `redactErrorMessage`. The result is
|
|
22
|
-
* memoised because the redactor runs in the hot path of error-printing.
|
|
12
|
+
* Memoised — the redactor runs on the error-printing hot path.
|
|
23
13
|
*
|
|
24
14
|
* @returns {string}
|
|
25
15
|
*/
|
|
@@ -34,10 +24,7 @@ export function resolveRepoRoot() {
|
|
|
34
24
|
const TOKEN_SHAPED = /\b(?:gh[pousr]_[A-Za-z0-9_]{20,}|[A-Fa-f0-9]{32,})\b/g;
|
|
35
25
|
|
|
36
26
|
/**
|
|
37
|
-
*
|
|
38
|
-
* `message` to repo-relative form, elide `$HOME` / `$USERPROFILE`
|
|
39
|
-
* outside the repo, and scrub token-shaped substrings (`ghp_*`,
|
|
40
|
-
* `gho_*`, `ghs_*`, `ghu_*`, `ghr_*`, 32+ hex chars).
|
|
27
|
+
* Handles both Windows and POSIX path separators.
|
|
41
28
|
*
|
|
42
29
|
* @param {string|undefined} message
|
|
43
30
|
* @param {object} [options]
|
|
@@ -80,15 +67,8 @@ function pathVariants(p) {
|
|
|
80
67
|
}
|
|
81
68
|
|
|
82
69
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* Precedence (any one is enough to opt in):
|
|
86
|
-
* 1. Explicit `--quiet-errors` flag in `argv`.
|
|
87
|
-
* 2. `AGENT_CLI_QUIET_ERRORS=1` (or `true`) in `env`.
|
|
88
|
-
* 3. `CI=true` (or any other truthy non-empty value) in `env`.
|
|
89
|
-
*
|
|
90
|
-
* Operator workstations stay verbose by default; CI runs (where logs
|
|
91
|
-
* are public on OSS forks) get redaction automatically.
|
|
70
|
+
* On with `--quiet-errors`, `AGENT_CLI_QUIET_ERRORS`, or a truthy `CI` —
|
|
71
|
+
* CI logs are public on OSS forks; workstations stay verbose.
|
|
92
72
|
*
|
|
93
73
|
* @param {string[]} [argv] Defaults to `process.argv.slice(2)`.
|
|
94
74
|
* @param {NodeJS.ProcessEnv} [env] Defaults to `process.env`.
|
|
@@ -111,11 +91,6 @@ function isTruthyEnv(value) {
|
|
|
111
91
|
}
|
|
112
92
|
|
|
113
93
|
/**
|
|
114
|
-
* Format a thrown error for stderr, applying redaction when
|
|
115
|
-
* `parseQuietErrorsFlag()` says we should. Extracted from `runAsCli` so
|
|
116
|
-
* the cli-utils default error handler stays a single expression and the
|
|
117
|
-
* redaction logic lives next to the redactor itself.
|
|
118
|
-
*
|
|
119
94
|
* @param {unknown} err
|
|
120
95
|
* @returns {string}
|
|
121
96
|
*/
|
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* lib/errors/ — canonical home for custom Error subclasses used by the
|
|
3
|
-
* orchestration SDK.
|
|
4
|
-
*
|
|
5
|
-
* Consumers import by class so tests can match on `instanceof` rather than
|
|
6
|
-
* message substrings.
|
|
7
|
-
*/
|
|
1
|
+
/** Custom Error subclasses; match on `instanceof`, not message text. */
|
|
8
2
|
|
|
9
3
|
class ConflictingTypeLabelsError extends Error {
|
|
10
4
|
constructor(message) {
|
|
@@ -21,12 +15,6 @@ export class ValidationError extends Error {
|
|
|
21
15
|
}
|
|
22
16
|
}
|
|
23
17
|
|
|
24
|
-
/**
|
|
25
|
-
* Errors raised by the `gh` CLI bridge (currently the bootstrap preflight;
|
|
26
|
-
* later the `lib/gh-exec.js` shim outlined in Tech Spec #1350). Tests
|
|
27
|
-
* match on `instanceof` rather than message substrings so message text
|
|
28
|
-
* can evolve without churning the assertions.
|
|
29
|
-
*/
|
|
30
18
|
export class GhNotInstalledError extends Error {
|
|
31
19
|
constructor(message = 'gh CLI is not installed or not on PATH') {
|
|
32
20
|
super(message);
|
|
@@ -49,15 +37,7 @@ export class GhVersionError extends Error {
|
|
|
49
37
|
}
|
|
50
38
|
}
|
|
51
39
|
|
|
52
|
-
/**
|
|
53
|
-
* Raised when a framework runtime dependency (e.g. `ajv`) cannot be
|
|
54
|
-
* resolved from the consumer's `node_modules/`. Surfaces during the
|
|
55
|
-
* `agents-bootstrap-github` preflight to redirect operators to the
|
|
56
|
-
* correct remediation (`mandrel init` for new projects, or
|
|
57
|
-
* `npm install mandrel` for existing ones). `missing` carries the
|
|
58
|
-
* package specifiers that failed to resolve so the CLI can render an
|
|
59
|
-
* actionable hint.
|
|
60
|
-
*/
|
|
40
|
+
/** A runtime dep (e.g. `ajv`) did not resolve; `missing` names the specifiers. */
|
|
61
41
|
export class MissingRuntimeDepsError extends Error {
|
|
62
42
|
constructor(message, details = {}) {
|
|
63
43
|
super(message);
|