janitor

Clean codebase by eliminating waste through deletion and simplification. Use when asked to remove dead code, clean up unused imports, delete debug statements, or simplify over-engineered code. Triggers on: "use janitor mode", "clean up", "remove dead code", "delete unused", "simplify", "janitor", "eliminate waste", "reduce complexity", "remove debug code". Full access mode - modifies files and runs tests.

$ 설치

git clone https://github.com/mcouthon/agents /tmp/agents && cp -r /tmp/agents/.github/skills/janitor ~/.claude/skills/agents

// tip: Run this command in your terminal to install the skill


name: janitor description: > Clean codebase by eliminating waste through deletion and simplification. Use when asked to remove dead code, clean up unused imports, delete debug statements, or simplify over-engineered code. Triggers on: "use janitor mode", "clean up", "remove dead code", "delete unused", "simplify", "janitor", "eliminate waste", "reduce complexity", "remove debug code". Full access mode - modifies files and runs tests.

Janitor Mode

Cleanup, simplification, and elimination.

Core Philosophy

"Deletion is the most powerful refactoring."

Every line of code:

  • Must be understood
  • Must be tested
  • Must be maintained
  • Can contain bugs

Less code = less of all the above.

What to Clean

Priority 1: Dead Code

  • Unused functions and methods
  • Unreachable code branches
  • Commented-out code
  • Unused imports and variables

Priority 2: Debug Artifacts

  • Print statements
  • Console.log calls
  • Debug flags left on
  • Hardcoded test values

Priority 3: Redundancy

  • Duplicate logic (DRY violations)
  • Unnecessary abstractions
  • Wrapper functions that just pass through
  • Over-engineered solutions

Priority 4: Noise

  • Obvious comments (# increment i)
  • Empty blocks
  • Unnecessary type casts
  • Redundant conditionals

Process

1. Measure Before Deleting

Before removing code, verify it's unused:

# Check for usages
ag "function_name" --python

# Check imports
ag "from module import function_name"

2. Delete with Tests

  • Run tests before deletion
  • Delete the code
  • Run tests after deletion
  • If tests still pass, code was dead

3. Verify No Side Effects

Watch for:

  • Dynamically called code (getattr, eval)
  • Reflection-based frameworks
  • External API contracts
  • CLI entry points

Cleaning Checklist

- [ ] Unused imports removed
- [ ] Unused variables removed
- [ ] Dead functions removed
- [ ] Commented-out code removed
- [ ] Debug statements removed
- [ ] Duplicate code consolidated
- [ ] Tests still pass
- [ ] Types still check

Safe Deletion Patterns

# ✅ Safe to delete: unused import
from typing import List  # 'List' never used in file

# ✅ Safe to delete: unused variable
result = calculate()  # 'result' never read
log(value)  # This is the actual intent

# ✅ Safe to delete: dead branch
if False:  # Will never execute
    do_something()

# ⚠️ Verify first: might be used dynamically
def _helper():  # Underscore suggests private, but check usages
    pass

# ❌ Don't delete without checking: exported function
def public_api():  # Might be called by external code
    pass

Cleanup Report Format

## Cleanup Report

### Summary

- **Lines removed**: X
- **Files cleaned**: Y
- **Tests**: All passing

### Changes

#### Deleted: Unused Code

| File       | What                    | Lines Removed |
| ---------- | ----------------------- | ------------- |
| `utils.py` | `old_helper()` function | 15            |
| `api.py`   | Unused import `json`    | 1             |

#### Deleted: Debug Artifacts

| File         | What             | Lines Removed |
| ------------ | ---------------- | ------------- |
| `service.py` | print statements | 3             |

#### Simplified

| File         | Before   | After    | Improvement         |
| ------------ | -------- | -------- | ------------------- |
| `handler.py` | 45 lines | 28 lines | Removed duplication |

### Verification

- ✅ All tests pass
- ✅ Type check clean
- ✅ No runtime errors detected