tree-sitter-analyzer 0.9.6__tar.gz → 0.9.7__tar.gz
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.
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/CHANGELOG.md +18 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/PKG-INFO +9 -3
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/README.md +8 -2
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/README_ja.md +8 -2
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/README_zh.md +8 -2
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/pyproject.toml +1 -1
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/__init__.py +1 -1
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/query_service.py +162 -162
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/query_tool.py +6 -2
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/utils/error_handler.py +569 -569
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/uv.lock +1 -1
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/.gitignore +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/.kiro/steering/product.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/.kiro/steering/structure.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/.kiro/steering/tech.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/.pre-commit-config.yaml +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/AI_COLLABORATION_GUIDE.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/CODE_STYLE_GUIDE.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/CONTRIBUTING.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/DEPLOYMENT_GUIDE.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/LANGUAGE_GUIDELINES.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/LLM_CODING_GUIDELINES.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/MCP_SETUP_DEVELOPERS.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/MCP_SETUP_USERS.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/PROJECT_ROOT_CONFIG.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/PYPI_RELEASE_GUIDE.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/build_standalone.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/check_quality.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/docs/api.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/BigService.java +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/BigService.json +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/BigService.summary.json +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/JavaDocTest.java +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/MultiClass.java +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/Sample.java +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/calculate_token_comparison.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/project_root_demo.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/sample.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/security_demo.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/security_integration_demo.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/llm_code_checker.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/pypirc_example.txt +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/pytest.ini +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/scripts/improved_readme_updater.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/scripts/readme_config.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/start_mcp_server.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/01_onboarding.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/02_architecture_map.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/03_cli_cheatsheet.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/04_mcp_cheatsheet.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/05_plugin_tutorial.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/06_quality_workflow.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/07_troubleshooting.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/08_prompt_library.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/09_tasks.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/10_glossary.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/11_takeover_plan.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/README.md +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/__main__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/api.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/__main__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/advanced_command.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/base_command.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/default_command.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/partial_read_command.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/query_command.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/structure_command.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/summary_command.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/table_command.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/info_commands.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli_main.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/analysis_engine.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/cache_service.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/engine.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/parser.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/query.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/query_filter.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/encoding_utils.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/exceptions.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/file_handler.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/formatters/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/formatters/base_formatter.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/formatters/formatter_factory.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/formatters/java_formatter.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/formatters/python_formatter.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/interfaces/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/interfaces/cli.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/interfaces/cli_adapter.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/interfaces/mcp_adapter.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/interfaces/mcp_server.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/language_detector.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/language_loader.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/languages/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/languages/java_plugin.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/languages/javascript_plugin.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/languages/python_plugin.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/resources/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/resources/code_file_resource.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/resources/project_stats_resource.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/server.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/base_tool.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/read_partial_tool.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/table_format_tool.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/utils/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/models.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/output_manager.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/plugins/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/plugins/base.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/plugins/manager.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/project_detector.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/queries/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/queries/java.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/queries/javascript.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/queries/python.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/queries/typescript.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/query_loader.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/security/__init__.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/security/boundary_manager.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/security/regex_checker.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/security/validator.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/table_formatter.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/utils.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/upload_interactive.py +0 -0
- {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/upload_to_pypi.py +0 -0
|
@@ -1,4 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
|
+
## [0.9.7] - 2025-01-17
|
|
3
|
+
|
|
4
|
+
### 🛠️ Error Handling Improvements
|
|
5
|
+
|
|
6
|
+
#### 🔧 MCP Tool Enhancements
|
|
7
|
+
- **Enhanced Error Decorator**: Improved `@handle_mcp_errors` decorator with tool name identification
|
|
8
|
+
- **Better Error Context**: Added tool name "query_code" to error handling for improved debugging
|
|
9
|
+
- **Security Validation**: Enhanced file path security validation in query tool
|
|
10
|
+
|
|
11
|
+
#### 🧪 Code Quality
|
|
12
|
+
- **Pre-commit Hooks**: All code quality checks passed including black, ruff, bandit, and isort
|
|
13
|
+
- **Mixed Line Endings**: Fixed mixed line ending issues in query_tool.py
|
|
14
|
+
- **Type Safety**: Maintained existing type annotations and code structure
|
|
15
|
+
|
|
16
|
+
#### 📚 Documentation
|
|
17
|
+
- **Updated Examples**: Enhanced error handling documentation
|
|
18
|
+
- **Security Guidelines**: Improved security validation documentation
|
|
19
|
+
|
|
2
20
|
## [0.9.6] - 2025-01-17
|
|
3
21
|
|
|
4
22
|
### 🎉 New Feature: Advanced Query Filtering System
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tree-sitter-analyzer
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.7
|
|
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
|
|
@@ -141,6 +141,7 @@ Description-Content-Type: text/markdown
|
|
|
141
141
|
[](#quality-assurance)
|
|
142
142
|
[](#quality-assurance)
|
|
143
143
|
[](https://pypi.org/project/tree-sitter-analyzer/)
|
|
144
|
+
[](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
|
|
144
145
|
[](https://github.com/aimasteracc/tree-sitter-analyzer)
|
|
145
146
|
|
|
146
147
|
## 🚀 Break Through LLM Token Limits, Let AI Understand Code Files of Any Size
|
|
@@ -359,7 +360,12 @@ Parameters: {"file_path": "examples/BigService.java", "start_line": 100, "end_li
|
|
|
359
360
|
}
|
|
360
361
|
```
|
|
361
362
|
|
|
362
|
-
#### 🔍 **Step 4: Smart Query Filtering (
|
|
363
|
+
#### 🔍 **Step 4: Smart Query Filtering (v0.9.6+)**
|
|
364
|
+
|
|
365
|
+
**Enhanced Error Handling (v0.9.7):**
|
|
366
|
+
- Improved `@handle_mcp_errors` decorator with tool name identification
|
|
367
|
+
- Better error context for debugging and troubleshooting
|
|
368
|
+
- Enhanced security validation for file paths
|
|
363
369
|
|
|
364
370
|
**Find specific methods:**
|
|
365
371
|
```
|
|
@@ -418,7 +424,7 @@ uv run python -m tree_sitter_analyzer examples/BigService.java --partial-read --
|
|
|
418
424
|
# Silent mode (display results only)
|
|
419
425
|
uv run python -m tree_sitter_analyzer examples/BigService.java --table=full --quiet
|
|
420
426
|
|
|
421
|
-
# 🔍 Query filtering examples (
|
|
427
|
+
# 🔍 Query filtering examples (v0.9.6+)
|
|
422
428
|
# Find specific methods
|
|
423
429
|
uv run python -m tree_sitter_analyzer examples/BigService.java --query-key methods --filter "name=main"
|
|
424
430
|
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
[](#quality-assurance)
|
|
7
7
|
[](#quality-assurance)
|
|
8
8
|
[](https://pypi.org/project/tree-sitter-analyzer/)
|
|
9
|
+
[](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
|
|
9
10
|
[](https://github.com/aimasteracc/tree-sitter-analyzer)
|
|
10
11
|
|
|
11
12
|
## 🚀 Break Through LLM Token Limits, Let AI Understand Code Files of Any Size
|
|
@@ -224,7 +225,12 @@ Parameters: {"file_path": "examples/BigService.java", "start_line": 100, "end_li
|
|
|
224
225
|
}
|
|
225
226
|
```
|
|
226
227
|
|
|
227
|
-
#### 🔍 **Step 4: Smart Query Filtering (
|
|
228
|
+
#### 🔍 **Step 4: Smart Query Filtering (v0.9.6+)**
|
|
229
|
+
|
|
230
|
+
**Enhanced Error Handling (v0.9.7):**
|
|
231
|
+
- Improved `@handle_mcp_errors` decorator with tool name identification
|
|
232
|
+
- Better error context for debugging and troubleshooting
|
|
233
|
+
- Enhanced security validation for file paths
|
|
228
234
|
|
|
229
235
|
**Find specific methods:**
|
|
230
236
|
```
|
|
@@ -283,7 +289,7 @@ uv run python -m tree_sitter_analyzer examples/BigService.java --partial-read --
|
|
|
283
289
|
# Silent mode (display results only)
|
|
284
290
|
uv run python -m tree_sitter_analyzer examples/BigService.java --table=full --quiet
|
|
285
291
|
|
|
286
|
-
# 🔍 Query filtering examples (
|
|
292
|
+
# 🔍 Query filtering examples (v0.9.6+)
|
|
287
293
|
# Find specific methods
|
|
288
294
|
uv run python -m tree_sitter_analyzer examples/BigService.java --query-key methods --filter "name=main"
|
|
289
295
|
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
[](#品質保証)
|
|
7
7
|
[](#品質保証)
|
|
8
8
|
[](https://pypi.org/project/tree-sitter-analyzer/)
|
|
9
|
+
[](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
|
|
9
10
|
[](https://github.com/aimasteracc/tree-sitter-analyzer)
|
|
10
11
|
|
|
11
12
|
## 🚀 LLMトークン制限を突破し、AIにあらゆるサイズのコードファイルを理解させる
|
|
@@ -224,7 +225,12 @@ MCPツールextract_code_sectionを使用して指定されたコードセクシ
|
|
|
224
225
|
}
|
|
225
226
|
```
|
|
226
227
|
|
|
227
|
-
#### 🔍 **ステップ4: スマートクエリフィルタリング(
|
|
228
|
+
#### 🔍 **ステップ4: スマートクエリフィルタリング(v0.9.6+)**
|
|
229
|
+
|
|
230
|
+
**エラーハンドリングの強化(v0.9.7):**
|
|
231
|
+
- ツール名識別を追加した`@handle_mcp_errors`デコレータの改善
|
|
232
|
+
- デバッグとトラブルシューティングのためのより良いエラーコンテキスト
|
|
233
|
+
- ファイルパスのセキュリティ検証の強化
|
|
228
234
|
|
|
229
235
|
**特定のメソッドを検索:**
|
|
230
236
|
```
|
|
@@ -283,7 +289,7 @@ uv run python -m tree_sitter_analyzer examples/BigService.java --partial-read --
|
|
|
283
289
|
# サイレントモード(結果のみ表示)
|
|
284
290
|
uv run python -m tree_sitter_analyzer examples/BigService.java --table=full --quiet
|
|
285
291
|
|
|
286
|
-
# 🔍 クエリフィルタリング例(
|
|
292
|
+
# 🔍 クエリフィルタリング例(v0.9.6+)
|
|
287
293
|
# 特定のメソッドを検索
|
|
288
294
|
uv run python -m tree_sitter_analyzer examples/BigService.java --query-key methods --filter "name=main"
|
|
289
295
|
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
[](#质量保证)
|
|
7
7
|
[](#质量保证)
|
|
8
8
|
[](https://pypi.org/project/tree-sitter-analyzer/)
|
|
9
|
+
[](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
|
|
9
10
|
[](https://github.com/aimasteracc/tree-sitter-analyzer)
|
|
10
11
|
|
|
11
12
|
## 🚀 突破LLM token限制,让AI理解任意大小的代码文件
|
|
@@ -224,7 +225,12 @@ uv run python -m tree_sitter_analyzer examples/BigService.java --partial-read --
|
|
|
224
225
|
}
|
|
225
226
|
```
|
|
226
227
|
|
|
227
|
-
#### 🔍 **步骤4: 智能查询过滤(
|
|
228
|
+
#### 🔍 **步骤4: 智能查询过滤(v0.9.6+)**
|
|
229
|
+
|
|
230
|
+
**增强的错误处理(v0.9.7):**
|
|
231
|
+
- 改进了`@handle_mcp_errors`装饰器,添加工具名称标识
|
|
232
|
+
- 更好的错误上下文,便于调试和故障排除
|
|
233
|
+
- 增强的文件路径安全验证
|
|
228
234
|
|
|
229
235
|
**查找特定方法:**
|
|
230
236
|
```
|
|
@@ -283,7 +289,7 @@ uv run python -m tree_sitter_analyzer examples/BigService.java --partial-read --
|
|
|
283
289
|
# 静默模式(仅显示结果)
|
|
284
290
|
uv run python -m tree_sitter_analyzer examples/BigService.java --table=full --quiet
|
|
285
291
|
|
|
286
|
-
# 🔍 查询过滤示例(
|
|
292
|
+
# 🔍 查询过滤示例(v0.9.6+)
|
|
287
293
|
# 查找特定方法
|
|
288
294
|
uv run python -m tree_sitter_analyzer examples/BigService.java --query-key methods --filter "name=main"
|
|
289
295
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tree-sitter-analyzer"
|
|
7
|
-
version = "0.9.
|
|
7
|
+
version = "0.9.7"
|
|
8
8
|
description = "Extensible multi-language code analyzer framework using Tree-sitter with dynamic plugin architecture"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
{tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/query_service.py
RENAMED
|
@@ -1,162 +1,162 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Query Service
|
|
4
|
-
|
|
5
|
-
Unified query service for both CLI and MCP interfaces to avoid code duplication.
|
|
6
|
-
Provides core tree-sitter query functionality including predefined and custom queries.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import logging
|
|
10
|
-
from typing import Any
|
|
11
|
-
|
|
12
|
-
from ..encoding_utils import read_file_safe
|
|
13
|
-
from ..query_loader import query_loader
|
|
14
|
-
from .parser import Parser
|
|
15
|
-
from .query_filter import QueryFilter
|
|
16
|
-
|
|
17
|
-
logger = logging.getLogger(__name__)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class QueryService:
|
|
21
|
-
"""Unified query service providing tree-sitter query functionality"""
|
|
22
|
-
|
|
23
|
-
def __init__(self, project_root: str | None = None) -> None:
|
|
24
|
-
"""Initialize the query service"""
|
|
25
|
-
self.project_root = project_root
|
|
26
|
-
self.parser = Parser()
|
|
27
|
-
self.filter = QueryFilter()
|
|
28
|
-
|
|
29
|
-
async def execute_query(
|
|
30
|
-
self,
|
|
31
|
-
file_path: str,
|
|
32
|
-
language: str,
|
|
33
|
-
query_key: str | None = None,
|
|
34
|
-
query_string: str | None = None,
|
|
35
|
-
filter_expression: str | None = None,
|
|
36
|
-
) -> list[dict[str, Any]] | None:
|
|
37
|
-
"""
|
|
38
|
-
Execute a query
|
|
39
|
-
|
|
40
|
-
Args:
|
|
41
|
-
file_path: Path to the file to analyze
|
|
42
|
-
language: Programming language
|
|
43
|
-
query_key: Predefined query key (e.g., 'methods', 'class')
|
|
44
|
-
query_string: Custom query string (e.g., '(method_declaration) @method')
|
|
45
|
-
filter_expression: Filter expression (e.g., 'name=main', 'name=~get*,public=true')
|
|
46
|
-
|
|
47
|
-
Returns:
|
|
48
|
-
List of query results, each containing capture_name, node_type, start_line, end_line, content
|
|
49
|
-
|
|
50
|
-
Raises:
|
|
51
|
-
ValueError: If neither query_key nor query_string is provided
|
|
52
|
-
FileNotFoundError: If file doesn't exist
|
|
53
|
-
Exception: If query execution fails
|
|
54
|
-
"""
|
|
55
|
-
if not query_key and not query_string:
|
|
56
|
-
raise ValueError("Must provide either query_key or query_string")
|
|
57
|
-
|
|
58
|
-
if query_key and query_string:
|
|
59
|
-
raise ValueError("Cannot provide both query_key and query_string")
|
|
60
|
-
|
|
61
|
-
try:
|
|
62
|
-
# Read file content
|
|
63
|
-
content, encoding = read_file_safe(file_path)
|
|
64
|
-
|
|
65
|
-
# Parse file
|
|
66
|
-
parse_result = self.parser.parse_code(content, language, file_path)
|
|
67
|
-
if not parse_result or not parse_result.tree:
|
|
68
|
-
raise Exception("Failed to parse file")
|
|
69
|
-
|
|
70
|
-
tree = parse_result.tree
|
|
71
|
-
language_obj = tree.language if hasattr(tree, "language") else None
|
|
72
|
-
if not language_obj:
|
|
73
|
-
raise Exception(f"Language object not available for {language}")
|
|
74
|
-
|
|
75
|
-
# Get query string
|
|
76
|
-
if query_key:
|
|
77
|
-
query_string = query_loader.get_query(language, query_key)
|
|
78
|
-
if not query_string:
|
|
79
|
-
raise ValueError(
|
|
80
|
-
f"Query '{query_key}' not found for language '{language}'"
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
# Execute tree-sitter query
|
|
84
|
-
ts_query = language_obj.query(query_string)
|
|
85
|
-
captures = ts_query.captures(tree.root_node)
|
|
86
|
-
|
|
87
|
-
# Process capture results
|
|
88
|
-
results = []
|
|
89
|
-
if isinstance(captures, dict):
|
|
90
|
-
# New tree-sitter API returns dictionary
|
|
91
|
-
for capture_name, nodes in captures.items():
|
|
92
|
-
for node in nodes:
|
|
93
|
-
results.append(self._create_result_dict(node, capture_name))
|
|
94
|
-
else:
|
|
95
|
-
# Old tree-sitter API returns list of tuples
|
|
96
|
-
for capture in captures:
|
|
97
|
-
if isinstance(capture, tuple) and len(capture) == 2:
|
|
98
|
-
node, name = capture
|
|
99
|
-
results.append(self._create_result_dict(node, name))
|
|
100
|
-
|
|
101
|
-
# Apply filters
|
|
102
|
-
if filter_expression and results:
|
|
103
|
-
results = self.filter.filter_results(results, filter_expression)
|
|
104
|
-
|
|
105
|
-
return results
|
|
106
|
-
|
|
107
|
-
except Exception as e:
|
|
108
|
-
logger.error(f"Query execution failed: {e}")
|
|
109
|
-
raise
|
|
110
|
-
|
|
111
|
-
def _create_result_dict(self, node: Any, capture_name: str) -> dict[str, Any]:
|
|
112
|
-
"""
|
|
113
|
-
Create result dictionary from tree-sitter node
|
|
114
|
-
|
|
115
|
-
Args:
|
|
116
|
-
node: tree-sitter node
|
|
117
|
-
capture_name: capture name
|
|
118
|
-
|
|
119
|
-
Returns:
|
|
120
|
-
Result dictionary
|
|
121
|
-
"""
|
|
122
|
-
return {
|
|
123
|
-
"capture_name": capture_name,
|
|
124
|
-
"node_type": node.type if hasattr(node, "type") else "unknown",
|
|
125
|
-
"start_line": (
|
|
126
|
-
node.start_point[0] + 1 if hasattr(node, "start_point") else 0
|
|
127
|
-
),
|
|
128
|
-
"end_line": node.end_point[0] + 1 if hasattr(node, "end_point") else 0,
|
|
129
|
-
"content": (
|
|
130
|
-
node.text.decode("utf-8", errors="replace")
|
|
131
|
-
if hasattr(node, "text") and node.text
|
|
132
|
-
else ""
|
|
133
|
-
),
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
def get_available_queries(self, language: str) -> list[str]:
|
|
137
|
-
"""
|
|
138
|
-
Get available query keys for specified language
|
|
139
|
-
|
|
140
|
-
Args:
|
|
141
|
-
language: Programming language
|
|
142
|
-
|
|
143
|
-
Returns:
|
|
144
|
-
List of available query keys
|
|
145
|
-
"""
|
|
146
|
-
return query_loader.list_queries(language)
|
|
147
|
-
|
|
148
|
-
def get_query_description(self, language: str, query_key: str) -> str | None:
|
|
149
|
-
"""
|
|
150
|
-
Get description for query key
|
|
151
|
-
|
|
152
|
-
Args:
|
|
153
|
-
language: Programming language
|
|
154
|
-
query_key: Query key
|
|
155
|
-
|
|
156
|
-
Returns:
|
|
157
|
-
Query description, or None if not found
|
|
158
|
-
"""
|
|
159
|
-
try:
|
|
160
|
-
return query_loader.get_query_description(language, query_key)
|
|
161
|
-
except Exception:
|
|
162
|
-
return None
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Query Service
|
|
4
|
+
|
|
5
|
+
Unified query service for both CLI and MCP interfaces to avoid code duplication.
|
|
6
|
+
Provides core tree-sitter query functionality including predefined and custom queries.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from ..encoding_utils import read_file_safe
|
|
13
|
+
from ..query_loader import query_loader
|
|
14
|
+
from .parser import Parser
|
|
15
|
+
from .query_filter import QueryFilter
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class QueryService:
|
|
21
|
+
"""Unified query service providing tree-sitter query functionality"""
|
|
22
|
+
|
|
23
|
+
def __init__(self, project_root: str | None = None) -> None:
|
|
24
|
+
"""Initialize the query service"""
|
|
25
|
+
self.project_root = project_root
|
|
26
|
+
self.parser = Parser()
|
|
27
|
+
self.filter = QueryFilter()
|
|
28
|
+
|
|
29
|
+
async def execute_query(
|
|
30
|
+
self,
|
|
31
|
+
file_path: str,
|
|
32
|
+
language: str,
|
|
33
|
+
query_key: str | None = None,
|
|
34
|
+
query_string: str | None = None,
|
|
35
|
+
filter_expression: str | None = None,
|
|
36
|
+
) -> list[dict[str, Any]] | None:
|
|
37
|
+
"""
|
|
38
|
+
Execute a query
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
file_path: Path to the file to analyze
|
|
42
|
+
language: Programming language
|
|
43
|
+
query_key: Predefined query key (e.g., 'methods', 'class')
|
|
44
|
+
query_string: Custom query string (e.g., '(method_declaration) @method')
|
|
45
|
+
filter_expression: Filter expression (e.g., 'name=main', 'name=~get*,public=true')
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
List of query results, each containing capture_name, node_type, start_line, end_line, content
|
|
49
|
+
|
|
50
|
+
Raises:
|
|
51
|
+
ValueError: If neither query_key nor query_string is provided
|
|
52
|
+
FileNotFoundError: If file doesn't exist
|
|
53
|
+
Exception: If query execution fails
|
|
54
|
+
"""
|
|
55
|
+
if not query_key and not query_string:
|
|
56
|
+
raise ValueError("Must provide either query_key or query_string")
|
|
57
|
+
|
|
58
|
+
if query_key and query_string:
|
|
59
|
+
raise ValueError("Cannot provide both query_key and query_string")
|
|
60
|
+
|
|
61
|
+
try:
|
|
62
|
+
# Read file content
|
|
63
|
+
content, encoding = read_file_safe(file_path)
|
|
64
|
+
|
|
65
|
+
# Parse file
|
|
66
|
+
parse_result = self.parser.parse_code(content, language, file_path)
|
|
67
|
+
if not parse_result or not parse_result.tree:
|
|
68
|
+
raise Exception("Failed to parse file")
|
|
69
|
+
|
|
70
|
+
tree = parse_result.tree
|
|
71
|
+
language_obj = tree.language if hasattr(tree, "language") else None
|
|
72
|
+
if not language_obj:
|
|
73
|
+
raise Exception(f"Language object not available for {language}")
|
|
74
|
+
|
|
75
|
+
# Get query string
|
|
76
|
+
if query_key:
|
|
77
|
+
query_string = query_loader.get_query(language, query_key)
|
|
78
|
+
if not query_string:
|
|
79
|
+
raise ValueError(
|
|
80
|
+
f"Query '{query_key}' not found for language '{language}'"
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# Execute tree-sitter query
|
|
84
|
+
ts_query = language_obj.query(query_string)
|
|
85
|
+
captures = ts_query.captures(tree.root_node)
|
|
86
|
+
|
|
87
|
+
# Process capture results
|
|
88
|
+
results = []
|
|
89
|
+
if isinstance(captures, dict):
|
|
90
|
+
# New tree-sitter API returns dictionary
|
|
91
|
+
for capture_name, nodes in captures.items():
|
|
92
|
+
for node in nodes:
|
|
93
|
+
results.append(self._create_result_dict(node, capture_name))
|
|
94
|
+
else:
|
|
95
|
+
# Old tree-sitter API returns list of tuples
|
|
96
|
+
for capture in captures:
|
|
97
|
+
if isinstance(capture, tuple) and len(capture) == 2:
|
|
98
|
+
node, name = capture
|
|
99
|
+
results.append(self._create_result_dict(node, name))
|
|
100
|
+
|
|
101
|
+
# Apply filters
|
|
102
|
+
if filter_expression and results:
|
|
103
|
+
results = self.filter.filter_results(results, filter_expression)
|
|
104
|
+
|
|
105
|
+
return results
|
|
106
|
+
|
|
107
|
+
except Exception as e:
|
|
108
|
+
logger.error(f"Query execution failed: {e}")
|
|
109
|
+
raise
|
|
110
|
+
|
|
111
|
+
def _create_result_dict(self, node: Any, capture_name: str) -> dict[str, Any]:
|
|
112
|
+
"""
|
|
113
|
+
Create result dictionary from tree-sitter node
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
node: tree-sitter node
|
|
117
|
+
capture_name: capture name
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
Result dictionary
|
|
121
|
+
"""
|
|
122
|
+
return {
|
|
123
|
+
"capture_name": capture_name,
|
|
124
|
+
"node_type": node.type if hasattr(node, "type") else "unknown",
|
|
125
|
+
"start_line": (
|
|
126
|
+
node.start_point[0] + 1 if hasattr(node, "start_point") else 0
|
|
127
|
+
),
|
|
128
|
+
"end_line": node.end_point[0] + 1 if hasattr(node, "end_point") else 0,
|
|
129
|
+
"content": (
|
|
130
|
+
node.text.decode("utf-8", errors="replace")
|
|
131
|
+
if hasattr(node, "text") and node.text
|
|
132
|
+
else ""
|
|
133
|
+
),
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
def get_available_queries(self, language: str) -> list[str]:
|
|
137
|
+
"""
|
|
138
|
+
Get available query keys for specified language
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
language: Programming language
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
List of available query keys
|
|
145
|
+
"""
|
|
146
|
+
return query_loader.list_queries(language)
|
|
147
|
+
|
|
148
|
+
def get_query_description(self, language: str, query_key: str) -> str | None:
|
|
149
|
+
"""
|
|
150
|
+
Get description for query key
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
language: Programming language
|
|
154
|
+
query_key: Query key
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
Query description, or None if not found
|
|
158
|
+
"""
|
|
159
|
+
try:
|
|
160
|
+
return query_loader.get_query_description(language, query_key)
|
|
161
|
+
except Exception:
|
|
162
|
+
return None
|
|
@@ -74,7 +74,7 @@ class QueryTool:
|
|
|
74
74
|
},
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
@handle_mcp_errors
|
|
77
|
+
@handle_mcp_errors("query_code")
|
|
78
78
|
async def execute(self, arguments: dict[str, Any]) -> dict[str, Any]:
|
|
79
79
|
"""
|
|
80
80
|
Execute query tool
|
|
@@ -91,7 +91,11 @@ class QueryTool:
|
|
|
91
91
|
raise ValueError("file_path is required")
|
|
92
92
|
|
|
93
93
|
# Security validation
|
|
94
|
-
|
|
94
|
+
is_valid, error_msg = self.security_validator.validate_file_path(file_path)
|
|
95
|
+
if not is_valid:
|
|
96
|
+
raise ValueError(f"Invalid or unsafe file path: {error_msg or file_path}")
|
|
97
|
+
# Use the original path as validated path after checks
|
|
98
|
+
validated_path = file_path
|
|
95
99
|
|
|
96
100
|
# Get query parameters
|
|
97
101
|
query_key = arguments.get("query_key")
|