Self-healing Python — catches runtime errors, fixes code & dependencies via LLM + MCP
Project description
🔧 pfix
Self-healing Python — catches runtime errors and fixes source code + dependencies via LLM + MCP.
Features
@pfixdecorator — wrap any function; errors trigger automatic repair- Fast dep fix —
ModuleNotFoundError→ instantpip/uv install(no LLM call) - pipreqs scanning — project-wide import analysis for missing dependencies
- LLM code repair — sends error context to LLM (OpenRouter/LiteLLM) for intelligent fixes
- pip + uv — auto-detects
uvfor faster installs, falls back topip - MCP server —
@mcp.tool()via FastMCP for IDE integration (Claude Code, Cursor, VS Code) - Git auto-commit — optional auto-commit of fixes with configurable prefix
- Auto-restart —
os.execvprocess restart after fix applied - Interactive diff — unified diff with confirmation before applying
- Backup system — timestamped backups in
.pfix_backups/ - Async support —
@apfixfor async functions
Installation
pip install pfix
# With MCP server support
pip install pfix[mcp]
# With git auto-commit
pip install pfix[git]
# Everything
pip install pfix[all]
Quick Start
# 1. Configure
cp .env.example .env
# Set OPENROUTER_API_KEY=sk-or-v1-...
# 2. Use in your code
from pfix import pfix
@pfix
def process_data(path):
import pandas as pd # auto-installed if missing
df = pd.read_csv(path)
return df.groupby("category").sum() # LLM fixes column errors
@pfix(retries=3, hint="Parses ISO dates from API", deps=["requests", "python-dateutil"])
def fetch_events(url: str):
import requests
from dateutil.parser import parse
return [parse(e["ts"]) for e in requests.get(url).json()["events"]]
CLI
pfix run script.py # Run with global exception hook
pfix run script.py --auto # Auto-apply fixes
pfix run script.py --restart # Restart process after fix
pfix check # Show config status
pfix deps scan # Scan for missing deps (pipreqs)
pfix deps install # Install all missing deps
pfix deps generate # Generate requirements.txt
pfix server # Start MCP server (stdio)
pfix server --http 3001 # Start MCP server (HTTP)
MCP Integration
pfix exposes tools via FastMCP for IDE integration:
| Tool | Description |
|---|---|
pfix_analyze |
Analyze error → diagnosis + fix proposal |
pfix_fix |
Analyze + apply fix (with backup) |
pfix_deps_scan |
Scan for missing deps |
pfix_deps_install |
Install a package |
pfix_deps_generate |
Generate requirements.txt |
pfix_edit_file |
Write file content |
Claude Code / VS Code setup
Add to your MCP config (.claude/mcp.json or VS Code settings):
{
"mcpServers": {
"pfix": {
"command": "python",
"args": ["-m", "pfix.mcp_server"]
}
}
}
Configuration
.env
| Variable | Default | Description |
|---|---|---|
OPENROUTER_API_KEY |
— | Required |
PFIX_MODEL |
openrouter/anthropic/claude-sonnet-4 |
LLM model |
PFIX_AUTO_APPLY |
false |
Auto-apply fixes |
PFIX_AUTO_INSTALL_DEPS |
true |
Auto pip/uv install |
PFIX_AUTO_RESTART |
false |
Restart after fix |
PFIX_PKG_MANAGER |
auto | pip or uv |
PFIX_MAX_RETRIES |
3 |
Max attempts |
PFIX_DRY_RUN |
false |
Show only |
PFIX_GIT_COMMIT |
false |
Auto-commit fixes |
PFIX_GIT_PREFIX |
pfix: |
Commit prefix |
pyproject.toml
[tool.pfix]
model = "openrouter/anthropic/claude-sonnet-4"
auto_apply = false
max_retries = 3
Programmatic
from pfix import configure
configure(
auto_apply=True,
pkg_manager="uv",
git_auto_commit=True,
)
How It Works
@pfix decorated function
│
▼
Exception caught
│
├── ModuleNotFoundError? → pip/uv install → retry
│
▼
ErrorContext built (traceback, source, vars, imports, pipreqs scan)
│
▼
LLM analysis (LiteLLM → OpenRouter)
│
▼
FixProposal (diagnosis, code, deps, confidence)
│
├── Show diff → confirm (or auto-apply)
├── Create .pfix_backups/ backup
├── Apply fix to source
├── Git commit (optional)
▼
Reload module → retry (or os.execv restart)
Dependencies
| Package | Role |
|---|---|
litellm |
LLM proxy — OpenRouter, OpenAI, Anthropic, Ollama |
python-dotenv |
Load .env config |
rich |
Terminal UI (diffs, panels, tables) |
pipreqs |
Project import scanning |
pathspec |
Gitignore-aware file filtering |
mcp |
FastMCP server (optional) |
gitpython |
Git auto-commit (optional) |
watchdog |
File change watching (optional) |
License
Licensed under Apache-2.0.
Licensed under Apache-2.0.
Licensed under Apache-2.0.
Licensed under Apache-2.0.
Apache 2.0 — Tom Sapletta / Softreck
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pfix-0.1.4.tar.gz.
File metadata
- Download URL: pfix-0.1.4.tar.gz
- Upload date:
- Size: 32.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
49562001d8980cba64173c922f91565e719dfdbed05aca3d4ba6b92739856a0c
|
|
| MD5 |
6acb5c27394487709181828c3839d070
|
|
| BLAKE2b-256 |
437ebd31410bb570ba1f4192fccc4758ba3f7b30eaf5c79f6ffcbd858104ee5c
|
File details
Details for the file pfix-0.1.4-py3-none-any.whl.
File metadata
- Download URL: pfix-0.1.4-py3-none-any.whl
- Upload date:
- Size: 26.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8eeabc836b3aab5cdfec496db2c38dfecdbed837fdb15625ca312330e30baf80
|
|
| MD5 |
be3a92da4d781431b727cd818bd34194
|
|
| BLAKE2b-256 |
fb3b399a7e2cf2bb79e2ec1e47f1ceb68ec01fbd1201150a58e189ce4b9d5859
|