@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.
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/dist/engine/api.d.ts +16 -0
- package/dist/engine/api.js +543 -0
- package/dist/index.d.ts +122 -0
- package/dist/index.js +590 -0
- package/package.json +59 -0
- package/rules/VBC-001.yaml +33 -0
- package/rules/VBC-002.yaml +13 -0
- package/rules/VBC-003.yaml +36 -0
- package/rules/VBC-004.yaml +33 -0
- package/rules/VBC-005.yaml +24 -0
- package/rules/VBC-006.yaml +16 -0
- package/rules/VBC-007.yaml +28 -0
- package/rules/VBC-008.yaml +21 -0
- package/rules/VBC-009.yaml +24 -0
- package/rules/VBC-010.yaml +24 -0
- package/rules/VBC-011.yaml +21 -0
- package/rules/VBC-012.yaml +21 -0
- package/rules/VBC-013.yaml +17 -0
- package/rules/VBC-014.yaml +15 -0
- package/rules/VBC-015.yaml +40 -0
- package/rules/VBC-016.yaml +21 -0
- package/rules/VBC-017.yaml +23 -0
- package/rules/VBC-018.yaml +19 -0
- package/rules/VBC-019.yaml +42 -0
- package/rules/VBC-020.yaml +22 -0
- package/rules/VBC-021.yaml +22 -0
- package/rules/VBC-022.yaml +21 -0
- package/rules/VBC-023.yaml +22 -0
- package/rules/VBC-024.yaml +26 -0
- package/rules/VBC-025.yaml +13 -0
- package/rules/VBC-026.yaml +17 -0
- package/rules/VBC-027.yaml +27 -0
- package/rules/VBC-028.yaml +18 -0
- package/rules/VBC-029.yaml +22 -0
- package/rules/VBC-030.yaml +22 -0
- package/rules/VBC-032.yaml +20 -0
- package/rules/VBC-033.yaml +26 -0
- package/rules/VBC-034.yaml +41 -0
- package/rules/VBC-035.yaml +30 -0
- package/rules/VBC-039.yaml +18 -0
- package/rules/VBC-042.yaml +26 -0
- package/rules/VBC-045.yaml +13 -0
- package/rules/VBC-046.yaml +13 -0
- package/rules/VBC-048.yaml +23 -0
- package/rules/VBC-049.yaml +19 -0
- package/rules/VBC-051.yaml +23 -0
- package/rules/VBC-052.yaml +19 -0
- package/rules/VBC-053.yaml +19 -0
- package/rules/VBC-054.yaml +29 -0
- package/rules/VBC-056.yaml +28 -0
- package/rules/VBC-057.yaml +18 -0
- package/rules/VBC-058.yaml +18 -0
- package/rules/VBC-059.yaml +21 -0
- package/rules/VBC-063-B.yaml +15 -0
- package/rules/VBC-063.yaml +18 -0
- package/rules/VBC-065.yaml +33 -0
- package/rules/VBC-066.yaml +16 -0
- package/rules/VBC-068.yaml +21 -0
- package/rules/VBC-070.yaml +19 -0
- package/rules/VBC-077.yaml +35 -0
- package/rules/VBC-079.yaml +18 -0
- package/rules/VBC-080.yaml +18 -0
- package/rules/VBC-084.yaml +22 -0
- package/rules/VBC-086.yaml +22 -0
- package/rules/VBC-090.yaml +28 -0
- package/rules/VBC-096.yaml +19 -0
- package/rules/VBC-097.yaml +21 -0
- package/rules/VBC-098.yaml +18 -0
- package/rules/VBC-101.yaml +23 -0
- package/rules/VBC-102.yaml +20 -0
- package/rules/VBC-103.yaml +35 -0
- package/rules/VBC-104.yaml +24 -0
- package/rules/VBC-106.yaml +14 -0
- package/rules/VBC-112.yaml +20 -0
- package/rules/VBC-113.yaml +19 -0
- package/rules/VBC-117.yaml +21 -0
- package/rules/VBC-123.yaml +29 -0
- package/rules/VBC-131.yaml +20 -0
- package/rules/VBC-150.yaml +27 -0
- package/rules/VBC-153.yaml +21 -0
- package/rules/VBC-158.yaml +16 -0
- package/rules/VBC-161.yaml +27 -0
- package/rules/VBC-172.yaml +25 -0
- package/rules/VBC-197.yaml +22 -0
- package/rules/VBC-201.yaml +35 -0
- package/rules/VBC-206.yaml +19 -0
- package/rules/VBC-208.yaml +27 -0
- package/rules/VBC-212.yaml +19 -0
- package/rules/VBC-215.yaml +24 -0
- package/rules/VBC-305.yaml +20 -0
- package/rules/VBC-324.yaml +24 -0
- package/rules/VBC-334.yaml +23 -0
- package/rules/VBC-338.yaml +32 -0
- package/rules/VBC-340.yaml +22 -0
- package/rules/VBC-344.yaml +19 -0
- package/rules/VBC-347.yaml +21 -0
- package/rules/VBC-348.yaml +19 -0
- package/rules/VBC-385.yaml +21 -0
- package/rules/VBC-398.yaml +22 -0
- package/rules/VBC-401.yaml +12 -0
- package/rules/VBC-414.yaml +23 -0
- package/rules/VBC-421.yaml +20 -0
- package/rules/VBC-501.yaml +18 -0
- package/rules/VBC-502.yaml +23 -0
- package/rules/VBC-503.yaml +18 -0
- package/rules/VBC-504.yaml +20 -0
- package/rules/VBC-800.yaml +17 -0
- package/rules/VBC-901.yaml +48 -0
- package/rules/VBC-902.yaml +19 -0
- package/rules/VBC-903.yaml +17 -0
- package/rules/VBC-904.yaml +21 -0
- package/rules/VBC-905.yaml +17 -0
- package/rules/VBC-906.yaml +29 -0
- package/rules/VBC-907.yaml +24 -0
- package/rules/VBC-908.yaml +22 -0
- package/rules/VBC-909.yaml +21 -0
- package/rules/VBC-910.yaml +18 -0
- package/rules/VBC-911.yaml +21 -0
- package/rules/VBC-913.yaml +30 -0
- package/rules/VBC-914.yaml +31 -0
- package/rules/VBC-915.yaml +19 -0
- package/rules/VBC-916.yaml +24 -0
- package/rules/VBC-917.yaml +21 -0
- package/rules/VBC-918.yaml +22 -0
- package/rules/VBC-920.yaml +20 -0
- package/rules/VBC-921.yaml +45 -0
- package/rules/VBC-922.yaml +15 -0
- package/rules/VBC-923.yaml +15 -0
- package/rules/VBC-924.yaml +12 -0
- package/rules/VBC-925.yaml +14 -0
- package/rules/VBC-926.yaml +14 -0
- package/rules/VBC-927.yaml +24 -0
- package/rules/VBC-928.yaml +25 -0
- package/rules/VBC-929.yaml +21 -0
- package/rules/VBC-930.yaml +16 -0
- package/rules/VBC-931.yaml +16 -0
- package/rules/VBC-932.yaml +16 -0
- package/rules/VBC-933.yaml +28 -0
- package/rules/VBC-934.yaml +24 -0
- package/rules/VBC-935.yaml +26 -0
- package/rules/VBC-936.yaml +24 -0
- package/rules/VBC-937.yaml +24 -0
- package/rules/VBC-938.yaml +23 -0
- package/rules/VBC-939.yaml +23 -0
- package/rules/VBC-940.yaml +30 -0
- package/rules/VBC-941.yaml +28 -0
- package/rules/VBC-942.yaml +23 -0
- package/rules/VBC-943.yaml +22 -0
- package/rules/VBC-944.yaml +26 -0
- package/rules/VBC-945.yaml +33 -0
- package/rules/VBC-946.yaml +26 -0
- package/rules/VBC-947.yaml +22 -0
- 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;
|