├── .gitignore ├── .vscode ├── extensions.json └── settings.json ├── pyproject.toml ├── Readme.md ├── pylance_patcher └── __init__.py └── uv.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Cache 2 | __pycache__/ 3 | .pytest_cache/ 4 | .ruff_cache/ 5 | 6 | # VS Code extension files 7 | *.vsix 8 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "editorconfig.editorconfig", 4 | "ms-python.python", 5 | "ms-python.vscode-pylance", 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | // 保存時に Ruff による自動フォーマットを行う 3 | "[python]": { 4 | "editor.codeActionsOnSave": { 5 | "source.fixAll.ruff": "explicit", 6 | "source.organizeImports.ruff": "explicit", 7 | }, 8 | "editor.defaultFormatter": "charliermarsh.ruff", 9 | "editor.formatOnSave": true, 10 | }, 11 | // VSCode でターミナルを開いた際に勝手に .env がロードされないようにする 12 | // vscode-python の変な仕様が原因らしい… 13 | // ref: https://github.com/microsoft/vscode-python/issues/24209 14 | // ref: https://note.com/optim/n/n46080562b660 15 | "python.envFile": "", 16 | // Pylance の Type Checking を有効化 17 | "python.languageServer": "Pylance", 18 | "python.analysis.typeCheckingMode": "strict", 19 | // Pylance の Type Checking のうち、いくつかのエラー報告を抑制する 20 | "python.analysis.diagnosticSeverityOverrides": { 21 | "reportConstantRedefinition": "none", 22 | "reportDeprecated": "warning", 23 | "reportMissingTypeStubs": "none", 24 | "reportPrivateImportUsage": "none", 25 | "reportShadowedImports": "none", 26 | "reportUnnecessaryComparison": "none", 27 | "reportUnknownArgumentType": "none", 28 | "reportUnknownMemberType": "none", 29 | "reportUnknownVariableType": "none", 30 | "reportUntypedFunctionDecorator": "none", 31 | "reportUnusedFunction": "none", 32 | }, 33 | } 34 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "pylance-patcher" 3 | version = "0.0.0" 4 | description = "Patch Pylance to use with for VS Code forks" 5 | readme = "Readme.md" 6 | requires-python = ">=3.12.0" 7 | dependencies = [ 8 | "rich>=14.0.0", 9 | "typer>=0.12.0", 10 | ] 11 | 12 | [tool.taskipy.tasks] 13 | lint = "ruff check --fix . ; pyright" 14 | format = "ruff format ." 15 | typecheck = "pyright" 16 | 17 | [project.scripts] 18 | pylance-patcher = "pylance_patcher:app" 19 | 20 | [dependency-groups] 21 | dev = [ 22 | "pyright>=1.1.364", 23 | "ruff>=0.2.0", 24 | "taskipy>=1.14.0", 25 | ] 26 | 27 | [build-system] 28 | requires = ["uv_build>=0.7.19,<0.8.0"] 29 | build-backend = "uv_build" 30 | 31 | [tool.uv.build-backend] 32 | module-root = "" 33 | module-name = "pylance_patcher" 34 | 35 | [tool.ruff] 36 | # 1行の長さを最大120文字に設定 37 | line-length = 120 38 | # インデントの幅を4スペースに設定 39 | indent-width = 4 40 | # Python 3.12 を利用する 41 | target-version = "py312" 42 | 43 | [tool.ruff.lint] 44 | # flake8, pycodestyle, pyupgrade, isort, Ruff 固有のルールを使う 45 | select = ["F", "E", "W", "UP", "I", "RUF"] 46 | ignore = [ 47 | "E501", # 1行の長さを超えている場合の警告を抑制 48 | "E731", # Do not assign a `lambda` expression, use a `def` を抑制 49 | "RUF001", # 全角記号など `ambiguous unicode character` も使いたいため 50 | "RUF002", # 全角記号など `ambiguous unicode character` も使いたいため 51 | "RUF003", # 全角記号など `ambiguous unicode character` も使いたいため 52 | ] 53 | 54 | [tool.ruff.lint.isort] 55 | # インポートブロックの後に2行空ける 56 | lines-after-imports = 2 57 | 58 | [tool.ruff.format] 59 | # シングルクオートを使う 60 | quote-style = "single" 61 | # インデントにはスペースを使う 62 | indent-style = "space" 63 | 64 | [tool.pyright] 65 | # Python バージョンを指定 66 | pythonVersion = "3.12" 67 | # TypeCheckingMode を strict に設定(VSCode の設定と同等) 68 | typeCheckingMode = "strict" 69 | # プロジェクトルートを指定 70 | pythonPlatform = "All" 71 | # 除外するパス 72 | exclude = [ 73 | "**/__pycache__", 74 | "**/.venv", 75 | ] 76 | # VSCode の settings.json の diagnosticSeverityOverrides に対応する設定 77 | reportConstantRedefinition = "none" 78 | reportDeprecated = "warning" 79 | reportMissingTypeStubs = "none" 80 | reportPrivateImportUsage = "none" 81 | reportShadowedImports = "none" 82 | reportUnnecessaryComparison = "none" 83 | reportUnknownArgumentType = "none" 84 | reportUnknownMemberType = "none" 85 | reportUnknownVariableType = "none" 86 | reportUntypedFunctionDecorator = "none" 87 | reportUnusedFunction = "none" 88 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Pylance-Patcher 2 | 3 | A tool to patch the Pylance extension for compatibility with Cursor and other VS Code forks. 4 | (Forked from https://gist.github.com/realdimas/c025cdba50cc05e0f644eb71bf7efbb9) 5 | 6 | Jump to the main script: [`pylance_patcher/__init__.py`](pylance_patcher/__init__.py) 7 | 8 | Run as a standalone Python script using [uv](https://docs.astral.sh/uv/): 9 | 10 | `uvx --from git+https://github.com/tsukumijima/Pylance-Patcher pylance-patcher --help` 11 | 12 | ## Usage 13 | 14 | ```plain 15 | $ uvx --from . pylance-patcher --help 16 | 17 | Usage: pylance-patcher [OPTIONS] [VERSION] 18 | 19 | Download and patch Pylance VS Code extension. 20 | 21 | Supported versions: 2025.4.1, 2025.6.2, 2025.6.101, 2025.7.1 22 | The --vscode-version option clamps the required VS Code version if the extension requires a newer 23 | version. For example, use --vscode-version 1.96 to declare the extension compatible with VS Code 24 | 1.96. 25 | The --override-version option allows you to override the extension version to prevent Cursor from 26 | automatically reverting to an older version. By default, the version is overridden to 2024.8.1. 27 | 28 | ╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮ 29 | │ version [VERSION] Pylance version to patch [default: 2025.7.1] │ 30 | ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ 31 | ╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮ 32 | │ --output -o PATH Output directory [default: .] │ 33 | │ --keep-temp Keep temporary files │ 34 | │ --vscode-version TEXT Maximum VS Code version to require (e.g., '1.96') │ 35 | │ [default: 1.99] │ 36 | │ --override-version TEXT Override version to use instead of the original version │ 37 | │ (default: 2024.8.1) │ 38 | │ [default: 2024.8.1] │ 39 | │ --install-completion Install completion for the current shell. │ 40 | │ --show-completion Show completion for the current shell, to copy it or │ 41 | │ customize the installation. │ 42 | │ --help -h Show this message and exit. │ 43 | ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ 44 | ``` 45 | -------------------------------------------------------------------------------- /pylance_patcher/__init__.py: -------------------------------------------------------------------------------- 1 | """A tool to patch the Pylance extension for compatibility with Cursor and other VS Code forks.""" 2 | 3 | import gzip 4 | import json 5 | import shutil 6 | import urllib.error 7 | import urllib.request 8 | import zipfile 9 | from pathlib import Path 10 | from typing import Annotated, TypedDict 11 | 12 | import typer 13 | from rich.console import Console 14 | from rich.progress import Progress, SpinnerColumn, TextColumn 15 | 16 | 17 | console = Console() 18 | app = typer.Typer(context_settings={'help_option_names': ['-h', '--help']}) 19 | 20 | 21 | def _exit_with_error(message: str) -> None: 22 | """Print error message and exit with status 1.""" 23 | console.print(f'[red]✗[/red] {message}') 24 | raise typer.Exit(1) 25 | 26 | 27 | class PatchInfo(TypedDict): 28 | """Type definition for version-specific patch data.""" 29 | 30 | search: str 31 | replace: str | None 32 | 33 | 34 | # Version-specific patch data 35 | PATCH_DATA: dict[str, PatchInfo] = { 36 | '2025.4.1': { 37 | # via @caenrige 38 | # https://github.com/VSCodium/vscodium/discussions/1641#discussioncomment-12603240 39 | 'search': ( 40 | 'return(0x0,_0x302dc7[_0x1e5d1c(0x69a)])(_0x17bc9b[_0x1e5d1c(0x120)]),' 41 | "{'client':_0x5d8ccf,'start':()=>{const _0x751a33=_0x1e5d1c;" 42 | "return _0x2bfc9a['sendTelemetryEvent'](_0x1d90e3['EventName'][_0x751a33(0x48e)])," 43 | "Promise[_0x751a33(0x60e)]();},'stop':()=>Promise[_0x1e5d1c(0x60e)]()," 44 | "'disposables':_0x22650a};" 45 | ), 46 | 'replace': None, # Will be replaced with spaces 47 | }, 48 | '2025.6.2': { 49 | # via @jamesst20 50 | # https://github.com/VSCodium/vscodium/discussions/1641#discussioncomment-13694853 51 | 'search': 'return _0x1a0cda(_0x18d153);', 52 | 'replace': 'return true;', 53 | }, 54 | '2025.6.101': { 55 | # via @jamesst20 56 | # https://github.com/VSCodium/vscodium/discussions/1641#discussioncomment-13694853 57 | 'search': 'return _0x4ecf62(_0x4bc45e);', 58 | 'replace': 'return true;', 59 | }, 60 | '2025.7.1': { 61 | # via @jamesst20 62 | # https://github.com/VSCodium/vscodium/discussions/1641#discussioncomment-13694853 63 | 'search': 'return _0x1d2169(_0x1e7a73);', 64 | 'replace': 'return true;', 65 | }, 66 | } 67 | 68 | # Supported versions 69 | SUPPORTED_VERSIONS = list(PATCH_DATA.keys()) 70 | 71 | 72 | def get_latest_version() -> str: 73 | """Get the latest version from PATCH_DATA based on semantic versioning.""" 74 | versions = list(PATCH_DATA.keys()) 75 | 76 | def parse_version(v: str) -> tuple[int, int, int]: 77 | """Parse a version string into a tuple of integers.""" 78 | parts = v.split('.') 79 | return tuple(int(p) for p in parts) # type: ignore[return-value] 80 | 81 | # Sort versions and get the latest 82 | sorted_versions = sorted(versions, key=parse_version, reverse=True) 83 | return sorted_versions[0] 84 | 85 | 86 | def download_file(url: str, dest: Path) -> None: 87 | """Download a file with progress indicator.""" 88 | # Validate URL scheme for security 89 | if not url.startswith(('http://', 'https://')): 90 | msg = 'Only HTTP(S) URLs are allowed' 91 | raise ValueError(msg) 92 | 93 | with Progress( 94 | SpinnerColumn(), 95 | TextColumn('[progress.description]{task.description}'), 96 | console=console, 97 | ) as progress: 98 | task = progress.add_task(f'Downloading {dest.name}...', total=None) 99 | urllib.request.urlretrieve(url, dest) 100 | progress.update(task, completed=True) 101 | 102 | 103 | def gunzip_file(src: Path, dest: Path) -> None: 104 | """Decompress a gzipped file.""" 105 | with console.status(f'Decompressing {src.name}...'), gzip.open(src, 'rb') as f_in, dest.open('wb') as f_out: 106 | shutil.copyfileobj(f_in, f_out) 107 | console.print(f'[green]✓[/green] Decompressed to {dest.name}') 108 | 109 | 110 | def extract_zip(zip_path: Path, extract_to: Path) -> None: 111 | """Extract a zip file to a directory.""" 112 | with console.status(f'Extracting {zip_path.name}...'), zipfile.ZipFile(zip_path, 'r') as zip_ref: 113 | zip_ref.extractall(extract_to) 114 | console.print(f'[green]✓[/green] Extracted to {extract_to.name}') 115 | 116 | 117 | def patch_extension_bundle(bundle_path: Path, version: str) -> None: 118 | """Apply version-specific patches to the extension bundle.""" 119 | if version not in PATCH_DATA: 120 | _exit_with_error(f'Unsupported version: {version}') 121 | 122 | patch_info = PATCH_DATA[version] 123 | search_text = patch_info['search'] 124 | replace_text = patch_info['replace'] 125 | 126 | with console.status(f'Patching extension bundle for version {version}...'): 127 | # Read the file 128 | content = bundle_path.read_text(encoding='utf-8') 129 | 130 | # Count occurrences 131 | occurrences = content.count(search_text) 132 | 133 | if occurrences == 0: 134 | _exit_with_error(f'Pattern not found in bundle for version {version}. The extension may have changed.') 135 | 136 | # Replace based on version 137 | replacement = ' ' * len(search_text) if replace_text is None else replace_text 138 | 139 | content = content.replace(search_text, replacement) 140 | 141 | # Write back 142 | bundle_path.write_text(content, encoding='utf-8') 143 | 144 | console.print(f'[green]✓[/green] Patched {occurrences} occurrence(s) in extension bundle for version {version}') 145 | 146 | 147 | def compare_vscode_versions(version1: str, version2: str) -> int: 148 | """Compare two VS Code version strings. 149 | 150 | Returns: 151 | -1 if version1 < version2 152 | 0 if version1 == version2 153 | 1 if version1 > version2 154 | 155 | """ 156 | # Extract version numbers, ignoring ^ or ~ prefixes 157 | v1 = version1.lstrip('^~').split('.') 158 | v2 = version2.lstrip('^~').split('.') 159 | 160 | # Compare major, minor, patch 161 | for i in range(3): 162 | n1 = int(v1[i]) if i < len(v1) else 0 163 | n2 = int(v2[i]) if i < len(v2) else 0 164 | if n1 < n2: 165 | return -1 166 | if n1 > n2: 167 | return 1 168 | return 0 169 | 170 | 171 | def create_vsix(source_dir: Path, output_file: Path) -> None: 172 | """Create a .vsix file from a directory.""" 173 | with ( 174 | console.status(f'Creating {output_file.name}...'), 175 | zipfile.ZipFile(output_file, 'w', zipfile.ZIP_DEFLATED) as zipf, 176 | ): 177 | for file_path in source_dir.rglob('*'): 178 | if file_path.is_file(): 179 | arcname = file_path.relative_to(source_dir) 180 | zipf.write(file_path, arcname) 181 | console.print(f'[green]✓[/green] Created {output_file.name}') 182 | 183 | 184 | def update_extension_version(extract_dir: Path, version: str, override_version: str | None = None) -> None: 185 | """Update version in package.json and manifest. 186 | 187 | If override_version is provided, the version will be replaced with override_version. 188 | Otherwise, +patched suffix will be added to the original version. 189 | """ 190 | target_version = override_version if override_version is not None else f'{version}+patched' 191 | 192 | # Update version in package.json 193 | package_json_path = extract_dir / 'extension' / 'package.json' 194 | if package_json_path.exists(): 195 | package_content = package_json_path.read_text(encoding='utf-8') 196 | package_content = package_content.replace(f'"version": "{version}"', f'"version": "{target_version}"') 197 | package_json_path.write_text(package_content, encoding='utf-8') 198 | if override_version is not None: 199 | console.print( 200 | f'[green]✓[/green] Updated version in package.json to {target_version} (overridden from {version})' 201 | ) 202 | else: 203 | console.print(f'[green]✓[/green] Updated version in package.json to {target_version}') 204 | 205 | # Update version in extension.vsixmanifest 206 | manifest_path = extract_dir / 'extension.vsixmanifest' 207 | if manifest_path.exists(): 208 | manifest_content = manifest_path.read_text(encoding='utf-8') 209 | manifest_content = manifest_content.replace(f'Version="{version}"', f'Version="{target_version}"') 210 | manifest_path.write_text(manifest_content, encoding='utf-8') 211 | if override_version is not None: 212 | console.print( 213 | f'[green]✓[/green] Updated version in extension.vsixmanifest to {target_version} (overridden from {version})' 214 | ) 215 | else: 216 | console.print(f'[green]✓[/green] Updated version in extension.vsixmanifest to {target_version}') 217 | 218 | 219 | def clamp_vscode_version(extract_dir: Path, vscode_version: str | None) -> None: 220 | """Clamp VS Code version requirement if needed.""" 221 | if not vscode_version: 222 | return 223 | 224 | package_json_path = extract_dir / 'extension' / 'package.json' 225 | if not package_json_path.exists(): 226 | return 227 | 228 | package_data = json.loads(package_json_path.read_text(encoding='utf-8')) 229 | current_vscode_version = package_data.get('engines', {}).get('vscode', '') 230 | 231 | # Normalize the user input to match VS Code format 232 | if not vscode_version.startswith('^'): 233 | vscode_target = f'^{vscode_version}' 234 | # Add .0 if only major.minor is provided 235 | if vscode_target.count('.') == 1: 236 | vscode_target += '.0' 237 | else: 238 | vscode_target = vscode_version 239 | 240 | if current_vscode_version and compare_vscode_versions(current_vscode_version, vscode_target) > 0: 241 | # Current version requirement is higher than our ceiling, clamp it 242 | package_data['engines']['vscode'] = vscode_target 243 | package_json_path.write_text(json.dumps(package_data, indent=2) + '\n', encoding='utf-8') 244 | console.print(f'[green]✓[/green] Clamped VS Code version from {current_vscode_version} to {vscode_target}') 245 | else: 246 | console.print(f'[dim]VS Code version {current_vscode_version} is already compatible (≤ {vscode_target})[/dim]') 247 | 248 | 249 | @app.command() 250 | def patch( 251 | version: Annotated[str, typer.Argument(help='Pylance version to patch', show_choices=True)] = get_latest_version(), 252 | output_dir: Annotated[Path, typer.Option('--output', '-o', help='Output directory')] = Path(), 253 | *, 254 | keep_temp: Annotated[bool, typer.Option('--keep-temp', help='Keep temporary files', is_flag=True)] = False, 255 | vscode_version: Annotated[ 256 | str | None, 257 | typer.Option('--vscode-version', help="Maximum VS Code version to require (e.g., '1.96')"), 258 | ] = '1.99', 259 | override_version: Annotated[ 260 | str | None, 261 | typer.Option( 262 | '--override-version', help='Override version to use instead of the original version (default: 2024.8.1)' 263 | ), 264 | ] = '2024.8.1', 265 | ) -> None: 266 | """Download and patch Pylance VS Code extension. 267 | 268 | Supported versions: 2025.4.1, 2025.6.2, 2025.6.101, 2025.7.1 269 | 270 | The --vscode-version option clamps the required VS Code version if the extension 271 | requires a newer version. For example, use --vscode-version 1.96 to declare 272 | the extension compatible with VS Code 1.96. 273 | 274 | The --override-version option allows you to override the extension version to prevent 275 | Cursor from automatically reverting to an older version. By default, the version 276 | is overridden to 2024.8.1. 277 | """ 278 | if version not in SUPPORTED_VERSIONS: 279 | console.print(f'[red]✗[/red] Unsupported version: {version}') 280 | console.print(f'Supported versions: {", ".join(SUPPORTED_VERSIONS)}') 281 | raise typer.Exit(1) 282 | 283 | console.print(f'[bold]Pylance Patcher[/bold] - Patching version {version}') 284 | console.print() 285 | 286 | # Ensure output directory exists 287 | output_dir.mkdir(parents=True, exist_ok=True) 288 | 289 | # Define file paths 290 | vsix_gz_path = output_dir / f'ms-python.vscode-pylance-{version}.vsix' 291 | vsix_path = output_dir / f'ms-python.vscode-pylance-{version}.zip' 292 | extract_dir = output_dir / f'ms-python.vscode-pylance-{version}-patched' 293 | patched_vsix = output_dir / f'ms-python.vscode-pylance-{version}-patched.vsix' 294 | 295 | try: 296 | # Download the extension 297 | url = f'https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-python/vsextensions/vscode-pylance/{version}/vspackage' 298 | download_file(url, vsix_gz_path) 299 | 300 | # Decompress (it comes gzipped) 301 | gunzip_file(vsix_gz_path, vsix_path) 302 | 303 | # Extract the zip 304 | extract_zip(vsix_path, extract_dir) 305 | 306 | # Patch the extension bundle 307 | bundle_path = extract_dir / 'extension' / 'dist' / 'extension.bundle.js' 308 | if not bundle_path.exists(): 309 | _exit_with_error(f'Extension bundle not found at expected path: {bundle_path}') 310 | 311 | patch_extension_bundle(bundle_path, version) 312 | 313 | # Update version (with override version if specified) 314 | update_extension_version(extract_dir, version, override_version) 315 | 316 | # Clamp VS Code version if needed 317 | clamp_vscode_version(extract_dir, vscode_version) 318 | 319 | # Repackage as .vsix 320 | create_vsix(extract_dir, patched_vsix) 321 | 322 | # Clean up temporary files unless asked to keep them 323 | if not keep_temp: 324 | with console.status('Cleaning up temporary files...'): 325 | vsix_gz_path.unlink(missing_ok=True) 326 | vsix_path.unlink(missing_ok=True) 327 | shutil.rmtree(extract_dir, ignore_errors=True) 328 | console.print('[green]✓[/green] Cleaned up temporary files') 329 | 330 | console.print() 331 | console.print(f'[bold green]Success![/bold green] Patched Pylance {version} extension saved to: {patched_vsix}') 332 | 333 | except (OSError, urllib.error.URLError, zipfile.BadZipFile) as e: 334 | console.print(f'[red]✗[/red] Error: {e}') 335 | raise typer.Exit(1) from e 336 | 337 | 338 | if __name__ == '__main__': 339 | app() 340 | -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | revision = 3 3 | requires-python = ">=3.12.0" 4 | 5 | [[package]] 6 | name = "click" 7 | version = "8.2.1" 8 | source = { registry = "https://pypi.org/simple" } 9 | dependencies = [ 10 | { name = "colorama", marker = "sys_platform == 'win32'" }, 11 | ] 12 | sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } 13 | wheels = [ 14 | { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, 15 | ] 16 | 17 | [[package]] 18 | name = "colorama" 19 | version = "0.4.6" 20 | source = { registry = "https://pypi.org/simple" } 21 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } 22 | wheels = [ 23 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, 24 | ] 25 | 26 | [[package]] 27 | name = "markdown-it-py" 28 | version = "3.0.0" 29 | source = { registry = "https://pypi.org/simple" } 30 | dependencies = [ 31 | { name = "mdurl" }, 32 | ] 33 | sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } 34 | wheels = [ 35 | { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, 36 | ] 37 | 38 | [[package]] 39 | name = "mdurl" 40 | version = "0.1.2" 41 | source = { registry = "https://pypi.org/simple" } 42 | sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } 43 | wheels = [ 44 | { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, 45 | ] 46 | 47 | [[package]] 48 | name = "mslex" 49 | version = "1.3.0" 50 | source = { registry = "https://pypi.org/simple" } 51 | sdist = { url = "https://files.pythonhosted.org/packages/e0/97/7022667073c99a0fe028f2e34b9bf76b49a611afd21b02527fbfd92d4cd5/mslex-1.3.0.tar.gz", hash = "sha256:641c887d1d3db610eee2af37a8e5abda3f70b3006cdfd2d0d29dc0d1ae28a85d", size = 11583, upload-time = "2024-10-16T13:16:18.523Z" } 52 | wheels = [ 53 | { url = "https://files.pythonhosted.org/packages/64/f2/66bd65ca0139675a0d7b18f0bada6e12b51a984e41a76dbe44761bf1b3ee/mslex-1.3.0-py3-none-any.whl", hash = "sha256:c7074b347201b3466fc077c5692fbce9b5f62a63a51f537a53fbbd02eff2eea4", size = 7820, upload-time = "2024-10-16T13:16:17.566Z" }, 54 | ] 55 | 56 | [[package]] 57 | name = "nodeenv" 58 | version = "1.9.1" 59 | source = { registry = "https://pypi.org/simple" } 60 | sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } 61 | wheels = [ 62 | { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, 63 | ] 64 | 65 | [[package]] 66 | name = "psutil" 67 | version = "6.1.1" 68 | source = { registry = "https://pypi.org/simple" } 69 | sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502, upload-time = "2024-12-19T18:21:20.568Z" } 70 | wheels = [ 71 | { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511, upload-time = "2024-12-19T18:21:45.163Z" }, 72 | { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985, upload-time = "2024-12-19T18:21:49.254Z" }, 73 | { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488, upload-time = "2024-12-19T18:21:51.638Z" }, 74 | { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477, upload-time = "2024-12-19T18:21:55.306Z" }, 75 | { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017, upload-time = "2024-12-19T18:21:57.875Z" }, 76 | { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602, upload-time = "2024-12-19T18:22:08.808Z" }, 77 | { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444, upload-time = "2024-12-19T18:22:11.335Z" }, 78 | ] 79 | 80 | [[package]] 81 | name = "pygments" 82 | version = "2.19.2" 83 | source = { registry = "https://pypi.org/simple" } 84 | sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } 85 | wheels = [ 86 | { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, 87 | ] 88 | 89 | [[package]] 90 | name = "pylance-patcher" 91 | version = "0.0.0" 92 | source = { editable = "." } 93 | dependencies = [ 94 | { name = "rich" }, 95 | { name = "typer" }, 96 | ] 97 | 98 | [package.dev-dependencies] 99 | dev = [ 100 | { name = "pyright" }, 101 | { name = "ruff" }, 102 | { name = "taskipy" }, 103 | ] 104 | 105 | [package.metadata] 106 | requires-dist = [ 107 | { name = "rich", specifier = ">=14.0.0" }, 108 | { name = "typer", specifier = ">=0.12.0" }, 109 | ] 110 | 111 | [package.metadata.requires-dev] 112 | dev = [ 113 | { name = "pyright", specifier = ">=1.1.364" }, 114 | { name = "ruff", specifier = ">=0.2.0" }, 115 | { name = "taskipy", specifier = ">=1.14.0" }, 116 | ] 117 | 118 | [[package]] 119 | name = "pyright" 120 | version = "1.1.403" 121 | source = { registry = "https://pypi.org/simple" } 122 | dependencies = [ 123 | { name = "nodeenv" }, 124 | { name = "typing-extensions" }, 125 | ] 126 | sdist = { url = "https://files.pythonhosted.org/packages/fe/f6/35f885264ff08c960b23d1542038d8da86971c5d8c955cfab195a4f672d7/pyright-1.1.403.tar.gz", hash = "sha256:3ab69b9f41c67fb5bbb4d7a36243256f0d549ed3608678d381d5f51863921104", size = 3913526, upload-time = "2025-07-09T07:15:52.882Z" } 127 | wheels = [ 128 | { url = "https://files.pythonhosted.org/packages/49/b6/b04e5c2f41a5ccad74a1a4759da41adb20b4bc9d59a5e08d29ba60084d07/pyright-1.1.403-py3-none-any.whl", hash = "sha256:c0eeca5aa76cbef3fcc271259bbd785753c7ad7bcac99a9162b4c4c7daed23b3", size = 5684504, upload-time = "2025-07-09T07:15:50.958Z" }, 129 | ] 130 | 131 | [[package]] 132 | name = "rich" 133 | version = "14.0.0" 134 | source = { registry = "https://pypi.org/simple" } 135 | dependencies = [ 136 | { name = "markdown-it-py" }, 137 | { name = "pygments" }, 138 | ] 139 | sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload-time = "2025-03-30T14:15:14.23Z" } 140 | wheels = [ 141 | { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload-time = "2025-03-30T14:15:12.283Z" }, 142 | ] 143 | 144 | [[package]] 145 | name = "ruff" 146 | version = "0.12.4" 147 | source = { registry = "https://pypi.org/simple" } 148 | sdist = { url = "https://files.pythonhosted.org/packages/9b/ce/8d7dbedede481245b489b769d27e2934730791a9a82765cb94566c6e6abd/ruff-0.12.4.tar.gz", hash = "sha256:13efa16df6c6eeb7d0f091abae50f58e9522f3843edb40d56ad52a5a4a4b6873", size = 5131435, upload-time = "2025-07-17T17:27:19.138Z" } 149 | wheels = [ 150 | { url = "https://files.pythonhosted.org/packages/ae/9f/517bc5f61bad205b7f36684ffa5415c013862dee02f55f38a217bdbe7aa4/ruff-0.12.4-py3-none-linux_armv6l.whl", hash = "sha256:cb0d261dac457ab939aeb247e804125a5d521b21adf27e721895b0d3f83a0d0a", size = 10188824, upload-time = "2025-07-17T17:26:31.412Z" }, 151 | { url = "https://files.pythonhosted.org/packages/28/83/691baae5a11fbbde91df01c565c650fd17b0eabed259e8b7563de17c6529/ruff-0.12.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:55c0f4ca9769408d9b9bac530c30d3e66490bd2beb2d3dae3e4128a1f05c7442", size = 10884521, upload-time = "2025-07-17T17:26:35.084Z" }, 152 | { url = "https://files.pythonhosted.org/packages/d6/8d/756d780ff4076e6dd035d058fa220345f8c458391f7edfb1c10731eedc75/ruff-0.12.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8224cc3722c9ad9044da7f89c4c1ec452aef2cfe3904365025dd2f51daeae0e", size = 10277653, upload-time = "2025-07-17T17:26:37.897Z" }, 153 | { url = "https://files.pythonhosted.org/packages/8d/97/8eeee0f48ece153206dce730fc9e0e0ca54fd7f261bb3d99c0a4343a1892/ruff-0.12.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9949d01d64fa3672449a51ddb5d7548b33e130240ad418884ee6efa7a229586", size = 10485993, upload-time = "2025-07-17T17:26:40.68Z" }, 154 | { url = "https://files.pythonhosted.org/packages/49/b8/22a43d23a1f68df9b88f952616c8508ea6ce4ed4f15353b8168c48b2d7e7/ruff-0.12.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:be0593c69df9ad1465e8a2d10e3defd111fdb62dcd5be23ae2c06da77e8fcffb", size = 10022824, upload-time = "2025-07-17T17:26:43.564Z" }, 155 | { url = "https://files.pythonhosted.org/packages/cd/70/37c234c220366993e8cffcbd6cadbf332bfc848cbd6f45b02bade17e0149/ruff-0.12.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7dea966bcb55d4ecc4cc3270bccb6f87a337326c9dcd3c07d5b97000dbff41c", size = 11524414, upload-time = "2025-07-17T17:26:46.219Z" }, 156 | { url = "https://files.pythonhosted.org/packages/14/77/c30f9964f481b5e0e29dd6a1fae1f769ac3fd468eb76fdd5661936edd262/ruff-0.12.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afcfa3ab5ab5dd0e1c39bf286d829e042a15e966b3726eea79528e2e24d8371a", size = 12419216, upload-time = "2025-07-17T17:26:48.883Z" }, 157 | { url = "https://files.pythonhosted.org/packages/6e/79/af7fe0a4202dce4ef62c5e33fecbed07f0178f5b4dd9c0d2fcff5ab4a47c/ruff-0.12.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c057ce464b1413c926cdb203a0f858cd52f3e73dcb3270a3318d1630f6395bb3", size = 11976756, upload-time = "2025-07-17T17:26:51.754Z" }, 158 | { url = "https://files.pythonhosted.org/packages/09/d1/33fb1fc00e20a939c305dbe2f80df7c28ba9193f7a85470b982815a2dc6a/ruff-0.12.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64b90d1122dc2713330350626b10d60818930819623abbb56535c6466cce045", size = 11020019, upload-time = "2025-07-17T17:26:54.265Z" }, 159 | { url = "https://files.pythonhosted.org/packages/64/f4/e3cd7f7bda646526f09693e2e02bd83d85fff8a8222c52cf9681c0d30843/ruff-0.12.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abc48f3d9667fdc74022380b5c745873499ff827393a636f7a59da1515e7c57", size = 11277890, upload-time = "2025-07-17T17:26:56.914Z" }, 160 | { url = "https://files.pythonhosted.org/packages/5e/d0/69a85fb8b94501ff1a4f95b7591505e8983f38823da6941eb5b6badb1e3a/ruff-0.12.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2b2449dc0c138d877d629bea151bee8c0ae3b8e9c43f5fcaafcd0c0d0726b184", size = 10348539, upload-time = "2025-07-17T17:26:59.381Z" }, 161 | { url = "https://files.pythonhosted.org/packages/16/a0/91372d1cb1678f7d42d4893b88c252b01ff1dffcad09ae0c51aa2542275f/ruff-0.12.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:56e45bb11f625db55f9b70477062e6a1a04d53628eda7784dce6e0f55fd549eb", size = 10009579, upload-time = "2025-07-17T17:27:02.462Z" }, 162 | { url = "https://files.pythonhosted.org/packages/23/1b/c4a833e3114d2cc0f677e58f1df6c3b20f62328dbfa710b87a1636a5e8eb/ruff-0.12.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:478fccdb82ca148a98a9ff43658944f7ab5ec41c3c49d77cd99d44da019371a1", size = 10942982, upload-time = "2025-07-17T17:27:05.343Z" }, 163 | { url = "https://files.pythonhosted.org/packages/ff/ce/ce85e445cf0a5dd8842f2f0c6f0018eedb164a92bdf3eda51984ffd4d989/ruff-0.12.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fc426bec2e4e5f4c4f182b9d2ce6a75c85ba9bcdbe5c6f2a74fcb8df437df4b", size = 11343331, upload-time = "2025-07-17T17:27:08.652Z" }, 164 | { url = "https://files.pythonhosted.org/packages/35/cf/441b7fc58368455233cfb5b77206c849b6dfb48b23de532adcc2e50ccc06/ruff-0.12.4-py3-none-win32.whl", hash = "sha256:4de27977827893cdfb1211d42d84bc180fceb7b72471104671c59be37041cf93", size = 10267904, upload-time = "2025-07-17T17:27:11.814Z" }, 165 | { url = "https://files.pythonhosted.org/packages/ce/7e/20af4a0df5e1299e7368d5ea4350412226afb03d95507faae94c80f00afd/ruff-0.12.4-py3-none-win_amd64.whl", hash = "sha256:fe0b9e9eb23736b453143d72d2ceca5db323963330d5b7859d60d101147d461a", size = 11209038, upload-time = "2025-07-17T17:27:14.417Z" }, 166 | { url = "https://files.pythonhosted.org/packages/11/02/8857d0dfb8f44ef299a5dfd898f673edefb71e3b533b3b9d2db4c832dd13/ruff-0.12.4-py3-none-win_arm64.whl", hash = "sha256:0618ec4442a83ab545e5b71202a5c0ed7791e8471435b94e655b570a5031a98e", size = 10469336, upload-time = "2025-07-17T17:27:16.913Z" }, 167 | ] 168 | 169 | [[package]] 170 | name = "shellingham" 171 | version = "1.5.4" 172 | source = { registry = "https://pypi.org/simple" } 173 | sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } 174 | wheels = [ 175 | { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, 176 | ] 177 | 178 | [[package]] 179 | name = "taskipy" 180 | version = "1.14.1" 181 | source = { registry = "https://pypi.org/simple" } 182 | dependencies = [ 183 | { name = "colorama" }, 184 | { name = "mslex", marker = "sys_platform == 'win32'" }, 185 | { name = "psutil" }, 186 | { name = "tomli", marker = "python_full_version < '4'" }, 187 | ] 188 | sdist = { url = "https://files.pythonhosted.org/packages/c7/44/572261df3db9c6c3332f8618fafeb07a578fd18b06673c73f000f3586749/taskipy-1.14.1.tar.gz", hash = "sha256:410fbcf89692dfd4b9f39c2b49e1750b0a7b81affd0e2d7ea8c35f9d6a4774ed", size = 14475, upload-time = "2024-11-26T16:37:46.155Z" } 189 | wheels = [ 190 | { url = "https://files.pythonhosted.org/packages/55/97/4e4cfb1391c81e926bebe3d68d5231b5dbc3bb41c6ba48349e68a881462d/taskipy-1.14.1-py3-none-any.whl", hash = "sha256:6e361520f29a0fd2159848e953599f9c75b1d0b047461e4965069caeb94908f1", size = 13052, upload-time = "2024-11-26T16:37:44.546Z" }, 191 | ] 192 | 193 | [[package]] 194 | name = "tomli" 195 | version = "2.3.0" 196 | source = { registry = "https://pypi.org/simple" } 197 | sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" } 198 | wheels = [ 199 | { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" }, 200 | { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" }, 201 | { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" }, 202 | { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" }, 203 | { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" }, 204 | { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" }, 205 | { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" }, 206 | { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" }, 207 | { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" }, 208 | { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" }, 209 | { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" }, 210 | { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" }, 211 | { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" }, 212 | { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" }, 213 | { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" }, 214 | { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" }, 215 | { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" }, 216 | { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" }, 217 | { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" }, 218 | { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" }, 219 | { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" }, 220 | { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" }, 221 | { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" }, 222 | { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" }, 223 | { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" }, 224 | { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" }, 225 | { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" }, 226 | { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" }, 227 | { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" }, 228 | { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" }, 229 | { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" }, 230 | { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" }, 231 | { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" }, 232 | ] 233 | 234 | [[package]] 235 | name = "typer" 236 | version = "0.16.0" 237 | source = { registry = "https://pypi.org/simple" } 238 | dependencies = [ 239 | { name = "click" }, 240 | { name = "rich" }, 241 | { name = "shellingham" }, 242 | { name = "typing-extensions" }, 243 | ] 244 | sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload-time = "2025-05-26T14:30:31.824Z" } 245 | wheels = [ 246 | { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload-time = "2025-05-26T14:30:30.523Z" }, 247 | ] 248 | 249 | [[package]] 250 | name = "typing-extensions" 251 | version = "4.14.1" 252 | source = { registry = "https://pypi.org/simple" } 253 | sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } 254 | wheels = [ 255 | { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, 256 | ] 257 | --------------------------------------------------------------------------------