@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 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { Category } from '../rules/categories.js';
2
+ import type { AnalyzerResult } from './result.js';
3
+ import type { RepositoryContext } from './context.js';
4
+ /**
5
+ * Every analyzer must implement this interface.
6
+ *
7
+ * Analyzers are pure in the sense that they read from context
8
+ * and return findings — they never modify anything.
9
+ */
10
+ export interface Analyzer {
11
+ /** Unique identifier, e.g. "git" */
12
+ readonly id: string;
13
+ /** Display name */
14
+ readonly name: string;
15
+ /** Which category this analyzer covers */
16
+ readonly category: Category;
17
+ /** Short description of what this analyzer checks */
18
+ readonly description: string;
19
+ /** Run the analysis and return results */
20
+ analyze(context: RepositoryContext): Promise<AnalyzerResult>;
21
+ }
22
+ /**
23
+ * Registry of all available analyzers.
24
+ *
25
+ * Future: support dynamic registration from plugins.
26
+ */
27
+ export declare class AnalyzerRegistry {
28
+ private readonly analyzers;
29
+ register(analyzer: Analyzer): this;
30
+ getAll(): Analyzer[];
31
+ get(id: string): Analyzer | undefined;
32
+ }
33
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/core/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0CAA0C;IAC1C,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC9D;AAED;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IAEzD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAKlC,MAAM,IAAI,QAAQ,EAAE;IAIpB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;CAGtC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Registry of all available analyzers.
3
+ *
4
+ * Future: support dynamic registration from plugins.
5
+ */
6
+ export class AnalyzerRegistry {
7
+ analyzers = new Map();
8
+ register(analyzer) {
9
+ this.analyzers.set(analyzer.id, analyzer);
10
+ return this;
11
+ }
12
+ getAll() {
13
+ return [...this.analyzers.values()];
14
+ }
15
+ get(id) {
16
+ return this.analyzers.get(id);
17
+ }
18
+ }
19
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/core/analyzer.ts"],"names":[],"mappings":"AAuBA;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IACV,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEzD,QAAQ,CAAC,QAAkB;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,90 @@
1
+ import type { EcosystemDetection } from '../detectors/language.js';
2
+ import type { FrameworkDetection } from '../detectors/framework.js';
3
+ import type { PackageManagerDetection } from '../detectors/package-manager.js';
4
+ import type { ProjectTypeDetection } from '../detectors/project-type.js';
5
+ /**
6
+ * A lightweight descriptor for a file in the repository.
7
+ */
8
+ export interface FileEntry {
9
+ /** Absolute path */
10
+ absolutePath: string;
11
+ /** Repository-relative path with forward slashes */
12
+ relativePath: string;
13
+ /** File extension (lowercase, with dot) */
14
+ extension: string;
15
+ /** Size in bytes */
16
+ sizeBytes: number;
17
+ /** Whether this file is a known binary format */
18
+ isBinary: boolean;
19
+ /** Whether this is a source code file */
20
+ isSource: boolean;
21
+ /** Whether this appears to be a test file */
22
+ isTest: boolean;
23
+ /** Whether this is a config file */
24
+ isConfig: boolean;
25
+ }
26
+ /**
27
+ * Git-related context discovered about the repository.
28
+ */
29
+ export interface GitContext {
30
+ isRepository: boolean;
31
+ hasCommits: boolean;
32
+ hasGitignore: boolean;
33
+ gitignoreContent: string | null;
34
+ }
35
+ /**
36
+ * Package manifest contents (package.json, pyproject.toml, etc.)
37
+ */
38
+ export interface ManifestContext {
39
+ /** Raw manifest data keyed by relative file path */
40
+ files: Record<string, unknown>;
41
+ /** Parsed package.json (if present) */
42
+ packageJson: (Record<string, unknown> & {
43
+ dependencies?: Record<string, string>;
44
+ devDependencies?: Record<string, string>;
45
+ scripts?: Record<string, string>;
46
+ }) | null;
47
+ /** Lockfiles present */
48
+ lockfiles: string[];
49
+ }
50
+ /**
51
+ * The repository context — built once and shared by all analyzers.
52
+ *
53
+ * This avoids repeated filesystem traversals.
54
+ */
55
+ export interface RepositoryContext {
56
+ /** Absolute path to repository root */
57
+ root: string;
58
+ /** All discovered files (excluding ignored directories) */
59
+ files: FileEntry[];
60
+ /** Filenames at the repository root (for quick lookup) */
61
+ rootFilenames: string[];
62
+ /** Git context */
63
+ git: GitContext;
64
+ /** Detected ecosystems/languages */
65
+ languages: EcosystemDetection[];
66
+ /** Detected frameworks */
67
+ frameworks: FrameworkDetection[];
68
+ /** Detected package managers */
69
+ packageManagers: PackageManagerDetection[];
70
+ /** Project type */
71
+ projectType: ProjectTypeDetection;
72
+ /** Package manifests */
73
+ manifests: ManifestContext;
74
+ /** Additional ignore patterns from .fathom.json */
75
+ ignorePatterns: string[];
76
+ /** Optional online mode flag for analyzers requiring network opt-in */
77
+ online?: boolean;
78
+ /** Metadata */
79
+ metadata: {
80
+ /** ISO timestamp of when context was built */
81
+ scannedAt: string;
82
+ /** Total size of all indexed files in bytes */
83
+ totalSizeBytes: number;
84
+ };
85
+ }
86
+ /**
87
+ * Build the RepositoryContext by scanning the repository once.
88
+ */
89
+ export declare function buildRepositoryContext(root: string, additionalIgnorePatterns?: string[], online?: boolean): Promise<RepositoryContext>;
90
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAezE;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,QAAQ,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,MAAM,EAAE,OAAO,CAAC;IAChB,oCAAoC;IACpC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,uCAAuC;IACvC,WAAW,EACP,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC,GACF,IAAI,CAAC;IACT,wBAAwB;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB;IAClB,GAAG,EAAE,UAAU,CAAC;IAChB,oCAAoC;IACpC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,0BAA0B;IAC1B,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,gCAAgC;IAChC,eAAe,EAAE,uBAAuB,EAAE,CAAC;IAC3C,mBAAmB;IACnB,WAAW,EAAE,oBAAoB,CAAC;IAClC,wBAAwB;IACxB,SAAS,EAAE,eAAe,CAAC;IAC3B,mDAAmD;IACnD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe;IACf,QAAQ,EAAE;QACR,8CAA8C;QAC9C,SAAS,EAAE,MAAM,CAAC;QAClB,+CAA+C;QAC/C,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAkBD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,wBAAwB,GAAE,MAAM,EAAO,EACvC,MAAM,UAAQ,GACb,OAAO,CAAC,iBAAiB,CAAC,CAuJ5B"}
@@ -0,0 +1,159 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import fg from 'fast-glob';
4
+ import { IGNORE_GLOB_PATTERNS, isBinaryExtension, isSourceExtension, isConfigExtension, readJsonSafe, } from '../utils/filesystem.js';
5
+ import { detectLanguages } from '../detectors/language.js';
6
+ import { detectFrameworks } from '../detectors/framework.js';
7
+ import { detectPackageManagers, detectLockfiles } from '../detectors/package-manager.js';
8
+ import { detectProjectType } from '../detectors/project-type.js';
9
+ import { normalizeSlashes } from '../utils/paths.js';
10
+ import { isGitRepository } from '../utils/git.js';
11
+ /**
12
+ * Check whether a relative path looks like a test file.
13
+ */
14
+ function isTestFile(relativePath) {
15
+ const normalized = normalizeSlashes(relativePath).toLowerCase();
16
+ return (/\.(test|spec)\.(ts|tsx|js|jsx|mjs|py|rb|go|rs|java|cs)$/.test(normalized) ||
17
+ normalized.includes('__tests__/') ||
18
+ /\/tests?\//.test(normalized) ||
19
+ normalized.includes('/spec/') ||
20
+ normalized.endsWith('_test.go') ||
21
+ normalized.endsWith('_test.py') ||
22
+ normalized.endsWith('Test.java'));
23
+ }
24
+ /**
25
+ * Build the RepositoryContext by scanning the repository once.
26
+ */
27
+ export async function buildRepositoryContext(root, additionalIgnorePatterns = [], online = false) {
28
+ const absoluteRoot = path.resolve(root);
29
+ // Merge ignore patterns
30
+ const ignorePatterns = [...IGNORE_GLOB_PATTERNS, ...additionalIgnorePatterns];
31
+ // Discover all files
32
+ const rawPaths = await fg('**/*', {
33
+ cwd: absoluteRoot,
34
+ dot: true,
35
+ onlyFiles: true,
36
+ ignore: ignorePatterns,
37
+ followSymbolicLinks: false,
38
+ absolute: false,
39
+ suppressErrors: true,
40
+ });
41
+ // Build file entries
42
+ const files = [];
43
+ let totalSizeBytes = 0;
44
+ await Promise.all(rawPaths.map(async (relativePath) => {
45
+ try {
46
+ const absolutePath = path.join(absoluteRoot, relativePath);
47
+ const stat = await fs.stat(absolutePath);
48
+ if (!stat.isFile())
49
+ return;
50
+ const extension = path.extname(relativePath).toLowerCase();
51
+ const sizeBytes = stat.size;
52
+ totalSizeBytes += sizeBytes;
53
+ files.push({
54
+ absolutePath,
55
+ relativePath: normalizeSlashes(relativePath),
56
+ extension,
57
+ sizeBytes,
58
+ isBinary: isBinaryExtension(relativePath),
59
+ isSource: isSourceExtension(relativePath),
60
+ isTest: isTestFile(relativePath),
61
+ isConfig: isConfigExtension(relativePath),
62
+ });
63
+ }
64
+ catch {
65
+ return;
66
+ }
67
+ }));
68
+ // Sort for determinism
69
+ files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
70
+ // Root filenames for quick lookup
71
+ const rootFilenames = files
72
+ .filter((f) => !f.relativePath.includes('/'))
73
+ .map((f) => f.relativePath);
74
+ // Git context
75
+ const isRepo = await isGitRepository(absoluteRoot);
76
+ const gitignorePath = path.join(absoluteRoot, '.gitignore');
77
+ let gitignoreContent = null;
78
+ let hasGitignore = false;
79
+ try {
80
+ await fs.access(gitignorePath);
81
+ hasGitignore = true;
82
+ gitignoreContent = await fs.readFile(gitignorePath, 'utf8');
83
+ }
84
+ catch {
85
+ hasGitignore = false;
86
+ }
87
+ let hasCommits = false;
88
+ if (isRepo) {
89
+ const { hasCommits: checkCommits } = await import('../utils/git.js');
90
+ hasCommits = await checkCommits(absoluteRoot);
91
+ }
92
+ const git = {
93
+ isRepository: isRepo,
94
+ hasCommits,
95
+ hasGitignore,
96
+ gitignoreContent,
97
+ };
98
+ // Parse package.json if present
99
+ const packageJsonPath = path.join(absoluteRoot, 'package.json');
100
+ const packageJson = await readJsonSafe(packageJsonPath);
101
+ // Collect lockfiles
102
+ const lockfiles = detectLockfiles(rootFilenames);
103
+ // Load other manifests
104
+ const manifestFiles = {};
105
+ const manifestNames = ['pyproject.toml', 'Cargo.toml', 'go.mod', 'composer.json', 'pom.xml'];
106
+ for (const mf of manifestNames) {
107
+ if (rootFilenames.includes(mf)) {
108
+ const mfPath = path.join(absoluteRoot, mf);
109
+ // Just track that they exist; full parsing happens in individual analyzers
110
+ try {
111
+ await fs.access(mfPath);
112
+ manifestFiles[mf] = true;
113
+ }
114
+ catch {
115
+ continue;
116
+ }
117
+ }
118
+ }
119
+ const manifests = {
120
+ files: manifestFiles,
121
+ packageJson: packageJson,
122
+ lockfiles,
123
+ };
124
+ // Detectors
125
+ const allRelativePaths = files.map((f) => f.relativePath);
126
+ const languages = detectLanguages(rootFilenames, allRelativePaths);
127
+ const deps = Object.keys(packageJson?.['dependencies'] ?? {});
128
+ const devDeps = Object.keys(packageJson?.['devDependencies'] ?? {});
129
+ const frameworks = detectFrameworks({
130
+ dependencies: deps,
131
+ devDependencies: devDeps,
132
+ rootFiles: rootFilenames,
133
+ allFiles: allRelativePaths,
134
+ });
135
+ const packageManagers = detectPackageManagers(rootFilenames);
136
+ const projectType = detectProjectType({
137
+ rootFiles: rootFilenames,
138
+ allFiles: allRelativePaths,
139
+ packageJson: packageJson,
140
+ });
141
+ return {
142
+ root: absoluteRoot,
143
+ files,
144
+ rootFilenames,
145
+ git,
146
+ languages,
147
+ frameworks,
148
+ packageManagers,
149
+ projectType,
150
+ manifests,
151
+ ignorePatterns,
152
+ online,
153
+ metadata: {
154
+ scannedAt: new Date().toISOString(),
155
+ totalSizeBytes,
156
+ },
157
+ };
158
+ }
159
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Custom error types for Fathom.
3
+ */
4
+ /**
5
+ * Thrown when the CLI receives invalid arguments or options.
6
+ * Results in exit code 2.
7
+ */
8
+ export declare class FathomUsageError extends Error {
9
+ constructor(message: string);
10
+ }
11
+ /**
12
+ * Thrown when a repository cannot be accessed or read.
13
+ * Results in exit code 3.
14
+ */
15
+ export declare class FathomRepositoryError extends Error {
16
+ readonly path?: string | undefined;
17
+ constructor(message: string, path?: string | undefined);
18
+ }
19
+ /**
20
+ * Thrown when configuration is invalid.
21
+ * Results in exit code 2.
22
+ */
23
+ export declare class FathomConfigError extends Error {
24
+ readonly configPath?: string | undefined;
25
+ constructor(message: string, configPath?: string | undefined);
26
+ }
27
+ /**
28
+ * Thrown by an individual analyzer on failure.
29
+ * Caught by the orchestrator; never propagated to the top level.
30
+ */
31
+ export declare class AnalyzerError extends Error {
32
+ readonly analyzerId: string;
33
+ readonly cause?: unknown | undefined;
34
+ constructor(message: string, analyzerId: string, cause?: unknown | undefined);
35
+ }
36
+ /**
37
+ * Base error for baseline operations.
38
+ */
39
+ export declare class FathomBaselineError extends Error {
40
+ constructor(message: string);
41
+ }
42
+ /**
43
+ * Thrown when a requested baseline file does not exist.
44
+ * Results in exit code 2.
45
+ */
46
+ export declare class FathomBaselineMissingError extends FathomBaselineError {
47
+ readonly baselinePath: string;
48
+ constructor(baselinePath: string);
49
+ }
50
+ /**
51
+ * Thrown when a baseline file cannot be parsed or has an invalid schema.
52
+ * Results in exit code 2.
53
+ */
54
+ export declare class FathomBaselineCorruptError extends FathomBaselineError {
55
+ readonly baselinePath: string;
56
+ readonly reason: string;
57
+ constructor(baselinePath: string, reason: string);
58
+ }
59
+ /**
60
+ * Thrown when a Git diff operation fails or a base ref cannot be resolved.
61
+ * Results in exit code 2.
62
+ */
63
+ export declare class FathomGitDiffError extends Error {
64
+ constructor(message: string);
65
+ }
66
+ /**
67
+ * Thrown when a plugin is malformed, has colliding rules/analyzers, or fails validation.
68
+ * Results in exit code 2.
69
+ */
70
+ export declare class FathomPluginError extends Error {
71
+ readonly pluginName?: string | undefined;
72
+ constructor(message: string, pluginName?: string | undefined);
73
+ }
74
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,IAAI,CAAC,EAAE,MAAM;gBAD7B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,UAAU,CAAC,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA;CAKtC;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,KAAK;aAGpB,UAAU,EAAE,MAAM;aACT,KAAK,CAAC,EAAE,OAAO;gBAFxC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EACT,KAAK,CAAC,EAAE,OAAO,YAAA;CAK3C;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,qBAAa,0BAA2B,SAAQ,mBAAmB;aACrC,YAAY,EAAE,MAAM;gBAApB,YAAY,EAAE,MAAM;CAMjD;AAED;;;GAGG;AACH,qBAAa,0BAA2B,SAAQ,mBAAmB;aAE/C,YAAY,EAAE,MAAM;aACpB,MAAM,EAAE,MAAM;gBADd,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM;CAOjC;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,UAAU,CAAC,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA;CAKtC"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Custom error types for Fathom.
3
+ */
4
+ /**
5
+ * Thrown when the CLI receives invalid arguments or options.
6
+ * Results in exit code 2.
7
+ */
8
+ export class FathomUsageError extends Error {
9
+ constructor(message) {
10
+ super(message);
11
+ this.name = 'FathomUsageError';
12
+ }
13
+ }
14
+ /**
15
+ * Thrown when a repository cannot be accessed or read.
16
+ * Results in exit code 3.
17
+ */
18
+ export class FathomRepositoryError extends Error {
19
+ path;
20
+ constructor(message, path) {
21
+ super(message);
22
+ this.path = path;
23
+ this.name = 'FathomRepositoryError';
24
+ }
25
+ }
26
+ /**
27
+ * Thrown when configuration is invalid.
28
+ * Results in exit code 2.
29
+ */
30
+ export class FathomConfigError extends Error {
31
+ configPath;
32
+ constructor(message, configPath) {
33
+ super(message);
34
+ this.configPath = configPath;
35
+ this.name = 'FathomConfigError';
36
+ }
37
+ }
38
+ /**
39
+ * Thrown by an individual analyzer on failure.
40
+ * Caught by the orchestrator; never propagated to the top level.
41
+ */
42
+ export class AnalyzerError extends Error {
43
+ analyzerId;
44
+ cause;
45
+ constructor(message, analyzerId, cause) {
46
+ super(message);
47
+ this.analyzerId = analyzerId;
48
+ this.cause = cause;
49
+ this.name = 'AnalyzerError';
50
+ }
51
+ }
52
+ /**
53
+ * Base error for baseline operations.
54
+ */
55
+ export class FathomBaselineError extends Error {
56
+ constructor(message) {
57
+ super(message);
58
+ this.name = 'FathomBaselineError';
59
+ }
60
+ }
61
+ /**
62
+ * Thrown when a requested baseline file does not exist.
63
+ * Results in exit code 2.
64
+ */
65
+ export class FathomBaselineMissingError extends FathomBaselineError {
66
+ baselinePath;
67
+ constructor(baselinePath) {
68
+ super(`Baseline file not found at ${baselinePath}.\nRun "fathom --baseline" to create an initial baseline.`);
69
+ this.baselinePath = baselinePath;
70
+ this.name = 'FathomBaselineMissingError';
71
+ }
72
+ }
73
+ /**
74
+ * Thrown when a baseline file cannot be parsed or has an invalid schema.
75
+ * Results in exit code 2.
76
+ */
77
+ export class FathomBaselineCorruptError extends FathomBaselineError {
78
+ baselinePath;
79
+ reason;
80
+ constructor(baselinePath, reason) {
81
+ super(`Baseline file at ${baselinePath} is invalid or corrupted: ${reason}.\nRun "fathom --baseline" to regenerate the baseline.`);
82
+ this.baselinePath = baselinePath;
83
+ this.reason = reason;
84
+ this.name = 'FathomBaselineCorruptError';
85
+ }
86
+ }
87
+ /**
88
+ * Thrown when a Git diff operation fails or a base ref cannot be resolved.
89
+ * Results in exit code 2.
90
+ */
91
+ export class FathomGitDiffError extends Error {
92
+ constructor(message) {
93
+ super(message);
94
+ this.name = 'FathomGitDiffError';
95
+ }
96
+ }
97
+ /**
98
+ * Thrown when a plugin is malformed, has colliding rules/analyzers, or fails validation.
99
+ * Results in exit code 2.
100
+ */
101
+ export class FathomPluginError extends Error {
102
+ pluginName;
103
+ constructor(message, pluginName) {
104
+ super(message);
105
+ this.pluginName = pluginName;
106
+ this.name = 'FathomPluginError';
107
+ }
108
+ }
109
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAG5B;IAFlB,YACE,OAAe,EACC,IAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,SAAI,GAAJ,IAAI,CAAS;QAG7B,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAGxB;IAFlB,YACE,OAAe,EACC,UAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGpB;IACS;IAH3B,YACE,OAAe,EACC,UAAkB,EACT,KAAe;QAExC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,eAAU,GAAV,UAAU,CAAQ;QACT,UAAK,GAAL,KAAK,CAAU;QAGxC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,0BAA2B,SAAQ,mBAAmB;IACrC;IAA5B,YAA4B,YAAoB;QAC9C,KAAK,CACH,8BAA8B,YAAY,2DAA2D,CACtG,CAAC;QAHwB,iBAAY,GAAZ,YAAY,CAAQ;QAI9C,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,0BAA2B,SAAQ,mBAAmB;IAE/C;IACA;IAFlB,YACkB,YAAoB,EACpB,MAAc;QAE9B,KAAK,CACH,oBAAoB,YAAY,6BAA6B,MAAM,wDAAwD,CAC5H,CAAC;QALc,iBAAY,GAAZ,YAAY,CAAQ;QACpB,WAAM,GAAN,MAAM,CAAQ;QAK9B,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAGxB;IAFlB,YACE,OAAe,EACC,UAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,59 @@
1
+ import type { Category } from '../rules/categories.js';
2
+ import type { Severity } from '../rules/severity.js';
3
+ /**
4
+ * Location within the repository where a finding was detected.
5
+ */
6
+ export interface FindingLocation {
7
+ /** Repository-relative file path */
8
+ file?: string;
9
+ /** Line number (1-indexed) */
10
+ line?: number;
11
+ /** Column number (1-indexed) */
12
+ column?: number;
13
+ }
14
+ /**
15
+ * A single finding produced by an analyzer rule.
16
+ *
17
+ * Every field that might contain raw secrets MUST be omitted.
18
+ * Evidence must never contain the actual credential/secret value.
19
+ */
20
+ export interface Finding {
21
+ /** Stable, deterministic unique ID for this finding */
22
+ id: string;
23
+ /** Rule that produced this finding, e.g. "SEC-001" */
24
+ ruleId: string;
25
+ /** Analysis category */
26
+ category: Category;
27
+ /** Severity level */
28
+ severity: Severity;
29
+ /** Short title */
30
+ title: string;
31
+ /** Explanation of the issue */
32
+ description: string;
33
+ /** What the developer should do */
34
+ recommendation: string;
35
+ /** Confidence 0–1 (1 = fully deterministic) */
36
+ confidence: number;
37
+ /** Where the finding was detected */
38
+ location?: FindingLocation;
39
+ /** Non-sensitive context for the finding */
40
+ evidence?: string;
41
+ /** Whether Fathom can automatically fix this (reserved for future) */
42
+ autoFixable: boolean;
43
+ /** Optional links to external documentation */
44
+ references?: string[];
45
+ }
46
+ /**
47
+ * Create a stable deterministic finding ID from the rule, file, and line.
48
+ * This ensures repeated scans produce consistent IDs.
49
+ */
50
+ export declare function createFindingId(ruleId: string, file?: string, line?: number): string;
51
+ /**
52
+ * Sort findings by severity (critical first), then confidence (higher first).
53
+ */
54
+ export declare function sortFindings(findings: Finding[]): Finding[];
55
+ /**
56
+ * Deduplicate findings by their stable ID.
57
+ */
58
+ export declare function deduplicateFindings(findings: Finding[]): Finding[];
59
+ //# sourceMappingURL=findings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../src/core/findings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIrD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,qBAAqB;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,WAAW,EAAE,OAAO,CAAC;IACrB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAM3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAOlE"}
@@ -0,0 +1,34 @@
1
+ import { SEVERITY_ORDER } from '../rules/severity.js';
2
+ import crypto from 'node:crypto';
3
+ /**
4
+ * Create a stable deterministic finding ID from the rule, file, and line.
5
+ * This ensures repeated scans produce consistent IDs.
6
+ */
7
+ export function createFindingId(ruleId, file, line) {
8
+ const key = `${ruleId}:${file ?? ''}:${line ?? ''}`;
9
+ return crypto.createHash('sha256').update(key).digest('hex').slice(0, 12);
10
+ }
11
+ /**
12
+ * Sort findings by severity (critical first), then confidence (higher first).
13
+ */
14
+ export function sortFindings(findings) {
15
+ return [...findings].sort((a, b) => {
16
+ const severityDiff = SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity];
17
+ if (severityDiff !== 0)
18
+ return severityDiff;
19
+ return b.confidence - a.confidence;
20
+ });
21
+ }
22
+ /**
23
+ * Deduplicate findings by their stable ID.
24
+ */
25
+ export function deduplicateFindings(findings) {
26
+ const seen = new Set();
27
+ return findings.filter((f) => {
28
+ if (seen.has(f.id))
29
+ return false;
30
+ seen.add(f.id);
31
+ return true;
32
+ });
33
+ }
34
+ //# sourceMappingURL=findings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.js","sourceRoot":"","sources":["../../src/core/findings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,MAAM,MAAM,aAAa,CAAC;AA+CjC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,IAAa,EAAE,IAAa;IAC1E,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;IACpD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAmB;IAC9C,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7E,IAAI,YAAY,KAAK,CAAC;YAAE,OAAO,YAAY,CAAC;QAC5C,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAmB;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}