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
|
@@ -6,23 +6,17 @@ description: Drive Gherkin scenarios through a real browser as an agent-driven Q
|
|
|
6
6
|
|
|
7
7
|
Execute a consumer's Gherkin `.feature` scenarios through a **real browser**
|
|
8
8
|
(the chrome-devtools MCP surface), with the agent acting as the step executor
|
|
9
|
-
and a human observing
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
[`helpers/qa-run-scenario.md`](helpers/qa-run-scenario.md), which drives it
|
|
13
|
-
navigation-first and asserts `Then` outcomes semantically against the
|
|
14
|
-
accessibility snapshot. Per-surface console and network are captured as
|
|
15
|
-
structured findings, recorded as `QaLedgerItem`s on the shared session ledger,
|
|
16
|
-
and triaged — after operator sign-off — through the shared classify/route/
|
|
17
|
-
dedup/promote core. The harness never files tickets autonomously.
|
|
9
|
+
and a human observing: resolve a run envelope, drive each scenario through
|
|
10
|
+
[`helpers/qa-run-scenario.md`](helpers/qa-run-scenario.md), record findings as
|
|
11
|
+
`QaLedgerItem`s, and triage after operator sign-off.
|
|
18
12
|
|
|
19
13
|
The shared machinery — contract resolution + loud failure, the session & ledger
|
|
20
14
|
contract, redact-first, the `QaLedgerItem` shape, the triage procedure, and the
|
|
21
15
|
HITL write gate — lives once in [`helpers/qa-core.md`](helpers/qa-core.md); this
|
|
22
16
|
workflow states only the `/qa-run`-specific phases (env → scope → sign-in →
|
|
23
|
-
drive)
|
|
24
|
-
|
|
25
|
-
|
|
17
|
+
drive). Deterministic Node helpers under `.agents/scripts/lib/qa/` own
|
|
18
|
+
contract, environment, and scenario resolution; the agent never invents those
|
|
19
|
+
decisions in prose.
|
|
26
20
|
|
|
27
21
|
> **When to run**: during sprint testing to exercise a targeted slice of the
|
|
28
22
|
> acceptance suite (a feature, a tag expression, or a domain), for regression
|
|
@@ -99,7 +93,8 @@ The chrome-devtools MCP surface (`navigate_page`, `take_snapshot`, `click`,
|
|
|
99
93
|
`list_network_requests`) is **host-provided** — an external runtime dependency,
|
|
100
94
|
not in-repo code. If the host does not expose it, degrade with a clear error
|
|
101
95
|
("the chrome-devtools MCP server is unavailable; the QA harness requires a live
|
|
102
|
-
browser surface") and stop. Never attempt a headless fallback
|
|
96
|
+
browser surface") and stop. Never attempt a headless fallback, and never fall
|
|
97
|
+
back to a retired headless BDD runner.
|
|
103
98
|
|
|
104
99
|
### Step 1 — Resolve the environment, then the scope
|
|
105
100
|
|
|
@@ -234,23 +229,6 @@ Then summarize the sweep in chat with:
|
|
|
234
229
|
|
|
235
230
|
## Constraints
|
|
236
231
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
navigation-first, semantic `Then`, redaction, sequential-only), the
|
|
241
|
-
`/qa-run`-specific deltas are:
|
|
242
|
-
|
|
243
|
-
- **Always** resolve a target environment (Step 1) — prompt when no `<env>` is
|
|
244
|
-
supplied — and **fail loudly** on an unknown name or unmatched URL; never
|
|
245
|
-
silently fall back to the default.
|
|
246
|
-
- **Always** apply the `allowWrites` guardrail: on a read-only environment,
|
|
247
|
-
exclude mutating scenarios and report the exclusion count; include them only
|
|
248
|
-
on explicit in-session operator confirmation.
|
|
249
|
-
- **Always** sign in per persona through the environment's `signInSeam` and
|
|
250
|
-
confirm the authenticated state with a post-sign-in `take_snapshot` before
|
|
251
|
-
driving.
|
|
252
|
-
- An **empty selection is operator error**, not a passing sweep — report it and
|
|
253
|
-
stop.
|
|
254
|
-
- **Never** expand `consoleAllowlist` to suppress genuine error signal.
|
|
255
|
-
- **Never** file follow-up tickets autonomously, and **never** fall back to a
|
|
256
|
-
retired headless BDD runner.
|
|
232
|
+
The shared core in [`helpers/qa-core.md`](helpers/qa-core.md) and the driving
|
|
233
|
+
rules in [`helpers/qa-run-scenario.md`](helpers/qa-run-scenario.md) bind this
|
|
234
|
+
workflow; the `/qa-run` deltas are the MUSTs in Steps 0–5 above.
|
package/README.md
CHANGED
|
@@ -105,7 +105,7 @@ idempotent — safe to re-run anytime.
|
|
|
105
105
|
|
|
106
106
|
For the consumer reference and the end-to-end workflow narrative, see
|
|
107
107
|
[`.agents/README.md`](.agents/README.md) and
|
|
108
|
-
[
|
|
108
|
+
[`docs/SDLC.md`](docs/SDLC.md). Every `.agentrc.json` key is
|
|
109
109
|
documented in [`.agents/docs/configuration.md`](.agents/docs/configuration.md), and the
|
|
110
110
|
slash-command index lives in
|
|
111
111
|
[`.agents/docs/workflows.md`](.agents/docs/workflows.md).
|
package/bin/mandrel.js
CHANGED
|
@@ -2,17 +2,8 @@
|
|
|
2
2
|
// bin/mandrel.js — mandrel CLI entry point
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Allowlist
|
|
6
|
-
*
|
|
7
|
-
* Only modules listed in SUBCOMMANDS are dispatchable. Each entry declares the
|
|
8
|
-
* name, a one-line description for help output, and the set of known flags so
|
|
9
|
-
* the dispatcher can reject unknown flags before loading the subcommand.
|
|
10
|
-
*
|
|
11
|
-
* Supported top-level flags:
|
|
12
|
-
* --help / -h Print subcommand list and exit 0.
|
|
13
|
-
* --version Print installed version and exit 0.
|
|
14
|
-
*
|
|
15
|
-
* Each subcommand module must export a default function `run(argv)`.
|
|
5
|
+
* Allowlist dispatcher: only SUBCOMMANDS entries load, and unknown flags are
|
|
6
|
+
* rejected before loading. Each module default-exports `run(argv)`.
|
|
16
7
|
*/
|
|
17
8
|
|
|
18
9
|
import { createRequire } from 'node:module';
|
|
@@ -21,10 +12,6 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
21
12
|
|
|
22
13
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
23
14
|
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
// Subcommand registry — the ONLY allowed dispatch targets
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
|
|
28
15
|
/**
|
|
29
16
|
* @typedef {{ description: string, knownFlags: Set<string> }} SubcommandMeta
|
|
30
17
|
* @type {Map<string, SubcommandMeta>}
|
|
@@ -108,13 +95,7 @@ const SUBCOMMANDS = new Map([
|
|
|
108
95
|
],
|
|
109
96
|
]);
|
|
110
97
|
|
|
111
|
-
// ---------------------------------------------------------------------------
|
|
112
|
-
// Helpers
|
|
113
|
-
// ---------------------------------------------------------------------------
|
|
114
|
-
|
|
115
98
|
/**
|
|
116
|
-
* Read the installed mandrel version from the root package.json.
|
|
117
|
-
*
|
|
118
99
|
* @returns {string}
|
|
119
100
|
*/
|
|
120
101
|
function installedVersion() {
|
|
@@ -124,8 +105,6 @@ function installedVersion() {
|
|
|
124
105
|
}
|
|
125
106
|
|
|
126
107
|
/**
|
|
127
|
-
* Print the help screen listing all subcommands with descriptions.
|
|
128
|
-
*
|
|
129
108
|
* @param {(s: string) => void} [write]
|
|
130
109
|
*/
|
|
131
110
|
function printHelp(write = (s) => process.stdout.write(s)) {
|
|
@@ -144,8 +123,6 @@ function printHelp(write = (s) => process.stdout.write(s)) {
|
|
|
144
123
|
}
|
|
145
124
|
|
|
146
125
|
/**
|
|
147
|
-
* Suggest the closest known subcommand name for a typo (Levenshtein-1).
|
|
148
|
-
*
|
|
149
126
|
* @param {string} input
|
|
150
127
|
* @returns {string | undefined}
|
|
151
128
|
*/
|
|
@@ -157,8 +134,7 @@ function suggest(input) {
|
|
|
157
134
|
}
|
|
158
135
|
|
|
159
136
|
/**
|
|
160
|
-
*
|
|
161
|
-
* performance — we only care about small distances).
|
|
137
|
+
* Edit distance; returns 4 early when lengths differ by more than 3.
|
|
162
138
|
*
|
|
163
139
|
* @param {string} a
|
|
164
140
|
* @param {string} b
|
|
@@ -182,19 +158,11 @@ function levenshtein(a, b) {
|
|
|
182
158
|
return prev[b.length];
|
|
183
159
|
}
|
|
184
160
|
|
|
185
|
-
/**
|
|
186
|
-
* Universal flags that all subcommands accept and that bypass per-subcommand
|
|
187
|
-
* flag validation. Subcommands may handle these themselves internally.
|
|
188
|
-
*/
|
|
161
|
+
/** Accepted by every subcommand, bypassing per-subcommand validation. */
|
|
189
162
|
const UNIVERSAL_FLAGS = new Set(['--help', '-h']);
|
|
190
163
|
|
|
191
164
|
/**
|
|
192
|
-
*
|
|
193
|
-
* Returns null when all flags are known; an error message string when an
|
|
194
|
-
* unknown flag is detected. Values following `=` or the next positional are
|
|
195
|
-
* allowed — only the flag name prefix is checked.
|
|
196
|
-
*
|
|
197
|
-
* Universal flags (--help, -h) are always allowed and bypass this check.
|
|
165
|
+
* Only flag names are checked (`--flag=value` is split).
|
|
198
166
|
*
|
|
199
167
|
* @param {string} subName
|
|
200
168
|
* @param {Set<string>} knownFlags
|
|
@@ -204,7 +172,6 @@ const UNIVERSAL_FLAGS = new Set(['--help', '-h']);
|
|
|
204
172
|
function findUnknownFlag(subName, knownFlags, argv) {
|
|
205
173
|
for (const arg of argv) {
|
|
206
174
|
if (!arg.startsWith('-')) continue;
|
|
207
|
-
// Strip value portion for `--flag=value` form.
|
|
208
175
|
const flagName = arg.includes('=') ? arg.slice(0, arg.indexOf('=')) : arg;
|
|
209
176
|
if (UNIVERSAL_FLAGS.has(flagName)) continue;
|
|
210
177
|
if (!knownFlags.has(flagName)) {
|
|
@@ -219,14 +186,9 @@ function findUnknownFlag(subName, knownFlags, argv) {
|
|
|
219
186
|
return null;
|
|
220
187
|
}
|
|
221
188
|
|
|
222
|
-
// ---------------------------------------------------------------------------
|
|
223
|
-
// Dispatch
|
|
224
|
-
// ---------------------------------------------------------------------------
|
|
225
|
-
|
|
226
189
|
const args = process.argv.slice(2);
|
|
227
190
|
const sub = args[0];
|
|
228
191
|
|
|
229
|
-
// --- Top-level flags (no subcommand) ---
|
|
230
192
|
if (!sub || sub === '--help' || sub === '-h') {
|
|
231
193
|
printHelp();
|
|
232
194
|
process.exit(0);
|
|
@@ -237,7 +199,6 @@ if (sub === '--version') {
|
|
|
237
199
|
process.exit(0);
|
|
238
200
|
}
|
|
239
201
|
|
|
240
|
-
// --- Subcommand lookup ---
|
|
241
202
|
const meta = SUBCOMMANDS.get(sub);
|
|
242
203
|
if (!meta) {
|
|
243
204
|
const subcommandList = [...SUBCOMMANDS.keys()].join(', ');
|
|
@@ -250,7 +211,6 @@ if (!meta) {
|
|
|
250
211
|
process.exit(1);
|
|
251
212
|
}
|
|
252
213
|
|
|
253
|
-
// --- Unknown-flag rejection ---
|
|
254
214
|
const subArgv = args.slice(1);
|
|
255
215
|
const unknownFlagError = findUnknownFlag(sub, meta.knownFlags, subArgv);
|
|
256
216
|
if (unknownFlagError) {
|
|
@@ -258,7 +218,6 @@ if (unknownFlagError) {
|
|
|
258
218
|
process.exit(1);
|
|
259
219
|
}
|
|
260
220
|
|
|
261
|
-
// --- Load and dispatch ---
|
|
262
221
|
const subFile = path.resolve(__dirname, '..', 'lib', 'cli', `${sub}.js`);
|
|
263
222
|
const subFileUrl = pathToFileURL(subFile).href;
|
|
264
223
|
|
package/bin/postinstall.js
CHANGED
|
@@ -2,38 +2,11 @@
|
|
|
2
2
|
// bin/postinstall.js — best-effort `.agents/` materializer on install.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* the sync fails, so that `--ignore-scripts` installs, sandboxed CI, or a
|
|
11
|
-
* transient copy error degrade to the `mandrel doctor`-detected
|
|
12
|
-
* "not materialized" state rather than failing the consumer's install.
|
|
13
|
-
*
|
|
14
|
-
* On any failure it logs a single actionable hint — "run `mandrel sync`" —
|
|
15
|
-
* and exits 0. It performs nothing beyond the local file copy that
|
|
16
|
-
* `mandrel sync` itself does: no network, no shell, no writes outside
|
|
17
|
-
* `./.agents/`.
|
|
18
|
-
*
|
|
19
|
-
* **Source-checkout guard (Story #3489, fixed in #3580).** In the Mandrel
|
|
20
|
-
* framework repo itself, `./.agents/` is not a regenerated working copy — it
|
|
21
|
-
* *is* the committed product, and `mandrel sync` would clobber that source of
|
|
22
|
-
* truth with a copy of `node_modules/mandrel/.agents/`. Today the
|
|
23
|
-
* repo `.npmrc` (`ignore-scripts=true`) masks this, but a contributor running
|
|
24
|
-
* `npm install --ignore-scripts=false` (or a tool that re-enables scripts)
|
|
25
|
-
* would overwrite the source tree. To make the guard intrinsic rather than
|
|
26
|
-
* config-dependent, the hook detects the source checkout and no-ops (exit 0)
|
|
27
|
-
* without invoking the materializer. Consumer installs (where the package is
|
|
28
|
-
* a dependency under `node_modules/`) are unaffected and still materialize
|
|
29
|
-
* `.agents/` as before — see `isSourceCheckout` for the two signals used to
|
|
30
|
-
* tell them apart.
|
|
31
|
-
*
|
|
32
|
-
* Injectable seams (used by tests/cli/postinstall.test.js):
|
|
33
|
-
* - `sync` — replaces the real `runSync` from lib/cli/sync.js
|
|
34
|
-
* - `isSourceCheckout` — replaces the source-checkout detector
|
|
35
|
-
* - `writeErr` — replaces process.stderr.write
|
|
36
|
-
* - `exit` — replaces process.exit
|
|
5
|
+
* Runs `mandrel sync` on install. Best-effort by contract: always exits 0 so
|
|
6
|
+
* `--ignore-scripts`, sandboxed CI, or a copy error degrade to the
|
|
7
|
+
* doctor-detected "not materialized" state instead of failing the install.
|
|
8
|
+
* In the framework's own source checkout it no-ops, since `.agents/` there is
|
|
9
|
+
* the committed product and a sync would clobber it.
|
|
37
10
|
*/
|
|
38
11
|
|
|
39
12
|
import nodeFs from 'node:fs';
|
|
@@ -47,36 +20,13 @@ const HINT =
|
|
|
47
20
|
'mandrel: could not materialize ./.agents/ during install — run `mandrel sync` to finish setup.\n';
|
|
48
21
|
|
|
49
22
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* a dependency this module lives at
|
|
58
|
-
* `<consumer>/node_modules/mandrel/bin/postinstall.js`, so its own
|
|
59
|
-
* resolved path contains a `node_modules` segment. That is true *by
|
|
60
|
-
* construction* for every dependency install and needs no env var, so a
|
|
61
|
-
* `node_modules` ancestor is treated as an unambiguous consumer install →
|
|
62
|
-
* return `false` (run the sync). This is the signal the original guard
|
|
63
|
-
* (Story #3489) was missing: it resolved the package's **own**
|
|
64
|
-
* `package.json` (always named `mandrel`) instead of the consumer
|
|
65
|
-
* root, so it misfired on every consumer install and skipped the sync
|
|
66
|
-
* (Story #3580).
|
|
67
|
-
*
|
|
68
|
-
* 2. **`INIT_CWD`-rooted name check (source-repo signal).** Outside
|
|
69
|
-
* `node_modules`, resolve the **invoking project root** and compare its
|
|
70
|
-
* `package.json#name` to `mandrel`. npm sets `INIT_CWD` to the
|
|
71
|
-
* directory where `npm install` was invoked — the framework repo root when
|
|
72
|
-
* a contributor installs the framework itself. When `INIT_CWD` is unset
|
|
73
|
-
* (e.g. the hook is run directly via `node`, outside npm), fall back to the
|
|
74
|
-
* module-relative repo root (`bin/postinstall.js` sits one directory below
|
|
75
|
-
* it), which still resolves to the source repo's own `package.json`.
|
|
76
|
-
*
|
|
77
|
-
* Fails safe: any read/parse error returns `false` (treat as a consumer
|
|
78
|
-
* install and let the best-effort sync run), so a malformed or missing
|
|
79
|
-
* `package.json` never strands a consumer without their `.agents/` payload.
|
|
23
|
+
* Two signals, both biased toward running the sync:
|
|
24
|
+
* 1. A `node_modules` segment in this module's own path means a dependency
|
|
25
|
+
* install — never the source repo (reading the package's own
|
|
26
|
+
* `package.json` would always say `mandrel`).
|
|
27
|
+
* 2. Otherwise compare the invoking root's `package.json#name` (`INIT_CWD`,
|
|
28
|
+
* or the module-relative repo root outside npm) to `mandrel`.
|
|
29
|
+
* Any read/parse error returns `false`.
|
|
80
30
|
*
|
|
81
31
|
* @param {{ fs?: typeof nodeFs, initCwd?: string, moduleUrl?: string }} [opts]
|
|
82
32
|
* @returns {boolean} `true` when running in the `mandrel` source repo.
|
|
@@ -88,13 +38,8 @@ export function isSourceCheckout({
|
|
|
88
38
|
} = {}) {
|
|
89
39
|
try {
|
|
90
40
|
const here = path.dirname(fileURLToPath(moduleUrl));
|
|
91
|
-
// Installed as a dependency → unambiguously a consumer install, regardless
|
|
92
|
-
// of what any package.json#name says. Run the sync.
|
|
93
41
|
if (here.split(path.sep).includes('node_modules')) return false;
|
|
94
42
|
|
|
95
|
-
// Source checkout: resolve the invoking project root (the dir where
|
|
96
|
-
// `npm install` ran) and compare its package name. Fall back to the
|
|
97
|
-
// module-relative repo root when npm did not set INIT_CWD.
|
|
98
43
|
const root = initCwd || path.join(here, '..');
|
|
99
44
|
const pkg = JSON.parse(
|
|
100
45
|
fs.readFileSync(path.join(root, 'package.json'), 'utf8'),
|
|
@@ -106,30 +51,10 @@ export function isSourceCheckout({
|
|
|
106
51
|
}
|
|
107
52
|
|
|
108
53
|
/**
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
* committed `.agents/` source is never overwritten — even under
|
|
114
|
-
* `--ignore-scripts=false`.
|
|
115
|
-
*
|
|
116
|
-
* `runSync` calls its injected `exit` with a non-zero code when the package
|
|
117
|
-
* is not resolvable (the common `--ignore-scripts`-adjacent failure). We
|
|
118
|
-
* intercept that here instead of letting it propagate to `process.exit`,
|
|
119
|
-
* and we also catch any thrown error (e.g. a mid-copy filesystem fault), so
|
|
120
|
-
* the postinstall lifecycle can never fail the consumer's `npm install`.
|
|
121
|
-
*
|
|
122
|
-
* **Destination root (Story #3584).** `runSync` derives its destination from
|
|
123
|
-
* `process.cwd()`, but npm runs a dependency's lifecycle scripts with cwd set
|
|
124
|
-
* to the **package's own directory** (`node_modules/mandrel`), not
|
|
125
|
-
* the consumer project root. Left unset, the materializer would copy
|
|
126
|
-
* `.agents/` back onto the package's own payload and the consumer's project
|
|
127
|
-
* root would get nothing. We pass `runSync` a `cwd` resolving to `INIT_CWD` —
|
|
128
|
-
* the directory where `npm install` was invoked (the consumer root) — falling
|
|
129
|
-
* back to `process.cwd()` only when the hook runs outside npm (`INIT_CWD`
|
|
130
|
-
* unset). This is scoped to the postinstall path: the manual `mandrel sync` /
|
|
131
|
-
* `mandrel update` paths already run from the project root and keep
|
|
132
|
-
* `runSync`'s default `process.cwd()` behaviour.
|
|
54
|
+
* Both a non-zero `exit` from `runSync` and a thrown error become the exit-0
|
|
55
|
+
* hint. The destination is `INIT_CWD` (the consumer root), because npm runs
|
|
56
|
+
* lifecycle scripts with cwd set to `node_modules/mandrel` — syncing there
|
|
57
|
+
* would copy the payload onto itself.
|
|
133
58
|
*
|
|
134
59
|
* @param {{
|
|
135
60
|
* sync?: typeof runSync,
|
|
@@ -148,9 +73,7 @@ export function runPostinstall({
|
|
|
148
73
|
writeErr = (s) => process.stderr.write(s),
|
|
149
74
|
exit = (code) => process.exit(code),
|
|
150
75
|
} = {}) {
|
|
151
|
-
//
|
|
152
|
-
// framework's own committed `.agents/` source. No hint — this is the
|
|
153
|
-
// expected, correct no-op in the framework repo, not a degraded state.
|
|
76
|
+
// Expected no-op in the framework repo, so no hint.
|
|
154
77
|
if (detectSource()) {
|
|
155
78
|
exit(0);
|
|
156
79
|
return { exitCode: 0, hinted: false, skipped: true };
|
|
@@ -158,18 +81,8 @@ export function runPostinstall({
|
|
|
158
81
|
|
|
159
82
|
let syncFailed = false;
|
|
160
83
|
try {
|
|
161
|
-
// No argv is forwarded: the install-time materialization is a plain,
|
|
162
|
-
// overwrite-in-place copy. The `mandrel sync` tokens in the package.json
|
|
163
|
-
// `postinstall` string document intent (and are what the hint points
|
|
164
|
-
// operators at); they are not flags this hook needs to honor.
|
|
165
84
|
sync({
|
|
166
|
-
// Resolve the destination from INIT_CWD (the consumer project root,
|
|
167
|
-
// where `npm install` ran), not the package dir npm makes cwd during
|
|
168
|
-
// the postinstall lifecycle (Story #3584). Fall back to process.cwd()
|
|
169
|
-
// outside npm, when INIT_CWD is unset.
|
|
170
85
|
cwd: () => initCwd || process.cwd(),
|
|
171
|
-
// Best-effort: never let sync's own non-zero exit terminate the
|
|
172
|
-
// install. Record the failure and fall through to the exit-0 hint.
|
|
173
86
|
exit: (code) => {
|
|
174
87
|
if (code !== 0) syncFailed = true;
|
|
175
88
|
},
|
|
@@ -182,13 +95,11 @@ export function runPostinstall({
|
|
|
182
95
|
writeErr(HINT);
|
|
183
96
|
}
|
|
184
97
|
|
|
185
|
-
// Always succeed: the install must not fail on a best-effort sync.
|
|
186
98
|
exit(0);
|
|
187
99
|
return { exitCode: 0, hinted: syncFailed, skipped: false };
|
|
188
100
|
}
|
|
189
101
|
|
|
190
|
-
//
|
|
191
|
-
// test). `process.argv[1]` is the resolved path to this file under npm.
|
|
102
|
+
// Only when run as the hook, not when imported by a test.
|
|
192
103
|
const invokedDirectly = process.argv[1]?.endsWith('postinstall.js');
|
|
193
104
|
if (invokedDirectly) {
|
|
194
105
|
runPostinstall();
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -15,6 +15,66 @@ All notable changes to this project will be documented in this file.
|
|
|
15
15
|
-->
|
|
16
16
|
<!-- markdownlint-disable-file MD004 MD012 MD037 -->
|
|
17
17
|
|
|
18
|
+
## [2.61.0](https://github.com/dsj1984/mandrel/compare/mandrel-v2.60.0...mandrel-v2.61.0) (2026-09-18)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### ⚠ BREAKING CHANGES
|
|
22
|
+
|
|
23
|
+
* these .agentrc keys are removed and now fail validation (mandrel update strips them first): delivery.quality.gates.lint, delivery.quality.gates.lighthouse, delivery.quality.gateScoping, delivery.quality.formatAutofix, delivery.quality.codingGuardrails, delivery.quality.baselineEpsilon, delivery.quality.autoRefresh.crapJumpCap, delivery.quality.autoRefresh.scope, delivery.quality.gates.crap.friction, delivery.quality.gates.crap.refreshTag, delivery.quality.gates.crap.refreshTimeoutMs, delivery.quality.gates.crap.incrementalCoverage.enabled, delivery.quality.gates.maintainability.refreshTag, delivery.quality.gates.maintainability.refreshTimeoutMs, delivery.quality.gates.duplication.refreshTimeoutMs, delivery.quality.gates.coverage.timeoutMs, delivery.quality.gates.mutation.strykerConfigPath, delivery.ci.watch, delivery.execution.timeoutMs, delivery.execution.requireCreditedCapture, delivery.tempRetention.staleDays, delivery.mergeWatch.intervalSeconds, delivery.mergeWatch.updateAttempts, delivery.review, delivery.feedbackLoop.frictionWindowDays, delivery.auditToStories, delivery.codeReview.providerConfig, delivery.codeReview.maxFixAttempts, github.defaultTimeoutMs, planning.memoryPool. The lint and lighthouse baseline kinds are gone from check-baselines.
|
|
24
|
+
* removed from the shipped payload (now repo-root scripts/, not distributed): .agents/scripts/test-isolate.js, .agents/scripts/check-test-portability.js, .agents/scripts/install-matrix-assert.js, .agents/scripts/check-audit-attribution.js, .agents/scripts/check-pinned-override-notes.js, .agents/scripts/check-action-pinning.js, .agents/scripts/check-baseline-drift.js, .agents/scripts/check-baseline-scope.js, .agents/scripts/check-generated-validator.js, .agents/scripts/check-knip-entries.js, .agents/scripts/check-lifecycle-lint.js, .agents/scripts/check-schema-references.js, .agents/scripts/check-workflow-citations.js, .agents/scripts/check-workflow-cli-lint.js, .agents/scripts/check-workflow-timeouts.js, .agents/scripts/lint-label-vocabulary.js, .agents/scripts/provision-git-hooks.js, .agents/scripts/run-coverage.js, .agents/scripts/run-lint.js, .agents/scripts/run-test-profile.js, .agents/scripts/run-verify.js, .agents/scripts/update-dead-exports-baseline.js, .agents/scripts/prune-baseline-orphans.js, .agents/scripts/post-structured-comment.js, plus .agents/scripts/lib/test-isolate/, .agents/scripts/lib/test-profile/, .agents/scripts/lib/dynamic-workflow/ and the rules .agents/rules/known-tooling-behavior.md, .agents/rules/test-seams.md and .agents/rules/orchestration-error-handling.md (now docs/contributing/).
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
* adopt a contract-once comment policy and trim source comments to it ([#5384](https://github.com/dsj1984/mandrel/issues/5384)) ([#5391](https://github.com/dsj1984/mandrel/issues/5391)) ([13b98de](https://github.com/dsj1984/mandrel/commit/13b98de474019fd61935f8e95b855b8c6f923d7d))
|
|
29
|
+
* cut the unused .agentrc config surface and migrate consumers off it ([#5382](https://github.com/dsj1984/mandrel/issues/5382)) ([#5389](https://github.com/dsj1984/mandrel/issues/5389)) ([660a71c](https://github.com/dsj1984/mandrel/commit/660a71cf5b1acd77a44a4460c4424e43746bf738))
|
|
30
|
+
* stop close re-running the suite after base-sync and failing at pre-push on CRAP scope ([#5378](https://github.com/dsj1984/mandrel/issues/5378)) ([#5379](https://github.com/dsj1984/mandrel/issues/5379)) ([83bda93](https://github.com/dsj1984/mandrel/commit/83bda93942a909bd18307ae0dedabf3c814768af))
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
|
|
35
|
+
* make the full-suite lock and close's suite spawns signal-safe, bounded and visible ([#5377](https://github.com/dsj1984/mandrel/issues/5377)) ([#5387](https://github.com/dsj1984/mandrel/issues/5387)) ([e3a32cb](https://github.com/dsj1984/mandrel/commit/e3a32cb6f773892b8cbfd0d4b9bbc81256038777))
|
|
36
|
+
* move contributor-only tooling out of the .agents payload ([#5381](https://github.com/dsj1984/mandrel/issues/5381)) ([#5388](https://github.com/dsj1984/mandrel/issues/5388)) ([984352b](https://github.com/dsj1984/mandrel/commit/984352b0cdcdd5707c8ed0c49e728bc9875634c6))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
|
|
41
|
+
* make each close-path merge decision once ([#5383](https://github.com/dsj1984/mandrel/issues/5383)) ([#5390](https://github.com/dsj1984/mandrel/issues/5390)) ([027da2e](https://github.com/dsj1984/mandrel/commit/027da2efe4719c0dc2a6a5065afc710bd0f796a0))
|
|
42
|
+
|
|
43
|
+
## [2.60.0](https://github.com/dsj1984/mandrel/compare/mandrel-v2.59.0...mandrel-v2.60.0) (2026-09-18)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
### ⚠ BREAKING CHANGES
|
|
47
|
+
|
|
48
|
+
* `delivery.feedbackLoop.auditResultsAutoFile` is no longer a valid `.agentrc.json` key. `mandrel update` strips it automatically.
|
|
49
|
+
* deliver-light.js no longer accepts --kinds, --magnitude, --uncertainty or --route; STORY_SHAPE_CEILINGS and the four ceiling SHAPE_CODES are removed, and no gate envelope carries warnings[].
|
|
50
|
+
* under delivery.routing.ceremonyProfile standard the acceptance verdict is authored inline; set strict to keep a fresh-context critic.
|
|
51
|
+
* plan-persist.js persists on a clean dry-run by default — pass --dry-run to validate only; the "Commit subject begins with '<prefix>:'" acceptance validator is removed; an empty verify[] is a warning, not a refusal.
|
|
52
|
+
* delivery.feedbackLoop.retroProposals and delivery.feedbackLoop.auditResultsAutoFile now default to false; a consumer that relied on auto-filed follow-up issues sets both to true in .agentrc.json.
|
|
53
|
+
|
|
54
|
+
### Added
|
|
55
|
+
|
|
56
|
+
* add deliver-run.js so a multi-Story run is one script beat plus spawns and closes, not a hand-driven protocol ([#5345](https://github.com/dsj1984/mandrel/issues/5345)) ([#5354](https://github.com/dsj1984/mandrel/issues/5354)) ([591dad7](https://github.com/dsj1984/mandrel/commit/591dad75923133bef9e3a9d095ac47442464943b))
|
|
57
|
+
* clamp deliver-runner concurrency to one when worktree isolation resolves off, so two workers can never share a checkout ([#5357](https://github.com/dsj1984/mandrel/issues/5357)) ([#5360](https://github.com/dsj1984/mandrel/issues/5360)) ([1f3f651](https://github.com/dsj1984/mandrel/commit/1f3f6515e4a7a4fd2c730001dc6dd4cdb44f251e))
|
|
58
|
+
* close fails fast with a named blocker when GitHub GraphQL is unavailable, instead of a raw 403 after the full gate chain ([#5355](https://github.com/dsj1984/mandrel/issues/5355)) ([#5359](https://github.com/dsj1984/mandrel/issues/5359)) ([b46c263](https://github.com/dsj1984/mandrel/commit/b46c26329dd7cc1e968e607ccaae9d51a9f1ef84))
|
|
59
|
+
* collapse the ceremony decision to what it decides and delete the inert layer around it ([#5366](https://github.com/dsj1984/mandrel/issues/5366)) ([#5375](https://github.com/dsj1984/mandrel/issues/5375)) ([54d0ece](https://github.com/dsj1984/mandrel/commit/54d0ece864d8cb3ec824228dc097999781f7b29f))
|
|
60
|
+
* collapse the light path to one gate and let an escalation continue in-session ([#5344](https://github.com/dsj1984/mandrel/issues/5344)) ([#5353](https://github.com/dsj1984/mandrel/issues/5353)) ([c09acd6](https://github.com/dsj1984/mandrel/commit/c09acd69a8525dd33073922a7541bb9488929249))
|
|
61
|
+
* cut the restated delivery rules, the v1 refusals and the sibling-coherence step, and turn auto-filing off by default ([#5341](https://github.com/dsj1984/mandrel/issues/5341)) ([#5350](https://github.com/dsj1984/mandrel/issues/5350)) ([349d346](https://github.com/dsj1984/mandrel/commit/349d3468c11a23504b510ac80d0716b5dd709853))
|
|
62
|
+
* delivery ceremony diet: one inline verdict per Story, opt-in fresh critics and audit roster, fewer Story comments, and one CI rerun after a recorded verdict ([#5343](https://github.com/dsj1984/mandrel/issues/5343)) ([#5352](https://github.com/dsj1984/mandrel/issues/5352)) ([1ac35c4](https://github.com/dsj1984/mandrel/commit/1ac35c40745bd1d6f0945f9a5ffd3f975452dbff))
|
|
63
|
+
* loosen plan authoring: one persist command, bare paths in changes[], empty verify[] as a warning, and the fossil validators removed ([#5342](https://github.com/dsj1984/mandrel/issues/5342)) ([#5351](https://github.com/dsj1984/mandrel/issues/5351)) ([c7534a5](https://github.com/dsj1984/mandrel/commit/c7534a523cf39b24324d26f2cad81b2ec4fb22df))
|
|
64
|
+
* make a dispatch that never reached init visible in the beat envelope ([#5363](https://github.com/dsj1984/mandrel/issues/5363)) ([#5370](https://github.com/dsj1984/mandrel/issues/5370)) ([ab3c755](https://github.com/dsj1984/mandrel/commit/ab3c7553975ef5dce8c60112d7f8c278c5dd0d8d))
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
### Fixed
|
|
68
|
+
|
|
69
|
+
* `mandrel update` reports whether the bump is actually staged instead of asserting it ([#5339](https://github.com/dsj1984/mandrel/issues/5339)) ([#5349](https://github.com/dsj1984/mandrel/issues/5349)) ([07f63c7](https://github.com/dsj1984/mandrel/commit/07f63c79bdb19a532e82d413de719a194c170504))
|
|
70
|
+
* anchor pre-push coverage capture and the CRAP preview on one resolved ref ([#5365](https://github.com/dsj1984/mandrel/issues/5365)) ([#5373](https://github.com/dsj1984/mandrel/issues/5373)) ([cb189e3](https://github.com/dsj1984/mandrel/commit/cb189e3a005749305cc0ce2075ea17793493bb0e))
|
|
71
|
+
* capture coverage before the pre-push quality preview (refs [#5356](https://github.com/dsj1984/mandrel/issues/5356)) ([#5358](https://github.com/dsj1984/mandrel/issues/5358)) ([14ef1dd](https://github.com/dsj1984/mandrel/commit/14ef1dde384455f16f3ddd502881c132fd6ae056))
|
|
72
|
+
* close the three correctness holes the plan-authoring loosening left in persist ([#5361](https://github.com/dsj1984/mandrel/issues/5361)) ([#5372](https://github.com/dsj1984/mandrel/issues/5372)) ([aef03bd](https://github.com/dsj1984/mandrel/commit/aef03bd90e14cc2dac68ea4d7a04f0f262e2494e))
|
|
73
|
+
* delete the write-only plan checkpoint payload and the three unreachable modules ([#5367](https://github.com/dsj1984/mandrel/issues/5367)) ([#5374](https://github.com/dsj1984/mandrel/issues/5374)) ([4c0c835](https://github.com/dsj1984/mandrel/commit/4c0c835d9eded8e993bb7ebd3e66e86bec4d2377))
|
|
74
|
+
* demote the workflow prose ratchets to reports and delete the reference sections that describe retired mechanisms ([#5340](https://github.com/dsj1984/mandrel/issues/5340)) ([#5347](https://github.com/dsj1984/mandrel/issues/5347)) ([8d76329](https://github.com/dsj1984/mandrel/commit/8d76329e3aacc726e39d1839f01e618fb7361662))
|
|
75
|
+
* report the index mandrel update actually observes, from one read ([#5364](https://github.com/dsj1984/mandrel/issues/5364)) ([#5371](https://github.com/dsj1984/mandrel/issues/5371)) ([12af953](https://github.com/dsj1984/mandrel/commit/12af95383f7ddbfe137715aa10bce3b25a7b95a3))
|
|
76
|
+
* treat a rate-limited GraphQL probe as fail-open rather than unreachable (refs [#5362](https://github.com/dsj1984/mandrel/issues/5362)) ([#5369](https://github.com/dsj1984/mandrel/issues/5369)) ([db6a9e0](https://github.com/dsj1984/mandrel/commit/db6a9e08441baf40281962e0b226575f9c7b1846))
|
|
77
|
+
|
|
18
78
|
## [2.59.0](https://github.com/dsj1984/mandrel/compare/mandrel-v2.58.0...mandrel-v2.59.0) (2026-09-14)
|
|
19
79
|
|
|
20
80
|
|
package/lib/cli/doctor.js
CHANGED
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
// lib/cli/doctor.js
|
|
2
2
|
/**
|
|
3
|
-
* `mandrel doctor
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* prints a ✔/✘ per-check report with remedies for failures, prints a
|
|
7
|
-
* final summary line, and exits 0 when all checks pass or non-zero when
|
|
8
|
-
* any check fails.
|
|
9
|
-
*
|
|
10
|
-
* Output contract (per Story #3450 AC):
|
|
11
|
-
* pass → "✔ <name> <detail>"
|
|
12
|
-
* fail → "✘ <name> <detail>\n → <remedy>"
|
|
13
|
-
* final → "✅ Ready (N/N checks passed)"
|
|
14
|
-
* | "❌ Not ready (N/N checks failed)"
|
|
15
|
-
*
|
|
16
|
-
* All output goes to process.stdout so it can be captured by tests.
|
|
17
|
-
* Exit code 0 = all pass, 1 = any fail.
|
|
18
|
-
*
|
|
19
|
-
* Injectable seams (used by tests):
|
|
20
|
-
* - `checks` — replaces the default registry array
|
|
21
|
-
* - `write` — replaces process.stdout.write
|
|
22
|
-
* - `exit` — replaces process.exit
|
|
23
|
-
* - `writeResultCache` — replaces the temp/doctor-result.json writer
|
|
3
|
+
* `mandrel doctor`: run the registry checks in order, print a ✔/✘ line per
|
|
4
|
+
* check (with the remedy under a failure) and a summary; exit 1 on any
|
|
5
|
+
* failure.
|
|
24
6
|
*/
|
|
25
7
|
|
|
26
8
|
import nodeFs from 'node:fs';
|
|
@@ -32,13 +14,7 @@ import {
|
|
|
32
14
|
} from '../../.agents/scripts/lib/doc-tiers.js';
|
|
33
15
|
import { registry } from './registry.js';
|
|
34
16
|
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
// Formatting helpers
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
|
|
39
17
|
/**
|
|
40
|
-
* Pad or truncate `name` to `width` characters so columns line up neatly.
|
|
41
|
-
*
|
|
42
18
|
* @param {string} name
|
|
43
19
|
* @param {number} width
|
|
44
20
|
* @returns {string}
|
|
@@ -47,13 +23,10 @@ function padName(name, width) {
|
|
|
47
23
|
return name.length >= width ? name : name + ' '.repeat(width - name.length);
|
|
48
24
|
}
|
|
49
25
|
|
|
50
|
-
//
|
|
51
|
-
// "agents-materialized" = 19 chars; use 21 for breathing room).
|
|
26
|
+
// Longest check name is 19 chars.
|
|
52
27
|
const NAME_COL = 21;
|
|
53
28
|
|
|
54
29
|
/**
|
|
55
|
-
* Format a single check result line (or lines when a remedy is present).
|
|
56
|
-
*
|
|
57
30
|
* @param {{ name: string, ok: boolean, detail: string, remedy?: string }} result
|
|
58
31
|
* @returns {string}
|
|
59
32
|
*/
|
|
@@ -68,8 +41,6 @@ function formatResult({ name, ok, detail, remedy }) {
|
|
|
68
41
|
}
|
|
69
42
|
|
|
70
43
|
/**
|
|
71
|
-
* Format the final summary line.
|
|
72
|
-
*
|
|
73
44
|
* @param {number} passed
|
|
74
45
|
* @param {number} total
|
|
75
46
|
* @returns {string}
|
|
@@ -83,17 +54,9 @@ function formatSummary(passed, total) {
|
|
|
83
54
|
}
|
|
84
55
|
|
|
85
56
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* tally and therefore never changes the doctor exit code (Story #4438). Any
|
|
90
|
-
* failure to resolve the closure degrades to a neutral line rather than
|
|
91
|
-
* throwing, so an unreadable tree never breaks the doctor run.
|
|
92
|
-
*
|
|
93
|
-
* Security (security-baseline § 5 — Data Leakage & Logging): emits only a file
|
|
94
|
-
* count and byte total, never file contents.
|
|
95
|
-
*
|
|
96
|
-
* Exported for testing.
|
|
57
|
+
* Informational line for the `CLAUDE.md` always-loaded closure (file count,
|
|
58
|
+
* KB). Never counted toward the verdict; a resolve failure degrades to a
|
|
59
|
+
* neutral line.
|
|
97
60
|
*
|
|
98
61
|
* @param {{ cwd?: () => string, resolveClosure?: (root: string) => Array<{ path: string, bytes: number }> }} [opts]
|
|
99
62
|
* @returns {string} a single line terminated by `\n`
|
|
@@ -116,19 +79,9 @@ export function formatClosureReport({
|
|
|
116
79
|
return `ℹ ${label} ${files.length} file(s), ${kb} KB always-loaded\n`;
|
|
117
80
|
}
|
|
118
81
|
|
|
119
|
-
// ---------------------------------------------------------------------------
|
|
120
|
-
// Result cache
|
|
121
|
-
// ---------------------------------------------------------------------------
|
|
122
|
-
|
|
123
82
|
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* preflight) can read the last recorded verdict without re-running doctor.
|
|
127
|
-
* `temp/` is the gitignored scratch root, so neither git nor the sync prune
|
|
128
|
-
* pass ever sees the cache. Any write failure is swallowed — the cache is
|
|
129
|
-
* advisory, never a gate.
|
|
130
|
-
*
|
|
131
|
-
* Exported for testing.
|
|
83
|
+
* Record the verdict in `temp/doctor-result.json` for workflows that read it
|
|
84
|
+
* without re-running doctor. Advisory: write failures are swallowed.
|
|
132
85
|
*
|
|
133
86
|
* @param {'ready'|'unready'} verdict
|
|
134
87
|
* @param {{ fs?: typeof nodeFs, cwd?: () => string }} [opts]
|
|
@@ -146,17 +99,11 @@ export function writeDoctorResultCache(
|
|
|
146
99
|
`${JSON.stringify({ verdict, checkedAt: new Date().toISOString() }, null, 2)}\n`,
|
|
147
100
|
);
|
|
148
101
|
} catch {
|
|
149
|
-
//
|
|
102
|
+
// An unwritable temp/ must never fail the doctor run.
|
|
150
103
|
}
|
|
151
104
|
}
|
|
152
105
|
|
|
153
|
-
// ---------------------------------------------------------------------------
|
|
154
|
-
// Doctor runner (exported for testing)
|
|
155
|
-
// ---------------------------------------------------------------------------
|
|
156
|
-
|
|
157
106
|
/**
|
|
158
|
-
* Run all checks and emit a formatted report.
|
|
159
|
-
*
|
|
160
107
|
* @param {{
|
|
161
108
|
* checks?: Array<{ name: string, run(opts?: unknown): { ok: boolean, detail: string, remedy?: string } }>,
|
|
162
109
|
* write?: (s: string) => void,
|
|
@@ -181,8 +128,7 @@ export async function runDoctor({
|
|
|
181
128
|
write(formatResult({ name: check.name, ...result }));
|
|
182
129
|
}
|
|
183
130
|
|
|
184
|
-
// Report-only
|
|
185
|
-
// never affects the doctor verdict or exit code (Story #4438).
|
|
131
|
+
// Report-only: not counted toward passed/total.
|
|
186
132
|
write(closureReport());
|
|
187
133
|
|
|
188
134
|
const total = checks.length;
|
|
@@ -195,13 +141,7 @@ export async function runDoctor({
|
|
|
195
141
|
}
|
|
196
142
|
}
|
|
197
143
|
|
|
198
|
-
// ---------------------------------------------------------------------------
|
|
199
|
-
// Subcommand entry point (called by bin/mandrel.js)
|
|
200
|
-
// ---------------------------------------------------------------------------
|
|
201
|
-
|
|
202
144
|
/**
|
|
203
|
-
* Default export consumed by `bin/mandrel.js`.
|
|
204
|
-
*
|
|
205
145
|
* @param {string[]} _argv Unused — `mandrel doctor` takes no arguments.
|
|
206
146
|
* @returns {Promise<void>}
|
|
207
147
|
*/
|