diff --git a/pyproject.toml b/pyproject.toml index 8e8a3b2..3357b5a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "mcp-server-aidd" version = "0.1.14" description = "This MCP server provides a set of tools that support AI-driven Development workflows." readme = "README.md" -requires-python = ">=3.9" +requires-python = ">=3.11" authors = [{name = "SkyDeck.ai", email = "support@skydeck.ai"}] license = {text = "MIT"} keywords = ["mcp", "development", "ai", "aidd", "code-analysis"] @@ -32,6 +32,18 @@ packages = ["src/aidd"] [tool.hatch.envs.default] dependencies = [ "build", + "ruff>=0.9.1", +] + +[tool.ruff] +line-length = 200 +target-version = "py311" + +# Enable rules +lint.select = [ + "E", # pycodestyle errors + "F", # pyflakes + "I", # isort ] [project.urls] diff --git a/src/aidd/__init__.py b/src/aidd/__init__.py index 484c8bb..52e79ad 100644 --- a/src/aidd/__init__.py +++ b/src/aidd/__init__.py @@ -1,6 +1,8 @@ -from . import server import asyncio +from . import server + + def main(): """Main entry point for the package.""" asyncio.run(server.main()) diff --git a/src/aidd/cli.py b/src/aidd/cli.py index ce782d1..52cde96 100644 --- a/src/aidd/cli.py +++ b/src/aidd/cli.py @@ -5,12 +5,12 @@ import json import sys import traceback -from typing import Optional from contextlib import AsyncExitStack +from typing import Optional + from mcp.client.session import ClientSession -from mcp.client.stdio import StdioServerParameters -from mcp.types import TextContent, CallToolResult -from mcp.client.stdio import stdio_client +from mcp.client.stdio import StdioServerParameters, stdio_client +from mcp.types import CallToolResult, TextContent class MCPClient: diff --git a/src/aidd/server.py b/src/aidd/server.py index e957d65..62b409c 100644 --- a/src/aidd/server.py +++ b/src/aidd/server.py @@ -1,8 +1,10 @@ import asyncio -from mcp.server.models import InitializationOptions + +import mcp.server.stdio import mcp.types as types from mcp.server import NotificationOptions, Server -import mcp.server.stdio +from mcp.server.models import InitializationOptions + from .tools import TOOL_DEFINITIONS, TOOL_HANDLERS server = Server("aidd") diff --git a/src/aidd/tools/__init__.py b/src/aidd/tools/__init__.py index 02944bd..db41712 100644 --- a/src/aidd/tools/__init__.py +++ b/src/aidd/tools/__init__.py @@ -1,36 +1,69 @@ -from .path_tools import ( - get_allowed_directory_tool, update_allowed_directory_tool, - handle_get_allowed_directory, handle_update_allowed_directory +from .code_analysis import handle_tree_sitter_map, tree_sitter_map_tool +from .code_execution import ( + execute_code_tool, + execute_shell_script_tool, + handle_execute_code, + handle_execute_shell_script, ) from .directory_tools import ( - list_directory_tool, handle_list_directory, - create_directory_tool, handle_create_directory, - directory_tree_tool, handle_directory_tree + create_directory_tool, + directory_tree_tool, + handle_create_directory, + handle_directory_tree, + handle_list_directory, + list_directory_tool, ) from .file_tools import ( - read_file_tool, read_multiple_files_tool, write_file_tool, - handle_read_file, handle_read_multiple_files, handle_write_file, edit_file_tool, handle_edit_file, - move_file_tool, handle_move_file, - search_files_tool, handle_search_files, - delete_file_tool, handle_delete_file, - get_file_info_tool, handle_get_file_info, -) -from .code_execution import ( - execute_code_tool, handle_execute_code, - execute_shell_script_tool, handle_execute_shell_script -) -from .code_analysis import ( - tree_sitter_map_tool, handle_tree_sitter_map + delete_file_tool, + edit_file_tool, + get_file_info_tool, + handle_delete_file, + handle_edit_file, + handle_get_file_info, + handle_move_file, + handle_read_file, + handle_read_multiple_files, + handle_search_files, + handle_write_file, + move_file_tool, + read_file_tool, + read_multiple_files_tool, + search_files_tool, + write_file_tool, ) from .git_tools import ( - git_init_tool, git_status_tool, git_diff_unstaged_tool, git_diff_staged_tool, git_diff_tool, git_commit_tool, - git_add_tool, git_reset_tool, git_log_tool, git_create_branch_tool, git_checkout_tool, git_show_tool, - handle_git_init, handle_git_status, handle_git_diff_unstaged, handle_git_diff_staged, handle_git_diff, handle_git_commit, - handle_git_add, handle_git_reset, handle_git_log, handle_git_create_branch, handle_git_checkout, handle_git_show + git_add_tool, + git_checkout_tool, + git_commit_tool, + git_create_branch_tool, + git_diff_staged_tool, + git_diff_tool, + git_diff_unstaged_tool, + git_init_tool, + git_log_tool, + git_reset_tool, + git_show_tool, + git_status_tool, + handle_git_add, + handle_git_checkout, + handle_git_commit, + handle_git_create_branch, + handle_git_diff, + handle_git_diff_staged, + handle_git_diff_unstaged, + handle_git_init, + handle_git_log, + handle_git_reset, + handle_git_show, + handle_git_status, ) -from .system_tools import ( - get_system_info_tool, handle_get_system_info +from .path_tools import ( + get_allowed_directory_tool, + handle_get_allowed_directory, + handle_update_allowed_directory, + update_allowed_directory_tool, ) +from .system_tools import get_system_info_tool, handle_get_system_info # Export all tools definitions TOOL_DEFINITIONS = [ diff --git a/src/aidd/tools/base.py b/src/aidd/tools/base.py index db8199c..9c656c5 100644 --- a/src/aidd/tools/base.py +++ b/src/aidd/tools/base.py @@ -1,6 +1,8 @@ -from typing import Dict, Any +from typing import Any, Dict + import mcp.types as types + class Tool: """Base class for all tools""" name: str diff --git a/src/aidd/tools/code_analysis.py b/src/aidd/tools/code_analysis.py index 676bc9b..abd4f33 100644 --- a/src/aidd/tools/code_analysis.py +++ b/src/aidd/tools/code_analysis.py @@ -1,21 +1,22 @@ +import json import os -from tree_sitter import Language, Parser -import tree_sitter_python -import tree_sitter_javascript -from tree_sitter_typescript._binding import language_typescript, language_tsx -import tree_sitter_java +import subprocess +from typing import Any, Dict, List + +import tree_sitter_c_sharp import tree_sitter_cpp -import tree_sitter_ruby import tree_sitter_go +import tree_sitter_java +import tree_sitter_javascript +import tree_sitter_kotlin +import tree_sitter_python +import tree_sitter_ruby import tree_sitter_rust +from tree_sitter import Language, Parser from tree_sitter_php._binding import language_php -import tree_sitter_c_sharp -import tree_sitter_kotlin +from tree_sitter_typescript._binding import language_tsx, language_typescript from .state import state -from typing import Dict, Any, List -import subprocess -import json # Map of file extensions to language names LANGUAGE_MAP = { @@ -679,7 +680,8 @@ def format_analysis_results(analysis_results: List[Dict[str, Any]], analyzed_fil if errors: sections.append("\n===ERRORS===") for error in errors: - sections.append(f"{error['path']}: {error['error'].split('\n')[0]}") # Take only the first line of error + error_first_line = error['error'].split('\n')[0] + sections.append(f"{error['path']}: {error_first_line}") # Add repository map sections.append("\n===REPOSITORY STRUCTURE===") diff --git a/src/aidd/tools/code_execution.py b/src/aidd/tools/code_execution.py index 1957195..524168a 100644 --- a/src/aidd/tools/code_execution.py +++ b/src/aidd/tools/code_execution.py @@ -1,8 +1,10 @@ -import subprocess import os -from typing import List, Dict, Any import stat +import subprocess +from typing import Any, Dict, List + import mcp.types as types + from .state import state # Language configurations diff --git a/src/aidd/tools/directory_tools.py b/src/aidd/tools/directory_tools.py index f401802..b7e41ff 100644 --- a/src/aidd/tools/directory_tools.py +++ b/src/aidd/tools/directory_tools.py @@ -1,10 +1,13 @@ +import json import os -from datetime import datetime import subprocess -import json -from .state import state +from datetime import datetime + from mcp.types import TextContent +from .state import state + + def list_directory_tool(): return { "name": "list_directory", @@ -219,7 +222,7 @@ async def handle_directory_tree(arguments: dict): # Add all intermediate directories for i in range(len(parts)): parent = os.sep.join(parts[:i]) - current = os.sep.join(parts[:i+1]) + os.sep.join(parts[:i+1]) if i < len(parts) - 1: # It's a directory directory_map.setdefault(parent, {"dirs": set(), "files": set()})["dirs"].add(parts[i]) else: # It's a file diff --git a/src/aidd/tools/file_tools.py b/src/aidd/tools/file_tools.py index 81418cd..8b92fda 100644 --- a/src/aidd/tools/file_tools.py +++ b/src/aidd/tools/file_tools.py @@ -1,14 +1,17 @@ -import re import difflib import json import os +import re import stat import subprocess +from datetime import datetime from typing import List + import mcp.types as types -from datetime import datetime + from .state import state + def read_file_tool(): return { "name": "read_file", @@ -716,8 +719,9 @@ async def apply_file_edits(file_path: str, edits: List[dict], dry_run: bool = Fa f.write(modified_content) # Return results - return f"{'=== Failed Matches ===\n' + json.dumps(failed_matches, indent=2) + '\n\n' if failed_matches else ''}" + \ - f"{'=== Diff ===\n'}{diff}" + failed_matches_text = '=== Failed Matches ===\n' + json.dumps(failed_matches, indent=2) + '\n\n' if failed_matches else '' + diff_text = f'=== Diff ===\n{diff}' + return failed_matches_text + diff_text async def handle_edit_file(arguments: dict): """Handle editing a file with pattern matching and formatting.""" diff --git a/src/aidd/tools/git_tools.py b/src/aidd/tools/git_tools.py index 6bfb4d9..d28f882 100644 --- a/src/aidd/tools/git_tools.py +++ b/src/aidd/tools/git_tools.py @@ -1,10 +1,12 @@ import os -from datetime import datetime -from typing import List, Dict, Any, Optional +from typing import List + import git from mcp.types import TextContent + from .state import state + def _get_repo(repo_path: str) -> git.Repo: """Helper function to get git repo with validation.""" # Determine full path based on whether input is absolute or relative @@ -60,7 +62,7 @@ async def handle_git_init(arguments: dict) -> List[TextContent]: try: os.makedirs(full_path, exist_ok=True) - repo = git.Repo.init(full_path, initial_branch=initial_branch) + git.Repo.init(full_path, initial_branch=initial_branch) return [TextContent( type="text", text=f"Initialized empty Git repository in {path} with initial branch '{initial_branch}'" diff --git a/src/aidd/tools/path_tools.py b/src/aidd/tools/path_tools.py index bd8de89..86c9a23 100644 --- a/src/aidd/tools/path_tools.py +++ b/src/aidd/tools/path_tools.py @@ -1,6 +1,8 @@ import os + from .state import state + def get_allowed_directory_tool(): return { "name": "get_allowed_directory", diff --git a/src/aidd/tools/state.py b/src/aidd/tools/state.py index f096f8f..0334ebe 100644 --- a/src/aidd/tools/state.py +++ b/src/aidd/tools/state.py @@ -1,5 +1,6 @@ -from pathlib import Path import json +from pathlib import Path + # Global state management class GlobalState: diff --git a/src/aidd/tools/system_tools.py b/src/aidd/tools/system_tools.py index 8d078dc..16dd24b 100644 --- a/src/aidd/tools/system_tools.py +++ b/src/aidd/tools/system_tools.py @@ -1,12 +1,15 @@ -import platform -import psutil import json -from typing import Dict, Any, List -import mcp.types as types -import subprocess +import platform import re +import subprocess +from typing import Any, Dict, List + +import mcp.types as types +import psutil + from .state import state + def get_system_info_tool(): return { "name": "get_system_info", @@ -43,7 +46,7 @@ def get_wifi_info() -> str: if process.returncode == 0: for line in process.stdout.split('\n'): if "Current Network Information:" in line: - next_line = next((l.strip() for l in process.stdout.split('\n')[process.stdout.split('\n').index(line)+1:] if l.strip()), "") + next_line = next((line_text.strip() for line_text in process.stdout.split('\n')[process.stdout.split('\n').index(line)+1:] if line_text.strip()), "") return next_line.rstrip(':') elif platform.system() == "Linux": cmd = ["nmcli", "-t", "-f", "active,ssid", "dev", "wifi"] diff --git a/uv.lock b/uv.lock index 2b2816d..478922d 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -requires-python = ">=3.12" +requires-python = ">=3.11" [[package]] name = "annotated-types" @@ -131,12 +131,13 @@ wheels = [ [[package]] name = "mcp-server-aidd" -version = "0.1.9" +version = "0.1.14" source = { editable = "." } dependencies = [ { name = "gitpython" }, { name = "mcp" }, { name = "psutil" }, + { name = "ruff" }, { name = "tree-sitter" }, { name = "tree-sitter-c-sharp" }, { name = "tree-sitter-cpp" }, @@ -156,6 +157,7 @@ requires-dist = [ { name = "gitpython", specifier = ">=3.1.44" }, { name = "mcp", specifier = ">=1.1.2" }, { name = "psutil", specifier = ">=6.1.1" }, + { name = "ruff", specifier = ">=0.9.1" }, { name = "tree-sitter", specifier = ">=0.23.2" }, { name = "tree-sitter-c-sharp", specifier = ">=0.23.1" }, { name = "tree-sitter-cpp", specifier = ">=0.23.4" }, @@ -208,6 +210,20 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, + { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, + { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, + { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, + { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, + { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, + { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, + { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, + { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, + { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, + { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, + { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, + { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, + { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, @@ -238,6 +254,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, ] +[[package]] +name = "ruff" +version = "0.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/67/3e/e89f736f01aa9517a97e2e7e0ce8d34a4d8207087b3cfdec95133fee13b5/ruff-0.9.1.tar.gz", hash = "sha256:fd2b25ecaf907d6458fa842675382c8597b3c746a2dde6717fe3415425df0c17", size = 3498844 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/05/c3a2e0feb3d5d394cdfd552de01df9d3ec8a3a3771bbff247fab7e668653/ruff-0.9.1-py3-none-linux_armv6l.whl", hash = "sha256:84330dda7abcc270e6055551aca93fdde1b0685fc4fd358f26410f9349cf1743", size = 10645241 }, + { url = "https://files.pythonhosted.org/packages/dd/da/59f0a40e5f88ee5c054ad175caaa2319fc96571e1d29ab4730728f2aad4f/ruff-0.9.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3cae39ba5d137054b0e5b472aee3b78a7c884e61591b100aeb544bcd1fc38d4f", size = 10391066 }, + { url = "https://files.pythonhosted.org/packages/b7/fe/85e1c1acf0ba04a3f2d54ae61073da030f7a5dc386194f96f3c6ca444a78/ruff-0.9.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:50c647ff96f4ba288db0ad87048257753733763b409b2faf2ea78b45c8bb7fcb", size = 10012308 }, + { url = "https://files.pythonhosted.org/packages/6f/9b/780aa5d4bdca8dcea4309264b8faa304bac30e1ce0bcc910422bfcadd203/ruff-0.9.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0c8b149e9c7353cace7d698e1656ffcf1e36e50f8ea3b5d5f7f87ff9986a7ca", size = 10881960 }, + { url = "https://files.pythonhosted.org/packages/12/f4/dac4361afbfe520afa7186439e8094e4884ae3b15c8fc75fb2e759c1f267/ruff-0.9.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:beb3298604540c884d8b282fe7625651378e1986c25df51dec5b2f60cafc31ce", size = 10414803 }, + { url = "https://files.pythonhosted.org/packages/f0/a2/057a3cb7999513cb78d6cb33a7d1cc6401c82d7332583786e4dad9e38e44/ruff-0.9.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39d0174ccc45c439093971cc06ed3ac4dc545f5e8bdacf9f067adf879544d969", size = 11464929 }, + { url = "https://files.pythonhosted.org/packages/eb/c6/1ccfcc209bee465ced4874dcfeaadc88aafcc1ea9c9f31ef66f063c187f0/ruff-0.9.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:69572926c0f0c9912288915214ca9b2809525ea263603370b9e00bed2ba56dbd", size = 12170717 }, + { url = "https://files.pythonhosted.org/packages/84/97/4a524027518525c7cf6931e9fd3b2382be5e4b75b2b61bec02681a7685a5/ruff-0.9.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:937267afce0c9170d6d29f01fcd1f4378172dec6760a9f4dface48cdabf9610a", size = 11708921 }, + { url = "https://files.pythonhosted.org/packages/a6/a4/4e77cf6065c700d5593b25fca6cf725b1ab6d70674904f876254d0112ed0/ruff-0.9.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:186c2313de946f2c22bdf5954b8dd083e124bcfb685732cfb0beae0c47233d9b", size = 13058074 }, + { url = "https://files.pythonhosted.org/packages/f9/d6/fcb78e0531e863d0a952c4c5600cc5cd317437f0e5f031cd2288b117bb37/ruff-0.9.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f94942a3bb767675d9a051867c036655fe9f6c8a491539156a6f7e6b5f31831", size = 11281093 }, + { url = "https://files.pythonhosted.org/packages/e4/3b/7235bbeff00c95dc2d073cfdbf2b871b5bbf476754c5d277815d286b4328/ruff-0.9.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:728d791b769cc28c05f12c280f99e8896932e9833fef1dd8756a6af2261fd1ab", size = 10882610 }, + { url = "https://files.pythonhosted.org/packages/2a/66/5599d23257c61cf038137f82999ca8f9d0080d9d5134440a461bef85b461/ruff-0.9.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2f312c86fb40c5c02b44a29a750ee3b21002bd813b5233facdaf63a51d9a85e1", size = 10489273 }, + { url = "https://files.pythonhosted.org/packages/78/85/de4aa057e2532db0f9761e2c2c13834991e087787b93e4aeb5f1cb10d2df/ruff-0.9.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ae017c3a29bee341ba584f3823f805abbe5fe9cd97f87ed07ecbf533c4c88366", size = 11003314 }, + { url = "https://files.pythonhosted.org/packages/00/42/afedcaa089116d81447347f76041ff46025849fedb0ed2b187d24cf70fca/ruff-0.9.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5dc40a378a0e21b4cfe2b8a0f1812a6572fc7b230ef12cd9fac9161aa91d807f", size = 11342982 }, + { url = "https://files.pythonhosted.org/packages/39/c6/fe45f3eb27e3948b41a305d8b768e949bf6a39310e9df73f6c576d7f1d9f/ruff-0.9.1-py3-none-win32.whl", hash = "sha256:46ebf5cc106cf7e7378ca3c28ce4293b61b449cd121b98699be727d40b79ba72", size = 8819750 }, + { url = "https://files.pythonhosted.org/packages/38/8d/580db77c3b9d5c3d9479e55b0b832d279c30c8f00ab0190d4cd8fc67831c/ruff-0.9.1-py3-none-win_amd64.whl", hash = "sha256:342a824b46ddbcdddd3abfbb332fa7fcaac5488bf18073e841236aadf4ad5c19", size = 9701331 }, + { url = "https://files.pythonhosted.org/packages/b2/94/0498cdb7316ed67a1928300dd87d659c933479f44dec51b4f62bfd1f8028/ruff-0.9.1-py3-none-win_arm64.whl", hash = "sha256:1cd76c7f9c679e6e8f2af8f778367dca82b95009bc7b1a85a47f1521ae524fa7", size = 9145708 }, +] + [[package]] name = "smmap" version = "5.0.2" @@ -287,6 +328,14 @@ version = "0.23.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0f/50/fd5fafa42b884f741b28d9e6fd366c3f34e15d2ed3aa9633b34e388379e2/tree-sitter-0.23.2.tar.gz", hash = "sha256:66bae8dd47f1fed7bdef816115146d3a41c39b5c482d7bad36d9ba1def088450", size = 166800 } wheels = [ + { url = "https://files.pythonhosted.org/packages/55/8d/2d4fb04408772be0919441d66f700673ce7cb76b9ab6682e226d740fb88d/tree_sitter-0.23.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91fda41d4f8824335cc43c64e2c37d8089c8c563bd3900a512d2852d075af719", size = 139142 }, + { url = "https://files.pythonhosted.org/packages/32/52/b8a44bfff7b0203256e5dbc8d3a372ee8896128b8ed7d3a89e1ef17b2065/tree_sitter-0.23.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:92b2b489d5ce54b41f94c6f23fbaf592bd6e84dc2877048fd1cb060480fa53f7", size = 132198 }, + { url = "https://files.pythonhosted.org/packages/5d/54/746f2ee5acf6191a4a0be7f5843329f0d713bfe5196f5fc6fe2ea69cb44c/tree_sitter-0.23.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64859bd4aa1567d0d6016a811b2b49c59d4a4427d096e3d8c84b2521455f62b7", size = 554303 }, + { url = "https://files.pythonhosted.org/packages/2f/5a/3169d9933be813776a9b4b3f2e671d3d50fa27e589dee5578f6ecef7ff6d/tree_sitter-0.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:614590611636044e071d3a0b748046d52676dbda3bc9fa431216231e11dd98f7", size = 567626 }, + { url = "https://files.pythonhosted.org/packages/32/0d/23f363b3b0bc3fa0e7a4a294bf119957ac1ab02737d57815e1e8b7b3e196/tree_sitter-0.23.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:08466953c78ae57be61057188fb88c89791b0a562856010228e0ccf60e2ac453", size = 559803 }, + { url = "https://files.pythonhosted.org/packages/6f/b3/1ffba0f17a7ff2c9114d91a1ecc15e0748f217817797564d31fbb61d7458/tree_sitter-0.23.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8a33f03a562de91f7fd05eefcedd8994a06cd44c62f7aabace811ad82bc11cbd", size = 570987 }, + { url = "https://files.pythonhosted.org/packages/59/4b/085bcb8a11ea18003aacc4dbc91c301d1536c5e2deedb95393e8ef26f1f7/tree_sitter-0.23.2-cp311-cp311-win_amd64.whl", hash = "sha256:03b70296b569ef64f7b92b42ca5da9bf86d81bee2afd480bea35092687f51dae", size = 117771 }, + { url = "https://files.pythonhosted.org/packages/4b/e5/90adc4081f49ccb6bea89a800dc9b0dcc5b6953b0da423e8eff28f63fddf/tree_sitter-0.23.2-cp311-cp311-win_arm64.whl", hash = "sha256:7cb4bb953ea7c0b50eeafc4454783e030357179d2a93c3dd5ebed2da5588ddd0", size = 102555 }, { url = "https://files.pythonhosted.org/packages/07/a7/57e0fe87b49a78c670a7b4483f70e44c000c65c29b138001096b22e7dd87/tree_sitter-0.23.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a014498b6a9e6003fae8c6eb72f5927d62da9dcb72b28b3ce8cd15c6ff6a6572", size = 139259 }, { url = "https://files.pythonhosted.org/packages/b4/b9/bc8513d818ffb54993a017a36c8739300bc5739a13677acf90b54995e7db/tree_sitter-0.23.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:04f8699b131d4bcbe3805c37e4ef3d159ee9a82a0e700587625623999ba0ea53", size = 131951 }, { url = "https://files.pythonhosted.org/packages/d7/6a/eab01bb6b1ce3c9acf16d72922ffc29a904af485eb3e60baf3a3e04edd30/tree_sitter-0.23.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4471577df285059c71686ecb208bc50fb472099b38dcc8e849b0e86652891e87", size = 557952 },