@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,119 @@
1
+ /**
2
+ * ShadowingDetector - detects variable shadowing issues
3
+ *
4
+ * Detects two types of shadowing:
5
+ *
6
+ * 1. Cross-file shadowing:
7
+ * - CLASS `User` defined in models.js
8
+ * - VARIABLE `User` in handlers.js shadows the class
9
+ * - Method calls on the variable go to wrong target
10
+ *
11
+ * 2. Scope-aware shadowing:
12
+ * - import { User } from './models'
13
+ * - function handler() { const User = {...}; User.save(); }
14
+ * - Local variable shadows the imported class
15
+ *
16
+ * Implementation notes:
17
+ * - Datalog doesn't support inequality (\=), so we use JS filtering
18
+ * - queryNodes is an async generator, use getAllNodes for arrays
19
+ */
20
+ import { Plugin, createSuccessResult } from '../Plugin.js';
21
+ export class ShadowingDetector extends Plugin {
22
+ get metadata() {
23
+ return {
24
+ name: 'ShadowingDetector',
25
+ phase: 'VALIDATION',
26
+ priority: 80, // After enrichment, before other validators
27
+ creates: {
28
+ nodes: [],
29
+ edges: []
30
+ }
31
+ };
32
+ }
33
+ async execute(context) {
34
+ const { graph } = context;
35
+ console.log('[ShadowingDetector] Checking for variable shadowing...');
36
+ const issues = [];
37
+ // Get all relevant nodes
38
+ const allClasses = await graph.getAllNodes({ type: 'CLASS' });
39
+ const allVariables = await graph.getAllNodes({ type: 'VARIABLE' });
40
+ const allConstants = await graph.getAllNodes({ type: 'CONSTANT' });
41
+ const allImports = await graph.getAllNodes({ type: 'IMPORT' });
42
+ // Build maps for efficient lookup
43
+ const classesByName = new Map();
44
+ for (const cls of allClasses) {
45
+ const name = cls.name;
46
+ if (!classesByName.has(name)) {
47
+ classesByName.set(name, []);
48
+ }
49
+ classesByName.get(name).push(cls);
50
+ }
51
+ const importsByFileAndLocal = new Map();
52
+ for (const imp of allImports) {
53
+ const key = `${imp.file}:${imp.local}`;
54
+ importsByFileAndLocal.set(key, imp);
55
+ }
56
+ // 1. Cross-file shadowing: VARIABLE shadows CLASS from another file
57
+ for (const variable of allVariables) {
58
+ const name = variable.name;
59
+ const classesWithSameName = classesByName.get(name);
60
+ if (classesWithSameName) {
61
+ // Find classes in different files
62
+ const shadowedClasses = classesWithSameName.filter(c => c.file !== variable.file);
63
+ for (const shadowedClass of shadowedClasses) {
64
+ issues.push({
65
+ type: 'CROSS_FILE_SHADOW',
66
+ severity: 'WARNING',
67
+ message: `Variable "${name}" at ${variable.file}:${variable.line || '?'} shadows class "${name}" from ${shadowedClass.file}`,
68
+ shadowingNodeId: variable.id,
69
+ shadowedName: name,
70
+ shadowedNodeId: shadowedClass.id,
71
+ shadowedFile: shadowedClass.file,
72
+ file: variable.file,
73
+ line: variable.line
74
+ });
75
+ }
76
+ }
77
+ }
78
+ // 2. Scope-aware shadowing: local VARIABLE/CONSTANT shadows IMPORT
79
+ // Variables/constants with parentScopeId (inside functions) that shadow imports
80
+ const allLocalVars = [...allVariables, ...allConstants].filter(v => v.parentScopeId);
81
+ for (const localVar of allLocalVars) {
82
+ const name = localVar.name;
83
+ const importKey = `${localVar.file}:${name}`;
84
+ const shadowedImport = importsByFileAndLocal.get(importKey);
85
+ if (shadowedImport) {
86
+ const nodeType = localVar.type === 'CONSTANT' ? 'constant' : 'variable';
87
+ issues.push({
88
+ type: 'SCOPE_SHADOW',
89
+ severity: 'WARNING',
90
+ message: `Local ${nodeType} "${name}" at ${localVar.file}:${localVar.line || '?'} shadows imported "${name}"`,
91
+ shadowingNodeId: localVar.id,
92
+ shadowedName: name,
93
+ shadowedNodeId: shadowedImport.id,
94
+ file: localVar.file,
95
+ line: localVar.line,
96
+ scope: localVar.parentScopeId
97
+ });
98
+ }
99
+ }
100
+ const crossFileCount = issues.filter(i => i.type === 'CROSS_FILE_SHADOW').length;
101
+ const scopeCount = issues.filter(i => i.type === 'SCOPE_SHADOW').length;
102
+ const summary = {
103
+ crossFileShadows: crossFileCount,
104
+ scopeShadows: scopeCount,
105
+ totalIssues: issues.length
106
+ };
107
+ console.log('[ShadowingDetector] Summary:', summary);
108
+ if (issues.length > 0) {
109
+ console.log('[ShadowingDetector] Shadowing issues found:');
110
+ for (const issue of issues) {
111
+ console.log(` ${issue.type === 'CROSS_FILE_SHADOW' ? '📁' : '🔒'} ${issue.message}`);
112
+ }
113
+ }
114
+ else {
115
+ console.log('[ShadowingDetector] No shadowing issues detected');
116
+ }
117
+ return createSuccessResult({ nodes: 0, edges: 0 }, { summary, issues });
118
+ }
119
+ }
@@ -0,0 +1,21 @@
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
+ import { Plugin } from '../Plugin.js';
16
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
17
+ export declare class TypeScriptDeadCodeValidator extends Plugin {
18
+ get metadata(): PluginMetadata;
19
+ execute(context: PluginContext): Promise<PluginResult>;
20
+ }
21
+ //# sourceMappingURL=TypeScriptDeadCodeValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeScriptDeadCodeValidator.d.ts","sourceRoot":"","sources":["../../../src/plugins/validation/TypeScriptDeadCodeValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAuB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA4BhF,qBAAa,2BAA4B,SAAQ,MAAM;IACrD,IAAI,QAAQ,IAAI,cAAc,CAW7B;IAEK,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAgJ7D"}
@@ -0,0 +1,151 @@
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
+ import { Plugin, createSuccessResult } from '../Plugin.js';
16
+ export class TypeScriptDeadCodeValidator extends Plugin {
17
+ get metadata() {
18
+ return {
19
+ name: 'TypeScriptDeadCodeValidator',
20
+ phase: 'VALIDATION',
21
+ priority: 50, // Lower priority - runs after other validators
22
+ creates: {
23
+ nodes: [],
24
+ edges: []
25
+ },
26
+ dependencies: ['JSASTAnalyzer'] // Requires TypeScript nodes to be created
27
+ };
28
+ }
29
+ async execute(context) {
30
+ const { graph } = context;
31
+ console.log('[TypeScriptDeadCodeValidator] Checking for dead TypeScript code...');
32
+ const startTime = Date.now();
33
+ const issues = [];
34
+ // Collect all interfaces
35
+ console.log('[TypeScriptDeadCodeValidator] Collecting interfaces...');
36
+ const interfaces = new Map();
37
+ for await (const node of graph.queryNodes({ nodeType: 'INTERFACE' })) {
38
+ // Skip external/reference interfaces
39
+ if (node.isExternal)
40
+ continue;
41
+ interfaces.set(node.id, {
42
+ id: node.id,
43
+ name: node.name,
44
+ file: node.file,
45
+ line: node.line,
46
+ properties: node.properties
47
+ });
48
+ }
49
+ console.log(`[TypeScriptDeadCodeValidator] Found ${interfaces.size} interfaces`);
50
+ // Find interfaces with IMPLEMENTS or EXTENDS edges
51
+ console.log('[TypeScriptDeadCodeValidator] Checking implementations...');
52
+ const implementedInterfaces = new Map();
53
+ // Get all edges and filter by type (no queryEdges in GraphBackend yet)
54
+ const allEdges = await graph.getAllEdges?.() ?? [];
55
+ for (const edge of allEdges) {
56
+ if (edge.type === 'IMPLEMENTS' || edge.type === 'EXTENDS') {
57
+ const count = implementedInterfaces.get(edge.dst) || 0;
58
+ implementedInterfaces.set(edge.dst, count + 1);
59
+ }
60
+ }
61
+ // Analyze interfaces
62
+ let unusedCount = 0;
63
+ let emptyCount = 0;
64
+ let singleImplCount = 0;
65
+ for (const [id, iface] of interfaces) {
66
+ const implCount = implementedInterfaces.get(id) || 0;
67
+ const properties = iface.properties || [];
68
+ // Check for empty interface
69
+ if (properties.length === 0) {
70
+ emptyCount++;
71
+ issues.push({
72
+ type: 'EMPTY_INTERFACE',
73
+ severity: 'INFO',
74
+ message: `Empty interface '${iface.name}' at ${iface.file}:${iface.line || '?'} - consider using type alias or removing`,
75
+ nodeId: id,
76
+ name: iface.name,
77
+ file: iface.file,
78
+ line: iface.line
79
+ });
80
+ }
81
+ // Check for unused interface (no implementations)
82
+ if (implCount === 0) {
83
+ unusedCount++;
84
+ issues.push({
85
+ type: 'UNUSED_INTERFACE',
86
+ severity: 'WARNING',
87
+ message: `Interface '${iface.name}' at ${iface.file}:${iface.line || '?'} has no implementations`,
88
+ nodeId: id,
89
+ name: iface.name,
90
+ file: iface.file,
91
+ line: iface.line
92
+ });
93
+ }
94
+ // Check for single implementation (possible over-engineering)
95
+ else if (implCount === 1) {
96
+ singleImplCount++;
97
+ issues.push({
98
+ type: 'SINGLE_IMPLEMENTATION',
99
+ severity: 'INFO',
100
+ message: `Interface '${iface.name}' at ${iface.file}:${iface.line || '?'} has only one implementation - may be over-engineering`,
101
+ nodeId: id,
102
+ name: iface.name,
103
+ file: iface.file,
104
+ line: iface.line
105
+ });
106
+ }
107
+ }
108
+ // Count enums and types (for summary, full analysis requires USES_TYPE)
109
+ let enumCount = 0;
110
+ for await (const _node of graph.queryNodes({ nodeType: 'ENUM' })) {
111
+ enumCount++;
112
+ }
113
+ let typeCount = 0;
114
+ for await (const _node of graph.queryNodes({ nodeType: 'TYPE' })) {
115
+ typeCount++;
116
+ }
117
+ const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);
118
+ const summary = {
119
+ totalInterfaces: interfaces.size,
120
+ unusedInterfaces: unusedCount,
121
+ emptyInterfaces: emptyCount,
122
+ singleImplInterfaces: singleImplCount,
123
+ totalEnums: enumCount,
124
+ totalTypes: typeCount,
125
+ timeSeconds: totalTime
126
+ };
127
+ console.log('[TypeScriptDeadCodeValidator] Summary:', summary);
128
+ // Report issues
129
+ const warnings = issues.filter(i => i.severity === 'WARNING');
130
+ const infos = issues.filter(i => i.severity === 'INFO');
131
+ if (warnings.length > 0) {
132
+ console.log(`[TypeScriptDeadCodeValidator] ⚠️ ${warnings.length} warning(s):`);
133
+ for (const issue of warnings) {
134
+ console.log(` ⚠️ ${issue.message}`);
135
+ }
136
+ }
137
+ if (infos.length > 0) {
138
+ console.log(`[TypeScriptDeadCodeValidator] ℹ️ ${infos.length} info(s):`);
139
+ for (const issue of infos.slice(0, 5)) { // Limit to first 5
140
+ console.log(` ℹ️ ${issue.message}`);
141
+ }
142
+ if (infos.length > 5) {
143
+ console.log(` ... and ${infos.length - 5} more`);
144
+ }
145
+ }
146
+ if (issues.length === 0) {
147
+ console.log('[TypeScriptDeadCodeValidator] ✅ No dead TypeScript code detected');
148
+ }
149
+ return createSuccessResult({ nodes: 0, edges: 0 }, { summary, issues });
150
+ }
151
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Git VCS Plugin
3
+ *
4
+ * Плагин для работы с Git репозиториями
5
+ * Обнаруживает изменённые файлы и предоставляет их содержимое
6
+ */
7
+ import { VCSPlugin } from './VCSPlugin.js';
8
+ import type { VCSConfig, VCSPluginMetadata, ChangedFile, FileDiff } from './VCSPlugin.js';
9
+ /**
10
+ * Commit info
11
+ */
12
+ export interface CommitInfo {
13
+ hash: string;
14
+ author: string;
15
+ email: string;
16
+ timestamp: number;
17
+ message: string;
18
+ }
19
+ export declare class GitPlugin extends VCSPlugin {
20
+ private gitDir;
21
+ constructor(config?: VCSConfig);
22
+ get metadata(): VCSPluginMetadata;
23
+ /**
24
+ * Проверить доступность Git
25
+ */
26
+ isAvailable(): Promise<boolean>;
27
+ /**
28
+ * Получить список изменённых файлов
29
+ */
30
+ getChangedFiles(): Promise<ChangedFile[]>;
31
+ /**
32
+ * Получить содержимое файла из HEAD
33
+ */
34
+ getCommittedContent(filePath: string): Promise<string | null>;
35
+ /**
36
+ * Получить diff для файла
37
+ */
38
+ getFileDiff(filePath: string): Promise<FileDiff>;
39
+ /**
40
+ * Получить текущую ветку
41
+ */
42
+ getCurrentBranch(): Promise<string>;
43
+ /**
44
+ * Получить хеш последнего коммита
45
+ */
46
+ getLastCommitHash(): Promise<string | null>;
47
+ /**
48
+ * Проверить, отслеживается ли файл
49
+ */
50
+ isTracked(filePath: string): Promise<boolean>;
51
+ /**
52
+ * Вспомогательные методы
53
+ */
54
+ /**
55
+ * Выполнить git команду
56
+ */
57
+ private _exec;
58
+ /**
59
+ * Парсить git status код в FileStatus
60
+ */
61
+ private _parseGitStatus;
62
+ /**
63
+ * Парсить unified diff формат
64
+ */
65
+ private _parseUnifiedDiff;
66
+ /**
67
+ * Вычислить SHA256 хеш содержимого
68
+ */
69
+ private _hashContent;
70
+ /**
71
+ * Получить список всех tracked файлов в репозитории
72
+ * (полезно для initial analysis)
73
+ */
74
+ getAllTrackedFiles(): Promise<string[]>;
75
+ /**
76
+ * Получить информацию о последнем коммите
77
+ */
78
+ getLastCommitInfo(): Promise<CommitInfo | null>;
79
+ /**
80
+ * Проверить, есть ли uncommitted изменения
81
+ */
82
+ hasUncommittedChanges(): Promise<boolean>;
83
+ }
84
+ //# sourceMappingURL=GitPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/vcs/GitPlugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAc,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAY,MAAM,gBAAgB,CAAC;AAUpG;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,SAAU,SAAQ,SAAS;IACtC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,GAAE,SAAc;IAKlC,IAAI,QAAQ,IAAI,iBAAiB,CAMhC;IAED;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAerC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAsD/C;;OAEG;IACG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiBnE;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgBtD;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IASzC;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASjD;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASnD;;OAEG;IAEH;;OAEG;YACW,KAAK;IAOnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAgCvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgDzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAU7C;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAiBrD;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;CAIhD"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Git VCS Plugin
3
+ *
4
+ * Плагин для работы с Git репозиториями
5
+ * Обнаруживает изменённые файлы и предоставляет их содержимое
6
+ */
7
+ import { VCSPlugin, FileStatus } from './VCSPlugin.js';
8
+ import { exec } from 'child_process';
9
+ import { promisify } from 'util';
10
+ import { join } from 'path';
11
+ import { existsSync } from 'fs';
12
+ import { readFile } from 'fs/promises';
13
+ import { createHash } from 'crypto';
14
+ const execAsync = promisify(exec);
15
+ export class GitPlugin extends VCSPlugin {
16
+ gitDir;
17
+ constructor(config = {}) {
18
+ super(config);
19
+ this.gitDir = join(this.rootPath, '.git');
20
+ }
21
+ get metadata() {
22
+ return {
23
+ name: 'git',
24
+ type: 'vcs',
25
+ supported: existsSync(this.gitDir)
26
+ };
27
+ }
28
+ /**
29
+ * Проверить доступность Git
30
+ */
31
+ async isAvailable() {
32
+ try {
33
+ // Проверяем существование .git директории
34
+ if (!existsSync(this.gitDir)) {
35
+ return false;
36
+ }
37
+ // Проверяем работу git команды
38
+ const { stdout } = await this._exec('git rev-parse --git-dir');
39
+ return stdout.trim().length > 0;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ /**
46
+ * Получить список изменённых файлов
47
+ */
48
+ async getChangedFiles() {
49
+ try {
50
+ // Получаем список файлов через git status --porcelain
51
+ const { stdout } = await this._exec('git status --porcelain');
52
+ if (!stdout.trim()) {
53
+ return []; // Нет изменений
54
+ }
55
+ const files = [];
56
+ const lines = stdout.trim().split('\n');
57
+ for (const line of lines) {
58
+ // Git status format: XY filename
59
+ // X = index status, Y = working tree status
60
+ // После XY идёт пробел(ы), затем filename
61
+ const status = line.substring(0, 2);
62
+ // Убираем XY и все leading пробелы
63
+ const filePath = line.substring(2).trim();
64
+ // Пропускаем ignored и unmerged файлы
65
+ if (status === '!!' || status === 'UU') {
66
+ continue;
67
+ }
68
+ // Парсим статус
69
+ const parsedStatus = this._parseGitStatus(status);
70
+ // Получаем хеш содержимого для tracked файлов
71
+ let contentHash = null;
72
+ try {
73
+ const fullPath = join(this.rootPath, filePath);
74
+ if (existsSync(fullPath) && parsedStatus !== FileStatus.DELETED) {
75
+ const content = await readFile(fullPath, 'utf-8');
76
+ contentHash = this._hashContent(content);
77
+ }
78
+ }
79
+ catch {
80
+ // Игнорируем ошибки чтения файла
81
+ }
82
+ files.push({
83
+ path: filePath,
84
+ status: parsedStatus,
85
+ contentHash
86
+ });
87
+ }
88
+ return files;
89
+ }
90
+ catch (error) {
91
+ console.error('[GitPlugin] Failed to get changed files:', error.message);
92
+ return [];
93
+ }
94
+ }
95
+ /**
96
+ * Получить содержимое файла из HEAD
97
+ */
98
+ async getCommittedContent(filePath) {
99
+ try {
100
+ // Проверяем, отслеживается ли файл
101
+ const isTracked = await this.isTracked(filePath);
102
+ if (!isTracked) {
103
+ return null;
104
+ }
105
+ // Получаем содержимое из HEAD
106
+ const { stdout } = await this._exec(`git show HEAD:"${filePath}"`);
107
+ return stdout;
108
+ }
109
+ catch {
110
+ // Файл может не существовать в HEAD (новый файл)
111
+ return null;
112
+ }
113
+ }
114
+ /**
115
+ * Получить diff для файла
116
+ */
117
+ async getFileDiff(filePath) {
118
+ try {
119
+ const { stdout } = await this._exec(`git diff HEAD -- "${filePath}"`);
120
+ if (!stdout.trim()) {
121
+ return { path: filePath, hunks: [] };
122
+ }
123
+ // Парсим unified diff
124
+ return this._parseUnifiedDiff(filePath, stdout);
125
+ }
126
+ catch (error) {
127
+ console.error(`[GitPlugin] Failed to get diff for ${filePath}:`, error.message);
128
+ return { path: filePath, hunks: [] };
129
+ }
130
+ }
131
+ /**
132
+ * Получить текущую ветку
133
+ */
134
+ async getCurrentBranch() {
135
+ try {
136
+ const { stdout } = await this._exec('git rev-parse --abbrev-ref HEAD');
137
+ return stdout.trim();
138
+ }
139
+ catch {
140
+ return 'unknown';
141
+ }
142
+ }
143
+ /**
144
+ * Получить хеш последнего коммита
145
+ */
146
+ async getLastCommitHash() {
147
+ try {
148
+ const { stdout } = await this._exec('git rev-parse HEAD');
149
+ return stdout.trim();
150
+ }
151
+ catch {
152
+ return null;
153
+ }
154
+ }
155
+ /**
156
+ * Проверить, отслеживается ли файл
157
+ */
158
+ async isTracked(filePath) {
159
+ try {
160
+ await this._exec(`git ls-files --error-unmatch "${filePath}"`);
161
+ return true;
162
+ }
163
+ catch {
164
+ return false;
165
+ }
166
+ }
167
+ /**
168
+ * Вспомогательные методы
169
+ */
170
+ /**
171
+ * Выполнить git команду
172
+ */
173
+ async _exec(command) {
174
+ return await execAsync(command, {
175
+ cwd: this.rootPath,
176
+ maxBuffer: 10 * 1024 * 1024 // 10MB буфер для больших diff'ов
177
+ });
178
+ }
179
+ /**
180
+ * Парсить git status код в FileStatus
181
+ */
182
+ _parseGitStatus(statusCode) {
183
+ const index = statusCode[0];
184
+ const workingTree = statusCode[1];
185
+ // Приоритет: working tree > index
186
+ if (workingTree === 'M' || index === 'M') {
187
+ return FileStatus.MODIFIED;
188
+ }
189
+ if (workingTree === 'A' || index === 'A') {
190
+ return FileStatus.ADDED;
191
+ }
192
+ if (workingTree === 'D' || index === 'D') {
193
+ return FileStatus.DELETED;
194
+ }
195
+ if (workingTree === 'R' || index === 'R') {
196
+ return FileStatus.RENAMED;
197
+ }
198
+ if (workingTree === 'C' || index === 'C') {
199
+ return FileStatus.COPIED;
200
+ }
201
+ if (workingTree === '?') {
202
+ return FileStatus.UNTRACKED;
203
+ }
204
+ return FileStatus.MODIFIED; // По умолчанию
205
+ }
206
+ /**
207
+ * Парсить unified diff формат
208
+ */
209
+ _parseUnifiedDiff(filePath, diffText) {
210
+ const hunks = [];
211
+ const lines = diffText.split('\n');
212
+ let currentHunk = null;
213
+ for (const line of lines) {
214
+ // Начало нового hunk: @@ -oldStart,oldLines +newStart,newLines @@
215
+ if (line.startsWith('@@')) {
216
+ if (currentHunk) {
217
+ hunks.push(currentHunk);
218
+ }
219
+ const match = line.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);
220
+ if (match) {
221
+ currentHunk = {
222
+ oldStart: parseInt(match[1]),
223
+ oldLines: match[2] ? parseInt(match[2]) : 1,
224
+ newStart: parseInt(match[3]),
225
+ newLines: match[4] ? parseInt(match[4]) : 1,
226
+ lines: []
227
+ };
228
+ }
229
+ continue;
230
+ }
231
+ // Пропускаем заголовки diff
232
+ if (line.startsWith('diff --git') ||
233
+ line.startsWith('index ') ||
234
+ line.startsWith('---') ||
235
+ line.startsWith('+++')) {
236
+ continue;
237
+ }
238
+ // Добавляем строку в текущий hunk
239
+ if (currentHunk) {
240
+ currentHunk.lines.push(line);
241
+ }
242
+ }
243
+ // Добавляем последний hunk
244
+ if (currentHunk) {
245
+ hunks.push(currentHunk);
246
+ }
247
+ return { path: filePath, hunks };
248
+ }
249
+ /**
250
+ * Вычислить SHA256 хеш содержимого
251
+ */
252
+ _hashContent(content) {
253
+ return createHash('sha256').update(content, 'utf-8').digest('hex');
254
+ }
255
+ /**
256
+ * Получить список всех tracked файлов в репозитории
257
+ * (полезно для initial analysis)
258
+ */
259
+ async getAllTrackedFiles() {
260
+ try {
261
+ const { stdout } = await this._exec('git ls-files');
262
+ return stdout.trim().split('\n').filter(line => line.length > 0);
263
+ }
264
+ catch (error) {
265
+ console.error('[GitPlugin] Failed to get tracked files:', error.message);
266
+ return [];
267
+ }
268
+ }
269
+ /**
270
+ * Получить информацию о последнем коммите
271
+ */
272
+ async getLastCommitInfo() {
273
+ try {
274
+ const { stdout } = await this._exec('git log -1 --pretty=format:"%H%n%an%n%ae%n%at%n%s"');
275
+ const lines = stdout.split('\n');
276
+ return {
277
+ hash: lines[0],
278
+ author: lines[1],
279
+ email: lines[2],
280
+ timestamp: parseInt(lines[3]) * 1000,
281
+ message: lines[4]
282
+ };
283
+ }
284
+ catch {
285
+ return null;
286
+ }
287
+ }
288
+ /**
289
+ * Проверить, есть ли uncommitted изменения
290
+ */
291
+ async hasUncommittedChanges() {
292
+ const changedFiles = await this.getChangedFiles();
293
+ return changedFiles.length > 0;
294
+ }
295
+ }