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,54 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* path routes through. It sits directly over the `git-cleanup` phase
|
|
7
|
-
* library (`planCleanup` / `executeCleanup` / `executeFastForward` /
|
|
8
|
-
* `buildGlobFilter`) and the shared `evaluateProtection` guard set, so
|
|
9
|
-
* no reap path re-implements the `git branch -D` / `git merge --ff-only`
|
|
10
|
-
* primitives:
|
|
11
|
-
*
|
|
12
|
-
* - Scope: caller-supplied `include` / `exclude` globs (via
|
|
13
|
-
* `buildGlobFilter`). The story preset pins `story-*`.
|
|
14
|
-
* - Reap: merged local branches whose PR HEAD SHA equals the merged
|
|
15
|
-
* `headRefOid`, deleted local + origin with tracking-ref
|
|
16
|
-
* prune (`executeCleanup` in `--remote` mode).
|
|
17
|
-
* - Protection (Story #2011): each candidate is filtered through
|
|
18
|
-
* `evaluateProtection` before reaching `executeCleanup`. A
|
|
19
|
-
* candidate is protected (not reaped) when its branch HEAD
|
|
20
|
-
* differs from the PR's `headRefOid` (unpushed work), when
|
|
21
|
-
* its worktree has uncommitted edits, or when the parent
|
|
22
|
-
* Story ticket is not in a terminal state. Protected
|
|
23
|
-
* candidates surface under `protected`.
|
|
24
|
-
* - Fast-forward (opt-in via `fastForward: true`): fast-forward the
|
|
25
|
-
* base branch through `executeFastForward` after the reap.
|
|
26
|
-
* Best-effort — a failed fast-forward never fails the sweep.
|
|
27
|
-
* - Concurrency (Story #2011): the sweep acquires a process-scoped
|
|
28
|
-
* lockfile around plan + execute. On lock contention the
|
|
29
|
-
* sweep is skipped (the host continues — same contract as a
|
|
30
|
-
* plan failure).
|
|
31
|
-
* - Content-merged (Story #4396, report-only): a plan candidate the
|
|
32
|
-
* `git-cleanup` planner classified `detectedBy: 'content-merged'`
|
|
33
|
-
* (Story #4395's `git merge-tree --write-tree` content-equivalence
|
|
34
|
-
* probe) is a **weaker** signal than a merged PR or git ancestry —
|
|
35
|
-
* no CI/GitHub merge check ever validated its exact diff. This
|
|
36
|
-
* engine never reaps on that signal alone: content-merged
|
|
37
|
-
* candidates are pulled out of the plan before protection +
|
|
38
|
-
* execute and surfaced under `contentMerged` in the envelope so
|
|
39
|
-
* the operator can route them to `/git-cleanup` for a confirmed,
|
|
40
|
-
* eyeballed reap.
|
|
41
|
-
* - Never touches the stash stack.
|
|
42
|
-
* - Errors are caught and surfaced in the envelope. Callers MUST NOT
|
|
43
|
-
* propagate sweep failures — the host proceeds either way.
|
|
44
|
-
*
|
|
45
|
-
* `sweepMergedStoryBranches` is a thin preset over the engine tuned for
|
|
46
|
-
* the boot path (`include: story-*`, `exclude: <current story branch>`,
|
|
47
|
-
* `fastForward: false`). Its exported name, signature, and result
|
|
48
|
-
* envelope are unchanged from the pre-engine implementation.
|
|
49
|
-
*
|
|
50
|
-
* Re-exports the same `planCleanup` / `executeCleanup` injection seams so
|
|
51
|
-
* tests can stub git/`gh` without touching the CLI.
|
|
2
|
+
* Merged-branch sweep over the `git-cleanup` phases, plus the `story-*` boot
|
|
3
|
+
* preset. A candidate is protected when its HEAD differs from the PR's, its
|
|
4
|
+
* worktree is dirty, or its Story is not terminal. Lock contention skips.
|
|
5
|
+
* Errors land in the envelope; callers MUST NOT propagate them.
|
|
52
6
|
*/
|
|
53
7
|
|
|
54
8
|
import {
|
|
@@ -64,8 +18,6 @@ import { acquireSweepLock as defaultAcquireSweepLock } from './single-story-swee
|
|
|
64
18
|
const STORY_BRANCH_INCLUDE = 'story-*';
|
|
65
19
|
|
|
66
20
|
/**
|
|
67
|
-
* Scope-agnostic merged-branch sweep engine.
|
|
68
|
-
*
|
|
69
21
|
* @param {{
|
|
70
22
|
* cwd: string,
|
|
71
23
|
* baseBranch: string,
|
|
@@ -129,9 +81,7 @@ export async function sweepMergedBranches({
|
|
|
129
81
|
return zeroResult({ error: 'baseBranch is required' });
|
|
130
82
|
}
|
|
131
83
|
|
|
132
|
-
//
|
|
133
|
-
// supplied (e.g. unit tests, callers that opt out). Contention is
|
|
134
|
-
// non-fatal — return a skipped result and let the host continue.
|
|
84
|
+
// No lockPath → no lock. Contention returns a skipped result.
|
|
135
85
|
let releaseLock = () => {};
|
|
136
86
|
if (lockPath) {
|
|
137
87
|
const lockResult = acquireLockFn({ lockPath, timeoutMs: lockTimeoutMs });
|
|
@@ -190,12 +140,8 @@ export async function sweepMergedBranches({
|
|
|
190
140
|
}
|
|
191
141
|
|
|
192
142
|
/**
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
* include glob, excludes the current run's `currentStoryBranch`, and
|
|
196
|
-
* keeps `fastForward` off (the boot caller fast-forwards the base branch
|
|
197
|
-
* separately). Exported name, signature, and result-envelope shape are
|
|
198
|
-
* unchanged from the pre-engine implementation.
|
|
143
|
+
* Boot preset: `story-*` only, current Story branch excluded, no
|
|
144
|
+
* fast-forward (the boot caller does that separately).
|
|
199
145
|
*
|
|
200
146
|
* @param {{
|
|
201
147
|
* cwd: string,
|
|
@@ -228,13 +174,9 @@ export function sweepMergedStoryBranches(args = {}) {
|
|
|
228
174
|
}
|
|
229
175
|
|
|
230
176
|
/**
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
* `git merge-tree --write-tree` probe) never reaches protection or
|
|
235
|
-
* `executeCleanup` — it is a weaker signal than a merged PR or git
|
|
236
|
-
* ancestry, so the engine only reports it for the operator to route to
|
|
237
|
-
* `/git-cleanup`.
|
|
177
|
+
* Content-merged candidates are report-only: content equivalence is weaker
|
|
178
|
+
* than a merged PR or ancestry, so only an operator-confirmed `/git-cleanup`
|
|
179
|
+
* may reap them.
|
|
238
180
|
*/
|
|
239
181
|
function partitionContentMerged(candidates) {
|
|
240
182
|
const contentMerged = [];
|
|
@@ -252,10 +194,6 @@ function partitionContentMerged(candidates) {
|
|
|
252
194
|
return { contentMerged, reapCandidates };
|
|
253
195
|
}
|
|
254
196
|
|
|
255
|
-
/**
|
|
256
|
-
* Inner: the plan + protect + execute pipeline. Kept separate so the
|
|
257
|
-
* outer engine can stay focused on the lock and fast-forward wrappers.
|
|
258
|
-
*/
|
|
259
197
|
async function runSweepUnderLock({
|
|
260
198
|
cwd,
|
|
261
199
|
baseBranch,
|
|
@@ -342,11 +280,6 @@ async function runSweepUnderLock({
|
|
|
342
280
|
});
|
|
343
281
|
}
|
|
344
282
|
|
|
345
|
-
/**
|
|
346
|
-
* Execute the reap plan for the reapable candidates and shape the result
|
|
347
|
-
* envelope. Split out of {@link runSweepUnderLock} so each function keeps
|
|
348
|
-
* a single responsibility.
|
|
349
|
-
*/
|
|
350
283
|
function executeReap({
|
|
351
284
|
reapable,
|
|
352
285
|
protectedList,
|
|
@@ -403,10 +336,7 @@ function executeReap({
|
|
|
403
336
|
candidates: candidateCount,
|
|
404
337
|
localDeleted,
|
|
405
338
|
remoteDeleted,
|
|
406
|
-
//
|
|
407
|
-
// this sweep CONFIRMED (merged PR + matching headRefOid), which is exactly
|
|
408
|
-
// the evidence the temp-retention catch-up needs to purge that Story's
|
|
409
|
-
// spent artifacts. Previously these existed only inside a log string.
|
|
339
|
+
// Confirmed merges: temp-retention's catch-up purges on these names.
|
|
410
340
|
reaped: reapable.map((c) => c.branch),
|
|
411
341
|
protected: protectedList,
|
|
412
342
|
contentMerged,
|
|
@@ -414,11 +344,7 @@ function executeReap({
|
|
|
414
344
|
};
|
|
415
345
|
}
|
|
416
346
|
|
|
417
|
-
/**
|
|
418
|
-
* Best-effort fast-forward of the base branch through the git-cleanup
|
|
419
|
-
* fast-forward phase. Never throws — a failed fast-forward is logged and
|
|
420
|
-
* returned as `{ ok: false, error }` but must never fail the sweep.
|
|
421
|
-
*/
|
|
347
|
+
/** Best-effort base fast-forward; never throws, never fails the sweep. */
|
|
422
348
|
function runFastForwardStep({
|
|
423
349
|
cwd,
|
|
424
350
|
baseBranch,
|
|
@@ -453,17 +379,8 @@ function runFastForwardStep({
|
|
|
453
379
|
}
|
|
454
380
|
|
|
455
381
|
/**
|
|
456
|
-
*
|
|
457
|
-
*
|
|
458
|
-
*
|
|
459
|
-
* Protection failures are treated as protected — never reap a candidate
|
|
460
|
-
* whose state we cannot verify. The reason string travels into the
|
|
461
|
-
* result envelope and the log line for postmortem clarity.
|
|
462
|
-
*
|
|
463
|
-
* When no `protectionCtx` is supplied (legacy callers, unit tests),
|
|
464
|
-
* the protection check is bypassed entirely and every candidate is
|
|
465
|
-
* reapable. The boot-path CLI surfaces always supply a ctx, so this
|
|
466
|
-
* fallback never fires in production.
|
|
382
|
+
* A protection-eval error counts as protected: never reap what cannot be
|
|
383
|
+
* verified. No `protectionCtx` (tests only) bypasses protection.
|
|
467
384
|
*/
|
|
468
385
|
async function partitionCandidates({
|
|
469
386
|
candidates,
|
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
// .agents/scripts/lib/skills/parse-skill.js
|
|
2
2
|
//
|
|
3
|
-
// Shared SKILL.md parser
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// Public API:
|
|
8
|
-
//
|
|
9
|
-
// parseSkill(absolutePath, options?) -> {
|
|
10
|
-
// path, // repo-relative POSIX path (string)
|
|
11
|
-
// tier, // 'core' | 'stack'
|
|
12
|
-
// category, // bucket directly under the tier (string)
|
|
13
|
-
// name, // parent directory name of SKILL.md (string)
|
|
14
|
-
// frontmatter, // YAML-parsed object from between the leading '---' markers
|
|
15
|
-
// policyCapsule: {
|
|
16
|
-
// found, // boolean — true iff a '## Policy Capsule' heading exists
|
|
17
|
-
// bulletCount, // integer — count of contiguous top-level '- ' bullets
|
|
18
|
-
// sectionStart, // 1-based line number of the heading (null when absent)
|
|
19
|
-
// },
|
|
20
|
-
// }
|
|
21
|
-
//
|
|
22
|
-
// The parser asserts that frontmatter.name equals the parent directory name
|
|
23
|
-
// and throws a descriptive Error when the two diverge.
|
|
3
|
+
// Shared SKILL.md parser (CRLF/LF tolerant) returning
|
|
4
|
+
// { path, tier, category, name, frontmatter, policyCapsule }. Throws when
|
|
5
|
+
// frontmatter.name differs from the parent directory name.
|
|
24
6
|
|
|
25
7
|
import fs from 'node:fs';
|
|
26
8
|
import path from 'node:path';
|
|
@@ -30,14 +12,11 @@ const FRONTMATTER_DELIMITER = '---';
|
|
|
30
12
|
const POLICY_HEADING_RE = /^## Policy Capsule\s*$/;
|
|
31
13
|
const ANY_H2_RE = /^## /;
|
|
32
14
|
const BULLET_RE = /^- /;
|
|
33
|
-
/** An indented (wrapped) continuation of the bullet above it. */
|
|
34
15
|
const CONTINUATION_RE = /^\s+\S/;
|
|
35
16
|
|
|
36
17
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* marker. Falls back to the file's grandparent's grandparent if no marker
|
|
40
|
-
* is found, which is good enough for tests using temp fixtures.
|
|
18
|
+
* Nearest ancestor holding `.agents/skills`; fixture trees fall back to four
|
|
19
|
+
* levels up.
|
|
41
20
|
*/
|
|
42
21
|
function resolveRepoRoot(absoluteSkillPath) {
|
|
43
22
|
let dir = path.dirname(absoluteSkillPath);
|
|
@@ -47,7 +26,6 @@ function resolveRepoRoot(absoluteSkillPath) {
|
|
|
47
26
|
}
|
|
48
27
|
dir = path.dirname(dir);
|
|
49
28
|
}
|
|
50
|
-
// Fallback for fixture trees rooted outside a real .agents layout.
|
|
51
29
|
return path.resolve(path.dirname(absoluteSkillPath), '..', '..', '..', '..');
|
|
52
30
|
}
|
|
53
31
|
|
|
@@ -55,19 +33,11 @@ function toPosix(p) {
|
|
|
55
33
|
return p.split(path.sep).join('/');
|
|
56
34
|
}
|
|
57
35
|
|
|
58
|
-
/**
|
|
59
|
-
* Split the source on either CRLF or LF without normalizing line endings.
|
|
60
|
-
* The returned array's length and indices match the original file's line
|
|
61
|
-
* count, which lets callers report 1-based line numbers verbatim.
|
|
62
|
-
*/
|
|
36
|
+
/** Indices match the file's lines, so 1-based line numbers report verbatim. */
|
|
63
37
|
function splitLines(src) {
|
|
64
38
|
return src.split(/\r\n|\n/);
|
|
65
39
|
}
|
|
66
40
|
|
|
67
|
-
/**
|
|
68
|
-
* Extract the YAML frontmatter block sitting between the first two '---'
|
|
69
|
-
* lines. Throws when the file lacks a leading delimiter or never closes it.
|
|
70
|
-
*/
|
|
71
41
|
function extractFrontmatterBlock(lines, skillPath) {
|
|
72
42
|
if (lines[0] !== FRONTMATTER_DELIMITER) {
|
|
73
43
|
throw new Error(
|
|
@@ -85,16 +55,10 @@ function extractFrontmatterBlock(lines, skillPath) {
|
|
|
85
55
|
}
|
|
86
56
|
|
|
87
57
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* An **indented** continuation line belongs to the bullet above it — capsule
|
|
93
|
-
* bullets routinely wrap at the document's prose width — so it neither counts
|
|
94
|
-
* as a new bullet nor terminates the run. Only a **flush-left**, non-blank,
|
|
95
|
-
* non-bullet line after the run terminates it (Story #4546: treating any
|
|
96
|
-
* non-bullet line as a terminator counted a wrapped 5-bullet capsule as 1 and
|
|
97
|
-
* tripped the floor in validate-skills.js).
|
|
58
|
+
* Count top-level `- ` bullets under `## Policy Capsule` up to the next H2.
|
|
59
|
+
* Blank lines and indented (wrapped) continuations stay inside the run; only
|
|
60
|
+
* a flush-left non-bullet line after it terminates — otherwise a wrapped
|
|
61
|
+
* capsule would count as one bullet and trip the validator's floor.
|
|
98
62
|
*/
|
|
99
63
|
function findPolicyCapsule(lines, bodyStart) {
|
|
100
64
|
let headingIndex = -1;
|
|
@@ -119,19 +83,15 @@ function findPolicyCapsule(lines, bodyStart) {
|
|
|
119
83
|
continue;
|
|
120
84
|
}
|
|
121
85
|
if (line.trim() === '') {
|
|
122
|
-
// Blank lines inside or before the bullet run are tolerated.
|
|
123
86
|
continue;
|
|
124
87
|
}
|
|
125
88
|
if (sawBulletRun && CONTINUATION_RE.test(line)) {
|
|
126
|
-
// Indented continuation of the bullet above — same bullet, not a
|
|
127
|
-
// terminator. Wrapped capsule bullets are the norm, not an error.
|
|
128
89
|
continue;
|
|
129
90
|
}
|
|
130
91
|
if (sawBulletRun) {
|
|
131
|
-
// Flush-left, non-blank, non-bullet line after the run terminates it.
|
|
132
92
|
break;
|
|
133
93
|
}
|
|
134
|
-
// Leading prose
|
|
94
|
+
// Leading prose before the first bullet is allowed.
|
|
135
95
|
}
|
|
136
96
|
|
|
137
97
|
return {
|
|
@@ -141,9 +101,6 @@ function findPolicyCapsule(lines, bodyStart) {
|
|
|
141
101
|
};
|
|
142
102
|
}
|
|
143
103
|
|
|
144
|
-
/**
|
|
145
|
-
* Parse a SKILL.md file. See module-level docstring for the return shape.
|
|
146
|
-
*/
|
|
147
104
|
export function parseSkill(absolutePath, options = {}) {
|
|
148
105
|
if (typeof absolutePath !== 'string' || absolutePath.length === 0) {
|
|
149
106
|
throw new TypeError('parseSkill: absolutePath must be a non-empty string');
|
|
@@ -187,11 +144,8 @@ export function parseSkill(absolutePath, options = {}) {
|
|
|
187
144
|
);
|
|
188
145
|
}
|
|
189
146
|
|
|
190
|
-
//
|
|
191
|
-
//
|
|
192
|
-
// For core skills the bucket is the literal 'core' (one level deep);
|
|
193
|
-
// for stack skills the bucket is the first segment under 'stack'
|
|
194
|
-
// (e.g. 'backend', 'frontend', 'qa').
|
|
147
|
+
// <repo>/.agents/skills/<tier>/<...buckets>/<name>/SKILL.md — core's
|
|
148
|
+
// category is 'core'; stack's is the first bucket under 'stack'.
|
|
195
149
|
const relPath = toPosix(path.relative(repoRoot, absolutePath));
|
|
196
150
|
const parts = relPath.split('/');
|
|
197
151
|
const skillsIdx = parts.indexOf('skills');
|
|
@@ -1,25 +1,15 @@
|
|
|
1
1
|
// .agents/scripts/lib/skills/skills-index.js
|
|
2
2
|
//
|
|
3
|
-
// Shared I/O for the two skills manifests (
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// at `.agents/skills/`, and the consumer-writable zone's at
|
|
7
|
-
// `.agents/local/skills/`. The shipped one is a committed payload file that
|
|
8
|
-
// `mandrel doctor` / `mandrel sync-agents` compare byte-for-byte against the
|
|
9
|
-
// installed package, so the two manifests must never be merged — but they are
|
|
10
|
-
// read, compared and reported identically, and both CLIs need that logic.
|
|
11
|
-
// Before this module `generate-skills-index.js` and `validate-skills.js`
|
|
12
|
-
// each carried their own near-identical reader.
|
|
3
|
+
// Shared I/O for the two skills manifests (payload and local zone). They are
|
|
4
|
+
// read, compared and audited identically but never merged: the shipped one is
|
|
5
|
+
// compared byte-for-byte against the installed package.
|
|
13
6
|
|
|
14
7
|
import fs from 'node:fs';
|
|
15
8
|
import path from 'node:path';
|
|
16
9
|
|
|
17
|
-
/** Manifest filename, shared by both roots. */
|
|
18
10
|
export const INDEX_FILENAME = 'skills.index.json';
|
|
19
11
|
|
|
20
12
|
/**
|
|
21
|
-
* Absolute path of the manifest for one skills root.
|
|
22
|
-
*
|
|
23
13
|
* @param {string} repoRoot
|
|
24
14
|
* @param {readonly string[]} rootSegments From `walk-skill-files.js`.
|
|
25
15
|
* @returns {string}
|
|
@@ -29,9 +19,7 @@ export function indexPathFor(repoRoot, rootSegments) {
|
|
|
29
19
|
}
|
|
30
20
|
|
|
31
21
|
/**
|
|
32
|
-
*
|
|
33
|
-
* the `reason` channel so callers can report which drift they hit rather than
|
|
34
|
-
* collapsing both into "not fresh".
|
|
22
|
+
* `reason` separates "missing" from "unparseable" so callers can say which.
|
|
35
23
|
*
|
|
36
24
|
* @param {string} indexPath
|
|
37
25
|
* @returns {{ manifest: object | null, reason: string | null }}
|
|
@@ -54,9 +42,6 @@ export function readManifest(indexPath) {
|
|
|
54
42
|
}
|
|
55
43
|
|
|
56
44
|
/**
|
|
57
|
-
* Read a manifest and project its entry paths into a Set, the shape the
|
|
58
|
-
* validator's membership check consumes.
|
|
59
|
-
*
|
|
60
45
|
* @param {string} indexPath
|
|
61
46
|
* @returns {{ exists: boolean, paths: Set<string> | null, manifest: object | null, indexPath: string, parseError?: string }}
|
|
62
47
|
*/
|
|
@@ -83,9 +68,7 @@ export function readIndexPaths(indexPath) {
|
|
|
83
68
|
}
|
|
84
69
|
|
|
85
70
|
/**
|
|
86
|
-
*
|
|
87
|
-
* changes on every write and is not content. Returns null when they match, or
|
|
88
|
-
* a diff-style message naming the entry counts.
|
|
71
|
+
* Ignores the volatile `generatedAt`; `null` when the manifests match.
|
|
89
72
|
*
|
|
90
73
|
* @param {object | null} diskManifest
|
|
91
74
|
* @param {object} freshManifest
|
|
@@ -111,12 +94,10 @@ export function diffManifests(diskManifest, freshManifest, label) {
|
|
|
111
94
|
}
|
|
112
95
|
|
|
113
96
|
/**
|
|
114
|
-
*
|
|
115
|
-
* AJV validator is passed in so this module stays free of the schema-loading
|
|
116
|
-
* side effects the validator CLI owns.
|
|
97
|
+
* The validator is injected so this module avoids schema-loading side effects.
|
|
117
98
|
*
|
|
118
99
|
* @param {object} manifest
|
|
119
|
-
* @param {string} indexRelPath
|
|
100
|
+
* @param {string} indexRelPath
|
|
120
101
|
* @param {(m: object) => boolean} validateManifest Compiled AJV validator.
|
|
121
102
|
* @returns {string[]}
|
|
122
103
|
*/
|
|
@@ -133,9 +114,7 @@ function validateManifestSchema(manifest, indexRelPath, validateManifest) {
|
|
|
133
114
|
}
|
|
134
115
|
|
|
135
116
|
/**
|
|
136
|
-
*
|
|
137
|
-
* both skills roots so a consumer-authored index is held to the same bar as
|
|
138
|
-
* the shipped one.
|
|
117
|
+
* Present, parseable and schema-valid — the same bar for both roots.
|
|
139
118
|
*
|
|
140
119
|
* @param {{ exists: boolean, paths: Set<string> | null, manifest: object | null, parseError?: string }} indexInfo
|
|
141
120
|
* @param {string} indexRelPath
|
|
@@ -1,37 +1,20 @@
|
|
|
1
1
|
// .agents/scripts/lib/skills/walk-skill-files.js
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// The two roots stay **separately enumerable** on purpose (Story #5135).
|
|
10
|
-
// `.agents/skills/skills.index.json` is a committed payload file that
|
|
11
|
-
// `mandrel doctor` / `mandrel sync-agents` compare byte-for-byte against
|
|
12
|
-
// the installed package; folding a consumer's local skills into it would
|
|
13
|
-
// make every consumer's regenerated index read as payload drift and cause
|
|
14
|
-
// those commands to refuse. The local zone therefore carries its own
|
|
15
|
-
// index artifact, and the two roots are unified only at *lookup* time, by
|
|
16
|
-
// `resolveSkillFile` — never for the shipped manifest.
|
|
3
|
+
// SKILL.md traversal over the payload root and the consumer-writable local
|
|
4
|
+
// zone, in deterministic order. The roots stay separately enumerable: the
|
|
5
|
+
// shipped skills.index.json is compared byte-for-byte against the package, so
|
|
6
|
+
// folding local skills into it would read as payload drift. They are unified
|
|
7
|
+
// only at lookup time, by resolveSkillFile.
|
|
17
8
|
|
|
18
9
|
import fs from 'node:fs';
|
|
19
10
|
import path from 'node:path';
|
|
20
11
|
|
|
21
|
-
/** Tier directories a skills root is enumerated under. */
|
|
22
12
|
const TIERS = Object.freeze(['core', 'stack']);
|
|
23
13
|
|
|
24
|
-
/**
|
|
25
|
-
* Path segments (from the repo root) of the package-payload skills root.
|
|
26
|
-
* Materialized by `mandrel sync`; every file under it is payload.
|
|
27
|
-
*/
|
|
28
14
|
export const PAYLOAD_SKILLS_SEGMENTS = Object.freeze(['.agents', 'skills']);
|
|
29
15
|
|
|
30
16
|
/**
|
|
31
|
-
*
|
|
32
|
-
* It sits inside the `.agents/local/` zone (Story #3498), which sync never
|
|
33
|
-
* copies into and never prunes, and which the agents-drift check cannot
|
|
34
|
-
* flag because that check only walks files present in the package payload.
|
|
17
|
+
* Inside `.agents/local/`, which sync never touches and drift checks never walk.
|
|
35
18
|
*/
|
|
36
19
|
export const LOCAL_SKILLS_SEGMENTS = Object.freeze([
|
|
37
20
|
'.agents',
|
|
@@ -40,27 +23,14 @@ export const LOCAL_SKILLS_SEGMENTS = Object.freeze([
|
|
|
40
23
|
]);
|
|
41
24
|
|
|
42
25
|
/**
|
|
43
|
-
* A
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* The pattern is deliberately strict: ids resolve to filesystem paths, so
|
|
49
|
-
* anything that could escape a root (`..`, absolute paths, backslashes) or
|
|
50
|
-
* smuggle a shell metacharacter is rejected rather than normalized.
|
|
51
|
-
*
|
|
52
|
-
* Exported because `config-settings-schema.js` mirrors it as the `pattern`
|
|
53
|
-
* on `qa.environments.*.signInSeam.skill`, so a malformed id is rejected at
|
|
54
|
-
* config-validation time rather than surviving to a path join (Story #5285).
|
|
55
|
-
* It is one regex with two enforcement points, never two regexes: the AJV
|
|
56
|
-
* `pattern` keyword takes the source string, so the schema must import this
|
|
57
|
-
* value rather than restate it.
|
|
26
|
+
* A tier-relative skill id (`stack/qa/playwright`). Strict because ids become
|
|
27
|
+
* filesystem paths: anything that could escape a root is rejected, not
|
|
28
|
+
* normalized. The config schema imports this as its `pattern` — one regex,
|
|
29
|
+
* two enforcement points.
|
|
58
30
|
*/
|
|
59
31
|
export const SKILL_ID_RE = /^[a-z0-9][a-z0-9._-]*(?:\/[a-z0-9][a-z0-9._-]*)+$/;
|
|
60
32
|
|
|
61
33
|
/**
|
|
62
|
-
* Recursively enumerate `SKILL.md` paths under a directory.
|
|
63
|
-
*
|
|
64
34
|
* @param {string} rootDir
|
|
65
35
|
* @returns {string[]} absolute paths
|
|
66
36
|
*/
|
|
@@ -89,9 +59,6 @@ function walkSkillFiles(rootDir) {
|
|
|
89
59
|
}
|
|
90
60
|
|
|
91
61
|
/**
|
|
92
|
-
* Sort absolute paths by their POSIX repo-relative form so output order is
|
|
93
|
-
* deterministic across platforms.
|
|
94
|
-
*
|
|
95
62
|
* @param {string[]} files
|
|
96
63
|
* @param {string} repoRoot
|
|
97
64
|
* @returns {string[]}
|
|
@@ -105,9 +72,6 @@ function sortByRepoRelative(files, repoRoot) {
|
|
|
105
72
|
}
|
|
106
73
|
|
|
107
74
|
/**
|
|
108
|
-
* Enumerate the `SKILL.md` files under one skills root, sorted by POSIX
|
|
109
|
-
* repo-relative path.
|
|
110
|
-
*
|
|
111
75
|
* @param {string} repoRoot
|
|
112
76
|
* @param {readonly string[]} rootSegments One of the exported segment lists.
|
|
113
77
|
* @returns {string[]} absolute paths
|
|
@@ -121,11 +85,7 @@ function collectUnderRoot(repoRoot, rootSegments) {
|
|
|
121
85
|
}
|
|
122
86
|
|
|
123
87
|
/**
|
|
124
|
-
*
|
|
125
|
-
* `<repoRoot>/.agents/skills/{core,stack}/`.
|
|
126
|
-
*
|
|
127
|
-
* This is the set the **shipped** `skills.index.json` is generated from —
|
|
128
|
-
* it must never include local-zone skills (see the module header).
|
|
88
|
+
* The set the shipped index is generated from — never local-zone skills.
|
|
129
89
|
*
|
|
130
90
|
* @param {string} repoRoot
|
|
131
91
|
* @returns {string[]} absolute paths
|
|
@@ -135,11 +95,6 @@ export function collectSkillFiles(repoRoot) {
|
|
|
135
95
|
}
|
|
136
96
|
|
|
137
97
|
/**
|
|
138
|
-
* Build the list of consumer-authored SKILL.md files under
|
|
139
|
-
* `<repoRoot>/.agents/local/skills/{core,stack}/`. Empty when the
|
|
140
|
-
* consumer has authored none — the common case, and the case in this
|
|
141
|
-
* repository itself.
|
|
142
|
-
*
|
|
143
98
|
* @param {string} repoRoot
|
|
144
99
|
* @returns {string[]} absolute paths
|
|
145
100
|
*/
|
|
@@ -148,26 +103,14 @@ export function collectLocalSkillFiles(repoRoot) {
|
|
|
148
103
|
}
|
|
149
104
|
|
|
150
105
|
/**
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
* {
|
|
154
|
-
*
|
|
155
|
-
* Returns rather than throwing so callers own the error message — a config
|
|
156
|
-
* resolver wants to name the offending config key, a workflow wants to name
|
|
157
|
-
* the seam. The two failures are **distinguishable** (Story #5285):
|
|
158
|
-
*
|
|
159
|
-
* - `null` — a well-formed id that resolves under neither root. The remedy
|
|
160
|
-
* is to author the skill, so the caller says so.
|
|
161
|
-
* - `{ reason: 'invalid-id' }` — an id the pattern rejects (`../../secrets`,
|
|
162
|
-
* `Core/Foo`, a bare `core`). No filesystem lookup happens, and telling
|
|
163
|
-
* the operator to author `../../secrets/SKILL.md` would be advice that
|
|
164
|
-
* cannot be followed. The remedy is to fix the id.
|
|
106
|
+
* Payload root first, then local (payload wins). Returns rather than throws
|
|
107
|
+
* so the caller names the offending key; `null` (author the skill) and
|
|
108
|
+
* `{ reason: 'invalid-id' }` (fix the id; nothing was searched) need
|
|
109
|
+
* different remedies.
|
|
165
110
|
*
|
|
166
111
|
* @param {string} repoRoot
|
|
167
112
|
* @param {string} skillId Tier-relative id, e.g. `stack/qa/acme-sso`.
|
|
168
113
|
* @returns {{ path: string, root: string } | { reason: 'invalid-id' } | null}
|
|
169
|
-
* the absolute `SKILL.md` path and the POSIX repo-relative root it resolved
|
|
170
|
-
* under, the malformed-id marker, or `null` when nothing resolved.
|
|
171
114
|
*/
|
|
172
115
|
export function resolveSkillFile(repoRoot, skillId) {
|
|
173
116
|
if (typeof skillId !== 'string' || !SKILL_ID_RE.test(skillId)) {
|
|
@@ -180,17 +123,13 @@ export function resolveSkillFile(repoRoot, skillId) {
|
|
|
180
123
|
return { path: candidate, root: segments.join('/') };
|
|
181
124
|
}
|
|
182
125
|
} catch {
|
|
183
|
-
//
|
|
126
|
+
// Absent — try the next root.
|
|
184
127
|
}
|
|
185
128
|
}
|
|
186
129
|
return null;
|
|
187
130
|
}
|
|
188
131
|
|
|
189
|
-
/**
|
|
190
|
-
* The POSIX repo-relative skills roots, in search order. Exported so error
|
|
191
|
-
* messages can name exactly what was searched rather than restating the
|
|
192
|
-
* paths as literals.
|
|
193
|
-
*/
|
|
132
|
+
/** POSIX repo-relative roots in search order, for error messages. */
|
|
194
133
|
export const SKILL_SEARCH_ROOTS = Object.freeze([
|
|
195
134
|
PAYLOAD_SKILLS_SEGMENTS.join('/'),
|
|
196
135
|
LOCAL_SKILLS_SEGMENTS.join('/'),
|
|
@@ -1,45 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* the CRAP
|
|
2
|
+
* SSOT for the extensions the CRAP/MI scanners score. The scanner walk, the
|
|
3
|
+
* coverage-freshness check and the CRAP projection filter must all agree: a
|
|
4
|
+
* narrower selector makes a gate green while measuring nothing. Not
|
|
5
|
+
* configurable, for the same reason.
|
|
4
6
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* measuring nothing: the maintainability/CRAP directory walk
|
|
8
|
-
* (`maintainability-utils.js`), the coverage-freshness check
|
|
9
|
-
* (`coverage-capture.js`), and the close-validation CRAP projection's
|
|
10
|
-
* changed-file filter (`close-validation/projections/crap.js`). Story #5076
|
|
11
|
-
* folded all three onto the set below after a TypeScript consumer's entire
|
|
12
|
-
* source tree was filtered out of the freshness check by a `js|mjs`-only
|
|
13
|
-
* literal.
|
|
14
|
-
*
|
|
15
|
-
* **This module MUST import nothing outside `node:` builtins.**
|
|
16
|
-
* `coverage-capture.js` runs on the pre-push path; `maintainability-utils.js`
|
|
17
|
-
* transitively pulls `typhonjs-escomplex` and `typescript`, so the shared set
|
|
18
|
-
* cannot live there without dragging the scoring engines into every freshness
|
|
19
|
-
* probe.
|
|
20
|
-
*
|
|
21
|
-
* The set is deliberately *not* configurable. Freshness exists only to serve
|
|
22
|
-
* the CRAP gate, so the contract is "what the scanner walks" — a
|
|
23
|
-
* consumer-settable extension list would be a second way to mis-scope the same
|
|
24
|
-
* gate.
|
|
25
|
-
*
|
|
26
|
-
* Not to be confused with `transpile.js`'s `TS_EXTS`, which answers a
|
|
27
|
-
* different question ("does this file need transpiling before scoring?") and
|
|
28
|
-
* is correctly a subset of this set rather than a fork of it.
|
|
7
|
+
* MUST import only `node:` builtins — it runs on the pre-push path and must
|
|
8
|
+
* not drag the scoring engines in.
|
|
29
9
|
*/
|
|
30
10
|
import path from 'node:path';
|
|
31
11
|
|
|
32
12
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* Formats the engines cannot parse — `.astro`, `.vue`, `.svelte` — are
|
|
37
|
-
* deliberately absent: this set selects what the scanner already scores, not
|
|
38
|
-
* every source file that exists in a consumer's tree.
|
|
39
|
-
*
|
|
40
|
-
* Module-private: production consumers select through {@link
|
|
41
|
-
* SCORABLE_SOURCE_EXT_RE} or {@link isScorableSourceFile}, so exporting the
|
|
42
|
-
* raw list would be a dead production export.
|
|
13
|
+
* What the engines can parse (not `.vue`/`.svelte`/`.astro`). Private: select
|
|
14
|
+
* via the exported regex or predicate.
|
|
43
15
|
*
|
|
44
16
|
* @type {readonly string[]}
|
|
45
17
|
*/
|
|
@@ -54,10 +26,7 @@ const SCORABLE_SOURCE_EXTENSIONS = Object.freeze([
|
|
|
54
26
|
]);
|
|
55
27
|
|
|
56
28
|
/**
|
|
57
|
-
*
|
|
58
|
-
* {@link SCORABLE_SOURCE_EXTENSIONS} so the list stays the only definition.
|
|
59
|
-
* Use it where a path arrives as raw text (a `git ls-files` line, a porcelain
|
|
60
|
-
* status entry) and `path.extname` would be the wrong tool.
|
|
29
|
+
* For paths arriving as raw text (git output lines).
|
|
61
30
|
*
|
|
62
31
|
* @type {RegExp}
|
|
63
32
|
*/
|
|
@@ -66,8 +35,8 @@ export const SCORABLE_SOURCE_EXT_RE = new RegExp(
|
|
|
66
35
|
);
|
|
67
36
|
|
|
68
37
|
/**
|
|
69
|
-
* @param {string} filePath
|
|
70
|
-
* @returns {boolean}
|
|
38
|
+
* @param {string} filePath
|
|
39
|
+
* @returns {boolean}
|
|
71
40
|
*/
|
|
72
41
|
export function isScorableSourceFile(filePath) {
|
|
73
42
|
return SCORABLE_SOURCE_EXTENSIONS.includes(
|