Fix Command
$ARGUMENTS
Attempts to fix code errors autonomously.
Usage
/fix <file_or_scope>
# Example: /fix src/utils.ts
Automated Error Classification
Before entering the fix loop, classify errors to prioritize auto-fixable ones:
# Pipe lint or test output
ruff check . 2>&1 | python3 ${CLAUDE_SKILL_DIR}/scripts/error-classifier.py
mypy src/ 2>&1 | python3 ${CLAUDE_SKILL_DIR}/scripts/error-classifier.py
npx eslint . 2>&1 | python3 ${CLAUDE_SKILL_DIR}/scripts/error-classifier.py
The script outputs JSON with:
- total_errors: count of all parsed errors
- auto_fixable_count: errors that tools can fix automatically (e.g., F401 unused imports, formatting)
- manual_count: errors requiring human/agent intervention
- tools_detected: which linters produced the output (ruff, mypy, eslint, tsc, phpstan)
- errors[]: each error with file, line, code, message, and auto_fixable flag
- suggested_order: files to fix, auto-fixable first
- fix_strategy: recommended approach (auto-fix first, then manual)
Use this to run auto-fixers (e.g., ruff check --fix .) before spending time on manual fixes.
Protocol (The "Fix Loop")
Analyze: Run validation to get the exact error message.
# Get error
npm test src/utils.ts 2>&1 | tee error.log
Diagnose: Analyze error.log.
- Use
debugging-tactics skill.
- Trace the error to the source line.
Patch: Apply a fix.
Verify: Run validation again.
- If PASS: Stop.
- If FAIL: Repeat (Max 3 retries).
Safety Limits
- Max Retries: 3
- Scope: Only modify the specified files.
- Stop Condition: If new errors appear that are totally different, STOP and ask user.
Example Flow
User: /fix app.py
Agent: Running tests... FAIL (NameError)
Agent: Fixing app.py (Import missing module)
Agent: Running tests... PASS
Agent: Fixed NameError in app.py
Rules
- MUST know the exact symptom (error message, failing test, lint code) before editing — guessing is not fixing
- MUST verify the fix by rerunning the same command that exposed the problem, not a different validator
- NEVER modify tests to make them pass — fixing the test is not fixing the bug
- NEVER touch files outside the declared scope — scope creep hides regressions
- CRITICAL: hard-stop after 3 iterations. If the fix loop has not converged, the problem is deeper than
/fix handles — escalate to /debug.
- MANDATORY: if new, unrelated errors appear during a fix attempt, stop and ask the user — do not chase them
Gotchas
ruff check --fix reorders imports and rewrites them. On files with circular imports or conditional-imports-under-TYPE_CHECKING, the "fix" can break things silently. Run --check first, inspect the diff, then apply.
eslint --fix --cache skips already-cached files even if their content changed (cache invalidation by mtime). On first-run misses, clear the cache with --no-cache to force a complete pass.
mypy --install-types auto-installs stub packages, adding dependencies to the environment the user did not request. Reserve it for explicit opt-in; in CI, pass --non-interactive to prevent surprise installs.
npm test -- path/to/test in a workspace repo runs the root workspace's test runner, not the leaf package's. Use npm test --workspace=<name> or the per-package cd packages/foo && npm test form.
- Fix loops occasionally produce cycle diffs — iteration 1 fixes A which triggers B, iteration 2 fixes B which re-breaks A. After every iteration compare the diff to the previous; identical or inverse diffs mean a cycle — stop.
When NOT to Use
- When the root cause is unknown — use
/debug first, then /fix with a clear target
- For systemic refactoring across modules — use
/refactor or /refactor-plan
- For writing new features test-first — use
/tdd
- For CI failures spanning many files — use
/workflow debugging (coordinated)
- When the failing validation is itself broken — repair the validator separately, do not patch code to satisfy it
1---2name: fix3description: Applies targeted fix to known bug/lint error, verifies with same command that surfaced it. Triggers: fix, apply fix, fix bug, fix lint, targeted fix.4---56# Fix Command78$ARGUMENTS910Attempts to fix code errors autonomously.1112## Usage1314```bash15/fix <file_or_scope>16# Example: /fix src/utils.ts17```1819## Automated Error Classification2021Before entering the fix loop, classify errors to prioritize auto-fixable ones:2223```bash24# Pipe lint or test output25ruff check . 2>&1 | python3 ${CLAUDE_SKILL_DIR}/scripts/error-classifier.py26mypy src/ 2>&1 | python3 ${CLAUDE_SKILL_DIR}/scripts/error-classifier.py27npx eslint . 2>&1 | python3 ${CLAUDE_SKILL_DIR}/scripts/error-classifier.py28```2930The script outputs JSON with:31- **total_errors**: count of all parsed errors32- **auto_fixable_count**: errors that tools can fix automatically (e.g., F401 unused imports, formatting)33- **manual_count**: errors requiring human/agent intervention34- **tools_detected**: which linters produced the output (ruff, mypy, eslint, tsc, phpstan)35- **errors[]**: each error with file, line, code, message, and auto_fixable flag36- **suggested_order**: files to fix, auto-fixable first37- **fix_strategy**: recommended approach (auto-fix first, then manual)3839Use this to run auto-fixers (e.g., `ruff check --fix .`) before spending time on manual fixes.4041---4243## Protocol (The "Fix Loop")44451. **Analyze**: Run validation to get the exact error message.46 ```bash47 # Get error48 npm test src/utils.ts 2>&1 | tee error.log49 ```50512. **Diagnose**: Analyze `error.log`.52 - Use `debugging-tactics` skill.53 - Trace the error to the source line.54553. **Patch**: Apply a fix.56 - Use `sed` or `write_file`.57584. **Verify**: Run validation again.59 - If PASS: Stop.60 - If FAIL: Repeat (Max 3 retries).6162## Safety Limits63- **Max Retries**: 364- **Scope**: Only modify the specified files.65- **Stop Condition**: If new errors appear that are totally different, STOP and ask user.6667## Example Flow68```69User: /fix app.py70Agent: Running tests... FAIL (NameError)71Agent: Fixing app.py (Import missing module)72Agent: Running tests... PASS73Agent: Fixed NameError in app.py74```7576## Rules7778- **MUST** know the exact symptom (error message, failing test, lint code) before editing — guessing is not fixing79- **MUST** verify the fix by rerunning **the same command** that exposed the problem, not a different validator80- **NEVER** modify tests to make them pass — fixing the test is not fixing the bug81- **NEVER** touch files outside the declared scope — scope creep hides regressions82- **CRITICAL**: hard-stop after 3 iterations. If the fix loop has not converged, the problem is deeper than `/fix` handles — escalate to `/debug`.83- **MANDATORY**: if new, unrelated errors appear during a fix attempt, stop and ask the user — do not chase them8485## Gotchas8687- `ruff check --fix` reorders imports and rewrites them. On files with circular imports or conditional-imports-under-TYPE_CHECKING, the "fix" can break things silently. Run `--check` first, inspect the diff, then apply.88- `eslint --fix --cache` skips already-cached files even if their content changed (cache invalidation by mtime). On first-run misses, clear the cache with `--no-cache` to force a complete pass.89- `mypy --install-types` auto-installs stub packages, adding dependencies to the environment the user did not request. Reserve it for explicit opt-in; in CI, pass `--non-interactive` to prevent surprise installs.90- `npm test -- path/to/test` in a workspace repo runs the **root** workspace's test runner, not the leaf package's. Use `npm test --workspace=<name>` or the per-package `cd packages/foo && npm test` form.91- Fix loops occasionally produce **cycle diffs** — iteration 1 fixes A which triggers B, iteration 2 fixes B which re-breaks A. After every iteration compare the diff to the previous; identical or inverse diffs mean a cycle — stop.9293## When NOT to Use9495- When the root cause is unknown — use `/debug` first, then `/fix` with a clear target96- For systemic refactoring across modules — use `/refactor` or `/refactor-plan`97- For writing new features test-first — use `/tdd`98- For CI failures spanning many files — use `/workflow debugging` (coordinated)99- When the failing validation is itself broken — repair the validator separately, do not patch code to satisfy it