slopbrick 0.34.2 → 0.34.3

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.
@@ -34436,7 +34436,8 @@ var importPathMismatchRule = createRule({
34436
34436
 
34437
34437
  // src/rules/cpp/c-style-cast.ts
34438
34438
  var C_STYLE_CAST_REGEX = /\(\s*(?:int|long|short|char|float|double|bool|unsigned\s+\w+|signed\s+\w+|size_t|[A-Za-z_]\w*(?:\s*[*,&][^)]*)?)\s*\)\s*(\w+|[^a-zA-Z_])/g;
34439
- var NAMED_CAST_PREFIX_REGEX = /\b(?:static|reinterpret|const|dynamic)_cast\s*<[^>]*>\s*\($/;
34439
+ var NAMED_CAST_PREFIX_REGEX = /\b(?:static|reinterpret|const|dynamic)_cast\s*<[^>]*>\s*$/;
34440
+ var VOID_CAST_REGEX = /^\s*void\s*$/;
34440
34441
  var cppCStyleCastRule = createRule({
34441
34442
  id: "cpp/c-style-cast",
34442
34443
  category: "typo",
@@ -34456,9 +34457,10 @@ var cppCStyleCastRule = createRule({
34456
34457
  while ((m = C_STYLE_CAST_REGEX.exec(source)) !== null) {
34457
34458
  const innerMatch = /\(\s*([^)]+?)\s*\)/.exec(m[0]) ?? [];
34458
34459
  const inner = (innerMatch[1] ?? "").trim();
34460
+ if (VOID_CAST_REGEX.test(inner)) continue;
34459
34461
  const looksLikeCast = /\b(?:int|long|short|char|float|double|bool|unsigned|signed|size_t)\b/.test(inner) || /[*&]/.test(inner);
34460
34462
  if (!looksLikeCast) continue;
34461
- const before = source.slice(Math.max(0, m.index - 40), m.index);
34463
+ const before = source.slice(Math.max(0, m.index - 60), m.index);
34462
34464
  if (NAMED_CAST_PREFIX_REGEX.test(before)) continue;
34463
34465
  const line = source.slice(0, m.index).split("\n").length;
34464
34466
  issues.push({
@@ -34469,7 +34471,7 @@ var cppCStyleCastRule = createRule({
34469
34471
  message: `C-style cast at line ${line} \u2014 use static_cast / reinterpret_cast / const_cast`,
34470
34472
  line,
34471
34473
  column: 1,
34472
- advice: "Use the named cast that matches the intent: `static_cast<int>(x)`, `reinterpret_cast<MyClass*>(p)`, `const_cast<...>(ref)`, or `dynamic_cast<Derived*>(base)` for runtime-checked downcasts. C-style casts silently pick whichever the compiler needs \u2014 `static_cast`, `reinterpret_cast`, OR `const_cast` \u2014 which makes them impossible to grep for and impossible to review. The C++ Core Guidelines (ES.49) call this out by name. AI agents reach for `(int)x` because of training-data C textbooks. Reference: cpp/c-style-cast v0.24."
34474
+ advice: "Use the named cast that matches the intent: `static_cast<int>(x)`, `reinterpret_cast<MyClass*>(p)`, `const_cast<...>(ref)`, or `dynamic_cast<Derived*>(base)` for runtime-checked downcasts. C-style casts silently pick whichever the compiler needs \u2014 `static_cast`, `reinterpret_cast`, OR `const_cast` \u2014 which makes them impossible to grep for and impossible to review. The C++ Core Guidelines (ES.49) call this out by name. AI agents reach for `(int)x` because of training-data C textbooks. Reference: cpp/c-style-cast v0.34.3 (refined regex selectivity)."
34473
34475
  });
34474
34476
  }
34475
34477
  return issues;
@@ -45738,7 +45740,7 @@ var signal_strength_default = {
45738
45740
  precision: 0.2325,
45739
45741
  lastCalibratedAt: "2026-07-03T00:00:00Z",
45740
45742
  verdict: "DORMANT",
45741
- _calibrationNote: "v0.33: v9 C++ calibration (5107 neg, 1655 pos). Per-file unique: 874 TP, 2885 FP, ratio=0.93. Total fires were 32265 TP, 39954 FP \u2014 the regex is too broad and fires on every C-style cast including static_cast in template code. The per-file measurement (874/1655 = 53%) is more meaningful \u2014 both arms have similar proportions of files using C-style casts. INSUFFICIENT_DATA: pos arm 1655 files.",
45743
+ _calibrationNote: "v0.34.3: REFINED \u2014 NAMED_CAST_PREFIX_REGEX tightened (the old version required the lookback slice to end with `>(`, which never matched because the slice ends with `>`). Lookback increased 40\u219260 chars. Added `(void)x` discard-idom exclusion. v0.33 baseline: 874 TP / 2885 FP per-file (ratio 0.93, DORMANT). The refinement targets: (1) static_cast/const_cast/reinterpret_cast/dynamic_cast no longer fire when followed by whitespace before `(`; (2) class-type named casts like `static_cast<MyClass*>(p)` now correctly excluded (60-char lookback reaches the long typename); (3) `(void)x` deliberate discards are no longer flagged. Expected post-refinement ratio: 1.0-1.2 (still DORMANT but better-targeted). Full v9 re-calibration is part of the v0.35.0 re-measurement. v0.33: v9 C++ calibration (5107 neg, 1655 pos). Per-file unique: 874 TP, 2885 FP, ratio=0.93. Total fires were 32265 TP, 39954 FP \u2014 the regex is too broad and fires on every C-style cast including static_cast in template code. The per-file measurement (874/1655 = 53%) is more meaningful \u2014 both arms have similar proportions of files using C-style casts. INSUFFICIENT_DATA: pos arm 1655 files.",
45742
45744
  aiSpecific: true,
45743
45745
  _v7Verdict: "DORMANT",
45744
45746
  _v7Lift: 1,
@@ -34407,7 +34407,8 @@ var importPathMismatchRule = createRule({
34407
34407
 
34408
34408
  // src/rules/cpp/c-style-cast.ts
34409
34409
  var C_STYLE_CAST_REGEX = /\(\s*(?:int|long|short|char|float|double|bool|unsigned\s+\w+|signed\s+\w+|size_t|[A-Za-z_]\w*(?:\s*[*,&][^)]*)?)\s*\)\s*(\w+|[^a-zA-Z_])/g;
34410
- var NAMED_CAST_PREFIX_REGEX = /\b(?:static|reinterpret|const|dynamic)_cast\s*<[^>]*>\s*\($/;
34410
+ var NAMED_CAST_PREFIX_REGEX = /\b(?:static|reinterpret|const|dynamic)_cast\s*<[^>]*>\s*$/;
34411
+ var VOID_CAST_REGEX = /^\s*void\s*$/;
34411
34412
  var cppCStyleCastRule = createRule({
34412
34413
  id: "cpp/c-style-cast",
34413
34414
  category: "typo",
@@ -34427,9 +34428,10 @@ var cppCStyleCastRule = createRule({
34427
34428
  while ((m = C_STYLE_CAST_REGEX.exec(source)) !== null) {
34428
34429
  const innerMatch = /\(\s*([^)]+?)\s*\)/.exec(m[0]) ?? [];
34429
34430
  const inner = (innerMatch[1] ?? "").trim();
34431
+ if (VOID_CAST_REGEX.test(inner)) continue;
34430
34432
  const looksLikeCast = /\b(?:int|long|short|char|float|double|bool|unsigned|signed|size_t)\b/.test(inner) || /[*&]/.test(inner);
34431
34433
  if (!looksLikeCast) continue;
34432
- const before = source.slice(Math.max(0, m.index - 40), m.index);
34434
+ const before = source.slice(Math.max(0, m.index - 60), m.index);
34433
34435
  if (NAMED_CAST_PREFIX_REGEX.test(before)) continue;
34434
34436
  const line = source.slice(0, m.index).split("\n").length;
34435
34437
  issues.push({
@@ -34440,7 +34442,7 @@ var cppCStyleCastRule = createRule({
34440
34442
  message: `C-style cast at line ${line} \u2014 use static_cast / reinterpret_cast / const_cast`,
34441
34443
  line,
34442
34444
  column: 1,
34443
- advice: "Use the named cast that matches the intent: `static_cast<int>(x)`, `reinterpret_cast<MyClass*>(p)`, `const_cast<...>(ref)`, or `dynamic_cast<Derived*>(base)` for runtime-checked downcasts. C-style casts silently pick whichever the compiler needs \u2014 `static_cast`, `reinterpret_cast`, OR `const_cast` \u2014 which makes them impossible to grep for and impossible to review. The C++ Core Guidelines (ES.49) call this out by name. AI agents reach for `(int)x` because of training-data C textbooks. Reference: cpp/c-style-cast v0.24."
34445
+ advice: "Use the named cast that matches the intent: `static_cast<int>(x)`, `reinterpret_cast<MyClass*>(p)`, `const_cast<...>(ref)`, or `dynamic_cast<Derived*>(base)` for runtime-checked downcasts. C-style casts silently pick whichever the compiler needs \u2014 `static_cast`, `reinterpret_cast`, OR `const_cast` \u2014 which makes them impossible to grep for and impossible to review. The C++ Core Guidelines (ES.49) call this out by name. AI agents reach for `(int)x` because of training-data C textbooks. Reference: cpp/c-style-cast v0.34.3 (refined regex selectivity)."
34444
34446
  });
34445
34447
  }
34446
34448
  return issues;
@@ -45709,7 +45711,7 @@ var signal_strength_default = {
45709
45711
  precision: 0.2325,
45710
45712
  lastCalibratedAt: "2026-07-03T00:00:00Z",
45711
45713
  verdict: "DORMANT",
45712
- _calibrationNote: "v0.33: v9 C++ calibration (5107 neg, 1655 pos). Per-file unique: 874 TP, 2885 FP, ratio=0.93. Total fires were 32265 TP, 39954 FP \u2014 the regex is too broad and fires on every C-style cast including static_cast in template code. The per-file measurement (874/1655 = 53%) is more meaningful \u2014 both arms have similar proportions of files using C-style casts. INSUFFICIENT_DATA: pos arm 1655 files.",
45714
+ _calibrationNote: "v0.34.3: REFINED \u2014 NAMED_CAST_PREFIX_REGEX tightened (the old version required the lookback slice to end with `>(`, which never matched because the slice ends with `>`). Lookback increased 40\u219260 chars. Added `(void)x` discard-idom exclusion. v0.33 baseline: 874 TP / 2885 FP per-file (ratio 0.93, DORMANT). The refinement targets: (1) static_cast/const_cast/reinterpret_cast/dynamic_cast no longer fire when followed by whitespace before `(`; (2) class-type named casts like `static_cast<MyClass*>(p)` now correctly excluded (60-char lookback reaches the long typename); (3) `(void)x` deliberate discards are no longer flagged. Expected post-refinement ratio: 1.0-1.2 (still DORMANT but better-targeted). Full v9 re-calibration is part of the v0.35.0 re-measurement. v0.33: v9 C++ calibration (5107 neg, 1655 pos). Per-file unique: 874 TP, 2885 FP, ratio=0.93. Total fires were 32265 TP, 39954 FP \u2014 the regex is too broad and fires on every C-style cast including static_cast in template code. The per-file measurement (874/1655 = 53%) is more meaningful \u2014 both arms have similar proportions of files using C-style casts. INSUFFICIENT_DATA: pos arm 1655 files.",
45713
45715
  aiSpecific: true,
45714
45716
  _v7Verdict: "DORMANT",
45715
45717
  _v7Lift: 1,
package/dist/index.cjs CHANGED
@@ -36,7 +36,7 @@ var VERSION;
36
36
  var init_header = __esm({
37
37
  "src/types/_header.ts"() {
38
38
  "use strict";
39
- VERSION = "0.34.2";
39
+ VERSION = "0.34.3";
40
40
  }
41
41
  });
42
42
 
@@ -27660,13 +27660,14 @@ var init_import_path_mismatch = __esm({
27660
27660
  });
27661
27661
 
27662
27662
  // src/rules/cpp/c-style-cast.ts
27663
- var C_STYLE_CAST_REGEX, NAMED_CAST_PREFIX_REGEX, cppCStyleCastRule;
27663
+ var C_STYLE_CAST_REGEX, NAMED_CAST_PREFIX_REGEX, VOID_CAST_REGEX, cppCStyleCastRule;
27664
27664
  var init_c_style_cast = __esm({
27665
27665
  "src/rules/cpp/c-style-cast.ts"() {
27666
27666
  "use strict";
27667
27667
  init_rule();
27668
27668
  C_STYLE_CAST_REGEX = /\(\s*(?:int|long|short|char|float|double|bool|unsigned\s+\w+|signed\s+\w+|size_t|[A-Za-z_]\w*(?:\s*[*,&][^)]*)?)\s*\)\s*(\w+|[^a-zA-Z_])/g;
27669
- NAMED_CAST_PREFIX_REGEX = /\b(?:static|reinterpret|const|dynamic)_cast\s*<[^>]*>\s*\($/;
27669
+ NAMED_CAST_PREFIX_REGEX = /\b(?:static|reinterpret|const|dynamic)_cast\s*<[^>]*>\s*$/;
27670
+ VOID_CAST_REGEX = /^\s*void\s*$/;
27670
27671
  cppCStyleCastRule = createRule({
27671
27672
  id: "cpp/c-style-cast",
27672
27673
  category: "typo",
@@ -27686,9 +27687,10 @@ var init_c_style_cast = __esm({
27686
27687
  while ((m = C_STYLE_CAST_REGEX.exec(source)) !== null) {
27687
27688
  const innerMatch = /\(\s*([^)]+?)\s*\)/.exec(m[0]) ?? [];
27688
27689
  const inner = (innerMatch[1] ?? "").trim();
27690
+ if (VOID_CAST_REGEX.test(inner)) continue;
27689
27691
  const looksLikeCast = /\b(?:int|long|short|char|float|double|bool|unsigned|signed|size_t)\b/.test(inner) || /[*&]/.test(inner);
27690
27692
  if (!looksLikeCast) continue;
27691
- const before = source.slice(Math.max(0, m.index - 40), m.index);
27693
+ const before = source.slice(Math.max(0, m.index - 60), m.index);
27692
27694
  if (NAMED_CAST_PREFIX_REGEX.test(before)) continue;
27693
27695
  const line = source.slice(0, m.index).split("\n").length;
27694
27696
  issues.push({
@@ -27699,7 +27701,7 @@ var init_c_style_cast = __esm({
27699
27701
  message: `C-style cast at line ${line} \u2014 use static_cast / reinterpret_cast / const_cast`,
27700
27702
  line,
27701
27703
  column: 1,
27702
- advice: "Use the named cast that matches the intent: `static_cast<int>(x)`, `reinterpret_cast<MyClass*>(p)`, `const_cast<...>(ref)`, or `dynamic_cast<Derived*>(base)` for runtime-checked downcasts. C-style casts silently pick whichever the compiler needs \u2014 `static_cast`, `reinterpret_cast`, OR `const_cast` \u2014 which makes them impossible to grep for and impossible to review. The C++ Core Guidelines (ES.49) call this out by name. AI agents reach for `(int)x` because of training-data C textbooks. Reference: cpp/c-style-cast v0.24."
27704
+ advice: "Use the named cast that matches the intent: `static_cast<int>(x)`, `reinterpret_cast<MyClass*>(p)`, `const_cast<...>(ref)`, or `dynamic_cast<Derived*>(base)` for runtime-checked downcasts. C-style casts silently pick whichever the compiler needs \u2014 `static_cast`, `reinterpret_cast`, OR `const_cast` \u2014 which makes them impossible to grep for and impossible to review. The C++ Core Guidelines (ES.49) call this out by name. AI agents reach for `(int)x` because of training-data C textbooks. Reference: cpp/c-style-cast v0.34.3 (refined regex selectivity)."
27703
27705
  });
27704
27706
  }
27705
27707
  return issues;
@@ -51825,7 +51827,7 @@ var init_signal_strength = __esm({
51825
51827
  precision: 0.2325,
51826
51828
  lastCalibratedAt: "2026-07-03T00:00:00Z",
51827
51829
  verdict: "DORMANT",
51828
- _calibrationNote: "v0.33: v9 C++ calibration (5107 neg, 1655 pos). Per-file unique: 874 TP, 2885 FP, ratio=0.93. Total fires were 32265 TP, 39954 FP \u2014 the regex is too broad and fires on every C-style cast including static_cast in template code. The per-file measurement (874/1655 = 53%) is more meaningful \u2014 both arms have similar proportions of files using C-style casts. INSUFFICIENT_DATA: pos arm 1655 files.",
51830
+ _calibrationNote: "v0.34.3: REFINED \u2014 NAMED_CAST_PREFIX_REGEX tightened (the old version required the lookback slice to end with `>(`, which never matched because the slice ends with `>`). Lookback increased 40\u219260 chars. Added `(void)x` discard-idom exclusion. v0.33 baseline: 874 TP / 2885 FP per-file (ratio 0.93, DORMANT). The refinement targets: (1) static_cast/const_cast/reinterpret_cast/dynamic_cast no longer fire when followed by whitespace before `(`; (2) class-type named casts like `static_cast<MyClass*>(p)` now correctly excluded (60-char lookback reaches the long typename); (3) `(void)x` deliberate discards are no longer flagged. Expected post-refinement ratio: 1.0-1.2 (still DORMANT but better-targeted). Full v9 re-calibration is part of the v0.35.0 re-measurement. v0.33: v9 C++ calibration (5107 neg, 1655 pos). Per-file unique: 874 TP, 2885 FP, ratio=0.93. Total fires were 32265 TP, 39954 FP \u2014 the regex is too broad and fires on every C-style cast including static_cast in template code. The per-file measurement (874/1655 = 53%) is more meaningful \u2014 both arms have similar proportions of files using C-style casts. INSUFFICIENT_DATA: pos arm 1655 files.",
51829
51831
  aiSpecific: true,
51830
51832
  _v7Verdict: "DORMANT",
51831
51833
  _v7Lift: 1,
package/dist/index.js CHANGED
@@ -19,7 +19,7 @@ var VERSION;
19
19
  var init_header = __esm({
20
20
  "src/types/_header.ts"() {
21
21
  "use strict";
22
- VERSION = "0.34.2";
22
+ VERSION = "0.34.3";
23
23
  }
24
24
  });
25
25
 
@@ -27642,13 +27642,14 @@ var init_import_path_mismatch = __esm({
27642
27642
  });
27643
27643
 
27644
27644
  // src/rules/cpp/c-style-cast.ts
27645
- var C_STYLE_CAST_REGEX, NAMED_CAST_PREFIX_REGEX, cppCStyleCastRule;
27645
+ var C_STYLE_CAST_REGEX, NAMED_CAST_PREFIX_REGEX, VOID_CAST_REGEX, cppCStyleCastRule;
27646
27646
  var init_c_style_cast = __esm({
27647
27647
  "src/rules/cpp/c-style-cast.ts"() {
27648
27648
  "use strict";
27649
27649
  init_rule();
27650
27650
  C_STYLE_CAST_REGEX = /\(\s*(?:int|long|short|char|float|double|bool|unsigned\s+\w+|signed\s+\w+|size_t|[A-Za-z_]\w*(?:\s*[*,&][^)]*)?)\s*\)\s*(\w+|[^a-zA-Z_])/g;
27651
- NAMED_CAST_PREFIX_REGEX = /\b(?:static|reinterpret|const|dynamic)_cast\s*<[^>]*>\s*\($/;
27651
+ NAMED_CAST_PREFIX_REGEX = /\b(?:static|reinterpret|const|dynamic)_cast\s*<[^>]*>\s*$/;
27652
+ VOID_CAST_REGEX = /^\s*void\s*$/;
27652
27653
  cppCStyleCastRule = createRule({
27653
27654
  id: "cpp/c-style-cast",
27654
27655
  category: "typo",
@@ -27668,9 +27669,10 @@ var init_c_style_cast = __esm({
27668
27669
  while ((m = C_STYLE_CAST_REGEX.exec(source)) !== null) {
27669
27670
  const innerMatch = /\(\s*([^)]+?)\s*\)/.exec(m[0]) ?? [];
27670
27671
  const inner = (innerMatch[1] ?? "").trim();
27672
+ if (VOID_CAST_REGEX.test(inner)) continue;
27671
27673
  const looksLikeCast = /\b(?:int|long|short|char|float|double|bool|unsigned|signed|size_t)\b/.test(inner) || /[*&]/.test(inner);
27672
27674
  if (!looksLikeCast) continue;
27673
- const before = source.slice(Math.max(0, m.index - 40), m.index);
27675
+ const before = source.slice(Math.max(0, m.index - 60), m.index);
27674
27676
  if (NAMED_CAST_PREFIX_REGEX.test(before)) continue;
27675
27677
  const line = source.slice(0, m.index).split("\n").length;
27676
27678
  issues.push({
@@ -27681,7 +27683,7 @@ var init_c_style_cast = __esm({
27681
27683
  message: `C-style cast at line ${line} \u2014 use static_cast / reinterpret_cast / const_cast`,
27682
27684
  line,
27683
27685
  column: 1,
27684
- advice: "Use the named cast that matches the intent: `static_cast<int>(x)`, `reinterpret_cast<MyClass*>(p)`, `const_cast<...>(ref)`, or `dynamic_cast<Derived*>(base)` for runtime-checked downcasts. C-style casts silently pick whichever the compiler needs \u2014 `static_cast`, `reinterpret_cast`, OR `const_cast` \u2014 which makes them impossible to grep for and impossible to review. The C++ Core Guidelines (ES.49) call this out by name. AI agents reach for `(int)x` because of training-data C textbooks. Reference: cpp/c-style-cast v0.24."
27686
+ advice: "Use the named cast that matches the intent: `static_cast<int>(x)`, `reinterpret_cast<MyClass*>(p)`, `const_cast<...>(ref)`, or `dynamic_cast<Derived*>(base)` for runtime-checked downcasts. C-style casts silently pick whichever the compiler needs \u2014 `static_cast`, `reinterpret_cast`, OR `const_cast` \u2014 which makes them impossible to grep for and impossible to review. The C++ Core Guidelines (ES.49) call this out by name. AI agents reach for `(int)x` because of training-data C textbooks. Reference: cpp/c-style-cast v0.34.3 (refined regex selectivity)."
27685
27687
  });
27686
27688
  }
27687
27689
  return issues;
@@ -51803,7 +51805,7 @@ var init_signal_strength = __esm({
51803
51805
  precision: 0.2325,
51804
51806
  lastCalibratedAt: "2026-07-03T00:00:00Z",
51805
51807
  verdict: "DORMANT",
51806
- _calibrationNote: "v0.33: v9 C++ calibration (5107 neg, 1655 pos). Per-file unique: 874 TP, 2885 FP, ratio=0.93. Total fires were 32265 TP, 39954 FP \u2014 the regex is too broad and fires on every C-style cast including static_cast in template code. The per-file measurement (874/1655 = 53%) is more meaningful \u2014 both arms have similar proportions of files using C-style casts. INSUFFICIENT_DATA: pos arm 1655 files.",
51808
+ _calibrationNote: "v0.34.3: REFINED \u2014 NAMED_CAST_PREFIX_REGEX tightened (the old version required the lookback slice to end with `>(`, which never matched because the slice ends with `>`). Lookback increased 40\u219260 chars. Added `(void)x` discard-idom exclusion. v0.33 baseline: 874 TP / 2885 FP per-file (ratio 0.93, DORMANT). The refinement targets: (1) static_cast/const_cast/reinterpret_cast/dynamic_cast no longer fire when followed by whitespace before `(`; (2) class-type named casts like `static_cast<MyClass*>(p)` now correctly excluded (60-char lookback reaches the long typename); (3) `(void)x` deliberate discards are no longer flagged. Expected post-refinement ratio: 1.0-1.2 (still DORMANT but better-targeted). Full v9 re-calibration is part of the v0.35.0 re-measurement. v0.33: v9 C++ calibration (5107 neg, 1655 pos). Per-file unique: 874 TP, 2885 FP, ratio=0.93. Total fires were 32265 TP, 39954 FP \u2014 the regex is too broad and fires on every C-style cast including static_cast in template code. The per-file measurement (874/1655 = 53%) is more meaningful \u2014 both arms have similar proportions of files using C-style casts. INSUFFICIENT_DATA: pos arm 1655 files.",
51807
51809
  aiSpecific: true,
51808
51810
  _v7Verdict: "DORMANT",
51809
51811
  _v7Lift: 1,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slopbrick",
3
- "version": "0.34.2",
3
+ "version": "0.34.3",
4
4
  "description": "Discovered, modeled, and governed repository structure. SlopBrick scans source code, classifies it against 95+ rules in 15 categories, computes 4 scores (aiSlopScore: lower=cleaner, engineeringHygiene, security, repositoryHealth composite), and persists the structure for AI agents and CI.",
5
5
  "type": "module",
6
6
  "bin": {