@bensandee/tooling 0.69.0 → 0.71.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/README.md +33 -19
- package/dist/bin.mjs +8794 -5991
- package/package.json +7 -6
- package/tooling.schema.json +32 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bensandee/tooling",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.71.0",
|
|
4
4
|
"description": "CLI tool to bootstrap and maintain standardized TypeScript project tooling",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"@bensandee/common": "0.1.4",
|
|
33
33
|
"@clack/prompts": "^1.7.0",
|
|
34
34
|
"citty": "^0.2.2",
|
|
35
|
-
"dependency-cruiser": "^18.
|
|
35
|
+
"dependency-cruiser": "^18.2.0",
|
|
36
36
|
"json5": "^2.2.3",
|
|
37
37
|
"jsonc-parser": "^3.3.1",
|
|
38
38
|
"picomatch": "^4.0.5",
|
|
@@ -41,16 +41,17 @@
|
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@bensandee/config": "0.14.0",
|
|
44
|
-
"@changesets/cli": "
|
|
44
|
+
"@changesets/cli": "3.0.1",
|
|
45
45
|
"@release-it/bumper": "8.0.0",
|
|
46
46
|
"@types/node": "24.13.3",
|
|
47
47
|
"@types/picomatch": "4.0.3",
|
|
48
48
|
"commit-and-tag-version": "13.1.2",
|
|
49
|
+
"oxfmt": "0.57.0",
|
|
49
50
|
"prettier": "3.9.6",
|
|
50
|
-
"release-it": "21.0.
|
|
51
|
+
"release-it": "21.0.2",
|
|
51
52
|
"tsdown": "0.22.14",
|
|
52
|
-
"@bensandee/claude-hooks": "0.11.
|
|
53
|
-
"@bensandee/forgejo": "0.
|
|
53
|
+
"@bensandee/claude-hooks": "0.11.2",
|
|
54
|
+
"@bensandee/forgejo": "0.2.0"
|
|
54
55
|
},
|
|
55
56
|
"scripts": {
|
|
56
57
|
"build": "tsdown",
|
package/tooling.schema.json
CHANGED
|
@@ -263,6 +263,12 @@
|
|
|
263
263
|
"type": "number",
|
|
264
264
|
"minimum": 0
|
|
265
265
|
},
|
|
266
|
+
"floorPp": {
|
|
267
|
+
"description": "Absolute floor in percent: a total at or above it passes the check regardless of baseline delta, and --update-baseline tracks its current value freely (up or down). Below the floor, the baseline ratchet applies unchanged. Unset means pure ratchet semantics.",
|
|
268
|
+
"type": "number",
|
|
269
|
+
"minimum": 0,
|
|
270
|
+
"maximum": 100
|
|
271
|
+
},
|
|
266
272
|
"gateOnPullRequests": {
|
|
267
273
|
"description": "Run coverage on PR builds too (default: false; deferred follow-up)",
|
|
268
274
|
"type": "boolean"
|
|
@@ -291,9 +297,11 @@
|
|
|
291
297
|
"type": "object",
|
|
292
298
|
"properties": {
|
|
293
299
|
"enabled": {
|
|
300
|
+
"description": "Opts into the gate (default false; absent and false alike mean off). `health:check` and `health:summary` print a disabled notice and exit 0 rather than failing while off. Read at generation time as well as at check time, so enabling the gate takes a `repo:sync` as well as a config edit. Dominates `history`.",
|
|
294
301
|
"type": "boolean"
|
|
295
302
|
},
|
|
296
303
|
"src": {
|
|
304
|
+
"description": "Repo-relative directory roots the measurement is scoped to (default `[\"packages/*/src\"]` when a `packages/` directory exists at the repo root, else `[\"src\"]`). Scopes both the file-tree walk and the dependency-cruiser globs, but not the same way: for the file-tree walk, an entry is expanded against existing directories (one `*` segment only, nothing else). An entry the expander cannot represent at all (`src/**/*.ts`, any other `**`) and one that is well-formed but names no existing directory (a typo, a directory renamed after the config was written) are both reported by name, classified separately, and a run whose file-tree scope resolves to zero source files fails `health:check` before its baseline is read, created, updated, or reset -- `--no-fail-on-empty-src` downgrades that to a notice. For the dependency-cruiser globs the entry is spliced in verbatim, so a `**` entry like `packages/**/src` still cruises and leaves the graph metrics live even though `crowdedDirectories` and the linesOfCode observation see an empty tree. Use `packages/*/src`. The file-tree walk also drops test files, `.d.ts` declarations and `exclude` matches; the dependency-cruiser half drops only `exclude` matches, so a colocated test file or a `.d.ts` under a `src` root still carries graph edges.",
|
|
297
305
|
"type": "array",
|
|
298
306
|
"items": {
|
|
299
307
|
"type": "string"
|
|
@@ -307,12 +315,14 @@
|
|
|
307
315
|
}
|
|
308
316
|
},
|
|
309
317
|
"extensions": {
|
|
318
|
+
"description": "Leading-dot file extensions that count as source (default `[\".ts\", \".tsx\"]` for a `typescript` stack, `[\".js\", \".jsx\", \".mjs\", \".cjs\"]` for `javascript`, `[]` for `none`). Feeds the walk and the cruiser globs. `[]` means match-all for the walk and switches the linesOfCode observation off; the line counter strips C-family comments, so a non-C-family extension degrades that observation to non-blank lines. `[]` means something different for the cruiser half: the cruiser glob then has no extension group to match, leaving the dependency-cruiser half matching nothing, so on a ts/js stack an explicit `\"extensions\": []` leaves every graph metric reading 0 while the gate passes.",
|
|
310
319
|
"type": "array",
|
|
311
320
|
"items": {
|
|
312
321
|
"type": "string"
|
|
313
322
|
}
|
|
314
323
|
},
|
|
315
324
|
"directoryFileLimit": {
|
|
325
|
+
"description": "A directory is a crowdedDirectories offender at strictly more than this many measured files sitting directly in it (default 20). The metric counts over-limit directories rather than files, so splitting one crowded directory into two crowded directories makes it worse. 0 makes every directory holding a measured file an offender.",
|
|
316
326
|
"type": "integer",
|
|
317
327
|
"minimum": 0,
|
|
318
328
|
"maximum": 9007199254740991
|
|
@@ -340,13 +350,16 @@
|
|
|
340
350
|
"type": "boolean"
|
|
341
351
|
},
|
|
342
352
|
"history": {
|
|
353
|
+
"description": "How history is persisted. \"orphan-branch\" (default) has `health:record` append one JSON line per commit to `historyBranch` and has `repo:sync` emit the CI record and status steps; \"none\" turns both off. Does not disable the gate, since the baseline is a committed file. Ignored when `enabled` is false.",
|
|
343
354
|
"type": "string",
|
|
344
355
|
"enum": ["orphan-branch", "none"]
|
|
345
356
|
},
|
|
346
357
|
"historyBranch": {
|
|
358
|
+
"description": "The orphan branch `health:record` appends to and `health:status` reads (default \"bst/health-metrics\"). Never merges into the default branch and holds no source; separate from `coverage.historyBranch` and must not share a branch with it. `branch:prune`'s built-in never-touch list matches the default name exactly, so a custom name should be named in `branchPrune.exclude` as well.",
|
|
347
359
|
"type": "string"
|
|
348
360
|
},
|
|
349
361
|
"tolerance": {
|
|
362
|
+
"description": "Slack in offender counts before an increase is a regression: a metric fails when the current count exceeds baseline + tolerance (default 0, so any increase fails). The same allowance applies to every per-module ceiling in health-baseline.json's moduleCeilings, not only the headline metrics. A count, not a percentage -- coverage's percentage-point slack is `coverage.tolerancePp`. Raising it un-tracks every module beneath the new line at once, which is why a justified `exempt` entry is the better answer to one stubborn hub.",
|
|
350
363
|
"type": "integer",
|
|
351
364
|
"minimum": 0,
|
|
352
365
|
"maximum": 9007199254740991
|
|
@@ -521,6 +534,17 @@
|
|
|
521
534
|
},
|
|
522
535
|
"additionalProperties": false
|
|
523
536
|
},
|
|
537
|
+
"lint": {
|
|
538
|
+
"description": "bst lint:types (the type-aware oxlint gate) overrides. See lint.strictTypeAware.",
|
|
539
|
+
"type": "object",
|
|
540
|
+
"properties": {
|
|
541
|
+
"strictTypeAware": {
|
|
542
|
+
"description": "Make `bst lint:types` (the type-aware oxlint gate, backed by oxlint-tsgolint) exit non-zero on any finding while the tooling is still in its report phase (default false; the enforce phase, a later tooling release, exits non-zero unconditionally). A missing oxlint-tsgolint binary is also a hard failure rather than a notice while this is set: arming the gate is what turns a platform gap into a build break, deliberately, because the repo that armed it is the one that asked for it.",
|
|
543
|
+
"type": "boolean"
|
|
544
|
+
}
|
|
545
|
+
},
|
|
546
|
+
"additionalProperties": false
|
|
547
|
+
},
|
|
524
548
|
"agent": {
|
|
525
549
|
"description": "agent:daemon behaviour overrides. Opt-in: see agent.autonomy for the interior-autonomy gate.",
|
|
526
550
|
"type": "object",
|
|
@@ -533,6 +557,10 @@
|
|
|
533
557
|
"description": "Attempt a clean-only rebase of the work branch onto the default branch before the implement (execute) phase's container starts (default true). A clean rebase runs the container on the rebased branch; a conflicting one is aborted, reported on the run's ledger comment, and the run still proceeds on the un-rebased branch for a later agent/repair cycle to resolve -- it never fails the run. Set false to skip the attempt entirely for this repo: no fetch, no rebase, no abort, and the branch is worked exactly as cloned.",
|
|
534
558
|
"type": "boolean"
|
|
535
559
|
},
|
|
560
|
+
"backlog": {
|
|
561
|
+
"description": "Whether the daemon may self-trigger backlog runs consuming this repo's .agent/findings/ ledger (default: on wherever the ledger exists, which only happens in a repo whose own review loop wrote it). A backlog run opens a pull request that fixes or refutes the pending findings; false disarms it, leaving the ledger to accumulate for a human.",
|
|
562
|
+
"type": "boolean"
|
|
563
|
+
},
|
|
536
564
|
"priority": {
|
|
537
565
|
"description": "Map this repo's own issue-label names onto the daemon's four priority levels, e.g. {\"P1\": \"critical\", \"P4\": \"low\"}. The map UNIONS with the built-in priority/<level> names rather than replacing them, and the daemon does not create aliased labels -- the repo owns names the daemon did not choose. Priority affects claim order only: it never changes a run's model, effort, or any budget.",
|
|
538
566
|
"type": "object",
|
|
@@ -543,6 +571,10 @@
|
|
|
543
571
|
"type": "string",
|
|
544
572
|
"enum": ["critical", "high", "normal", "low"]
|
|
545
573
|
}
|
|
574
|
+
},
|
|
575
|
+
"triageAnalysis": {
|
|
576
|
+
"description": "Whether the daemon may route its own agent-note/human-triage-needed issues through the agent/analyze stage (default: off). Unlike agent.backlog, which defaults on, this defaults off: a backlog run batches every pending finding into one container, while triage routing spends one container per issue -- arming it is the reversible direction, not disarming it.",
|
|
577
|
+
"type": "boolean"
|
|
546
578
|
}
|
|
547
579
|
},
|
|
548
580
|
"additionalProperties": false
|