@fabriziosalmi/slopless 1.4.1

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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -0
  3. package/dist/engine/api.d.ts +16 -0
  4. package/dist/engine/api.js +543 -0
  5. package/dist/index.d.ts +122 -0
  6. package/dist/index.js +590 -0
  7. package/package.json +59 -0
  8. package/rules/VBC-001.yaml +33 -0
  9. package/rules/VBC-002.yaml +13 -0
  10. package/rules/VBC-003.yaml +36 -0
  11. package/rules/VBC-004.yaml +33 -0
  12. package/rules/VBC-005.yaml +24 -0
  13. package/rules/VBC-006.yaml +16 -0
  14. package/rules/VBC-007.yaml +28 -0
  15. package/rules/VBC-008.yaml +21 -0
  16. package/rules/VBC-009.yaml +24 -0
  17. package/rules/VBC-010.yaml +24 -0
  18. package/rules/VBC-011.yaml +21 -0
  19. package/rules/VBC-012.yaml +21 -0
  20. package/rules/VBC-013.yaml +17 -0
  21. package/rules/VBC-014.yaml +15 -0
  22. package/rules/VBC-015.yaml +40 -0
  23. package/rules/VBC-016.yaml +21 -0
  24. package/rules/VBC-017.yaml +23 -0
  25. package/rules/VBC-018.yaml +19 -0
  26. package/rules/VBC-019.yaml +42 -0
  27. package/rules/VBC-020.yaml +22 -0
  28. package/rules/VBC-021.yaml +22 -0
  29. package/rules/VBC-022.yaml +21 -0
  30. package/rules/VBC-023.yaml +22 -0
  31. package/rules/VBC-024.yaml +26 -0
  32. package/rules/VBC-025.yaml +13 -0
  33. package/rules/VBC-026.yaml +17 -0
  34. package/rules/VBC-027.yaml +27 -0
  35. package/rules/VBC-028.yaml +18 -0
  36. package/rules/VBC-029.yaml +22 -0
  37. package/rules/VBC-030.yaml +22 -0
  38. package/rules/VBC-032.yaml +20 -0
  39. package/rules/VBC-033.yaml +26 -0
  40. package/rules/VBC-034.yaml +41 -0
  41. package/rules/VBC-035.yaml +30 -0
  42. package/rules/VBC-039.yaml +18 -0
  43. package/rules/VBC-042.yaml +26 -0
  44. package/rules/VBC-045.yaml +13 -0
  45. package/rules/VBC-046.yaml +13 -0
  46. package/rules/VBC-048.yaml +23 -0
  47. package/rules/VBC-049.yaml +19 -0
  48. package/rules/VBC-051.yaml +23 -0
  49. package/rules/VBC-052.yaml +19 -0
  50. package/rules/VBC-053.yaml +19 -0
  51. package/rules/VBC-054.yaml +29 -0
  52. package/rules/VBC-056.yaml +28 -0
  53. package/rules/VBC-057.yaml +18 -0
  54. package/rules/VBC-058.yaml +18 -0
  55. package/rules/VBC-059.yaml +21 -0
  56. package/rules/VBC-063-B.yaml +15 -0
  57. package/rules/VBC-063.yaml +18 -0
  58. package/rules/VBC-065.yaml +33 -0
  59. package/rules/VBC-066.yaml +16 -0
  60. package/rules/VBC-068.yaml +21 -0
  61. package/rules/VBC-070.yaml +19 -0
  62. package/rules/VBC-077.yaml +35 -0
  63. package/rules/VBC-079.yaml +18 -0
  64. package/rules/VBC-080.yaml +18 -0
  65. package/rules/VBC-084.yaml +22 -0
  66. package/rules/VBC-086.yaml +22 -0
  67. package/rules/VBC-090.yaml +28 -0
  68. package/rules/VBC-096.yaml +19 -0
  69. package/rules/VBC-097.yaml +21 -0
  70. package/rules/VBC-098.yaml +18 -0
  71. package/rules/VBC-101.yaml +23 -0
  72. package/rules/VBC-102.yaml +20 -0
  73. package/rules/VBC-103.yaml +35 -0
  74. package/rules/VBC-104.yaml +24 -0
  75. package/rules/VBC-106.yaml +14 -0
  76. package/rules/VBC-112.yaml +20 -0
  77. package/rules/VBC-113.yaml +19 -0
  78. package/rules/VBC-117.yaml +21 -0
  79. package/rules/VBC-123.yaml +29 -0
  80. package/rules/VBC-131.yaml +20 -0
  81. package/rules/VBC-150.yaml +27 -0
  82. package/rules/VBC-153.yaml +21 -0
  83. package/rules/VBC-158.yaml +16 -0
  84. package/rules/VBC-161.yaml +27 -0
  85. package/rules/VBC-172.yaml +25 -0
  86. package/rules/VBC-197.yaml +22 -0
  87. package/rules/VBC-201.yaml +35 -0
  88. package/rules/VBC-206.yaml +19 -0
  89. package/rules/VBC-208.yaml +27 -0
  90. package/rules/VBC-212.yaml +19 -0
  91. package/rules/VBC-215.yaml +24 -0
  92. package/rules/VBC-305.yaml +20 -0
  93. package/rules/VBC-324.yaml +24 -0
  94. package/rules/VBC-334.yaml +23 -0
  95. package/rules/VBC-338.yaml +32 -0
  96. package/rules/VBC-340.yaml +22 -0
  97. package/rules/VBC-344.yaml +19 -0
  98. package/rules/VBC-347.yaml +21 -0
  99. package/rules/VBC-348.yaml +19 -0
  100. package/rules/VBC-385.yaml +21 -0
  101. package/rules/VBC-398.yaml +22 -0
  102. package/rules/VBC-401.yaml +12 -0
  103. package/rules/VBC-414.yaml +23 -0
  104. package/rules/VBC-421.yaml +20 -0
  105. package/rules/VBC-501.yaml +18 -0
  106. package/rules/VBC-502.yaml +23 -0
  107. package/rules/VBC-503.yaml +18 -0
  108. package/rules/VBC-504.yaml +20 -0
  109. package/rules/VBC-800.yaml +17 -0
  110. package/rules/VBC-901.yaml +48 -0
  111. package/rules/VBC-902.yaml +19 -0
  112. package/rules/VBC-903.yaml +17 -0
  113. package/rules/VBC-904.yaml +21 -0
  114. package/rules/VBC-905.yaml +17 -0
  115. package/rules/VBC-906.yaml +29 -0
  116. package/rules/VBC-907.yaml +24 -0
  117. package/rules/VBC-908.yaml +22 -0
  118. package/rules/VBC-909.yaml +21 -0
  119. package/rules/VBC-910.yaml +18 -0
  120. package/rules/VBC-911.yaml +21 -0
  121. package/rules/VBC-913.yaml +30 -0
  122. package/rules/VBC-914.yaml +31 -0
  123. package/rules/VBC-915.yaml +19 -0
  124. package/rules/VBC-916.yaml +24 -0
  125. package/rules/VBC-917.yaml +21 -0
  126. package/rules/VBC-918.yaml +22 -0
  127. package/rules/VBC-920.yaml +20 -0
  128. package/rules/VBC-921.yaml +45 -0
  129. package/rules/VBC-922.yaml +15 -0
  130. package/rules/VBC-923.yaml +15 -0
  131. package/rules/VBC-924.yaml +12 -0
  132. package/rules/VBC-925.yaml +14 -0
  133. package/rules/VBC-926.yaml +14 -0
  134. package/rules/VBC-927.yaml +24 -0
  135. package/rules/VBC-928.yaml +25 -0
  136. package/rules/VBC-929.yaml +21 -0
  137. package/rules/VBC-930.yaml +16 -0
  138. package/rules/VBC-931.yaml +16 -0
  139. package/rules/VBC-932.yaml +16 -0
  140. package/rules/VBC-933.yaml +28 -0
  141. package/rules/VBC-934.yaml +24 -0
  142. package/rules/VBC-935.yaml +26 -0
  143. package/rules/VBC-936.yaml +24 -0
  144. package/rules/VBC-937.yaml +24 -0
  145. package/rules/VBC-938.yaml +23 -0
  146. package/rules/VBC-939.yaml +23 -0
  147. package/rules/VBC-940.yaml +30 -0
  148. package/rules/VBC-941.yaml +28 -0
  149. package/rules/VBC-942.yaml +23 -0
  150. package/rules/VBC-943.yaml +22 -0
  151. package/rules/VBC-944.yaml +26 -0
  152. package/rules/VBC-945.yaml +33 -0
  153. package/rules/VBC-946.yaml +26 -0
  154. package/rules/VBC-947.yaml +22 -0
  155. package/rules/VBC-948.yaml +26 -0
@@ -0,0 +1,18 @@
1
+ id: VBC-910
2
+ name: console-table-leaks
3
+ severity: warning
4
+ category: clean-code
5
+ tags:
6
+ - clean-code
7
+ match:
8
+ regex: console\.table\(
9
+ file_types:
10
+ - js
11
+ - ts
12
+ message: >-
13
+ console.table() left in code at line {line}. Useful for debug, but clutters production logs.
14
+ tests:
15
+ fire:
16
+ - console.table(rows);
17
+ quiet:
18
+ - renderTable(rows);
@@ -0,0 +1,21 @@
1
+ id: VBC-911
2
+ name: meaningless-helper-names
3
+ severity: warning
4
+ category: clean-code
5
+ tags:
6
+ - clean-code
7
+ - semantic
8
+ match:
9
+ regex: class\s+[a-zA-Z0-9_]*(Manager|Helper|Common|Util|Base)\b
10
+ file_types:
11
+ - js
12
+ - ts
13
+ - py
14
+ message: >-
15
+ Generic class name '{match}' detected. Use more specific semantic names (e.g., 'AuthValidator'
16
+ instead of 'AuthHelper').
17
+ tests:
18
+ fire:
19
+ - class UserManager {}
20
+ quiet:
21
+ - class UserRepository {}
@@ -0,0 +1,30 @@
1
+ id: VBC-913
2
+ name: outline-none-hazard
3
+ severity: error
4
+ category: ux-dx
5
+ tags:
6
+ - accessibility
7
+ - ux
8
+ match:
9
+ regex: >-
10
+ outline:\s*(?:none|0)\b(?![\s\S]{0,400}?:focus-visible[\s\S]{0,140}?outline\s*:\s*(?!none|0|\s*;))
11
+ multiline: true
12
+ file_types:
13
+ - css
14
+ - scss
15
+ message: >-
16
+ Focus outline removed at line {line} with nothing replacing it. Keyboard users lose all
17
+ sense of position. Pair it with a :focus-visible rule that draws a visible ring, which is
18
+ what this rule looks for before reporting.
19
+ tests:
20
+ fire:
21
+ - 'a:focus { outline: none; }'
22
+ quiet:
23
+ - 'a:focus { outline: 2px solid currentColor; }'
24
+ - |
25
+ *:focus {
26
+ outline: none;
27
+ }
28
+ *:focus-visible {
29
+ outline: 3px solid #0ff;
30
+ }
@@ -0,0 +1,31 @@
1
+ id: VBC-914
2
+ name: cursor-pointer-on-text
3
+ severity: warning
4
+ category: ux-dx
5
+ tags:
6
+ - ux
7
+ match:
8
+ regex: cursor:\s*pointer
9
+ file_types:
10
+ - css
11
+ exclude_selectors:
12
+ - button
13
+ - a
14
+ - summary
15
+ - label
16
+ - '[role=''button'']'
17
+ - '[role="button"]'
18
+ - input[type='submit']
19
+ - input[type='button']
20
+ - .btn
21
+ - .button
22
+ - .clickable
23
+ message: >-
24
+ cursor: pointer applied to potentially non-interactive element at line {line}. Don't lie
25
+ to the user about clickability. Only use for truly interactive components.
26
+ tests:
27
+ fire:
28
+ - '.card { cursor: pointer; }'
29
+ quiet:
30
+ - 'button { cursor: pointer; }'
31
+ - 'a:hover { cursor: pointer; }'
@@ -0,0 +1,19 @@
1
+ id: VBC-915
2
+ name: user-select-none-slop
3
+ severity: warning
4
+ category: ux-dx
5
+ tags:
6
+ - ux
7
+ - accessibility
8
+ match:
9
+ regex: user-select:\s*none
10
+ file_types:
11
+ - css
12
+ message: >-
13
+ user-select: none detected at line {line}. Preventing users from copying text is usually
14
+ a dark pattern.
15
+ tests:
16
+ fire:
17
+ - 'body { user-select: none; }'
18
+ quiet:
19
+ - 'body { user-select: text; }'
@@ -0,0 +1,24 @@
1
+ id: VBC-916
2
+ name: vague-link-text-ux
3
+ severity: warning
4
+ category: ux-dx
5
+ tags:
6
+ - ux
7
+ - accessibility
8
+ match:
9
+ regex: '>\s*(click here|read more|learn more|here|this link)\s*<'
10
+ flags: i
11
+ file_types:
12
+ - html
13
+ - tsx
14
+ - jsx
15
+ message: >-
16
+ Vague link text '{match}' detected at line {line}. Use descriptive labels (e.g., 'View detailed
17
+ report') for clarity and screen reader accessibility.
18
+ tests:
19
+ fire:
20
+ - file: fixture.html
21
+ code: <a href="/x">click here</a>
22
+ quiet:
23
+ - file: fixture.html
24
+ code: <a href="/x">the deployment guide</a>
@@ -0,0 +1,21 @@
1
+ id: VBC-917
2
+ name: shouting-documentation
3
+ severity: warning
4
+ category: docs
5
+ tags:
6
+ - documentation
7
+ - style
8
+ match:
9
+ regex: \b[A-Z]{3,}\b(?:\s+\b[A-Z]{2,}\b){3,}
10
+ file_types:
11
+ - md
12
+ - txt
13
+ opt_in: true
14
+ message: >-
15
+ Sustained all-caps text at line {line}. Shouting does not add emphasis, it costs readability.
16
+ Use bold or a callout instead.
17
+ tests:
18
+ fire:
19
+ - READ THIS BEFORE YOU DEPLOY ANYTHING
20
+ quiet:
21
+ - Read this before you deploy.
@@ -0,0 +1,22 @@
1
+ id: VBC-918
2
+ name: we-detected-tone
3
+ severity: warning
4
+ category: docs
5
+ tags:
6
+ - documentation
7
+ - style
8
+ match:
9
+ regex: We detected|We have identified
10
+ flags: i
11
+ file_types:
12
+ - md
13
+ - txt
14
+ opt_in: true
15
+ message: >-
16
+ Avoid first-person collective ('We') in system messages at line {line}. Use neutral or user-centric
17
+ language.
18
+ tests:
19
+ fire:
20
+ - We detected a problem with your configuration.
21
+ quiet:
22
+ - The configuration is missing a database URL.
@@ -0,0 +1,20 @@
1
+ id: VBC-920
2
+ name: relative-link-format
3
+ severity: warning
4
+ category: docs
5
+ tags:
6
+ - documentation
7
+ - maintenance
8
+ match:
9
+ regex: \]\((?![a-z]+:|/|\.)
10
+ file_types:
11
+ - md
12
+ message: >-
13
+ Relative local link missing './' prefix at line {line}. Use [link](./path/to/file) for better
14
+ tool compatibility.
15
+ tests:
16
+ fire:
17
+ - See [the guide](guide.md).
18
+ quiet:
19
+ - See [the guide](./guide.md).
20
+ - See [the site](https://example.com).
@@ -0,0 +1,45 @@
1
+ id: VBC-921
2
+ name: hardcoded-outdated-year
3
+ severity: warning
4
+ category: docs
5
+ tags:
6
+ - documentation
7
+ - maintenance
8
+ match:
9
+ file_types:
10
+ - md
11
+ - txt
12
+ - js
13
+ - ts
14
+ - tsx
15
+ - jsx
16
+ - css
17
+ - py
18
+ - go
19
+ - rs
20
+ - html
21
+ exclude_files:
22
+ - '**/test/**'
23
+ - '**/tests/**'
24
+ - '**/__tests__/**'
25
+ - '**/testdata/**'
26
+ - '**/fixtures/**'
27
+ - '**/test_*.py'
28
+ - '**/*_test.py'
29
+ - '**/test.py'
30
+ - '**/conftest.py'
31
+ - '**/*_test.go'
32
+ - '**/*_bench.go'
33
+ - '**/*.test.*'
34
+ - '**/*.spec.*'
35
+ - '**/bench/**'
36
+ - '**/benchmark*'
37
+ - '**/*corpus*'
38
+ - '**/*payload*'
39
+ heuristic_check: stale-copyright-year
40
+ message: >-
41
+ Copyright notice ends at a year that has passed: {match}. It is now {year}. Use a range
42
+ ending in the current year, or generate the year at build time.
43
+ tests:
44
+ external: >-
45
+ heuristic-checker.test.ts: compares against the year the run happens in
@@ -0,0 +1,15 @@
1
+ id: VBC-922
2
+ name: too-many-staged-files
3
+ severity: warning
4
+ category: git
5
+ tags:
6
+ - git
7
+ - dx
8
+ match:
9
+ git_check: too_many_staged_files
10
+ threshold: 30
11
+ message: >-
12
+ Staging {count} files (limit: {threshold}). Large commits are harder to review. Split your
13
+ work.
14
+ tests:
15
+ external: 'git-checker.test.ts: needs a staged file list'
@@ -0,0 +1,15 @@
1
+ id: VBC-923
2
+ name: filename-too-long-hazard
3
+ severity: warning
4
+ category: git
5
+ tags:
6
+ - git
7
+ - cross-platform
8
+ match:
9
+ git_check: filename_too_long
10
+ threshold: 50
11
+ message: >-
12
+ Filename length {length} exceeds {threshold} characters. This might cause issues on some
13
+ systems.
14
+ tests:
15
+ external: 'git-checker.test.ts: needs a staged file list'
@@ -0,0 +1,12 @@
1
+ id: VBC-924
2
+ name: missing-readme-root
3
+ severity: error
4
+ category: git
5
+ tags:
6
+ - git
7
+ - project-health
8
+ match:
9
+ git_check: missing_readme
10
+ message: No README file found in project root. Documentation is non-negotiable.
11
+ tests:
12
+ external: 'git-checker.test.ts: needs a repository working tree'
@@ -0,0 +1,14 @@
1
+ id: VBC-925
2
+ name: large-file-staged
3
+ severity: warning
4
+ category: git
5
+ tags:
6
+ - git
7
+ - performance
8
+ match:
9
+ git_check: large_file_size
10
+ threshold: 1048576
11
+ message: >-
12
+ File is over 1MB ({size} bytes). Consider using Git LFS or external storage.
13
+ tests:
14
+ external: 'git-checker.test.ts: needs files on disk'
@@ -0,0 +1,14 @@
1
+ id: VBC-926
2
+ name: short-commit-message-check
3
+ severity: warning
4
+ category: git
5
+ tags:
6
+ - git
7
+ - dx
8
+ match:
9
+ git_check: commit_message_too_short
10
+ threshold: 10
11
+ message: >-
12
+ Commit message is likely too short. Provide more context about the 'why' of your changes.
13
+ tests:
14
+ external: 'git-checker.test.ts: needs .git/COMMIT_EDITMSG'
@@ -0,0 +1,24 @@
1
+ id: VBC-927
2
+ name: vague-button-label
3
+ severity: warning
4
+ category: docs
5
+ tags:
6
+ - ux
7
+ - documentation
8
+ match:
9
+ regex: <button.*?>\s*(Click|Submit|OK|Go)\s*</button>
10
+ flags: i
11
+ file_types:
12
+ - html
13
+ - tsx
14
+ - jsx
15
+ message: >-
16
+ Vague button label '{match}' detected at line {line}. Use action-oriented labels (e.g.,
17
+ 'Save Changes', 'Create Account').
18
+ tests:
19
+ fire:
20
+ - file: fixture.html
21
+ code: <button>Submit</button>
22
+ quiet:
23
+ - file: fixture.html
24
+ code: <button>Create account</button>
@@ -0,0 +1,25 @@
1
+ id: VBC-928
2
+ name: lorem-ipsum-docs
3
+ severity: error
4
+ category: docs
5
+ tags:
6
+ - documentation
7
+ - slop
8
+ match:
9
+ regex: Lorem ipsum dolor sit amet
10
+ flags: i
11
+ scan: strings
12
+ file_types:
13
+ - md
14
+ - txt
15
+ - html
16
+ - js
17
+ - ts
18
+ message: >-
19
+ Placeholder text 'Lorem ipsum' detected at line {line}. Replace with real content before
20
+ committing.
21
+ tests:
22
+ fire:
23
+ - Lorem ipsum dolor sit amet, consectetur.
24
+ quiet:
25
+ - Real documentation content.
@@ -0,0 +1,21 @@
1
+ id: VBC-929
2
+ name: technical-jargon-slop
3
+ severity: warning
4
+ category: docs
5
+ tags:
6
+ - documentation
7
+ match:
8
+ regex: >-
9
+ (architectural paradigm|synergistic integration|leverage fundamental|cross-platform interoperability|holistic
10
+ approach)
11
+ flags: i
12
+ file_types:
13
+ - md
14
+ - txt
15
+ opt_in: true
16
+ message: Avoid buzzword-heavy jargon at line {line}. Be direct and clear.
17
+ tests:
18
+ fire:
19
+ - A holistic approach to synergistic integration.
20
+ quiet:
21
+ - The loader reads YAML rules from disk.
@@ -0,0 +1,16 @@
1
+ id: VBC-930
2
+ name: missing-contributing
3
+ severity: warning
4
+ category: git
5
+ tags:
6
+ - git
7
+ - project-health
8
+ - dx
9
+ match:
10
+ git_check: missing_contributing
11
+ message: >-
12
+ Missing CONTRIBUTING.md file. Without contribution guidelines, external contributors must
13
+ guess how to set up the dev environment, run tests, and submit pull requests. A CONTRIBUTING.md
14
+ reduces friction and sets expectations for code quality standards.
15
+ tests:
16
+ external: 'git-checker.test.ts: needs a repository working tree'
@@ -0,0 +1,16 @@
1
+ id: VBC-931
2
+ name: missing-security-policy
3
+ severity: warning
4
+ category: git
5
+ tags:
6
+ - git
7
+ - security
8
+ - project-health
9
+ match:
10
+ git_check: missing_security
11
+ message: >-
12
+ Missing SECURITY.md file. Without a security disclosure policy, researchers who find vulnerabilities
13
+ in your project have no private channel to report them and may resort to public disclosure.
14
+ Add a SECURITY.md with a contact email and responsible disclosure policy.
15
+ tests:
16
+ external: 'git-checker.test.ts: needs a repository working tree'
@@ -0,0 +1,16 @@
1
+ id: VBC-932
2
+ name: missing-changelog
3
+ severity: warning
4
+ category: git
5
+ tags:
6
+ - git
7
+ - project-health
8
+ - dx
9
+ match:
10
+ git_check: missing_changelog
11
+ message: >-
12
+ Missing CHANGELOG.md (or HISTORY.md) file. Developers who depend on your project need to
13
+ know exactly what changed between versions to assess upgrade risk. Follow "Keep a Changelog"
14
+ standards with Added, Changed, Deprecated, Removed, Fixed, and Security sections per release.
15
+ tests:
16
+ external: 'git-checker.test.ts: needs a repository working tree'
@@ -0,0 +1,28 @@
1
+ id: VBC-933
2
+ name: coming-soon-docs
3
+ severity: warning
4
+ category: docs
5
+ tags:
6
+ - docs
7
+ - maintenance
8
+ match:
9
+ regex: (coming soon|under construction|not yet written|🚧\s*wip|todo:\s*write)
10
+ flags: i
11
+ file_types:
12
+ - md
13
+ - txt
14
+ message: >-
15
+ Placeholder documentation content '{match}' at line {line}. Documentation stubs with "coming
16
+ soon" text signal an abandoned project to new contributors. Either write the section or
17
+ remove the header entirely. Git history preserves the intent if you need to revisit it later.
18
+ tests:
19
+ fire:
20
+ - |
21
+ ## Configuration
22
+
23
+ Coming soon.
24
+ quiet:
25
+ - |
26
+ ## Configuration
27
+
28
+ Set DATABASE_URL.
@@ -0,0 +1,24 @@
1
+ id: VBC-934
2
+ name: personal-opinion-docs
3
+ severity: warning
4
+ category: docs
5
+ tags:
6
+ - docs
7
+ - style
8
+ match:
9
+ regex: \b(I think|I believe|I feel that|in my opinion|IMO|IMHO|personally,)\b
10
+ flags: i
11
+ file_types:
12
+ - md
13
+ - txt
14
+ opt_in: true
15
+ message: >-
16
+ Personal opinion language '{match}' in documentation at line {line}. Technical documentation
17
+ should be objective and factual. Personal opinions erode credibility and confuse readers
18
+ about whether a recommendation is a design constraint or a preference. Use "this approach"
19
+ or cite evidence instead.
20
+ tests:
21
+ fire:
22
+ - I think this is the better default.
23
+ quiet:
24
+ - This is the default because it is safer.
@@ -0,0 +1,26 @@
1
+ id: VBC-935
2
+ name: colloquial-language
3
+ severity: warning
4
+ category: docs
5
+ tags:
6
+ - docs
7
+ - style
8
+ match:
9
+ regex: >-
10
+ \b(touch base|circle back|deep dive|low-hanging fruit|move the needle|game changer|paradigm
11
+ shift|the whole nine yards|ballpark figure|boil the ocean|drink the kool-aid|drink the
12
+ koolaid)\b
13
+ flags: i
14
+ file_types:
15
+ - md
16
+ - txt
17
+ opt_in: true
18
+ message: >-
19
+ Corporate colloquialism or buzzword '{match}' in documentation at line {line}. Jargon and
20
+ idioms are confusing for non-native English speakers and make documentation sound unprofessional.
21
+ Use plain, direct language.
22
+ tests:
23
+ fire:
24
+ - Let's circle back on the deep dive.
25
+ quiet:
26
+ - We will review the design on Tuesday.
@@ -0,0 +1,24 @@
1
+ id: VBC-936
2
+ name: outdated-experimental-tag
3
+ severity: warning
4
+ category: docs
5
+ tags:
6
+ - docs
7
+ - maintenance
8
+ match:
9
+ regex: >-
10
+ \[\s*(?:EXPERIMENTAL|ALPHA|UNSTABLE|PREVIEW)\s*\]|(?:⚠️|:warning:)\s*\*{0,2}(?:experimental|alpha|unstable)\b|^\s*>\s*\*{0,2}(?:experimental|unstable)\b
11
+ flags: im
12
+ file_types:
13
+ - md
14
+ - txt
15
+ message: >-
16
+ Experimental or alpha status tag '{match}' at line {line}. If this feature has been in production
17
+ for more than six months, remove the disclaimer. Stale warnings erode trust in documentation
18
+ accuracy and prevent users from adopting stable APIs.
19
+ tests:
20
+ fire:
21
+ - '[EXPERIMENTAL] The plugin API may change.'
22
+ quiet:
23
+ - Sort the entries in alphabetical order.
24
+ - The plugin API is stable.
@@ -0,0 +1,24 @@
1
+ id: VBC-937
2
+ name: client-side-auth-check
3
+ severity: error
4
+ category: security
5
+ tags:
6
+ - security
7
+ - ai-error
8
+ match:
9
+ regex: >-
10
+ (localStorage|sessionStorage)\.(getItem|setItem)\s*\(\s*['"](?:token|auth|role|user|admin|permission)['"]\s*\)
11
+ file_types:
12
+ - js
13
+ - ts
14
+ - jsx
15
+ - tsx
16
+ message: >-
17
+ Authentication token or role stored/read from browser storage at line {line}. Client-side
18
+ auth logic is trivially bypassable. Validate identity server-side on every request. Never
19
+ trust data in localStorage or sessionStorage for access control decisions.
20
+ tests:
21
+ fire:
22
+ - const role = localStorage.getItem('role');
23
+ quiet:
24
+ - const theme = localStorage.getItem('theme');
@@ -0,0 +1,23 @@
1
+ id: VBC-938
2
+ name: command-injection-risk
3
+ severity: error
4
+ category: security
5
+ tags:
6
+ - security
7
+ - ai-error
8
+ match:
9
+ regex: >-
10
+ (exec|execSync|spawn|spawnSync|system|popen)\s*\(\s*[`'"][^`'"]*\$\{|child_process\.(exec|execSync)\s*\(\s*[^)]*\+
11
+ file_types:
12
+ - js
13
+ - ts
14
+ - py
15
+ message: >-
16
+ Potential command injection at line {line}. Shell commands constructed with string interpolation
17
+ or concatenation allow attackers to execute arbitrary commands. Use parameterized commands
18
+ (e.g. execFile with an args array) and never interpolate untrusted input into shell strings.
19
+ tests:
20
+ fire:
21
+ - exec(`ls ${userDir}`);
22
+ quiet:
23
+ - execFile('ls', [userDir]);
@@ -0,0 +1,23 @@
1
+ id: VBC-939
2
+ name: unrestricted-file-upload
3
+ severity: error
4
+ category: security
5
+ tags:
6
+ - security
7
+ - ai-error
8
+ match:
9
+ regex: >-
10
+ (multer|formidable|busboy|diskStorage)\s*\(\s*\{[^}]*\}|req\.files?\s*\[\s*['"][^'"]+['"]\s*\]\s*\.(?:mv|pipe|save)\s*\(
11
+ file_types:
12
+ - js
13
+ - ts
14
+ message: >-
15
+ File upload handler at line {line} may lack type/size restrictions. Without validating MIME
16
+ type, file extension, and size, attackers can upload malicious executables or exhaust disk
17
+ space. Add allowlist-based extension validation and a strict size limit before processing
18
+ any uploaded file.
19
+ tests:
20
+ fire:
21
+ - 'const upload = multer({ dest: "uploads/" });'
22
+ quiet:
23
+ - const upload = multer(storageConfig);
@@ -0,0 +1,30 @@
1
+ id: VBC-940
2
+ name: float-currency-arithmetic
3
+ severity: error
4
+ category: security
5
+ tags:
6
+ - security
7
+ - correctness
8
+ - ai-error
9
+ match:
10
+ regex: >-
11
+ \b(?:(?:price|cost|fee|fees|tax|subtotal|payment|invoice|salary|refund|charge)(?![a-z])|[a-z_$]+(?:Price|Cost|Fee|Fees|Tax|Subtotal|Payment|Invoice|Salary|Refund|Charge)(?![a-z]))[A-Za-z_$]*\s*[*/+\-]=?\s*0\.[0-9]|\b(?:(?:price|cost|fee|fees|tax|subtotal|payment|invoice|salary|refund|charge)(?![a-z])|[a-z_$]+(?:Price|Cost|Fee|Fees|Tax|Subtotal|Payment|Invoice|Salary|Refund|Charge)(?![a-z]))[A-Za-z_$]*\s*=\s*[a-zA-Z_$][\w$]*\s*[*/]\s*[a-zA-Z_$][\w$]*
12
+ file_types:
13
+ - js
14
+ - ts
15
+ - py
16
+ supersedes:
17
+ - VBC-007
18
+ message: >-
19
+ Floating-point arithmetic on monetary value '{match}' at line {line}. Float imprecision
20
+ causes rounding errors in financial calculations (e.g. 0.1 + 0.2 != 0.3). Use integer cents/minor
21
+ units or a dedicated decimal library (decimal.js, big.js, Python's Decimal) for all money
22
+ math.
23
+ tests:
24
+ fire:
25
+ - const total = price * 0.22;
26
+ quiet:
27
+ - const totalCents = priceCents * 22;
28
+ - const wet = amount * 0.5;
29
+ - const pan = balance * 0.5;
30
+ - const g = rate * 0.35;