tree-sitter-analyzer 1.6.1.2__py3-none-any.whl → 1.6.1.4__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.

@@ -8,6 +8,9 @@ appropriate extensions based on content type, with security validation.
8
8
 
9
9
  import json
10
10
  import os
11
+ import tempfile
12
+ import threading
13
+ import time
11
14
  from pathlib import Path
12
15
  from typing import Any
13
16
 
@@ -22,6 +25,72 @@ class FileOutputManager:
22
25
  Manages file output for analysis results with automatic extension detection
23
26
  and security validation.
24
27
  """
28
+
29
+ # クラス変数で警告メッセージの重複を防ぐ(プロセス内のみ)
30
+ _warning_messages_shown = set()
31
+ # スレッド間の排他制御用ロック
32
+ _warning_lock = threading.Lock()
33
+
34
+ # プロセス間共有用のファイルベース重複防止
35
+ @staticmethod
36
+ def _get_warning_lock_file(warning_key: str) -> Path:
37
+ """警告メッセージ用のロックファイルパスを取得"""
38
+ temp_dir = Path(tempfile.gettempdir())
39
+ safe_key = warning_key.replace("/", "_").replace(":", "_").replace("\\", "_")
40
+ return temp_dir / f"tree_sitter_analyzer_warning_{safe_key}.lock"
41
+
42
+ @staticmethod
43
+ def _should_show_warning(warning_key: str, max_age_seconds: int = 300) -> bool:
44
+ """
45
+ プロセス間で警告表示の可否を判定
46
+
47
+ Args:
48
+ warning_key: 警告キー
49
+ max_age_seconds: ロックファイルの有効期間(秒)
50
+
51
+ Returns:
52
+ 警告を表示すべきかどうか
53
+ """
54
+ # スレッド間の排他制御
55
+ with FileOutputManager._warning_lock:
56
+ # プロセス内での重複チェック
57
+ if warning_key in FileOutputManager._warning_messages_shown:
58
+ return False
59
+
60
+ # プロセス間での重複チェック
61
+ lock_file = FileOutputManager._get_warning_lock_file(warning_key)
62
+
63
+ try:
64
+ # ロックファイルが存在し、有効期間内なら警告をスキップ
65
+ if lock_file.exists():
66
+ mtime = lock_file.stat().st_mtime
67
+ if time.time() - mtime < max_age_seconds:
68
+ FileOutputManager._warning_messages_shown.add(warning_key)
69
+ return False
70
+ else:
71
+ # 期限切れのロックファイルを削除
72
+ try:
73
+ lock_file.unlink()
74
+ except (OSError, FileNotFoundError):
75
+ pass
76
+
77
+ # ロックファイルを排他的に作成して警告表示権を獲得
78
+ # 'x'モードは、ファイルが既に存在する場合FileExistsErrorを発生させる
79
+ try:
80
+ with open(lock_file, 'x') as f:
81
+ f.write(str(time.time()))
82
+ FileOutputManager._warning_messages_shown.add(warning_key)
83
+ return True
84
+ except FileExistsError:
85
+ # 別のプロセスが先にロックを獲得した
86
+ FileOutputManager._warning_messages_shown.add(warning_key)
87
+ return False
88
+
89
+ except (OSError, IOError):
90
+ # ファイル操作に失敗した場合はフォールバック
91
+ # プロセス内のみの重複防止に戻る
92
+ FileOutputManager._warning_messages_shown.add(warning_key)
93
+ return True
25
94
 
26
95
  def __init__(self, project_root: str | None = None):
27
96
  """
@@ -51,7 +120,11 @@ class FileOutputManager:
51
120
 
52
121
  # Priority 3: Current working directory as fallback
53
122
  self._output_path = str(Path.cwd())
54
- logger.warning(f"Using current directory as output path: {self._output_path}")
123
+
124
+ # プロセス間で重複警告を防ぐ
125
+ warning_key = f"fallback_path:{self._output_path}"
126
+ if self._should_show_warning(warning_key):
127
+ logger.warning(f"Using current directory as output path: {self._output_path}")
55
128
 
56
129
  def get_output_path(self) -> str:
57
130
  """
@@ -308,6 +308,15 @@ class SearchCache:
308
308
  "word": params.get("word", False),
309
309
  "multiline": params.get("multiline", False),
310
310
  "max_filesize": params.get("max_filesize", ""),
311
+ # Include output format parameters in cache key
312
+ "total_only": params.get("total_only", False),
313
+ "count_only_matches": params.get("count_only_matches", False),
314
+ "summary_only": params.get("summary_only", False),
315
+ "group_by_file": params.get("group_by_file", False),
316
+ "optimize_paths": params.get("optimize_paths", False),
317
+ "max_count": params.get("max_count", None),
318
+ "context_before": params.get("context_before", None),
319
+ "context_after": params.get("context_after", None),
311
320
  }
312
321
 
313
322
  # Create deterministic key
@@ -14,191 +14,29 @@ from functools import wraps
14
14
  from pathlib import Path
15
15
  from typing import Any
16
16
 
17
+ # Import the new unified logging manager
18
+ from .logging_manager import get_logger_manager, SafeStreamHandler
19
+
17
20
 
18
- # Configure global logger
19
21
  def setup_logger(
20
22
  name: str = "tree_sitter_analyzer", level: int | str = logging.WARNING
21
23
  ) -> logging.Logger:
22
- """Setup unified logger for the project"""
23
- # Handle string level parameter
24
- if isinstance(level, str):
25
- level_upper = level.upper()
26
- if level_upper == "DEBUG":
27
- level = logging.DEBUG
28
- elif level_upper == "INFO":
29
- level = logging.INFO
30
- elif level_upper == "WARNING":
31
- level = logging.WARNING
32
- elif level_upper == "ERROR":
33
- level = logging.ERROR
34
- else:
35
- level = logging.WARNING # Default fallback
36
-
37
- # Get log level from environment variable (only if set and not empty)
38
- env_level = os.environ.get("LOG_LEVEL", "").upper()
39
- if env_level and env_level in ["DEBUG", "INFO", "WARNING", "ERROR"]:
40
- if env_level == "DEBUG":
41
- level = logging.DEBUG
42
- elif env_level == "INFO":
43
- level = logging.INFO
44
- elif env_level == "WARNING":
45
- level = logging.WARNING
46
- elif env_level == "ERROR":
47
- level = logging.ERROR
48
- # If env_level is empty or not recognized, use the passed level parameter
49
-
50
- logger = logging.getLogger(name)
51
-
52
- # Clear existing handlers if this is a test logger to ensure clean state
53
- if name.startswith("test_"):
54
- logger.handlers.clear()
55
-
56
- # Initialize file logging variables at function scope
57
- enable_file_log = (
58
- os.environ.get("TREE_SITTER_ANALYZER_ENABLE_FILE_LOG", "").lower() == "true"
59
- )
60
- file_log_level = level # Default to main logger level
61
-
62
- if not logger.handlers: # Avoid duplicate handlers
63
- # Create a safe handler that writes to stderr to avoid breaking MCP stdio
64
- handler = SafeStreamHandler()
65
- formatter = logging.Formatter(
66
- "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
67
- )
68
- handler.setFormatter(formatter)
69
- logger.addHandler(handler)
70
-
71
- # Optional file logging for debugging when launched by clients (e.g., Cursor)
72
- # This helps diagnose cases where stdio is captured by the client and logs are hidden.
73
- # Only enabled when TREE_SITTER_ANALYZER_ENABLE_FILE_LOG is set to 'true'
74
- if enable_file_log:
75
- try:
76
- # Determine log directory
77
- log_dir = os.environ.get("TREE_SITTER_ANALYZER_LOG_DIR")
78
- if log_dir:
79
- # Use specified directory
80
- log_path = Path(log_dir) / "tree_sitter_analyzer.log"
81
- # Ensure directory exists
82
- Path(log_dir).mkdir(parents=True, exist_ok=True)
83
- else:
84
- # Use system temporary directory
85
- temp_dir = tempfile.gettempdir()
86
- log_path = Path(temp_dir) / "tree_sitter_analyzer.log"
87
-
88
- # Determine file log level
89
- file_log_level_str = os.environ.get(
90
- "TREE_SITTER_ANALYZER_FILE_LOG_LEVEL", ""
91
- ).upper()
92
- if file_log_level_str and file_log_level_str in [
93
- "DEBUG",
94
- "INFO",
95
- "WARNING",
96
- "ERROR",
97
- ]:
98
- if file_log_level_str == "DEBUG":
99
- file_log_level = logging.DEBUG
100
- elif file_log_level_str == "INFO":
101
- file_log_level = logging.INFO
102
- elif file_log_level_str == "WARNING":
103
- file_log_level = logging.WARNING
104
- elif file_log_level_str == "ERROR":
105
- file_log_level = logging.ERROR
106
- else:
107
- # Use same level as main logger
108
- file_log_level = level
109
-
110
- file_handler = logging.FileHandler(str(log_path), encoding="utf-8")
111
- file_handler.setFormatter(formatter)
112
- file_handler.setLevel(file_log_level)
113
- logger.addHandler(file_handler)
114
-
115
- # Log the file location for debugging purposes
116
- if hasattr(sys, "stderr") and hasattr(sys.stderr, "write"):
117
- try:
118
- sys.stderr.write(
119
- f"[logging_setup] File logging enabled: {log_path}\n"
120
- )
121
- except Exception:
122
- ...
123
-
124
- except Exception as e:
125
- # Never let logging configuration break runtime behavior; log to stderr if possible
126
- if hasattr(sys, "stderr") and hasattr(sys.stderr, "write"):
127
- try:
128
- sys.stderr.write(
129
- f"[logging_setup] file handler init skipped: {e}\n"
130
- )
131
- except Exception:
132
- ...
133
-
134
- # Set the logger level to the minimum of main level and file log level
135
- # This ensures that all messages that should go to any handler are processed
136
- final_level = level
137
- if enable_file_log:
138
- # Use the minimum level to ensure all messages reach their intended handlers
139
- final_level = min(level, file_log_level)
140
-
141
- logger.setLevel(final_level)
142
-
143
- # For test loggers, ensure they don't inherit from parent and force level
144
- if logger.name.startswith("test_"):
145
- logger.propagate = False
146
- # Force the level setting for test loggers
147
- logger.level = level
148
-
149
- return logger
150
-
151
-
152
- class SafeStreamHandler(logging.StreamHandler):
153
24
  """
154
- A StreamHandler that safely handles closed streams
25
+ Setup unified logger for the project using LoggerManager
26
+
27
+ This function now delegates to the LoggerManager for unified logging
28
+ while maintaining backward compatibility with the existing API.
29
+
30
+ Args:
31
+ name: Logger name
32
+ level: Log level (string or int)
33
+
34
+ Returns:
35
+ Configured logger instance
155
36
  """
156
-
157
- def __init__(self, stream=None):
158
- # Default to sys.stderr to keep stdout clean for MCP stdio
159
- super().__init__(stream if stream is not None else sys.stderr)
160
-
161
- def emit(self, record: Any) -> None:
162
- """
163
- Emit a record, safely handling closed streams and pytest capture
164
- """
165
- try:
166
- # Check if stream is closed before writing
167
- if hasattr(self.stream, "closed") and self.stream.closed:
168
- return
169
-
170
- # Check if we can write to the stream
171
- if not hasattr(self.stream, "write"):
172
- return
173
-
174
- # Special handling for pytest capture scenarios
175
- # Check if this is a pytest capture stream that might be problematic
176
- stream_name = getattr(self.stream, "name", "")
177
- if stream_name is None or "pytest" in str(type(self.stream)).lower():
178
- # For pytest streams, be extra cautious
179
- try:
180
- # Just try to emit without any pre-checks
181
- super().emit(record)
182
- return
183
- except (ValueError, OSError, AttributeError, UnicodeError):
184
- return
185
-
186
- # Additional safety checks for stream validity for non-pytest streams
187
- try:
188
- # Test if we can actually write to the stream without flushing
189
- # Avoid flush() as it can cause "I/O operation on closed file" in pytest
190
- if hasattr(self.stream, "writable") and not self.stream.writable():
191
- return
192
- except (ValueError, OSError, AttributeError, UnicodeError):
193
- return
194
-
195
- super().emit(record)
196
- except (ValueError, OSError, AttributeError, UnicodeError):
197
- # Silently ignore I/O errors during shutdown or pytest capture
198
- pass
199
- except Exception:
200
- # For any other unexpected errors, silently ignore to prevent test failures
201
- pass
37
+ # Use the unified logger manager
38
+ logger_manager = get_logger_manager()
39
+ return logger_manager.get_logger(name, level)
202
40
 
203
41
 
204
42
  def setup_safe_logging_shutdown() -> None:
@@ -369,17 +207,18 @@ def safe_print(message: str | None, level: str = "info", quiet: bool = False) ->
369
207
 
370
208
 
371
209
  def create_performance_logger(name: str) -> logging.Logger:
372
- """Create performance-focused logger"""
373
- perf_logger = logging.getLogger(f"{name}.performance")
374
-
375
- if not perf_logger.handlers:
376
- handler = SafeStreamHandler()
377
- formatter = logging.Formatter("%(asctime)s - PERF - %(message)s")
378
- handler.setFormatter(formatter)
379
- perf_logger.addHandler(handler)
380
- perf_logger.setLevel(logging.DEBUG) # Change to DEBUG level
381
-
382
- return perf_logger
210
+ """
211
+ Create performance-focused logger using unified LoggerManager
212
+
213
+ Args:
214
+ name: Base name for the performance logger
215
+
216
+ Returns:
217
+ Configured performance logger
218
+ """
219
+ logger_manager = get_logger_manager()
220
+ perf_logger_name = f"{name}.performance"
221
+ return logger_manager.get_logger(perf_logger_name, logging.DEBUG)
383
222
 
384
223
 
385
224
  # Performance logger instance
@@ -402,7 +241,7 @@ def log_performance(
402
241
  else:
403
242
  detail_str = str(details)
404
243
  message += f" - {detail_str}"
405
- perf_logger.debug(message) # Change to DEBUG level
244
+ perf_logger.debug(message)
406
245
  except (ValueError, OSError) as e:
407
246
  if hasattr(sys, "stderr") and hasattr(sys.stderr, "write"):
408
247
  try:
@@ -412,18 +251,14 @@ def log_performance(
412
251
 
413
252
 
414
253
  def setup_performance_logger() -> logging.Logger:
415
- """Set up performance logging"""
416
- perf_logger = logging.getLogger("performance")
417
-
418
- # Add handler if not already configured
419
- if not perf_logger.handlers:
420
- handler = SafeStreamHandler()
421
- formatter = logging.Formatter("%(asctime)s - Performance - %(message)s")
422
- handler.setFormatter(formatter)
423
- perf_logger.addHandler(handler)
424
- perf_logger.setLevel(logging.INFO)
425
-
426
- return perf_logger
254
+ """
255
+ Set up performance logging (unified with create_performance_logger)
256
+
257
+ Returns:
258
+ Performance logger instance
259
+ """
260
+ # Delegate to the unified create_performance_logger
261
+ return create_performance_logger("performance")
427
262
 
428
263
 
429
264
  class LoggingContext:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tree-sitter-analyzer
3
- Version: 1.6.1.2
3
+ Version: 1.6.1.4
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
@@ -38,7 +38,7 @@ Requires-Dist: tree-sitter-cpp<0.25.0,>=0.23.4
38
38
  Requires-Dist: tree-sitter-java<0.25.0,>=0.23.5
39
39
  Requires-Dist: tree-sitter-javascript<0.25.0,>=0.23.1
40
40
  Requires-Dist: tree-sitter-python<0.25.0,>=0.23.6
41
- Requires-Dist: tree-sitter==0.24.0
41
+ Requires-Dist: tree-sitter>=0.25.0
42
42
  Provides-Extra: all
43
43
  Requires-Dist: anyio>=4.0.0; extra == 'all'
44
44
  Requires-Dist: black>=24.0.0; extra == 'all'
@@ -165,11 +165,11 @@ Description-Content-Type: text/markdown
165
165
 
166
166
  [![Python Version](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://python.org)
167
167
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
168
- [![Tests](https://img.shields.io/badge/tests-1893%20tests-brightgreen.svg)](#quality-assurance)
168
+ [![Tests](https://img.shields.io/badge/tests-1980%20tests-brightgreen.svg)](#quality-assurance)
169
169
  [![Coverage](https://img.shields.io/badge/coverage-71.48%25-green.svg)](#quality-assurance)
170
170
  [![Quality](https://img.shields.io/badge/quality-enterprise%20grade-blue.svg)](#quality-assurance)
171
171
  [![PyPI](https://img.shields.io/pypi/v/tree-sitter-analyzer.svg)](https://pypi.org/project/tree-sitter-analyzer/)
172
- [![Version](https://img.shields.io/badge/version-1.6.1.2-blue.svg)](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
172
+ [![Version](https://img.shields.io/badge/version-1.6.1.4-blue.svg)](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
173
173
  [![GitHub Stars](https://img.shields.io/github/stars/aimasteracc/tree-sitter-analyzer.svg?style=social)](https://github.com/aimasteracc/tree-sitter-analyzer)
174
174
 
175
175
  ## 🚀 Enterprise-Grade Code Analysis Tool for the AI Era
@@ -224,7 +224,7 @@ Tree-sitter Analyzer is an enterprise-grade code analysis tool designed for the
224
224
  - **More Languages** - Basic support for C/C++, Rust, Go
225
225
 
226
226
  ### 🏆 Production Ready
227
- - **1893 Tests** - Comprehensive test coverage, enterprise-grade quality assurance
227
+ - **1980 Tests** - Comprehensive test coverage, enterprise-grade quality assurance
228
228
  - **71.48% Coverage** - Comprehensive test suite
229
229
  - **Cross-Platform Support** - Full compatibility with Windows, macOS, Linux
230
230
  - **Continuous Maintenance** - Active development and community support
@@ -731,7 +731,7 @@ Powerful file discovery and content search based on fd and ripgrep:
731
731
  ## 🏆 Quality Assurance
732
732
 
733
733
  ### 📊 Quality Metrics
734
- - **1893 Tests** - Comprehensive test coverage ✅
734
+ - **1980 Tests** - Comprehensive test coverage ✅
735
735
  - **71.48% Code Coverage** - Comprehensive test suite
736
736
  - **Zero Test Failures** - Production ready
737
737
  - **Cross-Platform Support** - Windows, macOS, Linux
@@ -784,7 +784,7 @@ uv run pytest tests/test_mcp_server_initialization.py -v
784
784
  **Verification Environment:**
785
785
  - Operating Systems: Windows 10, macOS, Linux
786
786
  - Python Version: 3.10+
787
- - Project Version: tree-sitter-analyzer v1.6.1.2
787
+ - Project Version: tree-sitter-analyzer v1.6.1.4
788
788
  - Test Files: BigService.java (1419 lines), sample.py (256 lines), MultiClass.java (54 lines)
789
789
 
790
790
  ---
@@ -1,19 +1,20 @@
1
- tree_sitter_analyzer/__init__.py,sha256=1AWLjG9MxZmmNRJnGmvqA3jZ2lFYhvMNoKjB1_fSh5o,3069
1
+ tree_sitter_analyzer/__init__.py,sha256=uQLp3KXeuJDq1B5eHowray1HngjGdDoPOJu3Qf3gmiM,3069
2
2
  tree_sitter_analyzer/__main__.py,sha256=Zl79tpe4UaMu-7yeztc06tgP0CVMRnvGgas4ZQP5SCs,228
3
3
  tree_sitter_analyzer/api.py,sha256=jzwID6fJNdhQkJP3D0lzBVPhOnGIN4tyyMtmRYdK9zI,22753
4
4
  tree_sitter_analyzer/cli_main.py,sha256=BuaM-L-Jx3G49qvAUOQVsw0wEM-X0UzPaRszRZBist4,10374
5
5
  tree_sitter_analyzer/constants.py,sha256=7w3sLFt_6vPaKsxzrc21K1rOKpLGMyyA1203nu3pDOQ,1889
6
- tree_sitter_analyzer/encoding_utils.py,sha256=BgdBKnW20EueEFJT-aLrQI38bTOcR5rWQ3Dpa-ALszA,14805
6
+ tree_sitter_analyzer/encoding_utils.py,sha256=hPPoRzMHHYZ2hLREjp3OHWkmmVmjC6H0TX3SxyBXcGg,16704
7
7
  tree_sitter_analyzer/exceptions.py,sha256=AZryCQyKXekAg8lQZd3zqULnjhCKovBNNpnUlNGDhcI,11615
8
- tree_sitter_analyzer/file_handler.py,sha256=mtWz-DE4yfmak347s0e20xFNy3qddcek58Enom5GlZQ,6689
8
+ tree_sitter_analyzer/file_handler.py,sha256=f89N0CcnxfZxphu4QDpormc5AXoUko132EYK-kFoTx0,7753
9
9
  tree_sitter_analyzer/language_detector.py,sha256=pn3nQClo8b_Ar8dS5X3hq9_t5IIlIcizIC0twMaowU4,11693
10
10
  tree_sitter_analyzer/language_loader.py,sha256=gBUXGPTv91bRNs_urH23wzNKgh7ki6KkvpQ7iNPe3Rw,8922
11
+ tree_sitter_analyzer/logging_manager.py,sha256=pQYQAQi1RheWokGsokNuF9Ik466jQK5UQC8PSVOxpEU,12669
11
12
  tree_sitter_analyzer/models.py,sha256=eZSVTl4s0rnqG21nyCTaJhyhDw1HZkkpMRKCi2QRkL0,20404
12
13
  tree_sitter_analyzer/output_manager.py,sha256=tMEyjGeczqphcLoHdqxgyW8KaG8w6JF-fhsIibNQiCU,8260
13
14
  tree_sitter_analyzer/project_detector.py,sha256=10-aaIvgQSOkoR-1cWAyWVHAdEnJUEv0yOdxzN_VEv0,9463
14
15
  tree_sitter_analyzer/query_loader.py,sha256=jcJc6_kIMeZINfTVGuiEmDii9LViP_pbJfg4A9phJY4,9863
15
16
  tree_sitter_analyzer/table_formatter.py,sha256=tPKw77LLlQ7k5MMs9_Ez7qsSroNaSzZPoplyPtKHLhA,28577
16
- tree_sitter_analyzer/utils.py,sha256=4FfdpwUWX9AaREc6x8H8_EvOf66DZi-9oM0ZPY4WNCY,16196
17
+ tree_sitter_analyzer/utils.py,sha256=HB1gtN0gBwGqS92r6fNRpoHuIAOJtAEtd68P_TI30G0,9015
17
18
  tree_sitter_analyzer/cli/__init__.py,sha256=O_3URpbdu5Ilb2-r48LjbZuWtOWQu_BhL3pa6C0G3Bk,871
18
19
  tree_sitter_analyzer/cli/__main__.py,sha256=Xq8o8-0dPnMDU9WZqmqhzr98rx8rvoffTUHAkAwl-L8,218
19
20
  tree_sitter_analyzer/cli/info_commands.py,sha256=thWCLZ4iGVmqxuQfUz3t-uNRv9X3lgtWnsUJm6mbJ7o,4432
@@ -34,9 +35,9 @@ tree_sitter_analyzer/core/analysis_engine.py,sha256=IHE4ZQDGI4uu2Eh0QYX1bPsDBhtE
34
35
  tree_sitter_analyzer/core/cache_service.py,sha256=0oZGuTpeHBKYNdnqAOVi6VlQukYMIHncz2pbVfNpSqE,9762
35
36
  tree_sitter_analyzer/core/engine.py,sha256=5CheLzsxrApY6o2uM8sdYdzK4HkQypxlsYEFpUdai28,18357
36
37
  tree_sitter_analyzer/core/parser.py,sha256=qT3yIlTRdod4tf_2o1hU_B-GYGukyM2BtaFxzSoxois,9293
37
- tree_sitter_analyzer/core/query.py,sha256=UhQxUmQitFobe2YM7Ifhi3X2WdHVb02KzeBunueYJ4I,16397
38
+ tree_sitter_analyzer/core/query.py,sha256=vwFBCfKoSizqMpbILFGyOXkMIFAZ4irzlrILR0NDzfM,16630
38
39
  tree_sitter_analyzer/core/query_filter.py,sha256=PvGztAZFooFNZe6iHNmbg6RUNtMvq6f6hBZFzllig6Y,6591
39
- tree_sitter_analyzer/core/query_service.py,sha256=j9v3w2j3axhxzFEbZLovDNT2h6kF4PWbJVL_PmKl3ho,5542
40
+ tree_sitter_analyzer/core/query_service.py,sha256=9wmmva4t0GV_KXZ7oHy0gBKacxrjh3WzzriN9Ht5fA4,5435
40
41
  tree_sitter_analyzer/formatters/__init__.py,sha256=yVb4HF_4EEPRwTf3y3-vM2NllrhykG3zlvQhN-6dB4c,31
41
42
  tree_sitter_analyzer/formatters/base_formatter.py,sha256=XZwZ0klyCnmNkpWnMP7dy0XGaHForjE-BnBt1XZoQE8,5901
42
43
  tree_sitter_analyzer/formatters/formatter_factory.py,sha256=-yUeMiwg0eVyMtPsZjGNAUftfTVz4hoTj_9gOj5cefI,2225
@@ -51,9 +52,9 @@ tree_sitter_analyzer/interfaces/mcp_server.py,sha256=dUFn1CyO2jLa_y5gGOGE-f0sLGA
51
52
  tree_sitter_analyzer/languages/__init__.py,sha256=VTXxJgVjHJAciLhX0zzXOS4EygZMtebeYUbi_0z6fGw,340
52
53
  tree_sitter_analyzer/languages/java_plugin.py,sha256=G90_LlKdHtZNOPYu8MGBbgw6qkTiwd_QJu0xID3LMPc,50509
53
54
  tree_sitter_analyzer/languages/javascript_plugin.py,sha256=569WaMXOsR1M-_Eta32mdS4GBS_Qp43tqofKlOGWz7Y,55040
54
- tree_sitter_analyzer/languages/python_plugin.py,sha256=Cyu-0MIMIepioDKluO9_MwKUZRaHIG1QxeXR7N1TfR4,46109
55
+ tree_sitter_analyzer/languages/python_plugin.py,sha256=RdDSxURvGsive72Zg4ZkymG4qh8zWC9MlfnsWhioobs,47347
55
56
  tree_sitter_analyzer/mcp/__init__.py,sha256=8tC54ZYcZBcFEio-aDet7evzis50zV5gbHuvn_7K514,944
56
- tree_sitter_analyzer/mcp/server.py,sha256=cSkSzI7YMdQfR_Hzt5JjKgZbAPWrlJTYjL4HKBP6fzY,32934
57
+ tree_sitter_analyzer/mcp/server.py,sha256=2zAmcmd1ofCycW43EfAfbPt5AxB1Hgnbt4sjuu6_H4A,32962
57
58
  tree_sitter_analyzer/mcp/resources/__init__.py,sha256=D46ZDhPQaCrQze8dHmijMg1QZQ4ABRIjG532sFpuGPo,1367
58
59
  tree_sitter_analyzer/mcp/resources/code_file_resource.py,sha256=ZX5ZYSJfylBedpL80kTDlco2YZqgRMb5f3OW0VvOVRM,6166
59
60
  tree_sitter_analyzer/mcp/resources/project_stats_resource.py,sha256=r2owXkWrZ-Ee9hLGpt-SSNOxzrzuNVgNXcwxQghCcrM,20057
@@ -64,17 +65,18 @@ tree_sitter_analyzer/mcp/tools/base_tool.py,sha256=qf2My325azlnKOugNVMN_R1jtZcjX
64
65
  tree_sitter_analyzer/mcp/tools/fd_rg_utils.py,sha256=R1ICH40vkWO3OdKZjxok9ptQZpZ6-tM5SkLHHOC4-BE,17749
65
66
  tree_sitter_analyzer/mcp/tools/find_and_grep_tool.py,sha256=G-aExFZUvpJtitmEfYAClsHmQ1p3HqsT4IkOlym9R_o,22100
66
67
  tree_sitter_analyzer/mcp/tools/list_files_tool.py,sha256=TA1BRQtb-D5x1pD-IcRJYnP0WnnFfl9q7skI25MOdHk,12873
68
+ tree_sitter_analyzer/mcp/tools/output_format_validator.py,sha256=Kx-qSfLTQkYnLJed-4CUJmVuLJxSe6Djm0QnhGFZIrY,5252
67
69
  tree_sitter_analyzer/mcp/tools/query_tool.py,sha256=1xY1ONNY2sIFJxoILlnNzBnwGVgzEF7vVJ2ccqR9auA,10879
68
70
  tree_sitter_analyzer/mcp/tools/read_partial_tool.py,sha256=BMAJF205hTIrYTQJG6N1-vVuKSby2CSm9nWzSMMWceI,11339
69
- tree_sitter_analyzer/mcp/tools/search_content_tool.py,sha256=PDYY_O7T0y4bnC6JNjtL1_TyZcib0EpxnPA6PfKueoQ,22489
71
+ tree_sitter_analyzer/mcp/tools/search_content_tool.py,sha256=VqG_GHAE6dSyr1B80YK-I2sMssINnuH9i7WCdtYPSiA,24905
70
72
  tree_sitter_analyzer/mcp/tools/table_format_tool.py,sha256=8_yTYv7j7gFoQxsduJgWO_aKzRP9TsITYqx8cxyj4wo,20148
71
73
  tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py,sha256=-zZnqN9WcoyRTKM_16ADH859LSebzi34BGYwQL2zCOs,25084
72
74
  tree_sitter_analyzer/mcp/utils/__init__.py,sha256=TgTTKsRJAqF95g1fAp5SR_zQVDkImpc_5R0Dw529UUw,3126
73
75
  tree_sitter_analyzer/mcp/utils/error_handler.py,sha256=msrQHX67K3vhJsEc3OPRz5mmWU_yoHz55Lnxy0IZuy4,18404
74
- tree_sitter_analyzer/mcp/utils/file_output_manager.py,sha256=4R-evFZgb7KJpxQjgrz3WMPjL4zJhUH_9aaEbMQTCN4,8747
76
+ tree_sitter_analyzer/mcp/utils/file_output_manager.py,sha256=oDjAoAFydHD02DfnkUsry7H9r2q7i_oqzbdPWjYw4Xc,12059
75
77
  tree_sitter_analyzer/mcp/utils/gitignore_detector.py,sha256=VmO35Xj1fWiKVs4Y9aiD1gILm_8Kf1R8mhvtiF-wcfg,11027
76
78
  tree_sitter_analyzer/mcp/utils/path_resolver.py,sha256=77BmbyEuJCuDPNH9POcTOS4tYBorPu-IXFGpBC1DxOk,15006
77
- tree_sitter_analyzer/mcp/utils/search_cache.py,sha256=ZNv84st6PeejDY1B50AKTbItpXs9HS6JrpR-Ozjyc1c,12991
79
+ tree_sitter_analyzer/mcp/utils/search_cache.py,sha256=5iXlDpmJFBDW9njFZh_Dd9io-bz6-gD-1SFwjiYTga8,13566
78
80
  tree_sitter_analyzer/plugins/__init__.py,sha256=ITE9bTz7NO4axnn8g5Z-1_ydhSLT0RnY6Y1J9OhUP3E,10326
79
81
  tree_sitter_analyzer/plugins/base.py,sha256=FMRAOtjtDutNV8RnB6cmFgdvcjxKRAbrrzqldBBT1yk,17167
80
82
  tree_sitter_analyzer/plugins/manager.py,sha256=PyEY3jeuCBpDVqguWhaAu7nzUZM17_pI6wml2e0Hamo,12535
@@ -87,7 +89,7 @@ tree_sitter_analyzer/security/__init__.py,sha256=ZTqTt24hsljCpTXAZpJC57L7MU5lJLT
87
89
  tree_sitter_analyzer/security/boundary_manager.py,sha256=3eeENRKWtz2pyZHzd8DiVaq8fdeC6s1eVOuBylSmQPg,9347
88
90
  tree_sitter_analyzer/security/regex_checker.py,sha256=jWK6H8PTPgzbwRPfK_RZ8bBTS6rtEbgjY5vr3YWjQ_U,9616
89
91
  tree_sitter_analyzer/security/validator.py,sha256=yR4qTWEcXpR--bSFwtWvSgY0AzqujOFAqlc1Z7dlTdk,9809
90
- tree_sitter_analyzer-1.6.1.2.dist-info/METADATA,sha256=6ZAFU_eJcqCMY1HGBCxmXeqxilByHZWvI2GYXTH6HCQ,32236
91
- tree_sitter_analyzer-1.6.1.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
92
- tree_sitter_analyzer-1.6.1.2.dist-info/entry_points.txt,sha256=dEQkGMGmGGBzssEKlXW9F0-VlO3XJW2fJUv9i7898Ho,701
93
- tree_sitter_analyzer-1.6.1.2.dist-info/RECORD,,
92
+ tree_sitter_analyzer-1.6.1.4.dist-info/METADATA,sha256=pjEnX5EfNgtmFlaQeQLjR_KUYp1olwOZHHAK32S49MQ,32236
93
+ tree_sitter_analyzer-1.6.1.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
94
+ tree_sitter_analyzer-1.6.1.4.dist-info/entry_points.txt,sha256=dEQkGMGmGGBzssEKlXW9F0-VlO3XJW2fJUv9i7898Ho,701
95
+ tree_sitter_analyzer-1.6.1.4.dist-info/RECORD,,