@ash-technologia/fathom 0.1.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.
Files changed (236) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/LICENSE +21 -0
  3. package/README.md +725 -0
  4. package/dist/analyzers/architecture/graph.d.ts +29 -0
  5. package/dist/analyzers/architecture/graph.d.ts.map +1 -0
  6. package/dist/analyzers/architecture/graph.js +347 -0
  7. package/dist/analyzers/architecture/graph.js.map +1 -0
  8. package/dist/analyzers/architecture/imports.d.ts +24 -0
  9. package/dist/analyzers/architecture/imports.d.ts.map +1 -0
  10. package/dist/analyzers/architecture/imports.js +155 -0
  11. package/dist/analyzers/architecture/imports.js.map +1 -0
  12. package/dist/analyzers/architecture/index.d.ts +13 -0
  13. package/dist/analyzers/architecture/index.d.ts.map +1 -0
  14. package/dist/analyzers/architecture/index.js +217 -0
  15. package/dist/analyzers/architecture/index.js.map +1 -0
  16. package/dist/analyzers/architecture/types.d.ts +65 -0
  17. package/dist/analyzers/architecture/types.d.ts.map +1 -0
  18. package/dist/analyzers/architecture/types.js +2 -0
  19. package/dist/analyzers/architecture/types.js.map +1 -0
  20. package/dist/analyzers/cicd/index.d.ts +11 -0
  21. package/dist/analyzers/cicd/index.d.ts.map +1 -0
  22. package/dist/analyzers/cicd/index.js +157 -0
  23. package/dist/analyzers/cicd/index.js.map +1 -0
  24. package/dist/analyzers/dependencies/index.d.ts +11 -0
  25. package/dist/analyzers/dependencies/index.d.ts.map +1 -0
  26. package/dist/analyzers/dependencies/index.js +403 -0
  27. package/dist/analyzers/dependencies/index.js.map +1 -0
  28. package/dist/analyzers/dependencies/lockfiles.d.ts +19 -0
  29. package/dist/analyzers/dependencies/lockfiles.d.ts.map +1 -0
  30. package/dist/analyzers/dependencies/lockfiles.js +172 -0
  31. package/dist/analyzers/dependencies/lockfiles.js.map +1 -0
  32. package/dist/analyzers/dependencies/online.d.ts +19 -0
  33. package/dist/analyzers/dependencies/online.d.ts.map +1 -0
  34. package/dist/analyzers/dependencies/online.js +116 -0
  35. package/dist/analyzers/dependencies/online.js.map +1 -0
  36. package/dist/analyzers/dependencies/types.d.ts +49 -0
  37. package/dist/analyzers/dependencies/types.d.ts.map +1 -0
  38. package/dist/analyzers/dependencies/types.js +2 -0
  39. package/dist/analyzers/dependencies/types.js.map +1 -0
  40. package/dist/analyzers/documentation/index.d.ts +11 -0
  41. package/dist/analyzers/documentation/index.d.ts.map +1 -0
  42. package/dist/analyzers/documentation/index.js +166 -0
  43. package/dist/analyzers/documentation/index.js.map +1 -0
  44. package/dist/analyzers/git/index.d.ts +11 -0
  45. package/dist/analyzers/git/index.d.ts.map +1 -0
  46. package/dist/analyzers/git/index.js +180 -0
  47. package/dist/analyzers/git/index.js.map +1 -0
  48. package/dist/analyzers/project/index.d.ts +11 -0
  49. package/dist/analyzers/project/index.d.ts.map +1 -0
  50. package/dist/analyzers/project/index.js +95 -0
  51. package/dist/analyzers/project/index.js.map +1 -0
  52. package/dist/analyzers/quality/index.d.ts +11 -0
  53. package/dist/analyzers/quality/index.d.ts.map +1 -0
  54. package/dist/analyzers/quality/index.js +198 -0
  55. package/dist/analyzers/quality/index.js.map +1 -0
  56. package/dist/analyzers/security/index.d.ts +11 -0
  57. package/dist/analyzers/security/index.d.ts.map +1 -0
  58. package/dist/analyzers/security/index.js +236 -0
  59. package/dist/analyzers/security/index.js.map +1 -0
  60. package/dist/analyzers/testing/index.d.ts +11 -0
  61. package/dist/analyzers/testing/index.d.ts.map +1 -0
  62. package/dist/analyzers/testing/index.js +134 -0
  63. package/dist/analyzers/testing/index.js.map +1 -0
  64. package/dist/baseline/baseline.d.ts +20 -0
  65. package/dist/baseline/baseline.d.ts.map +1 -0
  66. package/dist/baseline/baseline.js +134 -0
  67. package/dist/baseline/baseline.js.map +1 -0
  68. package/dist/baseline/compare.d.ts +14 -0
  69. package/dist/baseline/compare.d.ts.map +1 -0
  70. package/dist/baseline/compare.js +113 -0
  71. package/dist/baseline/compare.js.map +1 -0
  72. package/dist/baseline/types.d.ts +25 -0
  73. package/dist/baseline/types.d.ts.map +1 -0
  74. package/dist/baseline/types.js +2 -0
  75. package/dist/baseline/types.js.map +1 -0
  76. package/dist/cli/commands.d.ts +39 -0
  77. package/dist/cli/commands.d.ts.map +1 -0
  78. package/dist/cli/commands.js +277 -0
  79. package/dist/cli/commands.js.map +1 -0
  80. package/dist/cli/index.d.ts +3 -0
  81. package/dist/cli/index.d.ts.map +1 -0
  82. package/dist/cli/index.js +29 -0
  83. package/dist/cli/index.js.map +1 -0
  84. package/dist/cli/options.d.ts +55 -0
  85. package/dist/cli/options.d.ts.map +1 -0
  86. package/dist/cli/options.js +258 -0
  87. package/dist/cli/options.js.map +1 -0
  88. package/dist/core/analyzer.d.ts +33 -0
  89. package/dist/core/analyzer.d.ts.map +1 -0
  90. package/dist/core/analyzer.js +19 -0
  91. package/dist/core/analyzer.js.map +1 -0
  92. package/dist/core/context.d.ts +90 -0
  93. package/dist/core/context.d.ts.map +1 -0
  94. package/dist/core/context.js +159 -0
  95. package/dist/core/context.js.map +1 -0
  96. package/dist/core/errors.d.ts +74 -0
  97. package/dist/core/errors.d.ts.map +1 -0
  98. package/dist/core/errors.js +109 -0
  99. package/dist/core/errors.js.map +1 -0
  100. package/dist/core/findings.d.ts +59 -0
  101. package/dist/core/findings.d.ts.map +1 -0
  102. package/dist/core/findings.js +34 -0
  103. package/dist/core/findings.js.map +1 -0
  104. package/dist/core/orchestrator.d.ts +44 -0
  105. package/dist/core/orchestrator.d.ts.map +1 -0
  106. package/dist/core/orchestrator.js +160 -0
  107. package/dist/core/orchestrator.js.map +1 -0
  108. package/dist/core/result.d.ts +169 -0
  109. package/dist/core/result.d.ts.map +1 -0
  110. package/dist/core/result.js +2 -0
  111. package/dist/core/result.js.map +1 -0
  112. package/dist/detectors/framework.d.ts +22 -0
  113. package/dist/detectors/framework.d.ts.map +1 -0
  114. package/dist/detectors/framework.js +147 -0
  115. package/dist/detectors/framework.js.map +1 -0
  116. package/dist/detectors/language.d.ts +13 -0
  117. package/dist/detectors/language.d.ts.map +1 -0
  118. package/dist/detectors/language.js +100 -0
  119. package/dist/detectors/language.js.map +1 -0
  120. package/dist/detectors/package-manager.d.ts +17 -0
  121. package/dist/detectors/package-manager.d.ts.map +1 -0
  122. package/dist/detectors/package-manager.js +67 -0
  123. package/dist/detectors/package-manager.js.map +1 -0
  124. package/dist/detectors/project-type.d.ts +20 -0
  125. package/dist/detectors/project-type.d.ts.map +1 -0
  126. package/dist/detectors/project-type.js +48 -0
  127. package/dist/detectors/project-type.js.map +1 -0
  128. package/dist/diff/analyzer.d.ts +16 -0
  129. package/dist/diff/analyzer.d.ts.map +1 -0
  130. package/dist/diff/analyzer.js +296 -0
  131. package/dist/diff/analyzer.js.map +1 -0
  132. package/dist/diff/git-diff.d.ts +44 -0
  133. package/dist/diff/git-diff.d.ts.map +1 -0
  134. package/dist/diff/git-diff.js +256 -0
  135. package/dist/diff/git-diff.js.map +1 -0
  136. package/dist/diff/types.d.ts +75 -0
  137. package/dist/diff/types.d.ts.map +1 -0
  138. package/dist/diff/types.js +2 -0
  139. package/dist/diff/types.js.map +1 -0
  140. package/dist/integrations/github/context.d.ts +22 -0
  141. package/dist/integrations/github/context.d.ts.map +1 -0
  142. package/dist/integrations/github/context.js +115 -0
  143. package/dist/integrations/github/context.js.map +1 -0
  144. package/dist/integrations/github/types.d.ts +30 -0
  145. package/dist/integrations/github/types.d.ts.map +1 -0
  146. package/dist/integrations/github/types.js +2 -0
  147. package/dist/integrations/github/types.js.map +1 -0
  148. package/dist/plugins/context.d.ts +13 -0
  149. package/dist/plugins/context.d.ts.map +1 -0
  150. package/dist/plugins/context.js +102 -0
  151. package/dist/plugins/context.js.map +1 -0
  152. package/dist/plugins/examples/react.d.ts +8 -0
  153. package/dist/plugins/examples/react.d.ts.map +1 -0
  154. package/dist/plugins/examples/react.js +129 -0
  155. package/dist/plugins/examples/react.js.map +1 -0
  156. package/dist/plugins/index.d.ts +5 -0
  157. package/dist/plugins/index.d.ts.map +1 -0
  158. package/dist/plugins/index.js +4 -0
  159. package/dist/plugins/index.js.map +1 -0
  160. package/dist/plugins/registry.d.ts +45 -0
  161. package/dist/plugins/registry.d.ts.map +1 -0
  162. package/dist/plugins/registry.js +236 -0
  163. package/dist/plugins/registry.js.map +1 -0
  164. package/dist/plugins/types.d.ts +148 -0
  165. package/dist/plugins/types.d.ts.map +1 -0
  166. package/dist/plugins/types.js +2 -0
  167. package/dist/plugins/types.js.map +1 -0
  168. package/dist/reporters/html.d.ts +11 -0
  169. package/dist/reporters/html.d.ts.map +1 -0
  170. package/dist/reporters/html.js +1352 -0
  171. package/dist/reporters/html.js.map +1 -0
  172. package/dist/reporters/json.d.ts +10 -0
  173. package/dist/reporters/json.d.ts.map +1 -0
  174. package/dist/reporters/json.js +11 -0
  175. package/dist/reporters/json.js.map +1 -0
  176. package/dist/reporters/markdown.d.ts +7 -0
  177. package/dist/reporters/markdown.d.ts.map +1 -0
  178. package/dist/reporters/markdown.js +74 -0
  179. package/dist/reporters/markdown.js.map +1 -0
  180. package/dist/reporters/sarif.d.ts +133 -0
  181. package/dist/reporters/sarif.d.ts.map +1 -0
  182. package/dist/reporters/sarif.js +268 -0
  183. package/dist/reporters/sarif.js.map +1 -0
  184. package/dist/reporters/terminal.d.ts +17 -0
  185. package/dist/reporters/terminal.d.ts.map +1 -0
  186. package/dist/reporters/terminal.js +423 -0
  187. package/dist/reporters/terminal.js.map +1 -0
  188. package/dist/rules/categories.d.ts +8 -0
  189. package/dist/rules/categories.d.ts.map +1 -0
  190. package/dist/rules/categories.js +23 -0
  191. package/dist/rules/categories.js.map +1 -0
  192. package/dist/rules/definitions.d.ts +25 -0
  193. package/dist/rules/definitions.d.ts.map +1 -0
  194. package/dist/rules/definitions.js +429 -0
  195. package/dist/rules/definitions.js.map +1 -0
  196. package/dist/rules/registry.d.ts +36 -0
  197. package/dist/rules/registry.d.ts.map +1 -0
  198. package/dist/rules/registry.js +64 -0
  199. package/dist/rules/registry.js.map +1 -0
  200. package/dist/rules/severity.d.ts +13 -0
  201. package/dist/rules/severity.d.ts.map +1 -0
  202. package/dist/rules/severity.js +15 -0
  203. package/dist/rules/severity.js.map +1 -0
  204. package/dist/scoring/confidence.d.ts +12 -0
  205. package/dist/scoring/confidence.d.ts.map +1 -0
  206. package/dist/scoring/confidence.js +22 -0
  207. package/dist/scoring/confidence.js.map +1 -0
  208. package/dist/scoring/score.d.ts +27 -0
  209. package/dist/scoring/score.d.ts.map +1 -0
  210. package/dist/scoring/score.js +81 -0
  211. package/dist/scoring/score.js.map +1 -0
  212. package/dist/scoring/weights.d.ts +11 -0
  213. package/dist/scoring/weights.d.ts.map +1 -0
  214. package/dist/scoring/weights.js +26 -0
  215. package/dist/scoring/weights.js.map +1 -0
  216. package/dist/utils/filesystem.d.ts +65 -0
  217. package/dist/utils/filesystem.d.ts.map +1 -0
  218. package/dist/utils/filesystem.js +299 -0
  219. package/dist/utils/filesystem.js.map +1 -0
  220. package/dist/utils/git.d.ts +47 -0
  221. package/dist/utils/git.d.ts.map +1 -0
  222. package/dist/utils/git.js +125 -0
  223. package/dist/utils/git.js.map +1 -0
  224. package/dist/utils/logger.d.ts +14 -0
  225. package/dist/utils/logger.d.ts.map +1 -0
  226. package/dist/utils/logger.js +25 -0
  227. package/dist/utils/logger.js.map +1 -0
  228. package/dist/utils/paths.d.ts +30 -0
  229. package/dist/utils/paths.d.ts.map +1 -0
  230. package/dist/utils/paths.js +48 -0
  231. package/dist/utils/paths.js.map +1 -0
  232. package/dist/utils/timing.d.ts +12 -0
  233. package/dist/utils/timing.d.ts.map +1 -0
  234. package/dist/utils/timing.js +19 -0
  235. package/dist/utils/timing.js.map +1 -0
  236. package/package.json +73 -0
@@ -0,0 +1,429 @@
1
+ /** All rule definitions indexed by rule ID */
2
+ export const RULE_DEFINITIONS = {
3
+ // Project
4
+ 'PROJ-001': {
5
+ id: 'PROJ-001',
6
+ name: 'Ecosystem Detection',
7
+ category: 'project',
8
+ severity: 'info',
9
+ description: 'Detect the primary programming ecosystem(s) used.',
10
+ enabledByDefault: true,
11
+ },
12
+ 'PROJ-002': {
13
+ id: 'PROJ-002',
14
+ name: 'Framework Detection',
15
+ category: 'project',
16
+ severity: 'info',
17
+ description: 'Detect frameworks and libraries in use.',
18
+ enabledByDefault: true,
19
+ },
20
+ 'PROJ-003': {
21
+ id: 'PROJ-003',
22
+ name: 'Package Manager Detection',
23
+ category: 'project',
24
+ severity: 'info',
25
+ description: 'Detect the package manager(s) used.',
26
+ enabledByDefault: true,
27
+ },
28
+ 'PROJ-004': {
29
+ id: 'PROJ-004',
30
+ name: 'Repository Size',
31
+ category: 'project',
32
+ severity: 'info',
33
+ description: 'Estimate the repository size and file count.',
34
+ enabledByDefault: true,
35
+ },
36
+ // Git
37
+ 'GIT-001': {
38
+ id: 'GIT-001',
39
+ name: 'Git Repository',
40
+ category: 'git',
41
+ severity: 'medium',
42
+ description: 'Detect whether the repository is tracked with Git.',
43
+ enabledByDefault: true,
44
+ },
45
+ 'GIT-002': {
46
+ id: 'GIT-002',
47
+ name: '.gitignore Exists',
48
+ category: 'git',
49
+ severity: 'medium',
50
+ description: 'Check whether a .gitignore file is present.',
51
+ enabledByDefault: true,
52
+ },
53
+ 'GIT-003': {
54
+ id: 'GIT-003',
55
+ name: 'Generated Directories Ignored',
56
+ category: 'git',
57
+ severity: 'medium',
58
+ description: 'Check whether common generated directories are gitignored.',
59
+ enabledByDefault: true,
60
+ },
61
+ 'GIT-004': {
62
+ id: 'GIT-004',
63
+ name: 'Large Files',
64
+ category: 'git',
65
+ severity: 'medium',
66
+ description: 'Detect files larger than 10 MB tracked in the repository.',
67
+ enabledByDefault: true,
68
+ },
69
+ 'GIT-005': {
70
+ id: 'GIT-005',
71
+ name: 'Uncommitted Changes',
72
+ category: 'git',
73
+ severity: 'info',
74
+ description: 'Detect uncommitted changes in the working directory.',
75
+ enabledByDefault: true,
76
+ },
77
+ 'GIT-006': {
78
+ id: 'GIT-006',
79
+ name: 'Empty Repository',
80
+ category: 'git',
81
+ severity: 'info',
82
+ description: 'Detect whether the repository has any commits.',
83
+ enabledByDefault: true,
84
+ },
85
+ // Security
86
+ 'SEC-001': {
87
+ id: 'SEC-001',
88
+ name: 'Environment File Not Ignored',
89
+ category: 'security',
90
+ severity: 'high',
91
+ description: '.env or similar files may contain sensitive configuration and should be gitignored.',
92
+ enabledByDefault: true,
93
+ },
94
+ 'SEC-002': {
95
+ id: 'SEC-002',
96
+ name: 'Potential Secret Detected',
97
+ category: 'security',
98
+ severity: 'high',
99
+ description: 'A value resembling a credential or secret was detected in source files.',
100
+ enabledByDefault: true,
101
+ },
102
+ 'SEC-003': {
103
+ id: 'SEC-003',
104
+ name: 'Private Key File Present',
105
+ category: 'security',
106
+ severity: 'high',
107
+ description: 'A file that may contain a private key was detected.',
108
+ enabledByDefault: true,
109
+ },
110
+ 'SEC-004': {
111
+ id: 'SEC-004',
112
+ name: 'Tracked Credential File',
113
+ category: 'security',
114
+ severity: 'high',
115
+ description: 'A credential or configuration file appears to be tracked in Git.',
116
+ enabledByDefault: true,
117
+ },
118
+ 'SEC-005': {
119
+ id: 'SEC-005',
120
+ name: 'Credentials in URL',
121
+ category: 'security',
122
+ severity: 'high',
123
+ description: 'A URL with embedded credentials was detected.',
124
+ enabledByDefault: true,
125
+ },
126
+ // Dependencies
127
+ 'DEP-001': {
128
+ id: 'DEP-001',
129
+ name: 'Package Manifest Detected',
130
+ category: 'dependencies',
131
+ severity: 'info',
132
+ description: 'Identify the package manifest for the project.',
133
+ enabledByDefault: true,
134
+ },
135
+ 'DEP-002': {
136
+ id: 'DEP-002',
137
+ name: 'Lockfile Detected',
138
+ category: 'dependencies',
139
+ severity: 'info',
140
+ description: 'Detect whether a dependency lockfile is present.',
141
+ enabledByDefault: true,
142
+ },
143
+ 'DEP-003': {
144
+ id: 'DEP-003',
145
+ name: 'Missing Lockfile',
146
+ category: 'dependencies',
147
+ severity: 'medium',
148
+ description: 'A package manifest exists without a corresponding lockfile.',
149
+ enabledByDefault: true,
150
+ },
151
+ 'DEP-004': {
152
+ id: 'DEP-004',
153
+ name: 'Package Manager Mismatch',
154
+ category: 'dependencies',
155
+ severity: 'low',
156
+ description: 'Multiple lockfiles suggest conflicting package managers.',
157
+ enabledByDefault: true,
158
+ },
159
+ 'DEP-005': {
160
+ id: 'DEP-005',
161
+ name: 'Dependency Count',
162
+ category: 'dependencies',
163
+ severity: 'info',
164
+ description: 'Report the number of declared dependencies.',
165
+ enabledByDefault: true,
166
+ },
167
+ 'DEP-006': {
168
+ id: 'DEP-006',
169
+ name: 'Suspicious Dependency Configuration',
170
+ category: 'dependencies',
171
+ severity: 'low',
172
+ description: 'Detect unpinned wildcard dependencies, unpinned Git URLs, or conflicting declarations.',
173
+ enabledByDefault: true,
174
+ },
175
+ 'DEP-007': {
176
+ id: 'DEP-007',
177
+ name: 'Known Vulnerability Detected',
178
+ category: 'dependencies',
179
+ severity: 'high',
180
+ description: 'Known security vulnerability identified in a dependency from vulnerability advisory data.',
181
+ enabledByDefault: true,
182
+ },
183
+ 'DEP-008': {
184
+ id: 'DEP-008',
185
+ name: 'Duplicate Dependency Versions',
186
+ category: 'dependencies',
187
+ severity: 'low',
188
+ description: 'Multiple distinct versions of the same dependency resolved in lockfiles.',
189
+ enabledByDefault: true,
190
+ },
191
+ 'DEP-009': {
192
+ id: 'DEP-009',
193
+ name: 'Outdated Dependency Version',
194
+ category: 'dependencies',
195
+ severity: 'low',
196
+ description: 'Dependency version is significantly behind the latest available stable release.',
197
+ enabledByDefault: true,
198
+ },
199
+ 'DEP-010': {
200
+ id: 'DEP-010',
201
+ name: 'Unused Dependency',
202
+ category: 'dependencies',
203
+ severity: 'info',
204
+ description: 'Declared production runtime dependency is not referenced in source code.',
205
+ enabledByDefault: true,
206
+ },
207
+ // Quality
208
+ 'QUAL-001': {
209
+ id: 'QUAL-001',
210
+ name: 'TODO Comments',
211
+ category: 'quality',
212
+ severity: 'low',
213
+ description: 'Detect TODO comments in source files.',
214
+ enabledByDefault: true,
215
+ },
216
+ 'QUAL-002': {
217
+ id: 'QUAL-002',
218
+ name: 'FIXME Comments',
219
+ category: 'quality',
220
+ severity: 'low',
221
+ description: 'Detect FIXME comments in source files.',
222
+ enabledByDefault: true,
223
+ },
224
+ 'QUAL-003': {
225
+ id: 'QUAL-003',
226
+ name: 'Debug Statements',
227
+ category: 'quality',
228
+ severity: 'low',
229
+ description: 'Detect debug/logging statements that may have been left in production code.',
230
+ enabledByDefault: true,
231
+ },
232
+ 'QUAL-004': {
233
+ id: 'QUAL-004',
234
+ name: 'Empty Catch Blocks',
235
+ category: 'quality',
236
+ severity: 'medium',
237
+ description: 'Detect empty or bare catch blocks that swallow errors silently.',
238
+ enabledByDefault: true,
239
+ },
240
+ 'QUAL-005': {
241
+ id: 'QUAL-005',
242
+ name: 'Large Source Files',
243
+ category: 'quality',
244
+ severity: 'low',
245
+ description: 'Detect source files exceeding 500 lines, which may indicate a maintainability concern.',
246
+ enabledByDefault: true,
247
+ },
248
+ 'QUAL-006': {
249
+ id: 'QUAL-006',
250
+ name: 'Deep Directory Nesting',
251
+ category: 'quality',
252
+ severity: 'low',
253
+ description: 'Detect deeply nested directory structures that may affect navigability.',
254
+ enabledByDefault: true,
255
+ },
256
+ // Testing
257
+ 'TEST-001': {
258
+ id: 'TEST-001',
259
+ name: 'Test Directories',
260
+ category: 'testing',
261
+ severity: 'info',
262
+ description: 'Detect the presence of test directories.',
263
+ enabledByDefault: true,
264
+ },
265
+ 'TEST-002': {
266
+ id: 'TEST-002',
267
+ name: 'Test Files',
268
+ category: 'testing',
269
+ severity: 'medium',
270
+ description: 'Detect test files using common naming conventions.',
271
+ enabledByDefault: true,
272
+ },
273
+ 'TEST-003': {
274
+ id: 'TEST-003',
275
+ name: 'Test Scripts',
276
+ category: 'testing',
277
+ severity: 'medium',
278
+ description: 'Detect test scripts in package manifests.',
279
+ enabledByDefault: true,
280
+ },
281
+ 'TEST-004': {
282
+ id: 'TEST-004',
283
+ name: 'Test Coverage Heuristic',
284
+ category: 'testing',
285
+ severity: 'info',
286
+ description: 'Estimate the ratio of test files to source files as a heuristic.',
287
+ enabledByDefault: true,
288
+ },
289
+ // Documentation
290
+ 'DOC-001': {
291
+ id: 'DOC-001',
292
+ name: 'README Exists',
293
+ category: 'documentation',
294
+ severity: 'medium',
295
+ description: 'Detect whether a README file is present.',
296
+ enabledByDefault: true,
297
+ },
298
+ 'DOC-002': {
299
+ id: 'DOC-002',
300
+ name: 'README Has Installation Instructions',
301
+ category: 'documentation',
302
+ severity: 'low',
303
+ description: 'Check whether the README contains installation or setup information.',
304
+ enabledByDefault: true,
305
+ },
306
+ 'DOC-003': {
307
+ id: 'DOC-003',
308
+ name: 'README Has Usage Information',
309
+ category: 'documentation',
310
+ severity: 'low',
311
+ description: 'Check whether the README contains usage information.',
312
+ enabledByDefault: true,
313
+ },
314
+ 'DOC-004': {
315
+ id: 'DOC-004',
316
+ name: 'LICENSE Exists',
317
+ category: 'documentation',
318
+ severity: 'medium',
319
+ description: 'Detect whether a LICENSE file is present.',
320
+ enabledByDefault: true,
321
+ },
322
+ 'DOC-005': {
323
+ id: 'DOC-005',
324
+ name: 'CONTRIBUTING Guide',
325
+ category: 'documentation',
326
+ severity: 'low',
327
+ description: 'Detect whether a CONTRIBUTING guide is present.',
328
+ enabledByDefault: true,
329
+ },
330
+ 'DOC-006': {
331
+ id: 'DOC-006',
332
+ name: 'SECURITY Policy',
333
+ category: 'documentation',
334
+ severity: 'low',
335
+ description: 'Detect whether a SECURITY policy document is present.',
336
+ enabledByDefault: true,
337
+ },
338
+ 'DOC-007': {
339
+ id: 'DOC-007',
340
+ name: 'README Has Project Description',
341
+ category: 'documentation',
342
+ severity: 'low',
343
+ description: 'Check whether the README contains a meaningful project description.',
344
+ enabledByDefault: true,
345
+ },
346
+ // CI/CD
347
+ 'CI-001': {
348
+ id: 'CI-001',
349
+ name: 'GitHub Actions Detected',
350
+ category: 'cicd',
351
+ severity: 'info',
352
+ description: 'Detect the presence of GitHub Actions workflow files.',
353
+ enabledByDefault: true,
354
+ },
355
+ 'CI-002': {
356
+ id: 'CI-002',
357
+ name: 'CI Workflow Detected',
358
+ category: 'cicd',
359
+ severity: 'medium',
360
+ description: 'Detect whether a CI workflow is configured.',
361
+ enabledByDefault: true,
362
+ },
363
+ 'CI-003': {
364
+ id: 'CI-003',
365
+ name: 'Tests Run in CI',
366
+ category: 'cicd',
367
+ severity: 'medium',
368
+ description: 'Detect whether the CI workflow appears to run tests.',
369
+ enabledByDefault: true,
370
+ },
371
+ 'CI-004': {
372
+ id: 'CI-004',
373
+ name: 'Build Run in CI',
374
+ category: 'cicd',
375
+ severity: 'low',
376
+ description: 'Detect whether the CI workflow appears to run a build step.',
377
+ enabledByDefault: true,
378
+ },
379
+ // Architecture
380
+ 'ARCH-001': {
381
+ id: 'ARCH-001',
382
+ name: 'Architecture Layout',
383
+ category: 'architecture',
384
+ severity: 'info',
385
+ description: 'Detect high-level architectural patterns and layout.',
386
+ enabledByDefault: true,
387
+ },
388
+ 'ARCH-002': {
389
+ id: 'ARCH-002',
390
+ name: 'Circular Dependency Candidate',
391
+ category: 'architecture',
392
+ severity: 'high',
393
+ description: 'Circular import dependencies detected between modules.',
394
+ enabledByDefault: true,
395
+ },
396
+ 'ARCH-003': {
397
+ id: 'ARCH-003',
398
+ name: 'Architectural Boundary Violation',
399
+ category: 'architecture',
400
+ severity: 'high',
401
+ description: 'Suspicious cross-layer import or layer boundary violation detected.',
402
+ enabledByDefault: true,
403
+ },
404
+ 'ARCH-004': {
405
+ id: 'ARCH-004',
406
+ name: 'Deep Coupling',
407
+ category: 'architecture',
408
+ severity: 'low',
409
+ description: 'Module exhibits excessive fan-out coupling to other internal modules.',
410
+ enabledByDefault: true,
411
+ },
412
+ 'ARCH-005': {
413
+ id: 'ARCH-005',
414
+ name: 'Very Large Module',
415
+ category: 'architecture',
416
+ severity: 'low',
417
+ description: 'Module is disproportionately large and tightly coupled.',
418
+ enabledByDefault: true,
419
+ },
420
+ 'ARCH-006': {
421
+ id: 'ARCH-006',
422
+ name: 'Orphaned Source File',
423
+ category: 'architecture',
424
+ severity: 'info',
425
+ description: 'Source file appears unused and unreferenced by any module.',
426
+ enabledByDefault: true,
427
+ },
428
+ };
429
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/rules/definitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { Category } from './categories.js';
2
+ import type { Severity } from './severity.js';
3
+ import { type RuleDefinition } from './definitions.js';
4
+ /**
5
+ * Rule configuration states.
6
+ */
7
+ export type RuleState = 'off' | 'warning' | 'error';
8
+ /**
9
+ * Per-rule configuration override (from .fathom.json)
10
+ */
11
+ export interface RuleConfig {
12
+ enabled?: boolean | undefined;
13
+ severity?: Severity | undefined;
14
+ reason?: string | undefined;
15
+ }
16
+ export type RuleConfigValue = RuleState | RuleConfig;
17
+ /**
18
+ * The rule registry provides lookup and filtering of all registered rules.
19
+ * Rules are registered statically from definitions.ts.
20
+ *
21
+ * Future: dynamic registration for plugins.
22
+ */
23
+ export declare class RuleRegistry {
24
+ private readonly rules;
25
+ constructor();
26
+ getRule(id: string): RuleDefinition | undefined;
27
+ hasRule(id: string): boolean;
28
+ registerRule(rule: RuleDefinition): this;
29
+ getRulesByCategory(category: Category): RuleDefinition[];
30
+ getAllRules(): RuleDefinition[];
31
+ isEnabled(id: string, overrides?: Record<string, RuleConfigValue>): boolean;
32
+ getEffectiveSeverity(id: string, overrides?: Record<string, RuleConfigValue>): Severity | undefined;
33
+ }
34
+ /** Shared singleton registry instance */
35
+ export declare const ruleRegistry: RuleRegistry;
36
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/rules/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEzE;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,UAAU,CAAC;AAErD;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;;IAMpD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI/C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI5B,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKxC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,EAAE;IAIxD,WAAW,IAAI,cAAc,EAAE;IAI/B,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAM,GAAG,OAAO;IAa/E,oBAAoB,CAClB,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAM,GAC9C,QAAQ,GAAG,SAAS;CAYxB;AAED,yCAAyC;AACzC,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { RULE_DEFINITIONS } from './definitions.js';
2
+ /**
3
+ * The rule registry provides lookup and filtering of all registered rules.
4
+ * Rules are registered statically from definitions.ts.
5
+ *
6
+ * Future: dynamic registration for plugins.
7
+ */
8
+ export class RuleRegistry {
9
+ rules;
10
+ constructor() {
11
+ this.rules = new Map(Object.entries(RULE_DEFINITIONS));
12
+ }
13
+ getRule(id) {
14
+ return this.rules.get(id);
15
+ }
16
+ hasRule(id) {
17
+ return this.rules.has(id);
18
+ }
19
+ registerRule(rule) {
20
+ this.rules.set(rule.id, rule);
21
+ return this;
22
+ }
23
+ getRulesByCategory(category) {
24
+ return [...this.rules.values()].filter((r) => r.category === category);
25
+ }
26
+ getAllRules() {
27
+ return [...this.rules.values()];
28
+ }
29
+ isEnabled(id, overrides = {}) {
30
+ const override = overrides[id];
31
+ if (override !== undefined) {
32
+ if (typeof override === 'string') {
33
+ if (override === 'off')
34
+ return false;
35
+ if (override === 'warning' || override === 'error')
36
+ return true;
37
+ }
38
+ else if (typeof override === 'object' && override !== null) {
39
+ if (override.enabled !== undefined)
40
+ return override.enabled;
41
+ }
42
+ }
43
+ return this.rules.get(id)?.enabledByDefault ?? true;
44
+ }
45
+ getEffectiveSeverity(id, overrides = {}) {
46
+ const override = overrides[id];
47
+ if (override !== undefined) {
48
+ if (typeof override === 'string') {
49
+ if (override === 'warning')
50
+ return 'medium';
51
+ if (override === 'error')
52
+ return 'high';
53
+ }
54
+ else if (typeof override === 'object' && override !== null) {
55
+ if (override.severity)
56
+ return override.severity;
57
+ }
58
+ }
59
+ return this.rules.get(id)?.severity;
60
+ }
61
+ }
62
+ /** Shared singleton registry instance */
63
+ export const ruleRegistry = new RuleRegistry();
64
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/rules/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAuB,MAAM,kBAAkB,CAAC;AAkBzE;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IACN,KAAK,CAA8B;IAEpD;QACE,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,YAAY,CAAC,IAAoB;QAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kBAAkB,CAAC,QAAkB;QACnC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACzE,CAAC;IAED,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,SAAS,CAAC,EAAU,EAAE,YAA6C,EAAE;QACnE,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,IAAI,QAAQ,KAAK,KAAK;oBAAE,OAAO,KAAK,CAAC;gBACrC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,OAAO;oBAAE,OAAO,IAAI,CAAC;YAClE,CAAC;iBAAM,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC7D,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS;oBAAE,OAAO,QAAQ,CAAC,OAAO,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,gBAAgB,IAAI,IAAI,CAAC;IACtD,CAAC;IAED,oBAAoB,CAClB,EAAU,EACV,YAA6C,EAAE;QAE/C,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,IAAI,QAAQ,KAAK,SAAS;oBAAE,OAAO,QAAQ,CAAC;gBAC5C,IAAI,QAAQ,KAAK,OAAO;oBAAE,OAAO,MAAM,CAAC;YAC1C,CAAC;iBAAM,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC7D,IAAI,QAAQ,CAAC,QAAQ;oBAAE,OAAO,QAAQ,CAAC,QAAQ,CAAC;YAClD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;IACtC,CAAC;CACF;AAED,yCAAyC;AACzC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Severity levels for findings.
3
+ *
4
+ * - critical: Immediate action required. Severe security or stability risk.
5
+ * - high: Significant issue that should be addressed soon.
6
+ * - medium: Notable concern that warrants attention.
7
+ * - low: Minor issue or improvement opportunity.
8
+ * - info: Informational signal, no action required.
9
+ */
10
+ export type Severity = 'critical' | 'high' | 'medium' | 'low' | 'info';
11
+ export declare const SEVERITY_ORDER: Record<Severity, number>;
12
+ export declare const SEVERITY_LABELS: Record<Severity, string>;
13
+ //# sourceMappingURL=severity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severity.d.ts","sourceRoot":"","sources":["../../src/rules/severity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvE,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAMnD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAMpD,CAAC"}
@@ -0,0 +1,15 @@
1
+ export const SEVERITY_ORDER = {
2
+ critical: 0,
3
+ high: 1,
4
+ medium: 2,
5
+ low: 3,
6
+ info: 4,
7
+ };
8
+ export const SEVERITY_LABELS = {
9
+ critical: 'CRITICAL',
10
+ high: 'HIGH',
11
+ medium: 'MEDIUM',
12
+ low: 'LOW',
13
+ info: 'INFO',
14
+ };
15
+ //# sourceMappingURL=severity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severity.js","sourceRoot":"","sources":["../../src/rules/severity.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,cAAc,GAA6B;IACtD,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;CACb,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Confidence utilities for findings.
3
+ */
4
+ /**
5
+ * Clamp a confidence value to [0, 1].
6
+ */
7
+ export declare function clampConfidence(value: number): number;
8
+ /**
9
+ * Classify a confidence value into a human-readable label.
10
+ */
11
+ export declare function confidenceLabel(confidence: number): string;
12
+ //# sourceMappingURL=confidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confidence.d.ts","sourceRoot":"","sources":["../../src/scoring/confidence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAK1D"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Confidence utilities for findings.
3
+ */
4
+ /**
5
+ * Clamp a confidence value to [0, 1].
6
+ */
7
+ export function clampConfidence(value) {
8
+ return Math.max(0, Math.min(1, value));
9
+ }
10
+ /**
11
+ * Classify a confidence value into a human-readable label.
12
+ */
13
+ export function confidenceLabel(confidence) {
14
+ if (confidence >= 0.95)
15
+ return 'deterministic';
16
+ if (confidence >= 0.8)
17
+ return 'high';
18
+ if (confidence >= 0.6)
19
+ return 'medium';
20
+ return 'low';
21
+ }
22
+ //# sourceMappingURL=confidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confidence.js","sourceRoot":"","sources":["../../src/scoring/confidence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,IAAI,UAAU,IAAI,IAAI;QAAE,OAAO,eAAe,CAAC;IAC/C,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,MAAM,CAAC;IACrC,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,QAAQ,CAAC;IACvC,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { Category } from '../rules/categories.js';
2
+ import type { Finding } from '../core/findings.js';
3
+ import type { AnalyzerResult, CategoryScore, HealthScore } from '../core/result.js';
4
+ /**
5
+ * Calculate a category score from its findings.
6
+ *
7
+ * - Starts at 100
8
+ * - Each finding deducts penalty points based on severity
9
+ * - Score is clamped to [0, 100]
10
+ * - The category weight is stored for weighted average calculation
11
+ *
12
+ * The scoring is deterministic: same findings → same score.
13
+ */
14
+ export declare function calculateCategoryScore(category: Category, findings: Finding[]): CategoryScore;
15
+ /**
16
+ * Classify a score into a health band.
17
+ */
18
+ export declare function classifyScore(score: number): HealthScore['band'];
19
+ /**
20
+ * Calculate the full health score from all findings and analyzer results.
21
+ */
22
+ export declare function calculateHealthScore(findings: Finding[], _analyzerResults: AnalyzerResult[]): HealthScore;
23
+ /**
24
+ * Get the human-readable label for a health band.
25
+ */
26
+ export declare function bandLabel(band: HealthScore['band']): string;
27
+ //# sourceMappingURL=score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/scoring/score.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGpF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,aAAa,CAqB7F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAMhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,OAAO,EAAE,EACnB,gBAAgB,EAAE,cAAc,EAAE,GACjC,WAAW,CAsBb;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAS3D"}