tree-sitter-analyzer 0.3.0__py3-none-any.whl → 0.4.0__py3-none-any.whl

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.

Potentially problematic release.


This version of tree-sitter-analyzer might be problematic. Click here for more details.

Files changed (51) hide show
  1. tree_sitter_analyzer/__init__.py +4 -3
  2. tree_sitter_analyzer/api.py +4 -2
  3. tree_sitter_analyzer/cli/__init__.py +3 -3
  4. tree_sitter_analyzer/cli/commands/advanced_command.py +1 -1
  5. tree_sitter_analyzer/cli/commands/base_command.py +1 -1
  6. tree_sitter_analyzer/cli/commands/partial_read_command.py +2 -2
  7. tree_sitter_analyzer/cli/commands/summary_command.py +2 -2
  8. tree_sitter_analyzer/cli/commands/table_command.py +11 -8
  9. tree_sitter_analyzer/cli_main.py +2 -1
  10. tree_sitter_analyzer/core/analysis_engine.py +33 -69
  11. tree_sitter_analyzer/core/engine.py +6 -4
  12. tree_sitter_analyzer/core/parser.py +1 -1
  13. tree_sitter_analyzer/core/query.py +16 -8
  14. tree_sitter_analyzer/encoding_utils.py +0 -2
  15. tree_sitter_analyzer/exceptions.py +23 -23
  16. tree_sitter_analyzer/file_handler.py +4 -11
  17. tree_sitter_analyzer/formatters/java_formatter.py +8 -4
  18. tree_sitter_analyzer/formatters/python_formatter.py +8 -4
  19. tree_sitter_analyzer/interfaces/cli.py +1 -1
  20. tree_sitter_analyzer/interfaces/cli_adapter.py +30 -9
  21. tree_sitter_analyzer/interfaces/mcp_adapter.py +43 -17
  22. tree_sitter_analyzer/interfaces/mcp_server.py +9 -9
  23. tree_sitter_analyzer/java_analyzer.py +20 -51
  24. tree_sitter_analyzer/language_loader.py +2 -2
  25. tree_sitter_analyzer/languages/java_plugin.py +86 -41
  26. tree_sitter_analyzer/{plugins → languages}/javascript_plugin.py +3 -3
  27. tree_sitter_analyzer/languages/python_plugin.py +16 -6
  28. tree_sitter_analyzer/mcp/resources/code_file_resource.py +0 -3
  29. tree_sitter_analyzer/mcp/resources/project_stats_resource.py +0 -5
  30. tree_sitter_analyzer/mcp/server.py +4 -4
  31. tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +63 -30
  32. tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +9 -4
  33. tree_sitter_analyzer/mcp/tools/table_format_tool.py +2 -2
  34. tree_sitter_analyzer/mcp/utils/__init__.py +10 -8
  35. tree_sitter_analyzer/models.py +1 -1
  36. tree_sitter_analyzer/output_manager.py +4 -10
  37. tree_sitter_analyzer/plugins/__init__.py +9 -62
  38. tree_sitter_analyzer/plugins/base.py +20 -1
  39. tree_sitter_analyzer/plugins/manager.py +29 -12
  40. tree_sitter_analyzer/query_loader.py +4 -1
  41. tree_sitter_analyzer/table_formatter.py +4 -1
  42. tree_sitter_analyzer/utils.py +6 -6
  43. {tree_sitter_analyzer-0.3.0.dist-info → tree_sitter_analyzer-0.4.0.dist-info}/METADATA +3 -3
  44. tree_sitter_analyzer-0.4.0.dist-info/RECORD +73 -0
  45. {tree_sitter_analyzer-0.3.0.dist-info → tree_sitter_analyzer-0.4.0.dist-info}/entry_points.txt +2 -1
  46. tree_sitter_analyzer/plugins/java_plugin.py +0 -608
  47. tree_sitter_analyzer/plugins/plugin_loader.py +0 -85
  48. tree_sitter_analyzer/plugins/python_plugin.py +0 -606
  49. tree_sitter_analyzer/plugins/registry.py +0 -374
  50. tree_sitter_analyzer-0.3.0.dist-info/RECORD +0 -77
  51. {tree_sitter_analyzer-0.3.0.dist-info → tree_sitter_analyzer-0.4.0.dist-info}/WHEEL +0 -0
@@ -21,7 +21,12 @@ from ..models import Import as ModelImport
21
21
  from ..models import Variable as ModelVariable
22
22
  from ..utils import log_debug, log_error, log_warning
23
23
 
24
- __all__ = ["LanguagePlugin", "ElementExtractor", "PluginRegistry", "plugin_registry"]
24
+ __all__ = [
25
+ "LanguagePlugin",
26
+ "ElementExtractor",
27
+ "DefaultExtractor",
28
+ "DefaultLanguagePlugin",
29
+ ]
25
30
 
26
31
 
27
32
  class ElementExtractor(ABC):
@@ -255,50 +260,7 @@ class DefaultExtractor(ElementExtractor):
255
260
  return None
256
261
 
257
262
 
258
- class PluginRegistry:
259
- """Registry for managing language plugins"""
260
-
261
- def __init__(self) -> None:
262
- self._plugins: dict[str, LanguagePlugin] = {}
263
- self._extension_map: dict[str, LanguagePlugin] = {}
264
- self._default_plugin = DefaultLanguagePlugin()
265
-
266
- def register_plugin(self, plugin: LanguagePlugin) -> None:
267
- """Register a language plugin"""
268
- try:
269
- language = plugin.get_language_name()
270
- self._plugins[language] = plugin
271
-
272
- # Register file extensions
273
- for ext in plugin.get_file_extensions():
274
- self._extension_map[ext] = plugin
275
-
276
- log_debug(f"Registered plugin for language: {language}")
277
- except Exception as e:
278
- log_error(f"Failed to register plugin: {e}")
279
-
280
- def get_plugin(self, language: str) -> LanguagePlugin | None:
281
- """Get plugin for specified language"""
282
- return self._plugins.get(language)
283
-
284
- def get_plugin_by_extension(self, extension: str) -> LanguagePlugin | None:
285
- """Get plugin for specified file extension"""
286
- return self._extension_map.get(extension)
287
-
288
- def get_plugin_for_file(self, file_path: str) -> LanguagePlugin:
289
- """Get appropriate plugin for a file"""
290
- for plugin in self._plugins.values():
291
- if plugin.is_applicable(file_path):
292
- return plugin
293
- return self._default_plugin
294
-
295
- def list_supported_languages(self) -> list[str]:
296
- """List all supported languages"""
297
- return list(self._plugins.keys())
298
-
299
- def list_supported_extensions(self) -> list[str]:
300
- """List all supported file extensions"""
301
- return list(self._extension_map.keys())
263
+ # Legacy PluginRegistry removed - now using PluginManager from .manager
302
264
 
303
265
 
304
266
  class DefaultLanguagePlugin(LanguagePlugin):
@@ -314,20 +276,5 @@ class DefaultLanguagePlugin(LanguagePlugin):
314
276
  return DefaultExtractor()
315
277
 
316
278
 
317
- # Global plugin registry instance
318
- plugin_registry = PluginRegistry()
319
-
320
-
321
- # Auto-load all plugins when the package is imported
322
- try:
323
- # from .plugin_loader import (
324
- # get_supported_extensions, # Not used currently
325
- # get_supported_languages, # Not used currently
326
- # load_all_plugins, # Not used currently
327
- # )
328
- pass
329
- # Plugins are automatically loaded when plugin_loader is imported
330
- except ImportError as e:
331
- from ..utils import log_warning
332
-
333
- log_warning(f"Could not load plugin loader: {e}")
279
+ # Legacy plugin registry removed - now using PluginManager
280
+ # from .manager import PluginManager
@@ -13,6 +13,9 @@ from typing import TYPE_CHECKING, Any
13
13
  if TYPE_CHECKING:
14
14
  import tree_sitter
15
15
 
16
+ from ..core.analysis_engine import AnalysisRequest
17
+ from ..models import AnalysisResult
18
+
16
19
  from ..models import Class as ModelClass
17
20
  from ..models import CodeElement
18
21
  from ..models import Function as ModelFunction
@@ -108,7 +111,7 @@ class ElementExtractor(ABC):
108
111
  Returns:
109
112
  List of all extracted code elements
110
113
  """
111
- elements = []
114
+ elements: list[CodeElement] = []
112
115
 
113
116
  try:
114
117
  elements.extend(self.extract_functions(tree, source_code))
@@ -159,6 +162,22 @@ class LanguagePlugin(ABC):
159
162
  """
160
163
  pass
161
164
 
165
+ @abstractmethod
166
+ async def analyze_file(
167
+ self, file_path: str, request: "AnalysisRequest"
168
+ ) -> "AnalysisResult":
169
+ """
170
+ Analyze a file and return analysis results.
171
+
172
+ Args:
173
+ file_path: Path to the file to analyze
174
+ request: Analysis request with configuration
175
+
176
+ Returns:
177
+ AnalysisResult containing extracted information
178
+ """
179
+ pass
180
+
162
181
  def is_applicable(self, file_path: str) -> bool:
163
182
  """
164
183
  Check if this plugin is applicable for the given file.
@@ -11,6 +11,7 @@ import importlib.metadata
11
11
  import logging
12
12
  import pkgutil
13
13
  from pathlib import Path
14
+ from typing import Any
14
15
 
15
16
  from ..utils import log_debug, log_error, log_info, log_warning
16
17
  from .base import LanguagePlugin
@@ -29,7 +30,7 @@ class PluginManager:
29
30
  - Error handling and fallback mechanisms
30
31
  """
31
32
 
32
- def __init__(self):
33
+ def __init__(self) -> None:
33
34
  """Initialize the plugin manager."""
34
35
  self._loaded_plugins: dict[str, LanguagePlugin] = {}
35
36
  self._plugin_classes: dict[str, type[LanguagePlugin]] = {}
@@ -52,13 +53,19 @@ class PluginManager:
52
53
  local_plugins = self._load_from_local_directory()
53
54
  loaded_plugins.extend(local_plugins)
54
55
 
55
- # Store loaded plugins
56
+ # Store loaded plugins and deduplicate by language
57
+ unique_plugins = {}
56
58
  for plugin in loaded_plugins:
57
59
  language = plugin.get_language_name()
58
- self._loaded_plugins[language] = plugin
60
+ if language not in unique_plugins:
61
+ unique_plugins[language] = plugin
62
+ self._loaded_plugins[language] = plugin
63
+ else:
64
+ log_debug(f"Skipping duplicate plugin for language: {language}")
59
65
 
60
- log_info(f"Successfully loaded {len(loaded_plugins)} plugins")
61
- return loaded_plugins
66
+ final_plugins = list(unique_plugins.values())
67
+ log_info(f"Successfully loaded {len(final_plugins)} plugins")
68
+ return final_plugins
62
69
 
63
70
  def _load_from_entry_points(self) -> list[LanguagePlugin]:
64
71
  """
@@ -74,12 +81,22 @@ class PluginManager:
74
81
  entry_points = importlib.metadata.entry_points()
75
82
 
76
83
  # Handle both old and new entry_points API
84
+ plugin_entries: Any = []
77
85
  if hasattr(entry_points, "select"):
78
86
  # New API (Python 3.10+)
79
87
  plugin_entries = entry_points.select(group=self._entry_point_group)
80
88
  else:
81
- # Old API
82
- plugin_entries = entry_points.get(self._entry_point_group, [])
89
+ # Old API - handle different return types
90
+ try:
91
+ # Try to get entry points, handling different API versions
92
+ if hasattr(entry_points, "get"):
93
+ result = entry_points.get(self._entry_point_group)
94
+ plugin_entries = list(result) if result else []
95
+ else:
96
+ plugin_entries = []
97
+ except (TypeError, AttributeError):
98
+ # Fallback for incompatible entry_points types
99
+ plugin_entries = []
83
100
 
84
101
  for entry_point in plugin_entries:
85
102
  try:
@@ -116,7 +133,7 @@ class PluginManager:
116
133
  Returns:
117
134
  List of plugin instances loaded from local directory
118
135
  """
119
- plugins = []
136
+ plugins: list[LanguagePlugin] = []
120
137
 
121
138
  try:
122
139
  # Get the languages directory path
@@ -171,7 +188,7 @@ class PluginManager:
171
188
 
172
189
  return plugins
173
190
 
174
- def _find_plugin_classes(self, module) -> list[type[LanguagePlugin]]:
191
+ def _find_plugin_classes(self, module: Any) -> list[type[LanguagePlugin]]:
175
192
  """
176
193
  Find LanguagePlugin classes in a module.
177
194
 
@@ -181,7 +198,7 @@ class PluginManager:
181
198
  Returns:
182
199
  List of LanguagePlugin classes found in the module
183
200
  """
184
- plugin_classes = []
201
+ plugin_classes: list[type[LanguagePlugin]] = []
185
202
 
186
203
  for attr_name in dir(module):
187
204
  attr = getattr(module, attr_name)
@@ -285,7 +302,7 @@ class PluginManager:
285
302
 
286
303
  return False
287
304
 
288
- def get_plugin_info(self, language: str) -> dict[str, any] | None:
305
+ def get_plugin_info(self, language: str) -> dict[str, Any] | None:
289
306
  """
290
307
  Get information about a specific plugin.
291
308
 
@@ -347,7 +364,7 @@ class PluginManager:
347
364
 
348
365
  extensions = plugin.get_file_extensions()
349
366
  if not isinstance(extensions, list):
350
- log_error("Plugin get_file_extensions() must return a list")
367
+ log_error("Plugin get_file_extensions() must return a list") # type: ignore[unreachable]
351
368
  return False
352
369
 
353
370
  extractor = plugin.create_extractor()
@@ -76,8 +76,11 @@ class QueryLoader:
76
76
  for attr_name in dir(module):
77
77
  if not attr_name.startswith("_"):
78
78
  attr_value = getattr(module, attr_name)
79
- if isinstance(attr_value, str | dict):
79
+ if isinstance(attr_value, str):
80
80
  queries[attr_name] = attr_value
81
+ elif isinstance(attr_value, dict):
82
+ # Convert dict to string representation for queries
83
+ queries[attr_name] = str(attr_value)
81
84
 
82
85
  self._loaded_queries[language] = queries
83
86
  self._query_modules[language] = module
@@ -383,6 +383,9 @@ class TableFormatter:
383
383
  if not isinstance(type_name, str):
384
384
  type_name = str(type_name)
385
385
 
386
+ # At this point, type_name is guaranteed to be a string
387
+ assert isinstance(type_name, str)
388
+
386
389
  type_mapping = {
387
390
  "String": "S",
388
391
  "int": "i",
@@ -462,7 +465,7 @@ class TableFormatter:
462
465
 
463
466
  def create_table_formatter(
464
467
  format_type: str, language: str = "java", include_javadoc: bool = False
465
- ):
468
+ ) -> "TableFormatter":
466
469
  """Create table formatter (using new factory)"""
467
470
  # Create TableFormatter directly (for JavaDoc support)
468
471
  return TableFormatter(format_type, language, include_javadoc)
@@ -50,7 +50,7 @@ class SafeStreamHandler(logging.StreamHandler):
50
50
  A StreamHandler that safely handles closed streams
51
51
  """
52
52
 
53
- def emit(self, record):
53
+ def emit(self, record: Any) -> None:
54
54
  """
55
55
  Emit a record, safely handling closed streams
56
56
  """
@@ -72,12 +72,12 @@ class SafeStreamHandler(logging.StreamHandler):
72
72
  self.handleError(record)
73
73
 
74
74
 
75
- def setup_safe_logging_shutdown():
75
+ def setup_safe_logging_shutdown() -> None:
76
76
  """
77
77
  Setup safe logging shutdown to prevent I/O errors
78
78
  """
79
79
 
80
- def cleanup_logging():
80
+ def cleanup_logging() -> None:
81
81
  """Clean up logging handlers safely"""
82
82
  try:
83
83
  # Get all loggers
@@ -178,7 +178,7 @@ class QuietMode:
178
178
  if self.enabled:
179
179
  self.old_level = logger.level
180
180
  logger.setLevel(logging.ERROR)
181
- return self # type: ignore
181
+ return self
182
182
 
183
183
  def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
184
184
  if self.enabled and self.old_level is not None:
@@ -222,7 +222,7 @@ perf_logger = create_performance_logger("tree_sitter_analyzer")
222
222
  def log_performance(
223
223
  operation: str,
224
224
  execution_time: float | None = None,
225
- details: dict | None = None,
225
+ details: dict[Any, Any] | str | None = None,
226
226
  ) -> None:
227
227
  """Log performance metrics"""
228
228
  try:
@@ -270,7 +270,7 @@ class LoggingContext:
270
270
  if self.enabled and self.level is not None:
271
271
  self.old_level = self.target_logger.level
272
272
  self.target_logger.setLevel(self.level)
273
- return self # type: ignore
273
+ return self
274
274
 
275
275
  def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
276
276
  if self.enabled and self.old_level is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tree-sitter-analyzer
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Extensible multi-language code analyzer framework using Tree-sitter with dynamic plugin architecture
5
5
  Project-URL: Homepage, https://github.com/aimasteracc/tree-sitter-analyzer
6
6
  Project-URL: Documentation, https://github.com/aimasteracc/tree-sitter-analyzer#readme
@@ -134,7 +134,7 @@ Description-Content-Type: text/markdown
134
134
 
135
135
  [![Python Version](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://python.org)
136
136
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
137
- [![Tests](https://img.shields.io/badge/tests-1283%20passed-brightgreen.svg)](#testing)
137
+ [![Tests](https://img.shields.io/badge/tests-1216%20passed-brightgreen.svg)](#testing)
138
138
 
139
139
  **Solve the LLM token limit problem for large code files.**
140
140
 
@@ -308,7 +308,7 @@ uv sync --extra all --extra mcp
308
308
 
309
309
  ## 🧪 Testing
310
310
 
311
- This project maintains high code quality with **1283 passing tests**.
311
+ This project maintains high code quality with **1216 passing tests**.
312
312
 
313
313
  ```bash
314
314
  # Run tests
@@ -0,0 +1,73 @@
1
+ tree_sitter_analyzer/__init__.py,sha256=9B6-aaRuPkRNKZXWPtiAKsUvAMP85D4IIQTGKy5GWvQ,3137
2
+ tree_sitter_analyzer/__main__.py,sha256=zlzSTDNKSOs7koUVJc_yCNilrOpF80yS01Tvny6UBi8,281
3
+ tree_sitter_analyzer/api.py,sha256=naRtGuZ27AIVfn6Rid0zQcHDI71UpO9Nh4NQM9JyD3c,16954
4
+ tree_sitter_analyzer/cli_main.py,sha256=kSCGMJS6hYR5sPYZU1KVO-ZyLseKt_uY4PAuIpvLVVU,9350
5
+ tree_sitter_analyzer/encoding_utils.py,sha256=Mmjz-C7J0lQDQhosJd7YHIbu8VAcJ_NYGBxgmL7KN3Q,14382
6
+ tree_sitter_analyzer/exceptions.py,sha256=PxQzmkwbaK_8JneWNniKNgBIjOwrOW-yYbj5pmQgvRs,9772
7
+ tree_sitter_analyzer/file_handler.py,sha256=WJqLiH98yCnNJX1sDM1ckPSJ8JKDW-h0eH7M0Ysllzg,6870
8
+ tree_sitter_analyzer/java_analyzer.py,sha256=eqg0qgptiEEBNcPHCHfiU4PEtpG7Nm2By9EjEKJstHo,6731
9
+ tree_sitter_analyzer/language_detector.py,sha256=EOwuraMtv9hW8xUU2hoD2-zlyhOStAadAXJ4EStiH6I,12142
10
+ tree_sitter_analyzer/language_loader.py,sha256=P1vOa9NR_iVCpawpjziP1uQTX1uL6bgzTb6F9tw4pAc,7900
11
+ tree_sitter_analyzer/models.py,sha256=a0r3mqiTNm5yyZ_q81KRakr_cH7qQZ6e0neWjWPrW18,16094
12
+ tree_sitter_analyzer/output_manager.py,sha256=J1h2sFMEc6YMzmOdY48uZxQbVfAP97H3D9aiGy8BF_U,8210
13
+ tree_sitter_analyzer/query_loader.py,sha256=oIjsgVOxXEhgET7B-SnCbOIx1D0S1KWaCxCq5C9dyxc,9904
14
+ tree_sitter_analyzer/table_formatter.py,sha256=hqmeEY4tuF6DAWDmpyd-7v4Hy0g8N0_SJ8d0gBNuiQg,17855
15
+ tree_sitter_analyzer/utils.py,sha256=B75-lozMxALATmYZE1guJPKgS8k2KeRjhyfg1EqSbio,7994
16
+ tree_sitter_analyzer/cli/__init__.py,sha256=O_3URpbdu5Ilb2-r48LjbZuWtOWQu_BhL3pa6C0G3Bk,871
17
+ tree_sitter_analyzer/cli/__main__.py,sha256=Xq8o8-0dPnMDU9WZqmqhzr98rx8rvoffTUHAkAwl-L8,218
18
+ tree_sitter_analyzer/cli/info_commands.py,sha256=fTW_rcEZuNB1iWSFPAp8CyhD_YUgvhAGtkvx64kYfvQ,4376
19
+ tree_sitter_analyzer/cli/commands/__init__.py,sha256=jpcpM1ptLuxLMBDUv1y_a87k8RAw1otFzeYpWtXvz3Y,671
20
+ tree_sitter_analyzer/cli/commands/advanced_command.py,sha256=xDZI4zKTMHNdf7fc_QN0eAQ8a5MnRb5DJ29ERLBDUQs,3424
21
+ tree_sitter_analyzer/cli/commands/base_command.py,sha256=dNg1JkWSPLHsjIF8yTtVUNk_b7FqM-hGRiHl47ztkqw,5787
22
+ tree_sitter_analyzer/cli/commands/default_command.py,sha256=41zPRy2ClcJVFGATx2KCDiMSRKa7vQvJi6R6LccjRrc,558
23
+ tree_sitter_analyzer/cli/commands/partial_read_command.py,sha256=R-dfWvVKxGdZyeieNjJAZQvgM13O3JZa6Fkmjc3sDqk,4684
24
+ tree_sitter_analyzer/cli/commands/query_command.py,sha256=v-DCDF4lGPhQO4X4QplGXFZEjXP9wbytH4shM1mhMj8,3187
25
+ tree_sitter_analyzer/cli/commands/structure_command.py,sha256=0iJwjOgtW838hXleXogWhbu6eQFfrLR1QgKe5PFBqvU,5220
26
+ tree_sitter_analyzer/cli/commands/summary_command.py,sha256=02WA3sOzfT83FVT6sW7nK04zVcZ9Qj_1S0WloqlTnFk,3602
27
+ tree_sitter_analyzer/cli/commands/table_command.py,sha256=eELDIGiEm_5FR2LarxNpjx5xKVTFXvwi-cBUZxx4R7w,9490
28
+ tree_sitter_analyzer/core/__init__.py,sha256=VlYOy1epW16vjaVd__knESewnU0sfXF9a4hjrFxiSEE,440
29
+ tree_sitter_analyzer/core/analysis_engine.py,sha256=QAVQJtTPNe8IoX33TtSGV5QapubyjB7H5Y7oWW_p2Sk,18740
30
+ tree_sitter_analyzer/core/cache_service.py,sha256=WeNawH6JyJKKBA-0rlJIRPmdErxkLQTQsbghHVkqmPo,9924
31
+ tree_sitter_analyzer/core/engine.py,sha256=6vdXcYfcHqv9tyJfT7iRPsdIIndf73wo71qT6Rt9Zow,18356
32
+ tree_sitter_analyzer/core/parser.py,sha256=qT3yIlTRdod4tf_2o1hU_B-GYGukyM2BtaFxzSoxois,9293
33
+ tree_sitter_analyzer/core/query.py,sha256=UhQxUmQitFobe2YM7Ifhi3X2WdHVb02KzeBunueYJ4I,16397
34
+ tree_sitter_analyzer/formatters/__init__.py,sha256=yVb4HF_4EEPRwTf3y3-vM2NllrhykG3zlvQhN-6dB4c,31
35
+ tree_sitter_analyzer/formatters/base_formatter.py,sha256=L5OD0KbK9udMJ03Iy1gUtbit0iUdL2zduf5-zVUaV4A,5930
36
+ tree_sitter_analyzer/formatters/formatter_factory.py,sha256=riwl62urKwMka8CqPhkFy7CgZP2YM3lckLQ4-boSA6s,2319
37
+ tree_sitter_analyzer/formatters/java_formatter.py,sha256=D2pKdtZTqBLiJQ8qI8g9jfMzVsId00PihEvdmz0qgwc,11331
38
+ tree_sitter_analyzer/formatters/python_formatter.py,sha256=JhrkAr73EVnY66dllYD93XERuilcfVSbGViAaUhlPaQ,10016
39
+ tree_sitter_analyzer/interfaces/__init__.py,sha256=OcT7eNIU0ZXvAeAXbhDqRG3puxn93HeSLqplwj6npTM,271
40
+ tree_sitter_analyzer/interfaces/cli.py,sha256=EsRcy0Wrt5BzR8RxBaXToH29XZoahR-fSLwGaMyf2LE,16840
41
+ tree_sitter_analyzer/interfaces/cli_adapter.py,sha256=u0geTSRo90sfU5EyrXAr7V-bPNPigCWtBEZk9j9qucQ,11405
42
+ tree_sitter_analyzer/interfaces/mcp_adapter.py,sha256=q4oPylICgCPXva-M0v4Geg0c4s4t_IPC7epH1yKGr_0,7145
43
+ tree_sitter_analyzer/interfaces/mcp_server.py,sha256=TvcmWWRxyWp5LrbDRGAeTZww_mmyarA8Mz9eL5xiQv0,16200
44
+ tree_sitter_analyzer/languages/__init__.py,sha256=VTXxJgVjHJAciLhX0zzXOS4EygZMtebeYUbi_0z6fGw,340
45
+ tree_sitter_analyzer/languages/java_plugin.py,sha256=6u50mYCtTUzwqvTEpTvahdscqsMo0nJOVxi5p4xRL3g,45902
46
+ tree_sitter_analyzer/languages/javascript_plugin.py,sha256=k14kHfi5II9MRTsVuy0NQq5l2KZYncCnM1Q6T1c5q_U,15844
47
+ tree_sitter_analyzer/languages/python_plugin.py,sha256=w-Tllw-5TuOgwLYymhVal8uO-A-hBwJsHv0LuDI9nEs,28776
48
+ tree_sitter_analyzer/mcp/__init__.py,sha256=76ZKgWbsXZWB8mNER2D0fNHdULPZhqqBJHi8R0uHDPE,721
49
+ tree_sitter_analyzer/mcp/server.py,sha256=chXNK7jA9SgEqZElKjej63pDvYJqN0cHBzZES0R818s,12426
50
+ tree_sitter_analyzer/mcp/resources/__init__.py,sha256=SWnK8liTQkuQXlVgyRP9mf5HzpqmqohShrC98xlNnDc,1389
51
+ tree_sitter_analyzer/mcp/resources/code_file_resource.py,sha256=POhQ1xPMiGBVVm6AfOQNKM29svDLvlGLA97ZPQgVoHw,6253
52
+ tree_sitter_analyzer/mcp/resources/project_stats_resource.py,sha256=uZrBI1oWZbPmNQP_cI4Q8hK4py6AqBztqKmv2B4UGOE,19203
53
+ tree_sitter_analyzer/mcp/tools/__init__.py,sha256=u7JrSLwE95y50mfjSus6HRdtdhkNbVrW8jP4AooawEU,762
54
+ tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py,sha256=njQxFS5507RolQR_nEJEnZVQMfs2MBEenWEhDYJC1_o,26343
55
+ tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py,sha256=mssed7bEfGeGxW4mOf7dg8BDS1oqHLolIBNX9DaZ3DM,8997
56
+ tree_sitter_analyzer/mcp/tools/base_tool.py,sha256=FVSMgKIliQ5EBVQEfjYwWeqzWt9OqOFDr3dyACIDxig,1210
57
+ tree_sitter_analyzer/mcp/tools/read_partial_tool.py,sha256=0Rb-jI2CfzN1PVeJZnkERaowm9Y8iFSZl8W-VIQQ8cI,10735
58
+ tree_sitter_analyzer/mcp/tools/table_format_tool.py,sha256=mydPcWazEIaF1IYEgmWTu2HAOVXVVb6s1-Pmcnnh6HE,14261
59
+ tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py,sha256=Wl4wZWHYbvcYKnFmdkEn7FTNSel_jlnpQCjfSuzYkEg,20785
60
+ tree_sitter_analyzer/mcp/utils/__init__.py,sha256=hibcoJc9PEetXqPIpvwHw1cpr1rabAm0QQaDZpxvA_g,2956
61
+ tree_sitter_analyzer/mcp/utils/error_handler.py,sha256=QgKqjUhe0QTCRrtoiuTxDMUt-eDRNclf1ToJtaCNoq8,17423
62
+ tree_sitter_analyzer/plugins/__init__.py,sha256=ITE9bTz7NO4axnn8g5Z-1_ydhSLT0RnY6Y1J9OhUP3E,10326
63
+ tree_sitter_analyzer/plugins/base.py,sha256=haHm66U9n0QDLjqP5PYd7sZWS30z4px0nInPF-bXHH8,16095
64
+ tree_sitter_analyzer/plugins/manager.py,sha256=PyEY3jeuCBpDVqguWhaAu7nzUZM17_pI6wml2e0Hamo,12535
65
+ tree_sitter_analyzer/queries/__init__.py,sha256=dwDDc7PCw_UWruxSeJ8uEBjY0O5uLDBI5YqyvBhbnN0,696
66
+ tree_sitter_analyzer/queries/java.py,sha256=eGbeu6UfTWsQ2oC5dvYMsQTH6GlT7mvhf9Mq2y52f2A,12536
67
+ tree_sitter_analyzer/queries/javascript.py,sha256=MFZgGGUTcujsG4fIMjQjaZoKezmpHsDGHBG2ZLBH1nQ,4010
68
+ tree_sitter_analyzer/queries/python.py,sha256=7-uOr8ZR7WC7iwbx8yeFfswYoNg6FwtdGXrnt6rGtm8,7708
69
+ tree_sitter_analyzer/queries/typescript.py,sha256=LJCfyntKFz7fHx1YG21DtdMC1nqRrrj3LkjydD2yDnk,6884
70
+ tree_sitter_analyzer-0.4.0.dist-info/METADATA,sha256=adZ8u-zh-coXjefPIKgDj0viEs4DAUxf3dugEh1hDuo,12976
71
+ tree_sitter_analyzer-0.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
72
+ tree_sitter_analyzer-0.4.0.dist-info/entry_points.txt,sha256=EA0Ow27x2SqNt2300sv70RTWxKRIxJzOhNPIVlez4NM,417
73
+ tree_sitter_analyzer-0.4.0.dist-info/RECORD,,
@@ -5,4 +5,5 @@ tree-sitter-analyzer = tree_sitter_analyzer.cli_main:main
5
5
 
6
6
  [tree_sitter_analyzer.plugins]
7
7
  java = tree_sitter_analyzer.languages.java_plugin:JavaPlugin
8
- python = tree_sitter_analyzer.plugins.python_plugin:PythonPlugin
8
+ javascript = tree_sitter_analyzer.languages.javascript_plugin:JavaScriptPlugin
9
+ python = tree_sitter_analyzer.languages.python_plugin:PythonPlugin