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.

Files changed (132) hide show
  1. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/CHANGELOG.md +18 -0
  2. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/PKG-INFO +9 -3
  3. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/README.md +8 -2
  4. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/README_ja.md +8 -2
  5. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/README_zh.md +8 -2
  6. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/pyproject.toml +1 -1
  7. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/__init__.py +1 -1
  8. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/query_service.py +162 -162
  9. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/query_tool.py +6 -2
  10. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/utils/error_handler.py +569 -569
  11. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/uv.lock +1 -1
  12. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/.gitignore +0 -0
  13. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/.kiro/steering/product.md +0 -0
  14. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/.kiro/steering/structure.md +0 -0
  15. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/.kiro/steering/tech.md +0 -0
  16. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/.pre-commit-config.yaml +0 -0
  17. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/AI_COLLABORATION_GUIDE.md +0 -0
  18. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/CODE_STYLE_GUIDE.md +0 -0
  19. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/CONTRIBUTING.md +0 -0
  20. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/DEPLOYMENT_GUIDE.md +0 -0
  21. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/LANGUAGE_GUIDELINES.md +0 -0
  22. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/LLM_CODING_GUIDELINES.md +0 -0
  23. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/MCP_SETUP_DEVELOPERS.md +0 -0
  24. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/MCP_SETUP_USERS.md +0 -0
  25. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/PROJECT_ROOT_CONFIG.md +0 -0
  26. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/PYPI_RELEASE_GUIDE.md +0 -0
  27. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/build_standalone.py +0 -0
  28. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/check_quality.py +0 -0
  29. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/docs/api.md +0 -0
  30. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/BigService.java +0 -0
  31. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/BigService.json +0 -0
  32. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/BigService.summary.json +0 -0
  33. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/JavaDocTest.java +0 -0
  34. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/MultiClass.java +0 -0
  35. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/Sample.java +0 -0
  36. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/calculate_token_comparison.py +0 -0
  37. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/project_root_demo.py +0 -0
  38. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/sample.py +0 -0
  39. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/security_demo.py +0 -0
  40. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/examples/security_integration_demo.py +0 -0
  41. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/llm_code_checker.py +0 -0
  42. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/pypirc_example.txt +0 -0
  43. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/pytest.ini +0 -0
  44. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/scripts/improved_readme_updater.py +0 -0
  45. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/scripts/readme_config.py +0 -0
  46. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/start_mcp_server.py +0 -0
  47. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/01_onboarding.md +0 -0
  48. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/02_architecture_map.md +0 -0
  49. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/03_cli_cheatsheet.md +0 -0
  50. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/04_mcp_cheatsheet.md +0 -0
  51. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/05_plugin_tutorial.md +0 -0
  52. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/06_quality_workflow.md +0 -0
  53. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/07_troubleshooting.md +0 -0
  54. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/08_prompt_library.md +0 -0
  55. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/09_tasks.md +0 -0
  56. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/10_glossary.md +0 -0
  57. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/11_takeover_plan.md +0 -0
  58. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/training/README.md +0 -0
  59. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/__main__.py +0 -0
  60. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/api.py +0 -0
  61. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/__init__.py +0 -0
  62. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/__main__.py +0 -0
  63. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/__init__.py +0 -0
  64. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/advanced_command.py +0 -0
  65. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/base_command.py +0 -0
  66. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/default_command.py +0 -0
  67. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/partial_read_command.py +0 -0
  68. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/query_command.py +0 -0
  69. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/structure_command.py +0 -0
  70. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/summary_command.py +0 -0
  71. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/commands/table_command.py +0 -0
  72. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli/info_commands.py +0 -0
  73. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/cli_main.py +0 -0
  74. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/__init__.py +0 -0
  75. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/analysis_engine.py +0 -0
  76. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/cache_service.py +0 -0
  77. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/engine.py +0 -0
  78. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/parser.py +0 -0
  79. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/query.py +0 -0
  80. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/core/query_filter.py +0 -0
  81. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/encoding_utils.py +0 -0
  82. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/exceptions.py +0 -0
  83. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/file_handler.py +0 -0
  84. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/formatters/__init__.py +0 -0
  85. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/formatters/base_formatter.py +0 -0
  86. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/formatters/formatter_factory.py +0 -0
  87. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/formatters/java_formatter.py +0 -0
  88. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/formatters/python_formatter.py +0 -0
  89. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/interfaces/__init__.py +0 -0
  90. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/interfaces/cli.py +0 -0
  91. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/interfaces/cli_adapter.py +0 -0
  92. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/interfaces/mcp_adapter.py +0 -0
  93. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/interfaces/mcp_server.py +0 -0
  94. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/language_detector.py +0 -0
  95. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/language_loader.py +0 -0
  96. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/languages/__init__.py +0 -0
  97. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/languages/java_plugin.py +0 -0
  98. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/languages/javascript_plugin.py +0 -0
  99. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/languages/python_plugin.py +0 -0
  100. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/__init__.py +0 -0
  101. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/resources/__init__.py +0 -0
  102. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/resources/code_file_resource.py +0 -0
  103. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/resources/project_stats_resource.py +0 -0
  104. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/server.py +0 -0
  105. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/__init__.py +0 -0
  106. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +0 -0
  107. {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
  108. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/base_tool.py +0 -0
  109. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/read_partial_tool.py +0 -0
  110. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/table_format_tool.py +0 -0
  111. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +0 -0
  112. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/mcp/utils/__init__.py +0 -0
  113. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/models.py +0 -0
  114. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/output_manager.py +0 -0
  115. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/plugins/__init__.py +0 -0
  116. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/plugins/base.py +0 -0
  117. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/plugins/manager.py +0 -0
  118. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/project_detector.py +0 -0
  119. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/queries/__init__.py +0 -0
  120. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/queries/java.py +0 -0
  121. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/queries/javascript.py +0 -0
  122. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/queries/python.py +0 -0
  123. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/queries/typescript.py +0 -0
  124. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/query_loader.py +0 -0
  125. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/security/__init__.py +0 -0
  126. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/security/boundary_manager.py +0 -0
  127. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/security/regex_checker.py +0 -0
  128. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/security/validator.py +0 -0
  129. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/table_formatter.py +0 -0
  130. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/tree_sitter_analyzer/utils.py +0 -0
  131. {tree_sitter_analyzer-0.9.6 → tree_sitter_analyzer-0.9.7}/upload_interactive.py +0 -0
  132. {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.6
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
  [![Coverage](https://img.shields.io/badge/coverage-74.36%25-green.svg)](#quality-assurance)
142
142
  [![Quality](https://img.shields.io/badge/quality-enterprise%20grade-blue.svg)](#quality-assurance)
143
143
  [![PyPI](https://img.shields.io/pypi/v/tree-sitter-analyzer.svg)](https://pypi.org/project/tree-sitter-analyzer/)
144
+ [![Version](https://img.shields.io/badge/version-0.9.7-blue.svg)](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
144
145
  [![GitHub Stars](https://img.shields.io/github/stars/aimasteracc/tree-sitter-analyzer.svg?style=social)](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 (NEW!)**
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 (NEW!)
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
  [![Coverage](https://img.shields.io/badge/coverage-74.36%25-green.svg)](#quality-assurance)
7
7
  [![Quality](https://img.shields.io/badge/quality-enterprise%20grade-blue.svg)](#quality-assurance)
8
8
  [![PyPI](https://img.shields.io/pypi/v/tree-sitter-analyzer.svg)](https://pypi.org/project/tree-sitter-analyzer/)
9
+ [![Version](https://img.shields.io/badge/version-0.9.7-blue.svg)](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
9
10
  [![GitHub Stars](https://img.shields.io/github/stars/aimasteracc/tree-sitter-analyzer.svg?style=social)](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 (NEW!)**
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 (NEW!)
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
  [![カバレッジ](https://img.shields.io/badge/coverage-74.36%25-green.svg)](#品質保証)
7
7
  [![品質](https://img.shields.io/badge/quality-enterprise%20grade-blue.svg)](#品質保証)
8
8
  [![PyPI](https://img.shields.io/pypi/v/tree-sitter-analyzer.svg)](https://pypi.org/project/tree-sitter-analyzer/)
9
+ [![バージョン](https://img.shields.io/badge/version-0.9.7-blue.svg)](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
9
10
  [![GitHub Stars](https://img.shields.io/github/stars/aimasteracc/tree-sitter-analyzer.svg?style=social)](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: スマートクエリフィルタリング(NEW!)**
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
- # 🔍 クエリフィルタリング例(NEW!)
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
  [![覆盖率](https://img.shields.io/badge/coverage-74.36%25-green.svg)](#质量保证)
7
7
  [![质量](https://img.shields.io/badge/quality-enterprise%20grade-blue.svg)](#质量保证)
8
8
  [![PyPI](https://img.shields.io/pypi/v/tree-sitter-analyzer.svg)](https://pypi.org/project/tree-sitter-analyzer/)
9
+ [![版本](https://img.shields.io/badge/version-0.9.7-blue.svg)](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
9
10
  [![GitHub Stars](https://img.shields.io/github/stars/aimasteracc/tree-sitter-analyzer.svg?style=social)](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: 智能查询过滤(NEW!)**
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
- # 🔍 查询过滤示例(NEW!)
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.6"
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"
@@ -11,7 +11,7 @@ Architecture:
11
11
  - Data Models: Generic and language-specific code element representations
12
12
  """
13
13
 
14
- __version__ = "0.9.6"
14
+ __version__ = "0.9.7"
15
15
  __author__ = "aisheng.yu"
16
16
  __email__ = "aimasteracc@gmail.com"
17
17
 
@@ -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
- validated_path = self.security_validator.validate_file_path(file_path)
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")