@grafema/core 0.2.4-beta → 0.2.5-beta

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 (557) hide show
  1. package/dist/Orchestrator.d.ts +37 -0
  2. package/dist/Orchestrator.d.ts.map +1 -1
  3. package/dist/Orchestrator.js +322 -35
  4. package/dist/Orchestrator.js.map +1 -0
  5. package/dist/api/GraphAPI.d.ts +1 -1
  6. package/dist/api/GraphAPI.d.ts.map +1 -1
  7. package/dist/api/GraphAPI.js +3 -1
  8. package/dist/api/GraphAPI.js.map +1 -0
  9. package/dist/api/GuaranteeAPI.d.ts.map +1 -1
  10. package/dist/api/GuaranteeAPI.js +4 -2
  11. package/dist/api/GuaranteeAPI.js.map +1 -0
  12. package/dist/config/ConfigLoader.d.ts +66 -0
  13. package/dist/config/ConfigLoader.d.ts.map +1 -1
  14. package/dist/config/ConfigLoader.js +77 -3
  15. package/dist/config/ConfigLoader.js.map +1 -0
  16. package/dist/config/index.d.ts +1 -1
  17. package/dist/config/index.d.ts.map +1 -1
  18. package/dist/config/index.js +2 -1
  19. package/dist/config/index.js.map +1 -0
  20. package/dist/core/ASTWorker.d.ts.map +1 -1
  21. package/dist/core/ASTWorker.js +6 -4
  22. package/dist/core/ASTWorker.js.map +1 -0
  23. package/dist/core/ASTWorkerPool.js +2 -1
  24. package/dist/core/ASTWorkerPool.js.map +1 -0
  25. package/dist/core/AnalysisQueue.js +1 -0
  26. package/dist/core/AnalysisQueue.js.map +1 -0
  27. package/dist/core/CoverageAnalyzer.d.ts.map +1 -1
  28. package/dist/core/CoverageAnalyzer.js +1 -0
  29. package/dist/core/CoverageAnalyzer.js.map +1 -0
  30. package/dist/core/FileExplainer.js +1 -0
  31. package/dist/core/FileExplainer.js.map +1 -0
  32. package/dist/core/FileNodeManager.d.ts.map +1 -1
  33. package/dist/core/FileNodeManager.js +4 -2
  34. package/dist/core/FileNodeManager.js.map +1 -0
  35. package/dist/core/GraphBackend.js +1 -0
  36. package/dist/core/GraphBackend.js.map +1 -0
  37. package/dist/core/GraphFreshnessChecker.js +1 -0
  38. package/dist/core/GraphFreshnessChecker.js.map +1 -0
  39. package/dist/core/GuaranteeManager.js +2 -1
  40. package/dist/core/GuaranteeManager.js.map +1 -0
  41. package/dist/core/HashUtils.js +1 -0
  42. package/dist/core/HashUtils.js.map +1 -0
  43. package/dist/core/IncrementalReanalyzer.d.ts.map +1 -1
  44. package/dist/core/IncrementalReanalyzer.js +7 -3
  45. package/dist/core/IncrementalReanalyzer.js.map +1 -0
  46. package/dist/core/ManifestStore.js +1 -0
  47. package/dist/core/ManifestStore.js.map +1 -0
  48. package/dist/core/NodeFactory.d.ts +54 -34
  49. package/dist/core/NodeFactory.d.ts.map +1 -1
  50. package/dist/core/NodeFactory.js +20 -1
  51. package/dist/core/NodeFactory.js.map +1 -0
  52. package/dist/core/NodeId.js +1 -0
  53. package/dist/core/NodeId.js.map +1 -0
  54. package/dist/core/PriorityQueue.js +1 -0
  55. package/dist/core/PriorityQueue.js.map +1 -0
  56. package/dist/core/Profiler.js +1 -0
  57. package/dist/core/Profiler.js.map +1 -0
  58. package/dist/core/ScopeTracker.js +1 -0
  59. package/dist/core/ScopeTracker.js.map +1 -0
  60. package/dist/core/SemanticId.js +1 -0
  61. package/dist/core/SemanticId.js.map +1 -0
  62. package/dist/core/Task.js +1 -0
  63. package/dist/core/Task.js.map +1 -0
  64. package/dist/core/TaskTypes.js +1 -0
  65. package/dist/core/TaskTypes.js.map +1 -0
  66. package/dist/core/VersionManager.js +1 -0
  67. package/dist/core/VersionManager.js.map +1 -0
  68. package/dist/core/WorkerPool.d.ts.map +1 -1
  69. package/dist/core/WorkerPool.js +3 -1
  70. package/dist/core/WorkerPool.js.map +1 -0
  71. package/dist/core/nodes/ArgumentExpressionNode.js +1 -0
  72. package/dist/core/nodes/ArgumentExpressionNode.js.map +1 -0
  73. package/dist/core/nodes/ArrayLiteralNode.js +1 -0
  74. package/dist/core/nodes/ArrayLiteralNode.js.map +1 -0
  75. package/dist/core/nodes/BranchNode.js +1 -0
  76. package/dist/core/nodes/BranchNode.js.map +1 -0
  77. package/dist/core/nodes/CallSiteNode.js +1 -0
  78. package/dist/core/nodes/CallSiteNode.js.map +1 -0
  79. package/dist/core/nodes/CaseNode.js +1 -0
  80. package/dist/core/nodes/CaseNode.js.map +1 -0
  81. package/dist/core/nodes/ClassNode.js +1 -0
  82. package/dist/core/nodes/ClassNode.js.map +1 -0
  83. package/dist/core/nodes/ConstantNode.js +1 -0
  84. package/dist/core/nodes/ConstantNode.js.map +1 -0
  85. package/dist/core/nodes/ConstructorCallNode.js +1 -0
  86. package/dist/core/nodes/ConstructorCallNode.js.map +1 -0
  87. package/dist/core/nodes/DatabaseQueryNode.js +1 -0
  88. package/dist/core/nodes/DatabaseQueryNode.js.map +1 -0
  89. package/dist/core/nodes/DecoratorNode.js +1 -0
  90. package/dist/core/nodes/DecoratorNode.js.map +1 -0
  91. package/dist/core/nodes/EntrypointNode.js +1 -0
  92. package/dist/core/nodes/EntrypointNode.js.map +1 -0
  93. package/dist/core/nodes/EnumNode.js +1 -0
  94. package/dist/core/nodes/EnumNode.js.map +1 -0
  95. package/dist/core/nodes/EventListenerNode.js +1 -0
  96. package/dist/core/nodes/EventListenerNode.js.map +1 -0
  97. package/dist/core/nodes/ExportNode.js +1 -0
  98. package/dist/core/nodes/ExportNode.js.map +1 -0
  99. package/dist/core/nodes/ExpressionNode.js +1 -0
  100. package/dist/core/nodes/ExpressionNode.js.map +1 -0
  101. package/dist/core/nodes/ExternalModuleNode.js +1 -0
  102. package/dist/core/nodes/ExternalModuleNode.js.map +1 -0
  103. package/dist/core/nodes/ExternalStdioNode.js +1 -0
  104. package/dist/core/nodes/ExternalStdioNode.js.map +1 -0
  105. package/dist/core/nodes/FunctionNode.js +1 -0
  106. package/dist/core/nodes/FunctionNode.js.map +1 -0
  107. package/dist/core/nodes/GuaranteeNode.js +1 -0
  108. package/dist/core/nodes/GuaranteeNode.js.map +1 -0
  109. package/dist/core/nodes/HttpRequestNode.js +1 -0
  110. package/dist/core/nodes/HttpRequestNode.js.map +1 -0
  111. package/dist/core/nodes/ImportNode.js +1 -0
  112. package/dist/core/nodes/ImportNode.js.map +1 -0
  113. package/dist/core/nodes/InterfaceNode.js +1 -0
  114. package/dist/core/nodes/InterfaceNode.js.map +1 -0
  115. package/dist/core/nodes/IssueNode.js +1 -0
  116. package/dist/core/nodes/IssueNode.js.map +1 -0
  117. package/dist/core/nodes/LiteralNode.js +1 -0
  118. package/dist/core/nodes/LiteralNode.js.map +1 -0
  119. package/dist/core/nodes/MethodCallNode.js +1 -0
  120. package/dist/core/nodes/MethodCallNode.js.map +1 -0
  121. package/dist/core/nodes/MethodNode.js +1 -0
  122. package/dist/core/nodes/MethodNode.js.map +1 -0
  123. package/dist/core/nodes/ModuleNode.js +1 -0
  124. package/dist/core/nodes/ModuleNode.js.map +1 -0
  125. package/dist/core/nodes/NetworkRequestNode.js +1 -0
  126. package/dist/core/nodes/NetworkRequestNode.js.map +1 -0
  127. package/dist/core/nodes/NodeKind.d.ts +5 -0
  128. package/dist/core/nodes/NodeKind.d.ts.map +1 -1
  129. package/dist/core/nodes/NodeKind.js +11 -0
  130. package/dist/core/nodes/NodeKind.js.map +1 -0
  131. package/dist/core/nodes/ObjectLiteralNode.js +1 -0
  132. package/dist/core/nodes/ObjectLiteralNode.js.map +1 -0
  133. package/dist/core/nodes/ParameterNode.js +1 -0
  134. package/dist/core/nodes/ParameterNode.js.map +1 -0
  135. package/dist/core/nodes/PluginNode.d.ts +69 -0
  136. package/dist/core/nodes/PluginNode.d.ts.map +1 -0
  137. package/dist/core/nodes/PluginNode.js +106 -0
  138. package/dist/core/nodes/PluginNode.js.map +1 -0
  139. package/dist/core/nodes/ScopeNode.js +1 -0
  140. package/dist/core/nodes/ScopeNode.js.map +1 -0
  141. package/dist/core/nodes/ServiceNode.js +1 -0
  142. package/dist/core/nodes/ServiceNode.js.map +1 -0
  143. package/dist/core/nodes/TypeNode.js +2 -1
  144. package/dist/core/nodes/TypeNode.js.map +1 -0
  145. package/dist/core/nodes/VariableDeclarationNode.js +1 -0
  146. package/dist/core/nodes/VariableDeclarationNode.js.map +1 -0
  147. package/dist/core/nodes/index.d.ts +2 -1
  148. package/dist/core/nodes/index.d.ts.map +1 -1
  149. package/dist/core/nodes/index.js +4 -1
  150. package/dist/core/nodes/index.js.map +1 -0
  151. package/dist/core/toposort.d.ts +38 -0
  152. package/dist/core/toposort.d.ts.map +1 -0
  153. package/dist/core/toposort.js +129 -0
  154. package/dist/core/toposort.js.map +1 -0
  155. package/dist/data/builtins/BuiltinRegistry.js +1 -0
  156. package/dist/data/builtins/BuiltinRegistry.js.map +1 -0
  157. package/dist/data/builtins/definitions.js +1 -0
  158. package/dist/data/builtins/definitions.js.map +1 -0
  159. package/dist/data/builtins/index.js +1 -0
  160. package/dist/data/builtins/index.js.map +1 -0
  161. package/dist/data/builtins/jsGlobals.js +1 -0
  162. package/dist/data/builtins/jsGlobals.js.map +1 -0
  163. package/dist/data/builtins/types.js +1 -0
  164. package/dist/data/builtins/types.js.map +1 -0
  165. package/dist/data/globals/definitions.js +1 -0
  166. package/dist/data/globals/definitions.js.map +1 -0
  167. package/dist/data/globals/index.js +1 -0
  168. package/dist/data/globals/index.js.map +1 -0
  169. package/dist/diagnostics/DiagnosticCollector.d.ts +5 -0
  170. package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -1
  171. package/dist/diagnostics/DiagnosticCollector.js +4 -0
  172. package/dist/diagnostics/DiagnosticCollector.js.map +1 -0
  173. package/dist/diagnostics/DiagnosticReporter.d.ts +23 -1
  174. package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -1
  175. package/dist/diagnostics/DiagnosticReporter.js +68 -15
  176. package/dist/diagnostics/DiagnosticReporter.js.map +1 -0
  177. package/dist/diagnostics/DiagnosticWriter.js +1 -0
  178. package/dist/diagnostics/DiagnosticWriter.js.map +1 -0
  179. package/dist/diagnostics/categories.d.ts +57 -0
  180. package/dist/diagnostics/categories.d.ts.map +1 -0
  181. package/dist/diagnostics/categories.js +71 -0
  182. package/dist/diagnostics/categories.js.map +1 -0
  183. package/dist/diagnostics/index.d.ts +3 -0
  184. package/dist/diagnostics/index.d.ts.map +1 -1
  185. package/dist/diagnostics/index.js +4 -0
  186. package/dist/diagnostics/index.js.map +1 -0
  187. package/dist/errors/GrafemaError.d.ts +39 -0
  188. package/dist/errors/GrafemaError.d.ts.map +1 -1
  189. package/dist/errors/GrafemaError.js +28 -0
  190. package/dist/errors/GrafemaError.js.map +1 -0
  191. package/dist/index.d.ts +21 -10
  192. package/dist/index.d.ts.map +1 -1
  193. package/dist/index.js +19 -7
  194. package/dist/index.js.map +1 -0
  195. package/dist/instructions/index.d.ts +8 -0
  196. package/dist/instructions/index.d.ts.map +1 -0
  197. package/dist/instructions/index.js +20 -0
  198. package/dist/instructions/index.js.map +1 -0
  199. package/dist/instructions/onboarding.md +121 -0
  200. package/dist/logging/Logger.d.ts +53 -3
  201. package/dist/logging/Logger.d.ts.map +1 -1
  202. package/dist/logging/Logger.js +144 -4
  203. package/dist/logging/Logger.js.map +1 -0
  204. package/dist/plugins/Plugin.js +1 -0
  205. package/dist/plugins/Plugin.js.map +1 -0
  206. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
  207. package/dist/plugins/analysis/DatabaseAnalyzer.js +20 -14
  208. package/dist/plugins/analysis/DatabaseAnalyzer.js.map +1 -0
  209. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
  210. package/dist/plugins/analysis/ExpressAnalyzer.js +23 -16
  211. package/dist/plugins/analysis/ExpressAnalyzer.js.map +1 -0
  212. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts +2 -1
  213. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts.map +1 -1
  214. package/dist/plugins/analysis/ExpressResponseAnalyzer.js +53 -76
  215. package/dist/plugins/analysis/ExpressResponseAnalyzer.js.map +1 -0
  216. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
  217. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +47 -37
  218. package/dist/plugins/analysis/ExpressRouteAnalyzer.js.map +1 -0
  219. package/dist/plugins/analysis/FetchAnalyzer.d.ts +8 -14
  220. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
  221. package/dist/plugins/analysis/FetchAnalyzer.js +144 -97
  222. package/dist/plugins/analysis/FetchAnalyzer.js.map +1 -0
  223. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
  224. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +3 -5
  225. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js.map +1 -0
  226. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +59 -2
  227. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
  228. package/dist/plugins/analysis/JSASTAnalyzer.js +926 -422
  229. package/dist/plugins/analysis/JSASTAnalyzer.js.map +1 -0
  230. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
  231. package/dist/plugins/analysis/ReactAnalyzer.js +24 -19
  232. package/dist/plugins/analysis/ReactAnalyzer.js.map +1 -0
  233. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
  234. package/dist/plugins/analysis/RustAnalyzer.js +39 -26
  235. package/dist/plugins/analysis/RustAnalyzer.js.map +1 -0
  236. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
  237. package/dist/plugins/analysis/SQLiteAnalyzer.js +14 -7
  238. package/dist/plugins/analysis/SQLiteAnalyzer.js.map +1 -0
  239. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
  240. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +33 -28
  241. package/dist/plugins/analysis/ServiceLayerAnalyzer.js.map +1 -0
  242. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
  243. package/dist/plugins/analysis/SocketIOAnalyzer.js +24 -14
  244. package/dist/plugins/analysis/SocketIOAnalyzer.js.map +1 -0
  245. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
  246. package/dist/plugins/analysis/SystemDbAnalyzer.js +19 -11
  247. package/dist/plugins/analysis/SystemDbAnalyzer.js.map +1 -0
  248. package/dist/plugins/analysis/ast/ConditionParser.js +1 -0
  249. package/dist/plugins/analysis/ast/ConditionParser.js.map +1 -0
  250. package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts.map +1 -1
  251. package/dist/plugins/analysis/ast/ExpressionEvaluator.js +1 -0
  252. package/dist/plugins/analysis/ast/ExpressionEvaluator.js.map +1 -0
  253. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +58 -6
  254. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
  255. package/dist/plugins/analysis/ast/GraphBuilder.js +440 -56
  256. package/dist/plugins/analysis/ast/GraphBuilder.js.map +1 -0
  257. package/dist/plugins/analysis/ast/IdGenerator.js +1 -0
  258. package/dist/plugins/analysis/ast/IdGenerator.js.map +1 -0
  259. package/dist/plugins/analysis/ast/OxcAdapter.js +1 -0
  260. package/dist/plugins/analysis/ast/OxcAdapter.js.map +1 -0
  261. package/dist/plugins/analysis/ast/types.d.ts +152 -1
  262. package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
  263. package/dist/plugins/analysis/ast/types.js +1 -0
  264. package/dist/plugins/analysis/ast/types.js.map +1 -0
  265. package/dist/plugins/analysis/ast/utils/babelTraverse.d.ts +27 -0
  266. package/dist/plugins/analysis/ast/utils/babelTraverse.d.ts.map +1 -0
  267. package/dist/plugins/analysis/ast/utils/babelTraverse.js +45 -0
  268. package/dist/plugins/analysis/ast/utils/babelTraverse.js.map +1 -0
  269. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +1 -1
  270. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -1
  271. package/dist/plugins/analysis/ast/utils/createParameterNodes.js +1 -0
  272. package/dist/plugins/analysis/ast/utils/createParameterNodes.js.map +1 -0
  273. package/dist/plugins/analysis/ast/utils/index.js +1 -0
  274. package/dist/plugins/analysis/ast/utils/index.js.map +1 -0
  275. package/dist/plugins/analysis/ast/utils/location.js +1 -0
  276. package/dist/plugins/analysis/ast/utils/location.js.map +1 -0
  277. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +3 -1
  278. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
  279. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +1 -0
  280. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js.map +1 -0
  281. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +9 -2
  282. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
  283. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +145 -14
  284. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js.map +1 -0
  285. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +1 -1
  286. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
  287. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +198 -0
  288. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js.map +1 -0
  289. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +4 -3
  290. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
  291. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +5 -2
  292. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js.map +1 -0
  293. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +1 -0
  294. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js.map +1 -0
  295. package/dist/plugins/analysis/ast/visitors/PropertyAccessVisitor.d.ts +83 -0
  296. package/dist/plugins/analysis/ast/visitors/PropertyAccessVisitor.d.ts.map +1 -0
  297. package/dist/plugins/analysis/ast/visitors/PropertyAccessVisitor.js +258 -0
  298. package/dist/plugins/analysis/ast/visitors/PropertyAccessVisitor.js.map +1 -0
  299. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +1 -1
  300. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
  301. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +1 -0
  302. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js.map +1 -0
  303. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +1 -1
  304. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
  305. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +1 -0
  306. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js.map +1 -0
  307. package/dist/plugins/analysis/ast/visitors/index.d.ts +1 -0
  308. package/dist/plugins/analysis/ast/visitors/index.d.ts.map +1 -1
  309. package/dist/plugins/analysis/ast/visitors/index.js +2 -0
  310. package/dist/plugins/analysis/ast/visitors/index.js.map +1 -0
  311. package/dist/plugins/discovery/DiscoveryPlugin.d.ts +42 -10
  312. package/dist/plugins/discovery/DiscoveryPlugin.d.ts.map +1 -1
  313. package/dist/plugins/discovery/DiscoveryPlugin.js +17 -1
  314. package/dist/plugins/discovery/DiscoveryPlugin.js.map +1 -0
  315. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
  316. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
  317. package/dist/plugins/discovery/MonorepoServiceDiscovery.js.map +1 -0
  318. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
  319. package/dist/plugins/discovery/SimpleProjectDiscovery.js +3 -2
  320. package/dist/plugins/discovery/SimpleProjectDiscovery.js.map +1 -0
  321. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -1
  322. package/dist/plugins/discovery/WorkspaceDiscovery.js +3 -2
  323. package/dist/plugins/discovery/WorkspaceDiscovery.js.map +1 -0
  324. package/dist/plugins/discovery/resolveSourceEntrypoint.js +1 -0
  325. package/dist/plugins/discovery/resolveSourceEntrypoint.js.map +1 -0
  326. package/dist/plugins/discovery/workspaces/detector.js +1 -0
  327. package/dist/plugins/discovery/workspaces/detector.js.map +1 -0
  328. package/dist/plugins/discovery/workspaces/globResolver.js +1 -0
  329. package/dist/plugins/discovery/workspaces/globResolver.js.map +1 -0
  330. package/dist/plugins/discovery/workspaces/index.js +1 -0
  331. package/dist/plugins/discovery/workspaces/index.js.map +1 -0
  332. package/dist/plugins/discovery/workspaces/parsers.js +1 -0
  333. package/dist/plugins/discovery/workspaces/parsers.js.map +1 -0
  334. package/dist/plugins/enrichment/AliasTracker.js +3 -2
  335. package/dist/plugins/enrichment/AliasTracker.js.map +1 -0
  336. package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts.map +1 -1
  337. package/dist/plugins/enrichment/ArgumentParameterLinker.js +1 -1
  338. package/dist/plugins/enrichment/ArgumentParameterLinker.js.map +1 -0
  339. package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts.map +1 -1
  340. package/dist/plugins/enrichment/ClosureCaptureEnricher.js +1 -1
  341. package/dist/plugins/enrichment/ClosureCaptureEnricher.js.map +1 -0
  342. package/dist/plugins/enrichment/ExpressHandlerLinker.d.ts +21 -0
  343. package/dist/plugins/enrichment/ExpressHandlerLinker.d.ts.map +1 -0
  344. package/dist/plugins/enrichment/ExpressHandlerLinker.js +137 -0
  345. package/dist/plugins/enrichment/ExpressHandlerLinker.js.map +1 -0
  346. package/dist/plugins/enrichment/ExternalCallResolver.d.ts.map +1 -1
  347. package/dist/plugins/enrichment/ExternalCallResolver.js +1 -1
  348. package/dist/plugins/enrichment/ExternalCallResolver.js.map +1 -0
  349. package/dist/plugins/enrichment/FunctionCallResolver.d.ts +5 -0
  350. package/dist/plugins/enrichment/FunctionCallResolver.d.ts.map +1 -1
  351. package/dist/plugins/enrichment/FunctionCallResolver.js +11 -9
  352. package/dist/plugins/enrichment/FunctionCallResolver.js.map +1 -0
  353. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +2 -0
  354. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
  355. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +51 -13
  356. package/dist/plugins/enrichment/HTTPConnectionEnricher.js.map +1 -0
  357. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
  358. package/dist/plugins/enrichment/ImportExportLinker.js +1 -1
  359. package/dist/plugins/enrichment/ImportExportLinker.js.map +1 -0
  360. package/dist/plugins/enrichment/InstanceOfResolver.js +3 -2
  361. package/dist/plugins/enrichment/InstanceOfResolver.js.map +1 -0
  362. package/dist/plugins/enrichment/MethodCallResolver.d.ts +39 -1
  363. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
  364. package/dist/plugins/enrichment/MethodCallResolver.js +422 -11
  365. package/dist/plugins/enrichment/MethodCallResolver.js.map +1 -0
  366. package/dist/plugins/enrichment/MountPointResolver.d.ts +1 -1
  367. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
  368. package/dist/plugins/enrichment/MountPointResolver.js +7 -23
  369. package/dist/plugins/enrichment/MountPointResolver.js.map +1 -0
  370. package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts.map +1 -1
  371. package/dist/plugins/enrichment/NodejsBuiltinsResolver.js +2 -2
  372. package/dist/plugins/enrichment/NodejsBuiltinsResolver.js.map +1 -0
  373. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
  374. package/dist/plugins/enrichment/PrefixEvaluator.js +5 -4
  375. package/dist/plugins/enrichment/PrefixEvaluator.js.map +1 -0
  376. package/dist/plugins/enrichment/RejectionPropagationEnricher.d.ts +30 -0
  377. package/dist/plugins/enrichment/RejectionPropagationEnricher.d.ts.map +1 -0
  378. package/dist/plugins/enrichment/RejectionPropagationEnricher.js +190 -0
  379. package/dist/plugins/enrichment/RejectionPropagationEnricher.js.map +1 -0
  380. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
  381. package/dist/plugins/enrichment/RustFFIEnricher.js +1 -1
  382. package/dist/plugins/enrichment/RustFFIEnricher.js.map +1 -0
  383. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +1 -1
  384. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
  385. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +4 -3
  386. package/dist/plugins/enrichment/ValueDomainAnalyzer.js.map +1 -0
  387. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts +3 -1
  388. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
  389. package/dist/plugins/indexing/IncrementalModuleIndexer.js +22 -29
  390. package/dist/plugins/indexing/IncrementalModuleIndexer.js.map +1 -0
  391. package/dist/plugins/indexing/JSModuleIndexer.d.ts +3 -1
  392. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
  393. package/dist/plugins/indexing/JSModuleIndexer.js +22 -31
  394. package/dist/plugins/indexing/JSModuleIndexer.js.map +1 -0
  395. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
  396. package/dist/plugins/indexing/RustModuleIndexer.js +11 -5
  397. package/dist/plugins/indexing/RustModuleIndexer.js.map +1 -0
  398. package/dist/plugins/validation/BrokenImportValidator.d.ts.map +1 -1
  399. package/dist/plugins/validation/BrokenImportValidator.js +3 -3
  400. package/dist/plugins/validation/BrokenImportValidator.js.map +1 -0
  401. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
  402. package/dist/plugins/validation/CallResolverValidator.js +3 -3
  403. package/dist/plugins/validation/CallResolverValidator.js.map +1 -0
  404. package/dist/plugins/validation/DataFlowValidator.js +2 -1
  405. package/dist/plugins/validation/DataFlowValidator.js.map +1 -0
  406. package/dist/plugins/validation/EvalBanValidator.js +2 -1
  407. package/dist/plugins/validation/EvalBanValidator.js.map +1 -0
  408. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
  409. package/dist/plugins/validation/GraphConnectivityValidator.js +2 -1
  410. package/dist/plugins/validation/GraphConnectivityValidator.js.map +1 -0
  411. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
  412. package/dist/plugins/validation/SQLInjectionValidator.js +4 -2
  413. package/dist/plugins/validation/SQLInjectionValidator.js.map +1 -0
  414. package/dist/plugins/validation/ShadowingDetector.js +2 -1
  415. package/dist/plugins/validation/ShadowingDetector.js.map +1 -0
  416. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
  417. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +3 -3
  418. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js.map +1 -0
  419. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
  420. package/dist/plugins/vcs/GitPlugin.js +13 -6
  421. package/dist/plugins/vcs/GitPlugin.js.map +1 -0
  422. package/dist/plugins/vcs/VCSPlugin.js +1 -0
  423. package/dist/plugins/vcs/VCSPlugin.js.map +1 -0
  424. package/dist/plugins/vcs/index.js +1 -0
  425. package/dist/plugins/vcs/index.js.map +1 -0
  426. package/dist/queries/findCallsInFunction.d.ts +1 -1
  427. package/dist/queries/findCallsInFunction.d.ts.map +1 -1
  428. package/dist/queries/findCallsInFunction.js +3 -2
  429. package/dist/queries/findCallsInFunction.js.map +1 -0
  430. package/dist/queries/findContainingFunction.d.ts +1 -1
  431. package/dist/queries/findContainingFunction.d.ts.map +1 -1
  432. package/dist/queries/findContainingFunction.js +1 -0
  433. package/dist/queries/findContainingFunction.js.map +1 -0
  434. package/dist/queries/index.js +1 -0
  435. package/dist/queries/index.js.map +1 -0
  436. package/dist/queries/traceValues.d.ts.map +1 -1
  437. package/dist/queries/traceValues.js +1 -0
  438. package/dist/queries/traceValues.js.map +1 -0
  439. package/dist/queries/types.js +1 -0
  440. package/dist/queries/types.js.map +1 -0
  441. package/dist/schema/GraphSchemaExtractor.js +1 -0
  442. package/dist/schema/GraphSchemaExtractor.js.map +1 -0
  443. package/dist/schema/InterfaceSchemaExtractor.js +1 -0
  444. package/dist/schema/InterfaceSchemaExtractor.js.map +1 -0
  445. package/dist/schema/index.js +1 -0
  446. package/dist/schema/index.js.map +1 -0
  447. package/dist/storage/backends/RFDBServerBackend.d.ts +25 -1
  448. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
  449. package/dist/storage/backends/RFDBServerBackend.js +100 -22
  450. package/dist/storage/backends/RFDBServerBackend.js.map +1 -0
  451. package/dist/storage/backends/typeValidation.d.ts.map +1 -1
  452. package/dist/storage/backends/typeValidation.js +3 -0
  453. package/dist/storage/backends/typeValidation.js.map +1 -0
  454. package/dist/utils/findRfdbBinary.js +1 -0
  455. package/dist/utils/findRfdbBinary.js.map +1 -0
  456. package/dist/utils/moduleResolution.d.ts +134 -0
  457. package/dist/utils/moduleResolution.d.ts.map +1 -0
  458. package/dist/utils/moduleResolution.js +164 -0
  459. package/dist/utils/moduleResolution.js.map +1 -0
  460. package/dist/validation/PathValidator.d.ts.map +1 -1
  461. package/dist/validation/PathValidator.js +1 -0
  462. package/dist/validation/PathValidator.js.map +1 -0
  463. package/package.json +4 -3
  464. package/src/Orchestrator.ts +371 -41
  465. package/src/api/GraphAPI.ts +4 -2
  466. package/src/api/GuaranteeAPI.ts +3 -2
  467. package/src/config/ConfigLoader.ts +121 -3
  468. package/src/config/index.ts +7 -1
  469. package/src/core/ASTWorker.ts +8 -20
  470. package/src/core/ASTWorkerPool.ts +1 -1
  471. package/src/core/CoverageAnalyzer.ts +2 -2
  472. package/src/core/FileNodeManager.ts +3 -2
  473. package/src/core/GuaranteeManager.ts +1 -1
  474. package/src/core/IncrementalReanalyzer.ts +6 -3
  475. package/src/core/NodeFactory.ts +34 -1
  476. package/src/core/WorkerPool.ts +2 -1
  477. package/src/core/nodes/NodeKind.ts +11 -0
  478. package/src/core/nodes/PluginNode.ts +144 -0
  479. package/src/core/nodes/TypeNode.ts +1 -1
  480. package/src/core/nodes/index.ts +4 -0
  481. package/src/core/toposort.ts +160 -0
  482. package/src/diagnostics/DiagnosticCollector.ts +8 -1
  483. package/src/diagnostics/DiagnosticReporter.ts +87 -16
  484. package/src/diagnostics/categories.ts +104 -0
  485. package/src/diagnostics/index.ts +14 -0
  486. package/src/errors/GrafemaError.ts +58 -0
  487. package/src/index.ts +53 -9
  488. package/src/instructions/index.ts +21 -0
  489. package/src/instructions/onboarding.md +121 -0
  490. package/src/logging/Logger.ts +155 -4
  491. package/src/plugins/analysis/DatabaseAnalyzer.ts +22 -15
  492. package/src/plugins/analysis/ExpressAnalyzer.ts +30 -18
  493. package/src/plugins/analysis/ExpressResponseAnalyzer.ts +72 -88
  494. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +54 -39
  495. package/src/plugins/analysis/FetchAnalyzer.ts +165 -113
  496. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +6 -7
  497. package/src/plugins/analysis/JSASTAnalyzer.ts +1122 -487
  498. package/src/plugins/analysis/ReactAnalyzer.ts +27 -20
  499. package/src/plugins/analysis/RustAnalyzer.ts +41 -27
  500. package/src/plugins/analysis/SQLiteAnalyzer.ts +18 -8
  501. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +38 -34
  502. package/src/plugins/analysis/SocketIOAnalyzer.ts +30 -15
  503. package/src/plugins/analysis/SystemDbAnalyzer.ts +24 -13
  504. package/src/plugins/analysis/ast/ExpressionEvaluator.ts +1 -3
  505. package/src/plugins/analysis/ast/GraphBuilder.ts +532 -66
  506. package/src/plugins/analysis/ast/types.ts +200 -2
  507. package/src/plugins/analysis/ast/utils/babelTraverse.ts +74 -0
  508. package/src/plugins/analysis/ast/utils/createParameterNodes.ts +1 -1
  509. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +7 -2
  510. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +163 -15
  511. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +249 -3
  512. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +9 -4
  513. package/src/plugins/analysis/ast/visitors/PropertyAccessVisitor.ts +342 -0
  514. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +2 -3
  515. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +1 -27
  516. package/src/plugins/analysis/ast/visitors/index.ts +2 -0
  517. package/src/plugins/discovery/DiscoveryPlugin.ts +42 -11
  518. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +2 -2
  519. package/src/plugins/discovery/SimpleProjectDiscovery.ts +2 -2
  520. package/src/plugins/discovery/WorkspaceDiscovery.ts +2 -2
  521. package/src/plugins/discovery/workspaces/globResolver.ts +1 -1
  522. package/src/plugins/enrichment/AliasTracker.ts +2 -2
  523. package/src/plugins/enrichment/ArgumentParameterLinker.ts +0 -1
  524. package/src/plugins/enrichment/ClosureCaptureEnricher.ts +0 -1
  525. package/src/plugins/enrichment/ExpressHandlerLinker.ts +178 -0
  526. package/src/plugins/enrichment/ExternalCallResolver.ts +0 -1
  527. package/src/plugins/enrichment/FunctionCallResolver.ts +10 -15
  528. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +65 -14
  529. package/src/plugins/enrichment/ImportExportLinker.ts +0 -1
  530. package/src/plugins/enrichment/InstanceOfResolver.ts +2 -2
  531. package/src/plugins/enrichment/MethodCallResolver.ts +526 -12
  532. package/src/plugins/enrichment/MountPointResolver.ts +6 -24
  533. package/src/plugins/enrichment/NodejsBuiltinsResolver.ts +1 -2
  534. package/src/plugins/enrichment/PrefixEvaluator.ts +4 -4
  535. package/src/plugins/enrichment/RejectionPropagationEnricher.ts +253 -0
  536. package/src/plugins/enrichment/RustFFIEnricher.ts +0 -1
  537. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +3 -3
  538. package/src/plugins/indexing/IncrementalModuleIndexer.ts +24 -30
  539. package/src/plugins/indexing/JSModuleIndexer.ts +21 -22
  540. package/src/plugins/indexing/RustModuleIndexer.ts +10 -5
  541. package/src/plugins/validation/BrokenImportValidator.ts +2 -3
  542. package/src/plugins/validation/CallResolverValidator.ts +2 -3
  543. package/src/plugins/validation/DataFlowValidator.ts +1 -1
  544. package/src/plugins/validation/EvalBanValidator.ts +1 -1
  545. package/src/plugins/validation/GraphConnectivityValidator.ts +1 -9
  546. package/src/plugins/validation/SQLInjectionValidator.ts +3 -2
  547. package/src/plugins/validation/ShadowingDetector.ts +1 -1
  548. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +2 -3
  549. package/src/plugins/vcs/GitPlugin.ts +12 -6
  550. package/src/queries/findCallsInFunction.ts +4 -4
  551. package/src/queries/findContainingFunction.ts +1 -1
  552. package/src/queries/traceValues.ts +0 -1
  553. package/src/storage/backends/RFDBServerBackend.ts +115 -25
  554. package/src/storage/backends/typeValidation.ts +2 -0
  555. package/src/utils/moduleResolution.ts +244 -0
  556. package/src/validation/PathValidator.ts +0 -8
  557. package/src/plugins/validation/NodeCreationValidator.ts +0 -554
@@ -0,0 +1,121 @@
1
+ # Grafema Project Onboarding
2
+
3
+ ## Goal
4
+ Study the target project and create a `.grafema/config.yaml` that correctly
5
+ describes its services, entry points, and analysis configuration.
6
+
7
+ ## Prerequisites
8
+ - The project directory exists and contains source code
9
+ - `.grafema/` directory exists (run `grafema init` if not)
10
+
11
+ ## Step 1: Initial Reconnaissance
12
+
13
+ Use `read_project_structure` to get the directory tree.
14
+
15
+ Look for:
16
+ - `package.json` in root and subdirectories (indicates JS/TS packages)
17
+ - `pnpm-workspace.yaml`, `lerna.json`, root `package.json` with `workspaces`
18
+ field (workspace/monorepo indicators)
19
+ - `tsconfig.json` files (TypeScript project)
20
+ - `Dockerfile`, `docker-compose.yml`, `k8s/`, `apps.json` (deployment configs
21
+ that may reveal service boundaries)
22
+ - Directories named `apps/`, `packages/`, `services/`, `pkg/`, `modules/`
23
+ (common monorepo structures)
24
+
25
+ ## Step 2: Identify Services
26
+
27
+ A "service" in Grafema is an independently analyzable unit of code with its
28
+ own entry point. Typically:
29
+ - A standalone application (API server, web app, CLI tool)
30
+ - A package in a monorepo that other packages depend on
31
+ - A microservice in a deployment configuration
32
+
33
+ For each potential service, determine:
34
+ 1. **Name** — human-readable identifier (e.g., "backend", "dashboard")
35
+ 2. **Path** — directory path relative to project root
36
+ 3. **Entry point** — the main source file (prefer TypeScript source over
37
+ compiled output)
38
+
39
+ ### How to find entry points
40
+ Check in order:
41
+ 1. `package.json` "source" field (TypeScript source entry)
42
+ 2. `package.json` "main" field, but look for `.ts` equivalent in `src/`
43
+ 3. Common patterns: `src/index.ts`, `src/main.ts`, `src/app.ts`,
44
+ `src/server.ts`, `index.ts`
45
+ 4. For React apps: `src/App.tsx`, `src/index.tsx`
46
+ 5. Check `bin` field in package.json for CLI tools
47
+
48
+ ### When to ask the user
49
+ - "I found [X] that looks like [description]. Should I include it as a
50
+ service?"
51
+ - "This directory has multiple potential entry points: [list].
52
+ Which should I use?"
53
+ - "I found deployment configuration mentioning services not visible in
54
+ the code structure. Should I investigate?"
55
+
56
+ ## Step 3: Run Auto-Discovery (Optional)
57
+
58
+ Use `discover_services` to see what Grafema's built-in detection finds.
59
+ Compare with your own findings from Steps 1-2. Note discrepancies —
60
+ auto-discovery may miss services or misidentify entry points.
61
+
62
+ ## Step 4: Configure Plugins
63
+
64
+ Default plugins work for most JS/TS projects. Adjust if:
65
+ - Project uses specific frameworks (Express, React, Socket.IO) — ensure
66
+ corresponding analyzers are enabled
67
+ - Project has Rust components — add `RustModuleIndexer` and `RustAnalyzer`
68
+ - Project has unusual file patterns — configure `include`/`exclude`
69
+
70
+ Default plugin list (reference only — omit from config to use defaults):
71
+ indexing: [JSModuleIndexer]
72
+ analysis: [JSASTAnalyzer, ExpressRouteAnalyzer, ExpressResponseAnalyzer,
73
+ SocketIOAnalyzer, DatabaseAnalyzer, FetchAnalyzer, ServiceLayerAnalyzer]
74
+ enrichment: [MethodCallResolver, ArgumentParameterLinker, AliasTracker,
75
+ ClosureCaptureEnricher, RejectionPropagationEnricher, ValueDomainAnalyzer,
76
+ MountPointResolver, ExpressHandlerLinker, PrefixEvaluator,
77
+ ImportExportLinker, HTTPConnectionEnricher]
78
+ validation: [GraphConnectivityValidator, DataFlowValidator, EvalBanValidator,
79
+ CallResolverValidator, SQLInjectionValidator, ShadowingDetector,
80
+ TypeScriptDeadCodeValidator, BrokenImportValidator]
81
+
82
+ ## Step 5: Write Configuration
83
+
84
+ Use `write_config` to save the discovered configuration.
85
+
86
+ The config should include:
87
+ - `services` array with all confirmed services (name, path, optional entryPoint)
88
+ - `plugins` section (only if overriding defaults)
89
+ - `include`/`exclude` patterns (only if needed)
90
+ - `workspace.roots` (for multi-root workspaces only)
91
+
92
+ ## Step 6: Verify
93
+
94
+ Run `analyze_project` to build the graph. Then check:
95
+ - `get_stats` — are node/edge counts reasonable for the project size?
96
+ - `get_coverage` — are the expected files analyzed?
97
+
98
+ If coverage is low or results are unexpected, iterate:
99
+ revisit services, entry points, or include/exclude patterns.
100
+
101
+ ## Common Patterns
102
+
103
+ ### Monorepo with workspaces
104
+ Look for `pnpm-workspace.yaml` or `workspaces` in root `package.json`.
105
+ Each workspace package is typically a service. Use `read_project_structure`
106
+ with depth=2 to see the package layout.
107
+
108
+ ### Legacy project with multiple entry points
109
+ Look for `scripts` in `package.json`, `bin` field, or multiple files
110
+ in `src/` that look like entry points (contain `app.listen()`,
111
+ `createServer()`, `express()`).
112
+
113
+ ### Microservices with shared deployment
114
+ Look for `docker-compose.yml`, Kubernetes configs, or similar
115
+ deployment manifests that list services. Cross-reference with
116
+ code directories.
117
+
118
+ ### Single-package project
119
+ If there is only one `package.json` at the root and no monorepo
120
+ structure, the project is likely a single service. The service path
121
+ is `.` (root), and the entry point is determined from `package.json`.
@@ -4,14 +4,20 @@
4
4
  * Features:
5
5
  * - 5 log levels: silent, errors, warnings, info, debug
6
6
  * - Context support for structured logging
7
- * - No external dependencies
7
+ * - Console and file output (or both via MultiLogger)
8
8
  * - Safe handling of circular references
9
9
  *
10
10
  * Usage:
11
11
  * const logger = createLogger('info');
12
12
  * logger.info('Processing files', { count: 150 });
13
+ *
14
+ * // Write logs to file (REG-199):
15
+ * const logger = createLogger('info', { logFile: '.grafema/analysis.log' });
13
16
  */
14
17
 
18
+ import { createWriteStream, writeFileSync, mkdirSync, accessSync, statSync, constants, type WriteStream } from 'fs';
19
+ import { dirname, resolve } from 'path';
20
+
15
21
  /**
16
22
  * Log level type
17
23
  */
@@ -145,8 +151,153 @@ export class ConsoleLogger implements Logger {
145
151
  }
146
152
 
147
153
  /**
148
- * Create a Logger instance with the specified log level
154
+ * File-based Logger implementation (REG-199)
155
+ *
156
+ * Writes log messages to a file with ISO timestamps using a write stream
157
+ * (non-blocking I/O). File is truncated on construction (overwritten each run).
158
+ * Parent directories are created automatically.
159
+ *
160
+ * Validates path on construction — throws if the directory is not writable
161
+ * or the path points to a directory.
162
+ */
163
+ export class FileLogger implements Logger {
164
+ private readonly priority: number;
165
+ private readonly stream: WriteStream;
166
+
167
+ constructor(logLevel: LogLevel, filePath: string) {
168
+ this.priority = LOG_LEVEL_PRIORITY[logLevel];
169
+ const resolvedPath = resolve(filePath);
170
+
171
+ // Create parent directories
172
+ const dir = dirname(resolvedPath);
173
+ mkdirSync(dir, { recursive: true });
174
+
175
+ // Validate: parent directory must be writable
176
+ try {
177
+ accessSync(dir, constants.W_OK);
178
+ } catch {
179
+ throw new Error(`Cannot write log file: directory '${dir}' is not writable`);
180
+ }
181
+
182
+ // Validate: path must not point to an existing directory
183
+ try {
184
+ if (statSync(resolvedPath).isDirectory()) {
185
+ throw new Error(`Cannot write log file: '${resolvedPath}' is a directory`);
186
+ }
187
+ } catch (e) {
188
+ // If stat throws, file doesn't exist yet — that's fine
189
+ if (e instanceof Error && e.message.includes('is a directory')) throw e;
190
+ }
191
+
192
+ // Truncate/create file synchronously (validates writeability),
193
+ // then open stream in append mode for non-blocking writes
194
+ writeFileSync(resolvedPath, '');
195
+ this.stream = createWriteStream(resolvedPath, { flags: 'a' });
196
+ this.stream.on('error', () => {
197
+ // Silently ignore stream errors — don't crash analysis for logging failures
198
+ });
199
+ }
200
+
201
+ private shouldLog(methodLevel: number): boolean {
202
+ return this.priority >= methodLevel;
203
+ }
204
+
205
+ private writeLine(level: string, message: string, context?: Record<string, unknown>): void {
206
+ const timestamp = new Date().toISOString();
207
+ const formatted = formatMessage(`${timestamp} [${level}] ${message}`, context);
208
+ this.stream.write(formatted + '\n');
209
+ }
210
+
211
+ error(message: string, context?: Record<string, unknown>): void {
212
+ if (!this.shouldLog(METHOD_LEVELS.error)) return;
213
+ this.writeLine('ERROR', message, context);
214
+ }
215
+
216
+ warn(message: string, context?: Record<string, unknown>): void {
217
+ if (!this.shouldLog(METHOD_LEVELS.warn)) return;
218
+ this.writeLine('WARN', message, context);
219
+ }
220
+
221
+ info(message: string, context?: Record<string, unknown>): void {
222
+ if (!this.shouldLog(METHOD_LEVELS.info)) return;
223
+ this.writeLine('INFO', message, context);
224
+ }
225
+
226
+ debug(message: string, context?: Record<string, unknown>): void {
227
+ if (!this.shouldLog(METHOD_LEVELS.debug)) return;
228
+ this.writeLine('DEBUG', message, context);
229
+ }
230
+
231
+ trace(message: string, context?: Record<string, unknown>): void {
232
+ if (!this.shouldLog(METHOD_LEVELS.trace)) return;
233
+ this.writeLine('TRACE', message, context);
234
+ }
235
+
236
+ /** Flush and close the write stream. Returns when all data is written. */
237
+ close(): Promise<void> {
238
+ return new Promise((resolve) => {
239
+ this.stream.end(resolve);
240
+ });
241
+ }
242
+ }
243
+
244
+ /**
245
+ * Multi-output Logger that delegates to multiple Logger instances.
246
+ *
247
+ * Each inner logger applies its own level filtering independently.
248
+ * Used to write to both console and file simultaneously.
249
+ */
250
+ export class MultiLogger implements Logger {
251
+ private readonly loggers: Logger[];
252
+
253
+ constructor(loggers: Logger[]) {
254
+ this.loggers = loggers;
255
+ }
256
+
257
+ error(message: string, context?: Record<string, unknown>): void {
258
+ for (const logger of this.loggers) logger.error(message, context);
259
+ }
260
+
261
+ warn(message: string, context?: Record<string, unknown>): void {
262
+ for (const logger of this.loggers) logger.warn(message, context);
263
+ }
264
+
265
+ info(message: string, context?: Record<string, unknown>): void {
266
+ for (const logger of this.loggers) logger.info(message, context);
267
+ }
268
+
269
+ debug(message: string, context?: Record<string, unknown>): void {
270
+ for (const logger of this.loggers) logger.debug(message, context);
271
+ }
272
+
273
+ trace(message: string, context?: Record<string, unknown>): void {
274
+ for (const logger of this.loggers) logger.trace(message, context);
275
+ }
276
+
277
+ /** Close all inner loggers that have a close() method (e.g., FileLogger). */
278
+ async close(): Promise<void> {
279
+ for (const logger of this.loggers) {
280
+ if (logger instanceof FileLogger) {
281
+ await logger.close();
282
+ }
283
+ }
284
+ }
285
+ }
286
+
287
+ /**
288
+ * Create a Logger instance with the specified log level.
289
+ *
290
+ * When logFile is specified, returns a MultiLogger that writes to both
291
+ * console and file. The file logger always captures at 'debug' level
292
+ * for complete post-mortem debugging, regardless of the console level.
149
293
  */
150
- export function createLogger(level: LogLevel): Logger {
151
- return new ConsoleLogger(level);
294
+ export function createLogger(level: LogLevel, options?: { logFile?: string }): Logger {
295
+ const consoleLogger = new ConsoleLogger(level);
296
+
297
+ if (options?.logFile) {
298
+ const fileLogger = new FileLogger('debug', options.logFile);
299
+ return new MultiLogger([consoleLogger, fileLogger]);
300
+ }
301
+
302
+ return consoleLogger;
152
303
  }
@@ -4,7 +4,8 @@
4
4
  */
5
5
 
6
6
  import { readFileSync } from 'fs';
7
- import { parse, ParserPlugin } from '@babel/parser';
7
+ import type { ParserPlugin } from '@babel/parser';
8
+ import { parse } from '@babel/parser';
8
9
  import traverseModule from '@babel/traverse';
9
10
  import type { CallExpression, Identifier } from '@babel/types';
10
11
  import type { NodePath } from '@babel/traverse';
@@ -12,9 +13,9 @@ import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
12
13
  import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
13
14
  import type { NodeRecord } from '@grafema/types';
14
15
  import { getLine, getColumn } from './ast/utils/location.js';
16
+ import { getTraverseFunction } from './ast/utils/babelTraverse.js';
15
17
 
16
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
- const traverse = (traverseModule as any).default || traverseModule;
18
+ const traverse = getTraverseFunction(traverseModule);
18
19
 
19
20
  /**
20
21
  * Database query node
@@ -47,7 +48,6 @@ export class DatabaseAnalyzer extends Plugin {
47
48
  return {
48
49
  name: 'DatabaseAnalyzer',
49
50
  phase: 'ANALYSIS',
50
- priority: 75, // После JSASTAnalyzer (80)
51
51
  creates: {
52
52
  nodes: ['db:query', 'db:table', 'db:connection'],
53
53
  edges: ['MAKES_QUERY', 'TARGETS', 'READS_FROM', 'WRITES_TO']
@@ -109,7 +109,8 @@ export class DatabaseAnalyzer extends Plugin {
109
109
  );
110
110
  } catch (error) {
111
111
  logger.error('Analysis failed', { error });
112
- return createErrorResult(error as Error);
112
+ const err = error instanceof Error ? error : new Error(String(error));
113
+ return createErrorResult(err);
113
114
  }
114
115
  }
115
116
 
@@ -234,30 +235,32 @@ export class DatabaseAnalyzer extends Plugin {
234
235
  }
235
236
  });
236
237
 
237
- // Создаём EXTERNAL_DATABASE ноду если есть хотя бы один query
238
+ // Collect all nodes and edges for batch operations
238
239
  if (databaseQueries.length > 0) {
239
240
  const databaseId = 'EXTERNAL_DATABASE:__database__';
241
+ const nodes: NodeRecord[] = [];
242
+ const edges: Array<{ type: string; src: string; dst: string }> = [];
240
243
 
241
244
  const existingDb = await graph.getNode(databaseId);
242
245
  if (!existingDb) {
243
- await graph.addNode({
246
+ nodes.push({
244
247
  id: databaseId,
245
248
  type: 'db:connection',
246
249
  name: '__database__'
247
250
  } as NodeRecord);
248
251
  }
249
252
 
250
- // Создаём DATABASE_QUERY ноды
253
+ // Prepare DATABASE_QUERY and TABLE nodes
251
254
  for (const query of databaseQueries) {
252
- await graph.addNode(query as unknown as NodeRecord);
255
+ nodes.push(query as unknown as NodeRecord);
253
256
  queriesCreated++;
254
257
 
255
- // Создаём TABLE ноду если есть tableName
258
+ // Prepare TABLE node if has tableName
256
259
  if (query.tableName) {
257
260
  const tableId = `TABLE:${query.tableName}`;
258
261
 
259
262
  if (!createdTables.has(tableId)) {
260
- await graph.addNode({
263
+ nodes.push({
261
264
  id: tableId,
262
265
  type: 'db:table',
263
266
  name: query.tableName
@@ -267,7 +270,7 @@ export class DatabaseAnalyzer extends Plugin {
267
270
  }
268
271
 
269
272
  // DATABASE_QUERY -> TARGETS -> TABLE
270
- await graph.addEdge({
273
+ edges.push({
271
274
  type: 'TARGETS',
272
275
  src: query.id,
273
276
  dst: tableId
@@ -279,7 +282,7 @@ export class DatabaseAnalyzer extends Plugin {
279
282
  const isReadOperation = query.operation === 'SELECT';
280
283
  const edgeType = isReadOperation ? 'READS_FROM' : 'WRITES_TO';
281
284
 
282
- await graph.addEdge({
285
+ edges.push({
283
286
  type: edgeType,
284
287
  src: query.id,
285
288
  dst: databaseId
@@ -290,7 +293,7 @@ export class DatabaseAnalyzer extends Plugin {
290
293
  const parentFunction = this.findParentFunction(query, functions);
291
294
 
292
295
  if (parentFunction) {
293
- await graph.addEdge({
296
+ edges.push({
294
297
  type: 'MAKES_QUERY',
295
298
  src: parentFunction.id,
296
299
  dst: query.id
@@ -298,8 +301,12 @@ export class DatabaseAnalyzer extends Plugin {
298
301
  edgesCreated++;
299
302
  }
300
303
  }
304
+
305
+ // Flush all nodes and edges
306
+ await graph.addNodes(nodes);
307
+ await graph.addEdges(edges);
301
308
  }
302
- } catch (error) {
309
+ } catch {
303
310
  // Silent - per-module errors shouldn't spam logs
304
311
  }
305
312
 
@@ -4,19 +4,20 @@
4
4
  */
5
5
 
6
6
  import { readFileSync } from 'fs';
7
- import { parse, ParserPlugin } from '@babel/parser';
7
+ import type { ParserPlugin } from '@babel/parser';
8
+ import { parse } from '@babel/parser';
8
9
  import traverseModule from '@babel/traverse';
9
10
  import { dirname, resolve, relative } from 'path';
10
- import type { CallExpression, ImportDeclaration, StringLiteral, TemplateLiteral, Identifier, MemberExpression } from '@babel/types';
11
+ import type { CallExpression, ImportDeclaration, Identifier, MemberExpression } from '@babel/types';
11
12
  import type { NodePath } from '@babel/traverse';
12
13
  import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
13
14
  import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
14
15
  import type { NodeRecord } from '@grafema/types';
15
16
  import { NetworkRequestNode } from '../../core/nodes/NetworkRequestNode.js';
16
17
  import { getLine, getColumn } from './ast/utils/location.js';
18
+ import { getTraverseFunction } from './ast/utils/babelTraverse.js';
17
19
 
18
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
- const traverse = (traverseModule as any).default || traverseModule;
20
+ const traverse = getTraverseFunction(traverseModule);
20
21
 
21
22
  /**
22
23
  * Endpoint node
@@ -71,7 +72,6 @@ export class ExpressAnalyzer extends Plugin {
71
72
  return {
72
73
  name: 'ExpressAnalyzer',
73
74
  phase: 'ANALYSIS',
74
- priority: 75, // После JSASTAnalyzer (80)
75
75
  creates: {
76
76
  nodes: ['http:route', 'express:mount'],
77
77
  edges: ['EXPOSES', 'MOUNTS', 'DEFINES']
@@ -86,9 +86,13 @@ export class ExpressAnalyzer extends Plugin {
86
86
  try {
87
87
  const { graph } = context;
88
88
 
89
+ // Batch arrays
90
+ const nodes: NodeRecord[] = [];
91
+ const edges: Array<{type: string; src: string; dst: string; [key: string]: unknown}> = [];
92
+
89
93
  // Create net:request singleton (GraphBackend handles deduplication)
90
94
  const networkNode = NetworkRequestNode.create();
91
- await graph.addNode(networkNode);
95
+ nodes.push(networkNode as unknown as NodeRecord);
92
96
 
93
97
  // Получаем все MODULE ноды
94
98
  const modules = await this.getModules(graph);
@@ -99,12 +103,16 @@ export class ExpressAnalyzer extends Plugin {
99
103
 
100
104
  // Анализируем каждый модуль
101
105
  for (const module of modules) {
102
- const result = await this.analyzeModule(module, graph, networkNode.id);
106
+ const result = await this.analyzeModule(module, graph, networkNode.id, nodes, edges);
103
107
  endpointsCreated += result.endpoints;
104
108
  mountPointsCreated += result.mountPoints;
105
109
  edgesCreated += result.edges;
106
110
  }
107
111
 
112
+ // Add all nodes and edges in batch
113
+ await graph.addNodes(nodes);
114
+ await graph.addEdges(edges);
115
+
108
116
  logger.info('Analysis complete', { endpointsCreated, mountPointsCreated });
109
117
 
110
118
  return createSuccessResult(
@@ -119,7 +127,8 @@ export class ExpressAnalyzer extends Plugin {
119
127
  );
120
128
  } catch (error) {
121
129
  logger.error('Analysis failed', { error });
122
- return createErrorResult(error as Error);
130
+ const err = error instanceof Error ? error : new Error(String(error));
131
+ return createErrorResult(err);
123
132
  }
124
133
  }
125
134
 
@@ -129,7 +138,9 @@ export class ExpressAnalyzer extends Plugin {
129
138
  private async analyzeModule(
130
139
  module: NodeRecord,
131
140
  graph: PluginContext['graph'],
132
- networkId: string
141
+ networkId: string,
142
+ nodes: NodeRecord[],
143
+ edges: Array<{type: string; src: string; dst: string; [key: string]: unknown}>
133
144
  ): Promise<AnalysisResult> {
134
145
  let endpointsCreated = 0;
135
146
  let mountPointsCreated = 0;
@@ -301,11 +312,11 @@ export class ExpressAnalyzer extends Plugin {
301
312
 
302
313
  // Создаём ENDPOINT ноды
303
314
  for (const endpoint of endpoints) {
304
- await graph.addNode(endpoint as unknown as NodeRecord);
315
+ nodes.push(endpoint as unknown as NodeRecord);
305
316
  endpointsCreated++;
306
317
 
307
318
  // MODULE --EXPOSES--> ENDPOINT
308
- await graph.addEdge({
319
+ edges.push({
309
320
  type: 'EXPOSES',
310
321
  src: module.id,
311
322
  dst: endpoint.id
@@ -313,7 +324,7 @@ export class ExpressAnalyzer extends Plugin {
313
324
  edgesCreated++;
314
325
 
315
326
  // ENDPOINT --INTERACTS_WITH--> EXTERNAL_NETWORK
316
- await graph.addEdge({
327
+ edges.push({
317
328
  type: 'INTERACTS_WITH',
318
329
  src: endpoint.id,
319
330
  dst: networkId
@@ -323,11 +334,11 @@ export class ExpressAnalyzer extends Plugin {
323
334
 
324
335
  // Создаём MOUNT_POINT ноды
325
336
  for (const mountPoint of mountPoints) {
326
- await graph.addNode(mountPoint as unknown as NodeRecord);
337
+ nodes.push(mountPoint as unknown as NodeRecord);
327
338
  mountPointsCreated++;
328
339
 
329
340
  // MODULE --DEFINES--> MOUNT_POINT
330
- await graph.addEdge({
341
+ edges.push({
331
342
  type: 'DEFINES',
332
343
  src: module.id,
333
344
  dst: mountPoint.id
@@ -335,10 +346,10 @@ export class ExpressAnalyzer extends Plugin {
335
346
  edgesCreated++;
336
347
 
337
348
  // Создаём MOUNTS рёбра
338
- const mountEdges = await this.createMountEdges(mountPoint, module, imports, graph);
349
+ const mountEdges = await this.createMountEdges(mountPoint, module, imports, graph, edges);
339
350
  edgesCreated += mountEdges;
340
351
  }
341
- } catch (error) {
352
+ } catch {
342
353
  // Silent - per-module errors shouldn't spam logs
343
354
  }
344
355
 
@@ -356,7 +367,8 @@ export class ExpressAnalyzer extends Plugin {
356
367
  mountPoint: MountPointNode,
357
368
  module: NodeRecord,
358
369
  imports: ImportInfo[],
359
- graph: PluginContext['graph']
370
+ graph: PluginContext['graph'],
371
+ edges: Array<{type: string; src: string; dst: string; [key: string]: unknown}>
360
372
  ): Promise<number> {
361
373
  let edgesCreated = 0;
362
374
 
@@ -401,7 +413,7 @@ export class ExpressAnalyzer extends Plugin {
401
413
  // Проверяем что модуль существует в графе
402
414
  const targetModule = await graph.getNode(targetModuleId);
403
415
  if (targetModule) {
404
- await graph.addEdge({
416
+ edges.push({
405
417
  type: 'MOUNTS',
406
418
  src: mountPoint.id,
407
419
  dst: targetModuleId