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

@@ -1,244 +1,241 @@
1
- #!/usr/bin/env python3
2
- """
3
- Security Validator for Tree-sitter Analyzer
4
-
5
- Provides unified security validation framework inspired by code-index-mcp's
6
- ValidationHelper but enhanced for tree-sitter analyzer's requirements.
7
- """
8
-
9
- import os
10
- import re
11
- from pathlib import Path
12
- from typing import Optional, Tuple
13
-
14
- from ..exceptions import SecurityError
15
- from ..utils import log_debug, log_warning
16
- from .boundary_manager import ProjectBoundaryManager
17
- from .regex_checker import RegexSafetyChecker
18
-
19
-
20
- class SecurityValidator:
21
- """
22
- Unified security validation framework.
23
-
24
- This class provides comprehensive security validation for file paths,
25
- regex patterns, and other user inputs to prevent security vulnerabilities.
26
-
27
- Features:
28
- - Multi-layer path traversal protection
29
- - Project boundary enforcement
30
- - ReDoS attack prevention
31
- - Input sanitization
32
- """
33
-
34
- def __init__(self, project_root: Optional[str] = None) -> None:
35
- """
36
- Initialize security validator.
37
-
38
- Args:
39
- project_root: Optional project root directory for boundary checks
40
- """
41
- self.boundary_manager = (
42
- ProjectBoundaryManager(project_root) if project_root else None
43
- )
44
- self.regex_checker = RegexSafetyChecker()
45
-
46
- log_debug(f"SecurityValidator initialized with project_root: {project_root}")
47
-
48
- def validate_file_path(
49
- self, file_path: str, base_path: Optional[str] = None
50
- ) -> Tuple[bool, str]:
51
- """
52
- Validate file path with comprehensive security checks.
53
-
54
- Implements multi-layer defense against path traversal attacks
55
- and ensures file access stays within project boundaries.
56
-
57
- Args:
58
- file_path: File path to validate
59
- base_path: Optional base path for relative path validation
60
-
61
- Returns:
62
- Tuple of (is_valid, error_message)
63
-
64
- Example:
65
- >>> validator = SecurityValidator("/project/root")
66
- >>> is_valid, error = validator.validate_file_path("src/main.py")
67
- >>> assert is_valid
68
- """
69
- try:
70
- # Layer 1: Basic input validation
71
- if not file_path or not isinstance(file_path, str):
72
- return False, "File path must be a non-empty string"
73
-
74
- # Layer 2: Null byte injection check
75
- if "\x00" in file_path:
76
- log_warning(f"Null byte detected in file path: {file_path}")
77
- return False, "File path contains null bytes"
78
-
79
- # Layer 3: Windows drive letter check (only on non-Windows systems)
80
- if len(file_path) > 1 and file_path[1] == ":" and os.name != 'nt':
81
- return False, "Windows drive letters are not allowed on this system"
82
-
83
- # Layer 4: Absolute path check (handle Windows leading slash/backslash explicitly)
84
- is_abs = os.path.isabs(file_path) or (
85
- os.name == 'nt' and (file_path.startswith('/') or file_path.startswith('\\'))
86
- )
87
- if is_abs:
88
- # If we have a project root, check if the absolute path is within it
89
- if self.boundary_manager and self.boundary_manager.project_root:
90
- if not self.boundary_manager.is_within_project(file_path):
91
- return False, "Absolute path must be within project directory"
92
- else:
93
- # In test environments (temp directories), allow absolute paths
94
- import tempfile
95
- temp_dir = tempfile.gettempdir()
96
- if file_path.startswith(temp_dir):
97
- return True, ""
98
- # No project root defined, reject all other absolute paths
99
- return False, "Absolute file paths are not allowed"
100
-
101
- # Layer 5: Path normalization and traversal check
102
- norm_path = os.path.normpath(file_path)
103
- if "..\\" in norm_path or "../" in norm_path or norm_path.startswith(".."):
104
- log_warning(f"Path traversal attempt detected: {file_path}")
105
- return False, "Directory traversal not allowed"
106
-
107
- # Layer 6: Project boundary validation
108
- if self.boundary_manager and base_path:
109
- if not self.boundary_manager.is_within_project(
110
- os.path.join(base_path, norm_path)
111
- ):
112
- return False, "Access denied. File path must be within project directory"
113
-
114
- # Layer 7: Symbolic link check (if file exists)
115
- if base_path:
116
- full_path = os.path.join(base_path, norm_path)
117
- if os.path.exists(full_path) and os.path.islink(full_path):
118
- log_warning(f"Symbolic link detected: {full_path}")
119
- return False, "Symbolic links are not allowed"
120
-
121
- log_debug(f"File path validation passed: {file_path}")
122
- return True, ""
123
-
124
- except Exception as e:
125
- log_warning(f"File path validation error: {e}")
126
- return False, f"Validation error: {str(e)}"
127
-
128
- def validate_directory_path(
129
- self, dir_path: str, must_exist: bool = True
130
- ) -> Tuple[bool, str]:
131
- """
132
- Validate directory path for security and existence.
133
-
134
- Args:
135
- dir_path: Directory path to validate
136
- must_exist: Whether directory must exist
137
-
138
- Returns:
139
- Tuple of (is_valid, error_message)
140
- """
141
- try:
142
- # Basic validation using file path validator
143
- is_valid, error = self.validate_file_path(dir_path)
144
- if not is_valid:
145
- return False, error
146
-
147
- # Check if path exists and is directory
148
- if must_exist:
149
- if not os.path.exists(dir_path):
150
- return False, f"Directory does not exist: {dir_path}"
151
-
152
- if not os.path.isdir(dir_path):
153
- return False, f"Path is not a directory: {dir_path}"
154
-
155
- log_debug(f"Directory path validation passed: {dir_path}")
156
- return True, ""
157
-
158
- except Exception as e:
159
- log_warning(f"Directory path validation error: {e}")
160
- return False, f"Validation error: {str(e)}"
161
-
162
- def validate_regex_pattern(self, pattern: str) -> Tuple[bool, str]:
163
- """
164
- Validate regex pattern for ReDoS attack prevention.
165
-
166
- Args:
167
- pattern: Regex pattern to validate
168
-
169
- Returns:
170
- Tuple of (is_valid, error_message)
171
- """
172
- return self.regex_checker.validate_pattern(pattern)
173
-
174
- def sanitize_input(self, user_input: str, max_length: int = 1000) -> str:
175
- """
176
- Sanitize user input by removing dangerous characters.
177
-
178
- Args:
179
- user_input: Input string to sanitize
180
- max_length: Maximum allowed length
181
-
182
- Returns:
183
- Sanitized input string
184
-
185
- Raises:
186
- SecurityError: If input is too long or contains dangerous content
187
- """
188
- if not isinstance(user_input, str):
189
- raise SecurityError("Input must be a string")
190
-
191
- if len(user_input) > max_length:
192
- raise SecurityError(f"Input too long: {len(user_input)} > {max_length}")
193
-
194
- # Remove null bytes and control characters
195
- sanitized = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '', user_input)
196
-
197
- # Remove HTML/XML tags for XSS prevention
198
- sanitized = re.sub(r'<[^>]*>', '', sanitized)
199
-
200
- # Remove potentially dangerous characters
201
- sanitized = re.sub(r'[<>"\']', '', sanitized)
202
-
203
- # Log if sanitization occurred
204
- if sanitized != user_input:
205
- log_warning("Input sanitization performed")
206
-
207
- return sanitized
208
-
209
- def validate_glob_pattern(self, pattern: str) -> Tuple[bool, str]:
210
- """
211
- Validate glob pattern for safe file matching.
212
-
213
- Args:
214
- pattern: Glob pattern to validate
215
-
216
- Returns:
217
- Tuple of (is_valid, error_message)
218
- """
219
- try:
220
- # Basic input validation
221
- if not pattern or not isinstance(pattern, str):
222
- return False, "Pattern must be a non-empty string"
223
-
224
- # Check for dangerous patterns
225
- dangerous_patterns = [
226
- "..", # Path traversal
227
- "//", # Double slashes
228
- "\\\\", # Double backslashes
229
- ]
230
-
231
- for dangerous in dangerous_patterns:
232
- if dangerous in pattern:
233
- return False, f"Dangerous pattern detected: {dangerous}"
234
-
235
- # Validate length
236
- if len(pattern) > 500:
237
- return False, "Pattern too long"
238
-
239
- log_debug(f"Glob pattern validation passed: {pattern}")
240
- return True, ""
241
-
242
- except Exception as e:
243
- log_warning(f"Glob pattern validation error: {e}")
244
- return False, f"Validation error: {str(e)}"
1
+ #!/usr/bin/env python3
2
+ """
3
+ Security Validator for Tree-sitter Analyzer
4
+
5
+ Provides unified security validation framework inspired by code-index-mcp's
6
+ ValidationHelper but enhanced for tree-sitter analyzer's requirements.
7
+ """
8
+
9
+ import os
10
+ import re
11
+ from pathlib import Path
12
+ from typing import Optional, Tuple
13
+
14
+ from ..exceptions import SecurityError
15
+ from ..utils import log_debug, log_warning
16
+ from .boundary_manager import ProjectBoundaryManager
17
+ from .regex_checker import RegexSafetyChecker
18
+
19
+
20
+ class SecurityValidator:
21
+ """
22
+ Unified security validation framework.
23
+
24
+ This class provides comprehensive security validation for file paths,
25
+ regex patterns, and other user inputs to prevent security vulnerabilities.
26
+
27
+ Features:
28
+ - Multi-layer path traversal protection
29
+ - Project boundary enforcement
30
+ - ReDoS attack prevention
31
+ - Input sanitization
32
+ """
33
+
34
+ def __init__(self, project_root: Optional[str] = None) -> None:
35
+ """
36
+ Initialize security validator.
37
+
38
+ Args:
39
+ project_root: Optional project root directory for boundary checks
40
+ """
41
+ self.boundary_manager = (
42
+ ProjectBoundaryManager(project_root) if project_root else None
43
+ )
44
+ self.regex_checker = RegexSafetyChecker()
45
+
46
+ log_debug(f"SecurityValidator initialized with project_root: {project_root}")
47
+
48
+ def validate_file_path(
49
+ self, file_path: str, base_path: Optional[str] = None
50
+ ) -> Tuple[bool, str]:
51
+ """
52
+ Validate file path with comprehensive security checks.
53
+
54
+ Implements multi-layer defense against path traversal attacks
55
+ and ensures file access stays within project boundaries.
56
+
57
+ Args:
58
+ file_path: File path to validate
59
+ base_path: Optional base path for relative path validation
60
+
61
+ Returns:
62
+ Tuple of (is_valid, error_message)
63
+
64
+ Example:
65
+ >>> validator = SecurityValidator("/project/root")
66
+ >>> is_valid, error = validator.validate_file_path("src/main.py")
67
+ >>> assert is_valid
68
+ """
69
+ try:
70
+ # Layer 1: Basic input validation
71
+ if not file_path or not isinstance(file_path, str):
72
+ return False, "File path must be a non-empty string"
73
+
74
+ # Layer 2: Null byte injection check
75
+ if "\x00" in file_path:
76
+ log_warning(f"Null byte detected in file path: {file_path}")
77
+ return False, "File path contains null bytes"
78
+
79
+ # Layer 3: Windows drive letter check (only on non-Windows systems)
80
+ if len(file_path) > 1 and file_path[1] == ":" and os.name != 'nt':
81
+ return False, "Windows drive letters are not allowed on this system"
82
+
83
+ # Layer 4: Absolute path check
84
+ if os.path.isabs(file_path):
85
+ # If we have a project root, check if the absolute path is within it
86
+ if self.boundary_manager and self.boundary_manager.project_root:
87
+ if not self.boundary_manager.is_within_project(file_path):
88
+ return False, "Absolute path must be within project directory"
89
+ else:
90
+ # In test environments (temp directories), allow absolute paths
91
+ import tempfile
92
+ temp_dir = tempfile.gettempdir()
93
+ if file_path.startswith(temp_dir):
94
+ return True, ""
95
+ # No project root defined, reject all other absolute paths
96
+ return False, "Absolute file paths are not allowed"
97
+
98
+ # Layer 5: Path normalization and traversal check
99
+ norm_path = os.path.normpath(file_path)
100
+ if "..\\" in norm_path or "../" in norm_path or norm_path.startswith(".."):
101
+ log_warning(f"Path traversal attempt detected: {file_path}")
102
+ return False, "Directory traversal not allowed"
103
+
104
+ # Layer 6: Project boundary validation
105
+ if self.boundary_manager and base_path:
106
+ if not self.boundary_manager.is_within_project(
107
+ os.path.join(base_path, norm_path)
108
+ ):
109
+ return False, "Access denied. File path must be within project directory"
110
+
111
+ # Layer 7: Symbolic link check (if file exists)
112
+ if base_path:
113
+ full_path = os.path.join(base_path, norm_path)
114
+ if os.path.exists(full_path) and os.path.islink(full_path):
115
+ log_warning(f"Symbolic link detected: {full_path}")
116
+ return False, "Symbolic links are not allowed"
117
+
118
+ log_debug(f"File path validation passed: {file_path}")
119
+ return True, ""
120
+
121
+ except Exception as e:
122
+ log_warning(f"File path validation error: {e}")
123
+ return False, f"Validation error: {str(e)}"
124
+
125
+ def validate_directory_path(
126
+ self, dir_path: str, must_exist: bool = True
127
+ ) -> Tuple[bool, str]:
128
+ """
129
+ Validate directory path for security and existence.
130
+
131
+ Args:
132
+ dir_path: Directory path to validate
133
+ must_exist: Whether directory must exist
134
+
135
+ Returns:
136
+ Tuple of (is_valid, error_message)
137
+ """
138
+ try:
139
+ # Basic validation using file path validator
140
+ is_valid, error = self.validate_file_path(dir_path)
141
+ if not is_valid:
142
+ return False, error
143
+
144
+ # Check if path exists and is directory
145
+ if must_exist:
146
+ if not os.path.exists(dir_path):
147
+ return False, f"Directory does not exist: {dir_path}"
148
+
149
+ if not os.path.isdir(dir_path):
150
+ return False, f"Path is not a directory: {dir_path}"
151
+
152
+ log_debug(f"Directory path validation passed: {dir_path}")
153
+ return True, ""
154
+
155
+ except Exception as e:
156
+ log_warning(f"Directory path validation error: {e}")
157
+ return False, f"Validation error: {str(e)}"
158
+
159
+ def validate_regex_pattern(self, pattern: str) -> Tuple[bool, str]:
160
+ """
161
+ Validate regex pattern for ReDoS attack prevention.
162
+
163
+ Args:
164
+ pattern: Regex pattern to validate
165
+
166
+ Returns:
167
+ Tuple of (is_valid, error_message)
168
+ """
169
+ return self.regex_checker.validate_pattern(pattern)
170
+
171
+ def sanitize_input(self, user_input: str, max_length: int = 1000) -> str:
172
+ """
173
+ Sanitize user input by removing dangerous characters.
174
+
175
+ Args:
176
+ user_input: Input string to sanitize
177
+ max_length: Maximum allowed length
178
+
179
+ Returns:
180
+ Sanitized input string
181
+
182
+ Raises:
183
+ SecurityError: If input is too long or contains dangerous content
184
+ """
185
+ if not isinstance(user_input, str):
186
+ raise SecurityError("Input must be a string")
187
+
188
+ if len(user_input) > max_length:
189
+ raise SecurityError(f"Input too long: {len(user_input)} > {max_length}")
190
+
191
+ # Remove null bytes and control characters
192
+ sanitized = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '', user_input)
193
+
194
+ # Remove HTML/XML tags for XSS prevention
195
+ sanitized = re.sub(r'<[^>]*>', '', sanitized)
196
+
197
+ # Remove potentially dangerous characters
198
+ sanitized = re.sub(r'[<>"\']', '', sanitized)
199
+
200
+ # Log if sanitization occurred
201
+ if sanitized != user_input:
202
+ log_warning("Input sanitization performed")
203
+
204
+ return sanitized
205
+
206
+ def validate_glob_pattern(self, pattern: str) -> Tuple[bool, str]:
207
+ """
208
+ Validate glob pattern for safe file matching.
209
+
210
+ Args:
211
+ pattern: Glob pattern to validate
212
+
213
+ Returns:
214
+ Tuple of (is_valid, error_message)
215
+ """
216
+ try:
217
+ # Basic input validation
218
+ if not pattern or not isinstance(pattern, str):
219
+ return False, "Pattern must be a non-empty string"
220
+
221
+ # Check for dangerous patterns
222
+ dangerous_patterns = [
223
+ "..", # Path traversal
224
+ "//", # Double slashes
225
+ "\\\\", # Double backslashes
226
+ ]
227
+
228
+ for dangerous in dangerous_patterns:
229
+ if dangerous in pattern:
230
+ return False, f"Dangerous pattern detected: {dangerous}"
231
+
232
+ # Validate length
233
+ if len(pattern) > 500:
234
+ return False, "Pattern too long"
235
+
236
+ log_debug(f"Glob pattern validation passed: {pattern}")
237
+ return True, ""
238
+
239
+ except Exception as e:
240
+ log_warning(f"Glob pattern validation error: {e}")
241
+ return False, f"Validation error: {str(e)}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tree-sitter-analyzer
3
- Version: 0.8.3
3
+ Version: 0.9.1
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
@@ -137,7 +137,7 @@ Description-Content-Type: text/markdown
137
137
 
138
138
  [![Python Version](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://python.org)
139
139
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
140
- [![Tests](https://img.shields.io/badge/tests-1358%20passed-brightgreen.svg)](#testing)
140
+ [![Tests](https://img.shields.io/badge/tests-306%20passed-brightgreen.svg)](#testing)
141
141
  [![Coverage](https://img.shields.io/badge/coverage-74.82%25-green.svg)](#testing)
142
142
  [![Quality](https://img.shields.io/badge/quality-enterprise%20grade-blue.svg)](#quality)
143
143
 
@@ -228,11 +228,10 @@ Extract specific code sections efficiently:
228
228
  - Content length information
229
229
 
230
230
  ### 3. AI Assistant Integration
231
- Four powerful MCP tools for AI assistants:
232
- - `analyze_code_scale` - Get code metrics and complexity
233
- - `analyze_code_structure` - Generate detailed structure tables
234
- - `read_code_partial` - Extract specific line ranges
235
- - `analyze_code_universal` - Universal analysis with auto-detection
231
+ Three-step workflow MCP tools for AI assistants:
232
+ - `check_code_scale` - **Step 1:** Get code metrics and complexity
233
+ - `analyze_code_structure` - **Step 2:** Generate detailed structure tables with line positions
234
+ - `extract_code_section` - **Step 3:** Extract specific code sections by line range
236
235
 
237
236
  ### 4. Multi-Language Support
238
237
  - **Java** - Full support with advanced analysis
@@ -244,14 +243,25 @@ Four powerful MCP tools for AI assistants:
244
243
 
245
244
  ### AI Assistant Usage (via Claude Desktop)
246
245
 
247
- **Step 1: Get code overview:**
248
- > "What's the overall complexity and size of this Java file examples/Sample.java?"
246
+ **Step 1: Check code scale**
247
+ ```
248
+ Use tool: check_code_scale
249
+ Parameters: {"file_path": "examples/Sample.java"}
250
+ ```
249
251
 
250
- **Step 2: Analyze code structure (for large files):**
251
- > "Please analyze the structure of examples/Sample.java and show me a detailed table"
252
+ **Step 2: Analyze structure (for large files >100 lines)**
253
+ ```
254
+ Use tool: analyze_code_structure
255
+ Parameters: {"file_path": "examples/Sample.java", "format_type": "full"}
256
+ ```
257
+
258
+ **Step 3: Extract specific code (using line positions from step 2)**
259
+ ```
260
+ Use tool: extract_code_section
261
+ Parameters: {"file_path": "examples/Sample.java", "start_line": 84, "end_line": 86}
262
+ ```
252
263
 
253
- **Step 3: Extract specific code:**
254
- > "Show me lines 84-86 from examples/Sample.java"
264
+ > **Note:** Always use snake_case parameter names: `file_path`, `start_line`, `end_line`, `format_type`
255
265
 
256
266
  ### CLI Usage
257
267
 
@@ -344,12 +354,11 @@ This project maintains **enterprise-grade quality** with comprehensive testing:
344
354
  - **Zero test failures** - Complete CI/CD readiness
345
355
  - **Cross-platform compatibility** - Windows, macOS, Linux
346
356
 
347
- ### 🏆 Recent Quality Achievements (v0.8.2+)
348
- - ✅ **Complete test suite stabilization** - All 1358 tests passing
349
- - ✅ **Windows compatibility improvements** - Fixed path handling and security validation
350
- - ✅ **Enhanced error messaging** - Consistent CLI and MCP error reporting
351
- - ✅ **Performance optimizations** - Improved timing accuracy in analysis tools
352
- - ✅ **Security framework enhancements** - Better project boundary management
357
+ ### 🏆 Recent Quality Achievements (v0.8.2)
358
+ - ✅ **Complete test suite stabilization** - Fixed all 31 failing tests
359
+ - ✅ **Formatters module breakthrough** - 0% 42.30% coverage
360
+ - ✅ **Error handling improvements** - 61.64% 82.76% coverage
361
+ - ✅ **104 new comprehensive tests** across critical modules
353
362
 
354
363
  ### 🔧 Running Tests
355
364
  ```bash
@@ -1,4 +1,4 @@
1
- tree_sitter_analyzer/__init__.py,sha256=_3nXMz3u_gwDfCxRMCiy5AzN7_CA7lp9Jpe4ovI19EE,3199
1
+ tree_sitter_analyzer/__init__.py,sha256=ToixgdoKI2Cp-Uj4bCiJIrMRcMptWOv6olr1C6iNKnE,3199
2
2
  tree_sitter_analyzer/__main__.py,sha256=ilhMPpn_ar28oelzxLfQcX6WH_UbQ2euxiSoV3z_yCg,239
3
3
  tree_sitter_analyzer/api.py,sha256=_94HoE1LKGELSE6FpZ6pEqm2R7qfoPokyfpGSjawliQ,17487
4
4
  tree_sitter_analyzer/cli_main.py,sha256=ses68m5tLoYMP6Co3Fk2vqBACuFd38MqF85uEoa0mbw,9714
@@ -18,7 +18,7 @@ tree_sitter_analyzer/cli/__main__.py,sha256=xgCuvLv5NNeEsxKM40pF_7b1apgj3DZ4ECa-
18
18
  tree_sitter_analyzer/cli/info_commands.py,sha256=0x_6mfMq7jpKBLT9jzhTikXcs0n4TzNEV2Te9dyKNd4,4405
19
19
  tree_sitter_analyzer/cli/commands/__init__.py,sha256=qLtJ7rRge-Reu4aZbczn_jmUHQNQ4lEAsve9BZYHYd0,697
20
20
  tree_sitter_analyzer/cli/commands/advanced_command.py,sha256=YJGrFBEqFPpS0VB-o28Un89Cjwr-eTirNdcFLP4rlN8,3512
21
- tree_sitter_analyzer/cli/commands/base_command.py,sha256=m-qt6BK8zmK0lLuN__lqZhwI6Vyr_P1yntQ71UvyBNY,6823
21
+ tree_sitter_analyzer/cli/commands/base_command.py,sha256=0CyODjCOWahH2x-PdeirxrKJMBNzTeRkfPvPuimhIXA,6770
22
22
  tree_sitter_analyzer/cli/commands/default_command.py,sha256=R9_GuI5KVYPK2DfXRuG8L89vwxv0QVW8sur_sigjZKo,542
23
23
  tree_sitter_analyzer/cli/commands/partial_read_command.py,sha256=kD3E2f1zCseSKpGQ3bgHnEuCq-DCPRQrT91JJJh8B4Q,4776
24
24
  tree_sitter_analyzer/cli/commands/query_command.py,sha256=TNkmuUKaTmTYD80jc8eesYLpw59YVk-6nw478SsYWH8,3640
@@ -45,16 +45,16 @@ tree_sitter_analyzer/languages/__init__.py,sha256=D-b1wReVcu3XRBvbeWgO80i29naGJ6
45
45
  tree_sitter_analyzer/languages/java_plugin.py,sha256=o_9F_anKCemnUDV6hq28RatRmBm3e0nchcQZ-v0nDv4,48454
46
46
  tree_sitter_analyzer/languages/javascript_plugin.py,sha256=9al0ScXmM5Y8Xl82oNp7cUaU9P59eNCJCPXSlfea4u8,16290
47
47
  tree_sitter_analyzer/languages/python_plugin.py,sha256=nlVxDx6thOB5o6QfQzGbD7gph3_YuM32YYzqYZoHlMw,29899
48
- tree_sitter_analyzer/mcp/__init__.py,sha256=mL_XjEks3tJOGAl9ULs_09KQOH1BWi92yvXpBidwmlI,752
49
- tree_sitter_analyzer/mcp/server.py,sha256=guh8Z4JPw3S_-qpQwAIY8V3KxZCskHXokB-EQhI6mqo,17015
48
+ tree_sitter_analyzer/mcp/__init__.py,sha256=udPIWx_nP4UoCjX0xVybElPQgWycAFYd3x7TrQS18Bs,1475
49
+ tree_sitter_analyzer/mcp/server.py,sha256=6WoRAV4ro_2OdwpT9Yj3D_GiUMhnvH8CmQ6D2AvmUzo,23688
50
50
  tree_sitter_analyzer/mcp/resources/__init__.py,sha256=PHDvZyHZawoToDQVqrepsmcTk00ZlaTsu6uxwVjoa4A,1433
51
51
  tree_sitter_analyzer/mcp/resources/code_file_resource.py,sha256=MDHvJl6akElHtcxlN6eCcY5WYSjQEQFCyhAVGiPGk9s,6462
52
52
  tree_sitter_analyzer/mcp/resources/project_stats_resource.py,sha256=lZF9TGxjKvTwPyuWE_o3I3V4LK0zEj3lab4L0Iq-hho,19758
53
53
  tree_sitter_analyzer/mcp/tools/__init__.py,sha256=RMvJOzfZMVe24WUNWJJ-pdygc1RbEVrhW5NZwpykDoQ,792
54
- tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py,sha256=-xVdDuo45X1O-IYKzJvJRM4LlISKWMJmEKCC7sJp3v0,27388
55
- tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py,sha256=1RjsEMS8n9hBmipbgIjw-sAykFRmMZzW53w5be1Ps24,9040
54
+ tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py,sha256=yI33yev1W-MztyjiPlSX4uwCcFigRpzdHloXNCXAQz8,27938
55
+ tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py,sha256=Ie1yeGTFNxuEeTLgXVnKEdKktoMEV27ychIMVkStRY8,9244
56
56
  tree_sitter_analyzer/mcp/tools/base_tool.py,sha256=szW84sSYejzRyBlFbskOARQbsfc2JLwHmjZ6rJZ8SQA,1264
57
- tree_sitter_analyzer/mcp/tools/read_partial_tool.py,sha256=Hjfl1-b0BVsT-g6zr0-pxXA0T1tKaE0iLJZFMm-fxRI,11505
57
+ tree_sitter_analyzer/mcp/tools/read_partial_tool.py,sha256=O8zfxZ6FGKfVXeuQfjoCNul02-2Jn7mOg_Hoxy8cxxM,11457
58
58
  tree_sitter_analyzer/mcp/tools/table_format_tool.py,sha256=JUfkB32ZXf-RQ5O2nKC2jFTVR1AxD8lks5vjjDFEoNw,15502
59
59
  tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py,sha256=MbJEzWa0b2KtHLIgmy5WVcCN89YL4tB1drujoHt9axs,22173
60
60
  tree_sitter_analyzer/mcp/utils/__init__.py,sha256=F_qFFC2gvGNdgRWGLxIh4Amd0dPhZv0Ni1ZbCbaYLlI,3063
@@ -68,10 +68,10 @@ tree_sitter_analyzer/queries/javascript.py,sha256=wIv5k-l48e1_sW_vqNUBkdNKO97CBs
68
68
  tree_sitter_analyzer/queries/python.py,sha256=tl72D3JTOSNIG-1lXww0YKQ41AgMKB5iBUkNBaqfkiI,7855
69
69
  tree_sitter_analyzer/queries/typescript.py,sha256=I1ndwPjAMGOIa1frSK3ewLqEkeDAJuAE9qzD9seEGf4,6937
70
70
  tree_sitter_analyzer/security/__init__.py,sha256=AlBGtSpDqVxlfM4K7JD-dJsDE8cPcuzJvN7OOsNOhm8,646
71
- tree_sitter_analyzer/security/boundary_manager.py,sha256=g1xPsBIx2w0hbqor7f2T2cSJ0_4ztSL_v-l076U-G54,9439
71
+ tree_sitter_analyzer/security/boundary_manager.py,sha256=jj7iHiZiMxC590aiw7oUlTjztGxY8WqauG8Rwu8n6Ig,8288
72
72
  tree_sitter_analyzer/security/regex_checker.py,sha256=glKsja9zbrP_kOkaXxPkzkkUjLZpO1EBCi3LS3fobmQ,10317
73
- tree_sitter_analyzer/security/validator.py,sha256=CbEQsKjw3F3MyU8WSOhFYy0SeAYdxORhLWI3ymxDBvo,9311
74
- tree_sitter_analyzer-0.8.3.dist-info/METADATA,sha256=0wTQ2VYQgpwasWzdiMUtQkPkzpkC_m9_5NztpT83kz8,15767
75
- tree_sitter_analyzer-0.8.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
76
- tree_sitter_analyzer-0.8.3.dist-info/entry_points.txt,sha256=EA0Ow27x2SqNt2300sv70RTWxKRIxJzOhNPIVlez4NM,417
77
- tree_sitter_analyzer-0.8.3.dist-info/RECORD,,
73
+ tree_sitter_analyzer/security/validator.py,sha256=6rbf2fWOxwgMqFqrRqhblcPUsXDOiaij9gd6l1owhXw,9359
74
+ tree_sitter_analyzer-0.9.1.dist-info/METADATA,sha256=xGxnZmp2tpuCVELZpkChnwH6TRTvjRqXvj6pbyj_5m4,15893
75
+ tree_sitter_analyzer-0.9.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
76
+ tree_sitter_analyzer-0.9.1.dist-info/entry_points.txt,sha256=EA0Ow27x2SqNt2300sv70RTWxKRIxJzOhNPIVlez4NM,417
77
+ tree_sitter_analyzer-0.9.1.dist-info/RECORD,,