--- name: uv-debug description: Troubleshooting and debugging problems with uv (Python package manager). Use when encountering uv installation issues, stale build cache, package not updating, or discrepancies between uv run and global installs. --- # UV Debugging Skill ## Purpose This skill provides systematic troubleshooting workflows for common `uv` (Python package manager) issues, with particular focus on build cache problems, installation discrepancies, and package update issues. ## When to Use This Skill Use this skill when encountering: - Code changes not appearing after `uv tool install` - Discrepancy between `uv run ` and globally installed command - New files/modules missing from installed package - "Command not found" after installation - Stale build cache issues - Installation mode confusion (editable vs production) ## Core Concepts ### UV Installation Modes **Production Install:** ```bash uv tool install . ``` - Builds wheel package (cached snapshot) - Fast to install, slow to update - Requires reinstall after code changes - Isolated from source directory **Editable Install:** ```bash uv tool install --editable . ``` - Creates symlinks to source directory - Changes reflect immediately - Best for active development - Less isolated **Local Environment:** ```bash uv sync # Setup environment uv run # Execute from source ``` - No global install needed - Always uses current source code - Fastest iteration cycle - Recommended for development ### Build Cache Location **Global tool installs:** ``` ~/.local/share/uv/tools// ``` **Build artifacts:** ``` build/ - Temporary build files dist/ - Built wheels (.whl) and source distributions *.egg-info/ - Package metadata and file manifest ``` ## Troubleshooting Workflows ### Workflow 1: Code Changes Not Appearing **Symptoms:** - Ran `uv tool install .` or `make install` - Code changes don't appear in installed command - New files/modules missing **Diagnostic Steps:** 1. **Verify the discrepancy:** ```bash # Check which version is running which # Test local version uv run --help # Test global version --help ``` 2. **Check for stale build artifacts:** ```bash ls -la build/ dist/ *.egg-info 2>/dev/null ``` 3. **Identify installation mode:** ```bash # Check if editable install ls ~/.local/share/uv/tools// | grep -i editable ``` **Solutions (in order of preference):** **Solution A: Clean and Reinstall (Recommended)** ```bash # Remove stale artifacts rm -rf build/ dist/ *.egg-info # Force fresh build uv tool install --force . # Verify --help ``` **Solution B: Use Makefile Pattern** ```makefile install: clean uv tool install --force . clean: rm -rf build/ dist/ *.egg-info find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true ``` **Solution C: Switch to Local Environment** ```bash # Setup once uv sync # Use for development uv run ``` **Solution D: Use Editable Mode** ```bash uv tool install --editable . ``` ### Workflow 2: New Module Not Found **Symptoms:** - Added new Python file (e.g., `mypackage/commands/new_cmd.py`) - `ModuleNotFoundError` or command not recognized - `uv run` works but global install doesn't **Root Cause:** Wheel package built before new file existed. Package metadata (`*.egg-info/RECORD`) doesn't list the new file. **Solution:** ```bash # 1. Clean build artifacts rm -rf build/ dist/ *.egg-info # 2. Reinstall with force uv tool install --force . # 3. Verify new module appears --help ``` **Prevention:** Add to Makefile: ```makefile install: clean uv tool install --force . ``` ### Workflow 3: Debugging Installation Location **Symptoms:** - Unsure which version is running - Multiple installations conflict - Changes not appearing despite reinstall **Diagnostic Commands:** ```bash # 1. Check which executable which # 2. Check Python import location python3 -c "import ; print(.__file__)" # 3. List all installations find ~/.local/share/uv/tools -name "*" # 4. Check if editable install cat ~/.local/share/uv/tools//*/site-packages/*.pth 2>/dev/null ``` **Interpretation:** If `which ` shows: - `~/.local/share/uv/tools/` → Global uv install - `/usr/local/bin/` → System-wide install (pip) - `/.venv/bin/` → Virtual environment If `.pth` file exists → Editable install (points to source) ### Workflow 4: Entry Point Not Updating **Symptoms:** - Changed command name or added new subcommand - Entry point not updating in installed version **Root Cause:** Entry points defined in `pyproject.toml` are baked into wheel at build time. **Solution:** 1. **Verify entry point definition:** ```bash # Read pyproject.toml grep -A 10 "\[project.scripts\]" pyproject.toml ``` 2. **Clean and rebuild:** ```bash rm -rf build/ dist/ *.egg-info uv tool install --force . ``` 3. **Verify entry points installed:** ```bash ls ~/.local/share/uv/tools//*/bin/ ``` ### Workflow 5: Dependency Issues **Symptoms:** - Import errors for dependencies - Version conflicts - `ModuleNotFoundError` for installed packages **Diagnostic:** ```bash # Check installed dependencies uv pip list # Check project dependencies grep -A 20 "dependencies" pyproject.toml # Check dependency resolution uv pip tree ``` **Solution:** ```bash # Sync dependencies uv sync --all-extras # Or for global install uv tool install --force --reinstall-package . ``` ## Decision Tree ``` Code changes not appearing? ├─ Does `uv run ` work? │ ├─ Yes → Stale build cache │ │ └─ Solution: rm -rf build/ dist/ *.egg-info && uv tool install --force . │ └─ No → Code issue, not cache │ └─ Debug the code itself │ ├─ New file/module missing? │ └─ Solution: Clean build artifacts and reinstall │ ├─ Entry point not found? │ └─ Check pyproject.toml [project.scripts], then clean and reinstall │ └─ Dependency missing? └─ Run uv sync or uv tool install --reinstall-package ``` ## Best Practices ### Development Workflow **Option 1: Local Environment (Recommended)** ```bash # Setup once uv sync # Develop with instant updates uv run uv run pytest ``` **Option 2: Editable Install** ```bash # Install once uv tool install --editable . # Changes reflect immediately # Always uses latest source ``` **Option 3: Production Build with Makefile** ```bash # Makefile ensures clean builds make install # Reinstall after each change make install ``` ### Testing Installation Before distributing or deploying: ```bash # 1. Clean environment rm -rf build/ dist/ *.egg-info # 2. Production build uv tool install --force . # 3. Test from clean shell --help # 4. Verify all entry points ls ~/.local/share/uv/tools//*/bin/ ``` ## Common Mistakes ### Mistake 1: Assuming `--force` Cleans Cache **Wrong:** ```bash uv tool install --force . # Doesn't clean build artifacts! ``` **Right:** ```bash rm -rf build/ dist/ *.egg-info uv tool install --force . ``` **Why:** `--force` reinstalls but may reuse cached wheel from `dist/`. ### Mistake 2: Editing Global Install Directly **Wrong:** ```bash # Editing files in ~/.local/share/uv/tools// vim ~/.local/share/uv/tools//.../myfile.py ``` **Right:** ```bash # Edit source, then reinstall vim mypackage/myfile.py make install ``` ### Mistake 3: Mixing Installation Methods **Problem:** ```bash uv tool install . # Production install # Later... uv tool install --editable . # Now editable # Changes behavior unpredictably ``` **Solution:** Pick one method and stick with it, or uninstall first: ```bash uv tool uninstall uv tool install --editable . ``` ## Advanced Debugging ### Inspecting Wheel Contents ```bash # Build wheel uv build # List contents unzip -l dist/*.whl # Extract and examine unzip dist/*.whl -d /tmp/wheel-inspect ls -la /tmp/wheel-inspect// ``` ### Checking Package Metadata ```bash # View installed package info uv pip show # View RECORD file (manifest of installed files) cat ~/.local/share/uv/tools//*/*.dist-info/RECORD ``` ### Debugging Import Paths ```python import sys print("Python path:") for p in sys.path: print(f" {p}") import print(f"\nPackage location: {.__file__}") ``` ## Reference: Build Process Understanding what happens during `uv tool install .`: 1. **Read metadata** - Parse `pyproject.toml` for package info 2. **Collect files** - Find all Python files in package 3. **Build wheel** - Create `.whl` in `dist/` 4. **Write manifest** - Record all files in `*.egg-info/RECORD` 5. **Install wheel** - Copy to `~/.local/share/uv/tools//` 6. **Create entry points** - Generate executables in `bin/` **Key insight:** Steps 3-4 create a snapshot. New files added after this won't be included until rebuild. ## Quick Reference **Check what's running:** ```bash which uv run --version --version ``` **Clean build cache:** ```bash rm -rf build/ dist/ *.egg-info ``` **Fresh install:** ```bash uv tool install --force . ``` **Development mode:** ```bash uv sync && uv run ``` **Inspect installation:** ```bash ls ~/.local/share/uv/tools// uv pip show ``` ## Official UV Documentation **Cache Management:** - https://docs.astral.sh/uv/concepts/cache/ - How UV caches packages, cache types, cache location, cache commands **Build Troubleshooting:** - https://docs.astral.sh/uv/reference/troubleshooting/build-failures/ - Common build errors, missing dependencies, build isolation issues **CLI Commands:** - https://docs.astral.sh/uv/reference/cli/ - Complete command reference with all flags and options **Settings Reference:** - https://docs.astral.sh/uv/reference/settings/ - Configuration options for build constraints, cache control, dependency resolution ## Internal References For deep technical details, see: - `references/python-build-cache.md` - Why Python build cache doesn't auto-update - `references/uv-cli-reference.md` - UV command workflows and examples ## Troubleshooting Checklist When encountering issues: - [ ] Does `uv run ` work? (Rules out code issues) - [ ] Are there stale artifacts in `build/`, `dist/`, `*.egg-info`? - [ ] Which installation mode am I using? (production/editable/local) - [ ] Did I recently add new files? - [ ] Did I update `pyproject.toml` dependencies or entry points? - [ ] Am I using the right `which ` version? - [ ] Have I tried cleaning and reinstalling? ## Exit Codes Common uv exit codes: - `0` - Success - `1` - General error - `2` - Command line usage error - `101` - Package not found - `102` - Version conflict