@grafema/core 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +76 -0
  3. package/dist/Orchestrator.d.ts +142 -0
  4. package/dist/Orchestrator.d.ts.map +1 -0
  5. package/dist/Orchestrator.js +481 -0
  6. package/dist/api/GraphAPI.d.ts +87 -0
  7. package/dist/api/GraphAPI.d.ts.map +1 -0
  8. package/dist/api/GraphAPI.js +210 -0
  9. package/dist/api/GuaranteeAPI.d.ts +147 -0
  10. package/dist/api/GuaranteeAPI.d.ts.map +1 -0
  11. package/dist/api/GuaranteeAPI.js +288 -0
  12. package/dist/core/ASTWorker.d.ts +133 -0
  13. package/dist/core/ASTWorker.d.ts.map +1 -0
  14. package/dist/core/ASTWorker.js +352 -0
  15. package/dist/core/ASTWorkerPool.d.ts +85 -0
  16. package/dist/core/ASTWorkerPool.d.ts.map +1 -0
  17. package/dist/core/ASTWorkerPool.js +207 -0
  18. package/dist/core/AnalysisQueue.d.ts +104 -0
  19. package/dist/core/AnalysisQueue.d.ts.map +1 -0
  20. package/dist/core/AnalysisQueue.js +299 -0
  21. package/dist/core/AnalysisWorker.d.ts +14 -0
  22. package/dist/core/AnalysisWorker.d.ts.map +1 -0
  23. package/dist/core/AnalysisWorker.js +307 -0
  24. package/dist/core/GraphBackend.d.ts +156 -0
  25. package/dist/core/GraphBackend.d.ts.map +1 -0
  26. package/dist/core/GraphBackend.js +85 -0
  27. package/dist/core/GuaranteeManager.d.ts +230 -0
  28. package/dist/core/GuaranteeManager.d.ts.map +1 -0
  29. package/dist/core/GuaranteeManager.js +352 -0
  30. package/dist/core/ManifestStore.d.ts +71 -0
  31. package/dist/core/ManifestStore.d.ts.map +1 -0
  32. package/dist/core/ManifestStore.js +146 -0
  33. package/dist/core/NodeFactory.d.ts +160 -0
  34. package/dist/core/NodeFactory.d.ts.map +1 -0
  35. package/dist/core/NodeFactory.js +137 -0
  36. package/dist/core/NodeId.d.ts +88 -0
  37. package/dist/core/NodeId.d.ts.map +1 -0
  38. package/dist/core/NodeId.js +170 -0
  39. package/dist/core/ParallelAnalyzer.d.ts +120 -0
  40. package/dist/core/ParallelAnalyzer.d.ts.map +1 -0
  41. package/dist/core/ParallelAnalyzer.js +331 -0
  42. package/dist/core/PriorityQueue.d.ts +106 -0
  43. package/dist/core/PriorityQueue.d.ts.map +1 -0
  44. package/dist/core/PriorityQueue.js +168 -0
  45. package/dist/core/Profiler.d.ts +75 -0
  46. package/dist/core/Profiler.d.ts.map +1 -0
  47. package/dist/core/Profiler.js +149 -0
  48. package/dist/core/QueueWorker.d.ts +12 -0
  49. package/dist/core/QueueWorker.d.ts.map +1 -0
  50. package/dist/core/QueueWorker.js +567 -0
  51. package/dist/core/RFDBClient.d.ts +179 -0
  52. package/dist/core/RFDBClient.d.ts.map +1 -0
  53. package/dist/core/RFDBClient.js +429 -0
  54. package/dist/core/Task.d.ts +56 -0
  55. package/dist/core/Task.d.ts.map +1 -0
  56. package/dist/core/Task.js +85 -0
  57. package/dist/core/TaskTypes.d.ts +20 -0
  58. package/dist/core/TaskTypes.d.ts.map +1 -0
  59. package/dist/core/TaskTypes.js +10 -0
  60. package/dist/core/VersionManager.d.ts +166 -0
  61. package/dist/core/VersionManager.d.ts.map +1 -0
  62. package/dist/core/VersionManager.js +237 -0
  63. package/dist/core/WorkerPool.d.ts +82 -0
  64. package/dist/core/WorkerPool.d.ts.map +1 -0
  65. package/dist/core/WorkerPool.js +109 -0
  66. package/dist/core/nodes/CallSiteNode.d.ts +26 -0
  67. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -0
  68. package/dist/core/nodes/CallSiteNode.js +44 -0
  69. package/dist/core/nodes/ClassNode.d.ts +25 -0
  70. package/dist/core/nodes/ClassNode.d.ts.map +1 -0
  71. package/dist/core/nodes/ClassNode.js +40 -0
  72. package/dist/core/nodes/ConstantNode.d.ts +24 -0
  73. package/dist/core/nodes/ConstantNode.d.ts.map +1 -0
  74. package/dist/core/nodes/ConstantNode.js +39 -0
  75. package/dist/core/nodes/DatabaseQueryNode.d.ts +22 -0
  76. package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -0
  77. package/dist/core/nodes/DatabaseQueryNode.js +37 -0
  78. package/dist/core/nodes/EntrypointNode.d.ts +102 -0
  79. package/dist/core/nodes/EntrypointNode.d.ts.map +1 -0
  80. package/dist/core/nodes/EntrypointNode.js +119 -0
  81. package/dist/core/nodes/EventListenerNode.d.ts +25 -0
  82. package/dist/core/nodes/EventListenerNode.d.ts.map +1 -0
  83. package/dist/core/nodes/EventListenerNode.js +39 -0
  84. package/dist/core/nodes/ExportNode.d.ts +26 -0
  85. package/dist/core/nodes/ExportNode.d.ts.map +1 -0
  86. package/dist/core/nodes/ExportNode.js +40 -0
  87. package/dist/core/nodes/ExternalStdioNode.d.ts +17 -0
  88. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -0
  89. package/dist/core/nodes/ExternalStdioNode.js +26 -0
  90. package/dist/core/nodes/FunctionNode.d.ts +27 -0
  91. package/dist/core/nodes/FunctionNode.d.ts.map +1 -0
  92. package/dist/core/nodes/FunctionNode.js +53 -0
  93. package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
  94. package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
  95. package/dist/core/nodes/GuaranteeNode.js +117 -0
  96. package/dist/core/nodes/HttpRequestNode.d.ts +24 -0
  97. package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -0
  98. package/dist/core/nodes/HttpRequestNode.js +38 -0
  99. package/dist/core/nodes/ImportNode.d.ts +27 -0
  100. package/dist/core/nodes/ImportNode.d.ts.map +1 -0
  101. package/dist/core/nodes/ImportNode.js +43 -0
  102. package/dist/core/nodes/LiteralNode.d.ts +26 -0
  103. package/dist/core/nodes/LiteralNode.d.ts.map +1 -0
  104. package/dist/core/nodes/LiteralNode.js +40 -0
  105. package/dist/core/nodes/MethodCallNode.d.ts +29 -0
  106. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -0
  107. package/dist/core/nodes/MethodCallNode.js +47 -0
  108. package/dist/core/nodes/MethodNode.d.ts +29 -0
  109. package/dist/core/nodes/MethodNode.d.ts.map +1 -0
  110. package/dist/core/nodes/MethodNode.js +44 -0
  111. package/dist/core/nodes/ModuleNode.d.ts +29 -0
  112. package/dist/core/nodes/ModuleNode.d.ts.map +1 -0
  113. package/dist/core/nodes/ModuleNode.js +49 -0
  114. package/dist/core/nodes/NodeKind.d.ts +91 -0
  115. package/dist/core/nodes/NodeKind.d.ts.map +1 -0
  116. package/dist/core/nodes/NodeKind.js +146 -0
  117. package/dist/core/nodes/ParameterNode.d.ts +26 -0
  118. package/dist/core/nodes/ParameterNode.d.ts.map +1 -0
  119. package/dist/core/nodes/ParameterNode.js +43 -0
  120. package/dist/core/nodes/ScopeNode.d.ts +32 -0
  121. package/dist/core/nodes/ScopeNode.d.ts.map +1 -0
  122. package/dist/core/nodes/ScopeNode.js +47 -0
  123. package/dist/core/nodes/ServiceNode.d.ts +44 -0
  124. package/dist/core/nodes/ServiceNode.d.ts.map +1 -0
  125. package/dist/core/nodes/ServiceNode.js +49 -0
  126. package/dist/core/nodes/VariableDeclarationNode.d.ts +22 -0
  127. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -0
  128. package/dist/core/nodes/VariableDeclarationNode.js +38 -0
  129. package/dist/core/nodes/index.d.ts +25 -0
  130. package/dist/core/nodes/index.d.ts.map +1 -0
  131. package/dist/core/nodes/index.js +30 -0
  132. package/dist/index.d.ts +57 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +63 -0
  135. package/dist/plugins/Plugin.d.ts +44 -0
  136. package/dist/plugins/Plugin.d.ts.map +1 -0
  137. package/dist/plugins/Plugin.js +46 -0
  138. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts +23 -0
  139. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -0
  140. package/dist/plugins/analysis/DatabaseAnalyzer.js +260 -0
  141. package/dist/plugins/analysis/ExpressAnalyzer.d.ts +19 -0
  142. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -0
  143. package/dist/plugins/analysis/ExpressAnalyzer.js +306 -0
  144. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts +17 -0
  145. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -0
  146. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +308 -0
  147. package/dist/plugins/analysis/FetchAnalyzer.d.ts +38 -0
  148. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -0
  149. package/dist/plugins/analysis/FetchAnalyzer.js +344 -0
  150. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +65 -0
  151. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -0
  152. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +472 -0
  153. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +84 -0
  154. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -0
  155. package/dist/plugins/analysis/JSASTAnalyzer.js +1378 -0
  156. package/dist/plugins/analysis/ReactAnalyzer.d.ts +90 -0
  157. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -0
  158. package/dist/plugins/analysis/ReactAnalyzer.js +1153 -0
  159. package/dist/plugins/analysis/RustAnalyzer.d.ts +13 -0
  160. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -0
  161. package/dist/plugins/analysis/RustAnalyzer.js +259 -0
  162. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts +21 -0
  163. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -0
  164. package/dist/plugins/analysis/SQLiteAnalyzer.js +317 -0
  165. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts +35 -0
  166. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -0
  167. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +303 -0
  168. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +33 -0
  169. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -0
  170. package/dist/plugins/analysis/SocketIOAnalyzer.js +283 -0
  171. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts +27 -0
  172. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -0
  173. package/dist/plugins/analysis/SystemDbAnalyzer.js +211 -0
  174. package/dist/plugins/analysis/ast/ConditionParser.d.ts +85 -0
  175. package/dist/plugins/analysis/ast/ConditionParser.d.ts.map +1 -0
  176. package/dist/plugins/analysis/ast/ConditionParser.js +277 -0
  177. package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts +15 -0
  178. package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts.map +1 -0
  179. package/dist/plugins/analysis/ast/ExpressionEvaluator.js +91 -0
  180. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +77 -0
  181. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -0
  182. package/dist/plugins/analysis/ast/GraphBuilder.js +1077 -0
  183. package/dist/plugins/analysis/ast/OxcAdapter.d.ts +41 -0
  184. package/dist/plugins/analysis/ast/OxcAdapter.d.ts.map +1 -0
  185. package/dist/plugins/analysis/ast/OxcAdapter.js +40 -0
  186. package/dist/plugins/analysis/ast/types.d.ts +346 -0
  187. package/dist/plugins/analysis/ast/types.d.ts.map +1 -0
  188. package/dist/plugins/analysis/ast/types.js +4 -0
  189. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +93 -0
  190. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -0
  191. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +24 -0
  192. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +77 -0
  193. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -0
  194. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +377 -0
  195. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +27 -0
  196. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -0
  197. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +232 -0
  198. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +25 -0
  199. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -0
  200. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +172 -0
  201. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +29 -0
  202. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -0
  203. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +180 -0
  204. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +14 -0
  205. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -0
  206. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +200 -0
  207. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +45 -0
  208. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -0
  209. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +150 -0
  210. package/dist/plugins/analysis/ast/visitors/index.d.ts +17 -0
  211. package/dist/plugins/analysis/ast/visitors/index.d.ts.map +1 -0
  212. package/dist/plugins/analysis/ast/visitors/index.js +13 -0
  213. package/dist/plugins/discovery/DiscoveryPlugin.d.ts +34 -0
  214. package/dist/plugins/discovery/DiscoveryPlugin.d.ts.map +1 -0
  215. package/dist/plugins/discovery/DiscoveryPlugin.js +26 -0
  216. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts +26 -0
  217. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -0
  218. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +79 -0
  219. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts +14 -0
  220. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -0
  221. package/dist/plugins/discovery/SimpleProjectDiscovery.js +65 -0
  222. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +19 -0
  223. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +1 -0
  224. package/dist/plugins/discovery/ZonServiceDiscovery.js +204 -0
  225. package/dist/plugins/enrichment/AliasTracker.d.ts +40 -0
  226. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -0
  227. package/dist/plugins/enrichment/AliasTracker.js +290 -0
  228. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +30 -0
  229. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -0
  230. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +135 -0
  231. package/dist/plugins/enrichment/ImportExportLinker.d.ts +30 -0
  232. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -0
  233. package/dist/plugins/enrichment/ImportExportLinker.js +176 -0
  234. package/dist/plugins/enrichment/InstanceOfResolver.d.ts +21 -0
  235. package/dist/plugins/enrichment/InstanceOfResolver.d.ts.map +1 -0
  236. package/dist/plugins/enrichment/InstanceOfResolver.js +117 -0
  237. package/dist/plugins/enrichment/MethodCallResolver.d.ts +41 -0
  238. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -0
  239. package/dist/plugins/enrichment/MethodCallResolver.js +252 -0
  240. package/dist/plugins/enrichment/MountPointResolver.d.ts +26 -0
  241. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -0
  242. package/dist/plugins/enrichment/MountPointResolver.js +189 -0
  243. package/dist/plugins/enrichment/PrefixEvaluator.d.ts +89 -0
  244. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -0
  245. package/dist/plugins/enrichment/PrefixEvaluator.js +415 -0
  246. package/dist/plugins/enrichment/RustFFIEnricher.d.ts +25 -0
  247. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -0
  248. package/dist/plugins/enrichment/RustFFIEnricher.js +170 -0
  249. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +114 -0
  250. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -0
  251. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +464 -0
  252. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts +27 -0
  253. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -0
  254. package/dist/plugins/indexing/IncrementalModuleIndexer.js +238 -0
  255. package/dist/plugins/indexing/JSModuleIndexer.d.ts +33 -0
  256. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -0
  257. package/dist/plugins/indexing/JSModuleIndexer.js +299 -0
  258. package/dist/plugins/indexing/RustModuleIndexer.d.ts +28 -0
  259. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -0
  260. package/dist/plugins/indexing/RustModuleIndexer.js +140 -0
  261. package/dist/plugins/indexing/ServiceDetector.d.ts +46 -0
  262. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -0
  263. package/dist/plugins/indexing/ServiceDetector.js +164 -0
  264. package/dist/plugins/validation/CallResolverValidator.d.ts +23 -0
  265. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -0
  266. package/dist/plugins/validation/CallResolverValidator.js +108 -0
  267. package/dist/plugins/validation/DataFlowValidator.d.ts +24 -0
  268. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -0
  269. package/dist/plugins/validation/DataFlowValidator.js +148 -0
  270. package/dist/plugins/validation/EvalBanValidator.d.ts +25 -0
  271. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -0
  272. package/dist/plugins/validation/EvalBanValidator.js +123 -0
  273. package/dist/plugins/validation/GraphConnectivityValidator.d.ts +11 -0
  274. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -0
  275. package/dist/plugins/validation/GraphConnectivityValidator.js +135 -0
  276. package/dist/plugins/validation/SQLInjectionValidator.d.ts +43 -0
  277. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -0
  278. package/dist/plugins/validation/SQLInjectionValidator.js +251 -0
  279. package/dist/plugins/validation/ShadowingDetector.d.ts +26 -0
  280. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -0
  281. package/dist/plugins/validation/ShadowingDetector.js +119 -0
  282. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts +21 -0
  283. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -0
  284. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +151 -0
  285. package/dist/plugins/vcs/GitPlugin.d.ts +84 -0
  286. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -0
  287. package/dist/plugins/vcs/GitPlugin.js +295 -0
  288. package/dist/plugins/vcs/VCSPlugin.d.ts +133 -0
  289. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -0
  290. package/dist/plugins/vcs/VCSPlugin.js +82 -0
  291. package/dist/plugins/vcs/index.d.ts +10 -0
  292. package/dist/plugins/vcs/index.d.ts.map +1 -0
  293. package/dist/plugins/vcs/index.js +18 -0
  294. package/dist/storage/backends/RFDBServerBackend.d.ts +258 -0
  295. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
  296. package/dist/storage/backends/RFDBServerBackend.js +565 -0
  297. package/dist/storage/backends/typeValidation.d.ts +47 -0
  298. package/dist/storage/backends/typeValidation.d.ts.map +1 -0
  299. package/dist/storage/backends/typeValidation.js +137 -0
  300. package/dist/validation/PathValidator.d.ts +81 -0
  301. package/dist/validation/PathValidator.d.ts.map +1 -0
  302. package/dist/validation/PathValidator.js +251 -0
  303. package/package.json +57 -0
  304. package/src/.rfguard/current-session.txt +1 -0
  305. package/src/Orchestrator.ts +673 -0
  306. package/src/api/GraphAPI.ts +305 -0
  307. package/src/api/GuaranteeAPI.ts +401 -0
  308. package/src/core/ASTWorker.ts +567 -0
  309. package/src/core/ASTWorkerPool.ts +299 -0
  310. package/src/core/AnalysisQueue.ts +447 -0
  311. package/src/core/AnalysisWorker.ts +410 -0
  312. package/src/core/GraphBackend.ts +265 -0
  313. package/src/core/GuaranteeManager.ts +581 -0
  314. package/src/core/ManifestStore.ts +196 -0
  315. package/src/core/NodeFactory.ts +274 -0
  316. package/src/core/NodeId.ts +257 -0
  317. package/src/core/ParallelAnalyzer.ts +476 -0
  318. package/src/core/PriorityQueue.ts +227 -0
  319. package/src/core/Profiler.ts +188 -0
  320. package/src/core/QueueWorker.ts +780 -0
  321. package/src/core/Task.ts +107 -0
  322. package/src/core/TaskTypes.ts +40 -0
  323. package/src/core/VersionManager.ts +404 -0
  324. package/src/core/WorkerPool.ts +180 -0
  325. package/src/core/nodes/CallSiteNode.ts +72 -0
  326. package/src/core/nodes/ClassNode.ts +69 -0
  327. package/src/core/nodes/ConstantNode.ts +63 -0
  328. package/src/core/nodes/DatabaseQueryNode.ts +60 -0
  329. package/src/core/nodes/EntrypointNode.ts +164 -0
  330. package/src/core/nodes/EventListenerNode.ts +64 -0
  331. package/src/core/nodes/ExportNode.ts +71 -0
  332. package/src/core/nodes/ExternalStdioNode.ts +36 -0
  333. package/src/core/nodes/FunctionNode.ts +78 -0
  334. package/src/core/nodes/GuaranteeNode.ts +162 -0
  335. package/src/core/nodes/HttpRequestNode.ts +63 -0
  336. package/src/core/nodes/ImportNode.ts +75 -0
  337. package/src/core/nodes/LiteralNode.ts +67 -0
  338. package/src/core/nodes/MethodCallNode.ts +79 -0
  339. package/src/core/nodes/MethodNode.ts +78 -0
  340. package/src/core/nodes/ModuleNode.ts +74 -0
  341. package/src/core/nodes/NodeKind.ts +171 -0
  342. package/src/core/nodes/ParameterNode.ts +73 -0
  343. package/src/core/nodes/ScopeNode.ts +80 -0
  344. package/src/core/nodes/ServiceNode.ts +86 -0
  345. package/src/core/nodes/VariableDeclarationNode.ts +60 -0
  346. package/src/core/nodes/index.ts +49 -0
  347. package/src/index.ts +93 -0
  348. package/src/plugins/Plugin.ts +74 -0
  349. package/src/plugins/analysis/DatabaseAnalyzer.ts +322 -0
  350. package/src/plugins/analysis/ExpressAnalyzer.ts +401 -0
  351. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +414 -0
  352. package/src/plugins/analysis/FetchAnalyzer.ts +441 -0
  353. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +686 -0
  354. package/src/plugins/analysis/JSASTAnalyzer.ts +1680 -0
  355. package/src/plugins/analysis/ReactAnalyzer.ts +1368 -0
  356. package/src/plugins/analysis/RustAnalyzer.ts +438 -0
  357. package/src/plugins/analysis/SQLiteAnalyzer.ts +388 -0
  358. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +429 -0
  359. package/src/plugins/analysis/SocketIOAnalyzer.ts +395 -0
  360. package/src/plugins/analysis/SystemDbAnalyzer.ts +284 -0
  361. package/src/plugins/analysis/ast/ConditionParser.ts +333 -0
  362. package/src/plugins/analysis/ast/ExpressionEvaluator.ts +117 -0
  363. package/src/plugins/analysis/ast/GraphBuilder.ts +1371 -0
  364. package/src/plugins/analysis/ast/OxcAdapter.ts +63 -0
  365. package/src/plugins/analysis/ast/types.ts +400 -0
  366. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +137 -0
  367. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +528 -0
  368. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +339 -0
  369. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +273 -0
  370. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +259 -0
  371. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +235 -0
  372. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +268 -0
  373. package/src/plugins/analysis/ast/visitors/index.ts +36 -0
  374. package/src/plugins/discovery/DiscoveryPlugin.ts +50 -0
  375. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +117 -0
  376. package/src/plugins/discovery/SimpleProjectDiscovery.ts +102 -0
  377. package/src/plugins/enrichment/AliasTracker.ts +399 -0
  378. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +192 -0
  379. package/src/plugins/enrichment/ImportExportLinker.ts +221 -0
  380. package/src/plugins/enrichment/InstanceOfResolver.ts +165 -0
  381. package/src/plugins/enrichment/MethodCallResolver.ts +333 -0
  382. package/src/plugins/enrichment/MountPointResolver.ts +264 -0
  383. package/src/plugins/enrichment/PrefixEvaluator.ts +527 -0
  384. package/src/plugins/enrichment/RustFFIEnricher.ts +218 -0
  385. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +682 -0
  386. package/src/plugins/indexing/IncrementalModuleIndexer.ts +287 -0
  387. package/src/plugins/indexing/JSModuleIndexer.ts +374 -0
  388. package/src/plugins/indexing/RustModuleIndexer.ts +160 -0
  389. package/src/plugins/indexing/ServiceDetector.ts +230 -0
  390. package/src/plugins/validation/CallResolverValidator.ts +170 -0
  391. package/src/plugins/validation/DataFlowValidator.ts +233 -0
  392. package/src/plugins/validation/EvalBanValidator.ts +175 -0
  393. package/src/plugins/validation/GraphConnectivityValidator.ts +201 -0
  394. package/src/plugins/validation/SQLInjectionValidator.ts +363 -0
  395. package/src/plugins/validation/ShadowingDetector.ts +173 -0
  396. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +203 -0
  397. package/src/plugins/vcs/GitPlugin.ts +344 -0
  398. package/src/plugins/vcs/VCSPlugin.ts +190 -0
  399. package/src/plugins/vcs/index.ts +32 -0
  400. package/src/storage/backends/RFDBServerBackend.ts +687 -0
  401. package/src/storage/backends/typeValidation.ts +151 -0
  402. package/src/validation/PathValidator.ts +342 -0
@@ -0,0 +1,203 @@
1
+ /**
2
+ * TypeScriptDeadCodeValidator - detects unused TypeScript constructs
3
+ *
4
+ * Checks:
5
+ * - Unused interfaces (no IMPLEMENTS edges)
6
+ * - Empty interfaces (no properties)
7
+ * - Interfaces with single implementation (possible over-engineering)
8
+ * - Unused enums (no references) - requires USES_TYPE edges
9
+ * - Unused type aliases (no references) - requires USES_TYPE edges
10
+ *
11
+ * NOTE: Full "unused type" detection requires USES_TYPE edges which track
12
+ * where types are used in function parameters, return types, and variables.
13
+ * Currently we can only detect interfaces without implementations.
14
+ */
15
+
16
+ import { Plugin, createSuccessResult } from '../Plugin.js';
17
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
18
+
19
+ /**
20
+ * Dead code issue
21
+ */
22
+ interface DeadCodeIssue {
23
+ type: 'UNUSED_INTERFACE' | 'EMPTY_INTERFACE' | 'SINGLE_IMPLEMENTATION' | 'UNUSED_ENUM' | 'UNUSED_TYPE';
24
+ severity: 'WARNING' | 'INFO';
25
+ message: string;
26
+ nodeId: string;
27
+ name: string;
28
+ file?: string;
29
+ line?: number;
30
+ }
31
+
32
+ /**
33
+ * Validation summary
34
+ */
35
+ interface ValidationSummary {
36
+ totalInterfaces: number;
37
+ unusedInterfaces: number;
38
+ emptyInterfaces: number;
39
+ singleImplInterfaces: number;
40
+ totalEnums: number;
41
+ totalTypes: number;
42
+ timeSeconds: string;
43
+ }
44
+
45
+ export class TypeScriptDeadCodeValidator extends Plugin {
46
+ get metadata(): PluginMetadata {
47
+ return {
48
+ name: 'TypeScriptDeadCodeValidator',
49
+ phase: 'VALIDATION',
50
+ priority: 50, // Lower priority - runs after other validators
51
+ creates: {
52
+ nodes: [],
53
+ edges: []
54
+ },
55
+ dependencies: ['JSASTAnalyzer'] // Requires TypeScript nodes to be created
56
+ };
57
+ }
58
+
59
+ async execute(context: PluginContext): Promise<PluginResult> {
60
+ const { graph } = context;
61
+
62
+ console.log('[TypeScriptDeadCodeValidator] Checking for dead TypeScript code...');
63
+ const startTime = Date.now();
64
+
65
+ const issues: DeadCodeIssue[] = [];
66
+
67
+ // Collect all interfaces
68
+ console.log('[TypeScriptDeadCodeValidator] Collecting interfaces...');
69
+ const interfaces: Map<string, { id: string; name: string; file?: string; line?: number; properties?: unknown[] }> = new Map();
70
+
71
+ for await (const node of graph.queryNodes({ nodeType: 'INTERFACE' })) {
72
+ // Skip external/reference interfaces
73
+ if ((node as { isExternal?: boolean }).isExternal) continue;
74
+
75
+ interfaces.set(node.id, {
76
+ id: node.id,
77
+ name: node.name as string,
78
+ file: node.file,
79
+ line: node.line as number | undefined,
80
+ properties: (node as { properties?: unknown[] }).properties
81
+ });
82
+ }
83
+ console.log(`[TypeScriptDeadCodeValidator] Found ${interfaces.size} interfaces`);
84
+
85
+ // Find interfaces with IMPLEMENTS or EXTENDS edges
86
+ console.log('[TypeScriptDeadCodeValidator] Checking implementations...');
87
+ const implementedInterfaces: Map<string, number> = new Map();
88
+
89
+ // Get all edges and filter by type (no queryEdges in GraphBackend yet)
90
+ const allEdges = await graph.getAllEdges?.() ?? [];
91
+ for (const edge of allEdges) {
92
+ if (edge.type === 'IMPLEMENTS' || edge.type === 'EXTENDS') {
93
+ const count = implementedInterfaces.get(edge.dst) || 0;
94
+ implementedInterfaces.set(edge.dst, count + 1);
95
+ }
96
+ }
97
+
98
+ // Analyze interfaces
99
+ let unusedCount = 0;
100
+ let emptyCount = 0;
101
+ let singleImplCount = 0;
102
+
103
+ for (const [id, iface] of interfaces) {
104
+ const implCount = implementedInterfaces.get(id) || 0;
105
+ const properties = iface.properties || [];
106
+
107
+ // Check for empty interface
108
+ if (properties.length === 0) {
109
+ emptyCount++;
110
+ issues.push({
111
+ type: 'EMPTY_INTERFACE',
112
+ severity: 'INFO',
113
+ message: `Empty interface '${iface.name}' at ${iface.file}:${iface.line || '?'} - consider using type alias or removing`,
114
+ nodeId: id,
115
+ name: iface.name,
116
+ file: iface.file,
117
+ line: iface.line
118
+ });
119
+ }
120
+
121
+ // Check for unused interface (no implementations)
122
+ if (implCount === 0) {
123
+ unusedCount++;
124
+ issues.push({
125
+ type: 'UNUSED_INTERFACE',
126
+ severity: 'WARNING',
127
+ message: `Interface '${iface.name}' at ${iface.file}:${iface.line || '?'} has no implementations`,
128
+ nodeId: id,
129
+ name: iface.name,
130
+ file: iface.file,
131
+ line: iface.line
132
+ });
133
+ }
134
+ // Check for single implementation (possible over-engineering)
135
+ else if (implCount === 1) {
136
+ singleImplCount++;
137
+ issues.push({
138
+ type: 'SINGLE_IMPLEMENTATION',
139
+ severity: 'INFO',
140
+ message: `Interface '${iface.name}' at ${iface.file}:${iface.line || '?'} has only one implementation - may be over-engineering`,
141
+ nodeId: id,
142
+ name: iface.name,
143
+ file: iface.file,
144
+ line: iface.line
145
+ });
146
+ }
147
+ }
148
+
149
+ // Count enums and types (for summary, full analysis requires USES_TYPE)
150
+ let enumCount = 0;
151
+ for await (const _node of graph.queryNodes({ nodeType: 'ENUM' })) {
152
+ enumCount++;
153
+ }
154
+
155
+ let typeCount = 0;
156
+ for await (const _node of graph.queryNodes({ nodeType: 'TYPE' })) {
157
+ typeCount++;
158
+ }
159
+
160
+ const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);
161
+ const summary: ValidationSummary = {
162
+ totalInterfaces: interfaces.size,
163
+ unusedInterfaces: unusedCount,
164
+ emptyInterfaces: emptyCount,
165
+ singleImplInterfaces: singleImplCount,
166
+ totalEnums: enumCount,
167
+ totalTypes: typeCount,
168
+ timeSeconds: totalTime
169
+ };
170
+
171
+ console.log('[TypeScriptDeadCodeValidator] Summary:', summary);
172
+
173
+ // Report issues
174
+ const warnings = issues.filter(i => i.severity === 'WARNING');
175
+ const infos = issues.filter(i => i.severity === 'INFO');
176
+
177
+ if (warnings.length > 0) {
178
+ console.log(`[TypeScriptDeadCodeValidator] ⚠️ ${warnings.length} warning(s):`);
179
+ for (const issue of warnings) {
180
+ console.log(` ⚠️ ${issue.message}`);
181
+ }
182
+ }
183
+
184
+ if (infos.length > 0) {
185
+ console.log(`[TypeScriptDeadCodeValidator] ℹ️ ${infos.length} info(s):`);
186
+ for (const issue of infos.slice(0, 5)) { // Limit to first 5
187
+ console.log(` ℹ️ ${issue.message}`);
188
+ }
189
+ if (infos.length > 5) {
190
+ console.log(` ... and ${infos.length - 5} more`);
191
+ }
192
+ }
193
+
194
+ if (issues.length === 0) {
195
+ console.log('[TypeScriptDeadCodeValidator] ✅ No dead TypeScript code detected');
196
+ }
197
+
198
+ return createSuccessResult(
199
+ { nodes: 0, edges: 0 },
200
+ { summary, issues }
201
+ );
202
+ }
203
+ }
@@ -0,0 +1,344 @@
1
+ /**
2
+ * Git VCS Plugin
3
+ *
4
+ * Плагин для работы с Git репозиториями
5
+ * Обнаруживает изменённые файлы и предоставляет их содержимое
6
+ */
7
+
8
+ import { VCSPlugin, FileStatus } from './VCSPlugin.js';
9
+ import type { VCSConfig, VCSPluginMetadata, ChangedFile, FileDiff, DiffHunk } from './VCSPlugin.js';
10
+ import { exec } from 'child_process';
11
+ import { promisify } from 'util';
12
+ import { join } from 'path';
13
+ import { existsSync } from 'fs';
14
+ import { readFile } from 'fs/promises';
15
+ import { createHash } from 'crypto';
16
+
17
+ const execAsync = promisify(exec);
18
+
19
+ /**
20
+ * Commit info
21
+ */
22
+ export interface CommitInfo {
23
+ hash: string;
24
+ author: string;
25
+ email: string;
26
+ timestamp: number;
27
+ message: string;
28
+ }
29
+
30
+ export class GitPlugin extends VCSPlugin {
31
+ private gitDir: string;
32
+
33
+ constructor(config: VCSConfig = {}) {
34
+ super(config);
35
+ this.gitDir = join(this.rootPath, '.git');
36
+ }
37
+
38
+ get metadata(): VCSPluginMetadata {
39
+ return {
40
+ name: 'git',
41
+ type: 'vcs',
42
+ supported: existsSync(this.gitDir)
43
+ };
44
+ }
45
+
46
+ /**
47
+ * Проверить доступность Git
48
+ */
49
+ async isAvailable(): Promise<boolean> {
50
+ try {
51
+ // Проверяем существование .git директории
52
+ if (!existsSync(this.gitDir)) {
53
+ return false;
54
+ }
55
+
56
+ // Проверяем работу git команды
57
+ const { stdout } = await this._exec('git rev-parse --git-dir');
58
+ return stdout.trim().length > 0;
59
+ } catch {
60
+ return false;
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Получить список изменённых файлов
66
+ */
67
+ async getChangedFiles(): Promise<ChangedFile[]> {
68
+ try {
69
+ // Получаем список файлов через git status --porcelain
70
+ const { stdout } = await this._exec('git status --porcelain');
71
+
72
+ if (!stdout.trim()) {
73
+ return []; // Нет изменений
74
+ }
75
+
76
+ const files: ChangedFile[] = [];
77
+ const lines = stdout.trim().split('\n');
78
+
79
+ for (const line of lines) {
80
+ // Git status format: XY filename
81
+ // X = index status, Y = working tree status
82
+ // После XY идёт пробел(ы), затем filename
83
+ const status = line.substring(0, 2);
84
+ // Убираем XY и все leading пробелы
85
+ const filePath = line.substring(2).trim();
86
+
87
+ // Пропускаем ignored и unmerged файлы
88
+ if (status === '!!' || status === 'UU') {
89
+ continue;
90
+ }
91
+
92
+ // Парсим статус
93
+ const parsedStatus = this._parseGitStatus(status);
94
+
95
+ // Получаем хеш содержимого для tracked файлов
96
+ let contentHash: string | null = null;
97
+ try {
98
+ const fullPath = join(this.rootPath, filePath);
99
+ if (existsSync(fullPath) && parsedStatus !== FileStatus.DELETED) {
100
+ const content = await readFile(fullPath, 'utf-8');
101
+ contentHash = this._hashContent(content);
102
+ }
103
+ } catch {
104
+ // Игнорируем ошибки чтения файла
105
+ }
106
+
107
+ files.push({
108
+ path: filePath,
109
+ status: parsedStatus,
110
+ contentHash
111
+ });
112
+ }
113
+
114
+ return files;
115
+ } catch (error) {
116
+ console.error('[GitPlugin] Failed to get changed files:', (error as Error).message);
117
+ return [];
118
+ }
119
+ }
120
+
121
+ /**
122
+ * Получить содержимое файла из HEAD
123
+ */
124
+ async getCommittedContent(filePath: string): Promise<string | null> {
125
+ try {
126
+ // Проверяем, отслеживается ли файл
127
+ const isTracked = await this.isTracked(filePath);
128
+ if (!isTracked) {
129
+ return null;
130
+ }
131
+
132
+ // Получаем содержимое из HEAD
133
+ const { stdout } = await this._exec(`git show HEAD:"${filePath}"`);
134
+ return stdout;
135
+ } catch {
136
+ // Файл может не существовать в HEAD (новый файл)
137
+ return null;
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Получить diff для файла
143
+ */
144
+ async getFileDiff(filePath: string): Promise<FileDiff> {
145
+ try {
146
+ const { stdout } = await this._exec(`git diff HEAD -- "${filePath}"`);
147
+
148
+ if (!stdout.trim()) {
149
+ return { path: filePath, hunks: [] };
150
+ }
151
+
152
+ // Парсим unified diff
153
+ return this._parseUnifiedDiff(filePath, stdout);
154
+ } catch (error) {
155
+ console.error(`[GitPlugin] Failed to get diff for ${filePath}:`, (error as Error).message);
156
+ return { path: filePath, hunks: [] };
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Получить текущую ветку
162
+ */
163
+ async getCurrentBranch(): Promise<string> {
164
+ try {
165
+ const { stdout } = await this._exec('git rev-parse --abbrev-ref HEAD');
166
+ return stdout.trim();
167
+ } catch {
168
+ return 'unknown';
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Получить хеш последнего коммита
174
+ */
175
+ async getLastCommitHash(): Promise<string | null> {
176
+ try {
177
+ const { stdout } = await this._exec('git rev-parse HEAD');
178
+ return stdout.trim();
179
+ } catch {
180
+ return null;
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Проверить, отслеживается ли файл
186
+ */
187
+ async isTracked(filePath: string): Promise<boolean> {
188
+ try {
189
+ await this._exec(`git ls-files --error-unmatch "${filePath}"`);
190
+ return true;
191
+ } catch {
192
+ return false;
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Вспомогательные методы
198
+ */
199
+
200
+ /**
201
+ * Выполнить git команду
202
+ */
203
+ private async _exec(command: string): Promise<{ stdout: string; stderr: string }> {
204
+ return await execAsync(command, {
205
+ cwd: this.rootPath,
206
+ maxBuffer: 10 * 1024 * 1024 // 10MB буфер для больших diff'ов
207
+ });
208
+ }
209
+
210
+ /**
211
+ * Парсить git status код в FileStatus
212
+ */
213
+ private _parseGitStatus(statusCode: string): string {
214
+ const index = statusCode[0];
215
+ const workingTree = statusCode[1];
216
+
217
+ // Приоритет: working tree > index
218
+ if (workingTree === 'M' || index === 'M') {
219
+ return FileStatus.MODIFIED;
220
+ }
221
+
222
+ if (workingTree === 'A' || index === 'A') {
223
+ return FileStatus.ADDED;
224
+ }
225
+
226
+ if (workingTree === 'D' || index === 'D') {
227
+ return FileStatus.DELETED;
228
+ }
229
+
230
+ if (workingTree === 'R' || index === 'R') {
231
+ return FileStatus.RENAMED;
232
+ }
233
+
234
+ if (workingTree === 'C' || index === 'C') {
235
+ return FileStatus.COPIED;
236
+ }
237
+
238
+ if (workingTree === '?') {
239
+ return FileStatus.UNTRACKED;
240
+ }
241
+
242
+ return FileStatus.MODIFIED; // По умолчанию
243
+ }
244
+
245
+ /**
246
+ * Парсить unified diff формат
247
+ */
248
+ private _parseUnifiedDiff(filePath: string, diffText: string): FileDiff {
249
+ const hunks: DiffHunk[] = [];
250
+ const lines = diffText.split('\n');
251
+
252
+ let currentHunk: DiffHunk | null = null;
253
+
254
+ for (const line of lines) {
255
+ // Начало нового hunk: @@ -oldStart,oldLines +newStart,newLines @@
256
+ if (line.startsWith('@@')) {
257
+ if (currentHunk) {
258
+ hunks.push(currentHunk);
259
+ }
260
+
261
+ const match = line.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);
262
+ if (match) {
263
+ currentHunk = {
264
+ oldStart: parseInt(match[1]),
265
+ oldLines: match[2] ? parseInt(match[2]) : 1,
266
+ newStart: parseInt(match[3]),
267
+ newLines: match[4] ? parseInt(match[4]) : 1,
268
+ lines: []
269
+ };
270
+ }
271
+ continue;
272
+ }
273
+
274
+ // Пропускаем заголовки diff
275
+ if (line.startsWith('diff --git') ||
276
+ line.startsWith('index ') ||
277
+ line.startsWith('---') ||
278
+ line.startsWith('+++')) {
279
+ continue;
280
+ }
281
+
282
+ // Добавляем строку в текущий hunk
283
+ if (currentHunk) {
284
+ currentHunk.lines.push(line);
285
+ }
286
+ }
287
+
288
+ // Добавляем последний hunk
289
+ if (currentHunk) {
290
+ hunks.push(currentHunk);
291
+ }
292
+
293
+ return { path: filePath, hunks };
294
+ }
295
+
296
+ /**
297
+ * Вычислить SHA256 хеш содержимого
298
+ */
299
+ private _hashContent(content: string): string {
300
+ return createHash('sha256').update(content, 'utf-8').digest('hex');
301
+ }
302
+
303
+ /**
304
+ * Получить список всех tracked файлов в репозитории
305
+ * (полезно для initial analysis)
306
+ */
307
+ async getAllTrackedFiles(): Promise<string[]> {
308
+ try {
309
+ const { stdout } = await this._exec('git ls-files');
310
+ return stdout.trim().split('\n').filter(line => line.length > 0);
311
+ } catch (error) {
312
+ console.error('[GitPlugin] Failed to get tracked files:', (error as Error).message);
313
+ return [];
314
+ }
315
+ }
316
+
317
+ /**
318
+ * Получить информацию о последнем коммите
319
+ */
320
+ async getLastCommitInfo(): Promise<CommitInfo | null> {
321
+ try {
322
+ const { stdout } = await this._exec('git log -1 --pretty=format:"%H%n%an%n%ae%n%at%n%s"');
323
+ const lines = stdout.split('\n');
324
+
325
+ return {
326
+ hash: lines[0],
327
+ author: lines[1],
328
+ email: lines[2],
329
+ timestamp: parseInt(lines[3]) * 1000,
330
+ message: lines[4]
331
+ };
332
+ } catch {
333
+ return null;
334
+ }
335
+ }
336
+
337
+ /**
338
+ * Проверить, есть ли uncommitted изменения
339
+ */
340
+ async hasUncommittedChanges(): Promise<boolean> {
341
+ const changedFiles = await this.getChangedFiles();
342
+ return changedFiles.length > 0;
343
+ }
344
+ }