Back to Skills

clean-codebase

pjt222
Updated 2 days ago
3 views
17
2
17
View on GitHub
Documentationapi

About

This skill automatically cleans up code hygiene issues like dead code, unused imports, and lint warnings while standardizing formatting, without altering core business logic. It's ideal for addressing technical debt accumulated during rapid development sprints. The tool focuses on safe, non-architectural fixes to restore codebase maintainability.

Quick Install

Claude Code

Recommended
Primary
npx skills add pjt222/agent-almanac -a claude-code
Plugin CommandAlternative
/plugin add https://github.com/pjt222/agent-almanac
Git CloneAlternative
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/clean-codebase

Copy and paste this command in Claude Code to install this skill

Documentation

clean-codebase

When Use

Use when codebase has accumulated hygiene debt:

  • Lint warnings piled up during rapid development
  • Unused imports, variables clutter files
  • Dead code paths exist but never removed
  • Formatting inconsistent across files
  • Static analysis tools report fixable issues

Do NOT use for architectural refactoring, bug fixes, or business logic changes. Skill focuses purely on hygiene, automated cleanup.

Inputs

ParameterTypeRequiredDescription
codebase_pathstringYesAbsolute path to codebase root
languagestringYesPrimary language (js, python, r, rust, etc.)
cleanup_modeenumNosafe (default) or aggressive
run_testsbooleanNoRun test suite after cleanup (default: true)
backupbooleanNoCreate backup before deletion (default: true)

Steps

Step 1: Pre-Cleanup Assessment

Measure current state to quantify improvements later.

# Count lint warnings by severity
lint_tool --format json > lint_before.json

# Count lines of code
cloc . --json > cloc_before.json

# List unused symbols (language-dependent)
# JavaScript/TypeScript: ts-prune or depcheck
# Python: vulture
# R: lintr unused function checks

Got: Baseline metrics saved to lint_before.json and cloc_before.json

If fail: Lint tool not found? Skip automated fixes, focus on manual review

Step 2: Fix Automated Lint Warnings

Apply safe automated fixes (spacing, quotes, semicolons, trailing whitespace).

JavaScript/TypeScript:

eslint --fix .
prettier --write .

Python:

black .
isort .
ruff check --fix .

R:

Rscript -e "styler::style_dir('.')"

Rust:

cargo fmt
cargo clippy --fix --allow-dirty

Got: All safe lint warnings resolved; files formatted consistently

If fail: Automated fixes introduce test failures? Revert changes, escalate

Step 3: Identify Dead Code Paths

Use static analysis to find unreferenced functions, unused variables, orphaned files.

JavaScript/TypeScript:

ts-prune | tee dead_code.txt
depcheck | tee unused_deps.txt

Python:

vulture . | tee dead_code.txt

R:

Rscript -e "lintr::lint_dir('.', linters = lintr::unused_function_linter())"

General approach:

  1. Grep for function definitions
  2. Grep for function calls
  3. Report functions defined but never called

Got: dead_code.txt lists unused functions, variables, files

If fail: Static analysis tool unavailable? Manually review recent commit history for orphaned code

Step 4: Remove Unused Imports

Clean up import blocks by removing references to packages never used.

JavaScript:

eslint --fix --rule 'no-unused-vars: error'

Python:

autoflake --remove-all-unused-imports --in-place --recursive .

R:

# Manual review: grep for library() calls, check if package used
grep -r "library(" . | cut -d: -f2 | sort | uniq

Got: All unused import statements removed

If fail: Removing imports breaks build? Used indirectly — restore, document

Step 5: Remove Dead Code (Mode-Dependent)

Safe Mode (default):

  • Only remove code explicitly marked as deprecated
  • Remove commented-out code blocks (if >10 lines and >6 months old)
  • Remove TODO comments referencing completed issues

Aggressive Mode (opt-in):

  • Remove all functions identified as unused in Step 3
  • Remove private methods with zero references
  • Remove feature flags for deprecated features

For each candidate deletion:

  1. Verify zero references in codebase
  2. Check git history for recent activity (skip if modified in last 30 days)
  3. Remove code, add entry to CLEANUP_LOG.md

Got: Dead code removed; CLEANUP_LOG.md documents all deletions

If fail: Uncertain whether code truly dead? Move to archive/ directory instead

Step 6: Normalize Formatting

Ensure consistent formatting across all files (even if not caught by linters).

  1. Normalize line endings (LF vs CRLF)
  2. Ensure single newline at end of file
  3. Remove trailing whitespace
  4. Normalize indentation (spaces vs tabs, indent width)
# Example: Fix line endings and trailing whitespace
find . -type f -name "*.js" -exec sed -i 's/\r$//' {} +
find . -type f -name "*.js" -exec sed -i 's/[[:space:]]*$//' {} +

Got: All files follow consistent formatting conventions

If fail: sed breaks binary files? Skip, document

Step 7: Run Tests

Validate cleanup didn't break functionality.

# Language-specific test command
npm test              # JavaScript
pytest                # Python
R CMD check           # R
cargo test            # Rust

Got: All tests pass (or same failures as before cleanup)

If fail: Revert changes incrementally to identify breaking change, then escalate

Step 8: Generate Cleanup Report

Document all changes for review.

# Codebase Cleanup Report

**Date**: YYYY-MM-DD
**Mode**: safe | aggressive
**Language**: <language>

## Metrics

| Metric | Before | After | Change |
|--------|--------|-------|--------|
| Lint warnings | X | Y | -Z |
| Lines of code | A | B | -C |
| Unused imports | D | 0 | -D |
| Dead functions | E | F | -G |

## Changes Applied

1. Fixed X lint warnings (automated)
2. Removed Y unused imports
3. Deleted Z lines of dead code (see CLEANUP_LOG.md)
4. Normalized formatting across W files

## Escalations

- [Issue description requiring human review]
- [Uncertain deletion moved to archive/]

## Validation

- [x] All tests pass
- [x] Backup created: backup_YYYYMMDD/
- [x] CLEANUP_LOG.md updated

Got: Report saved to CLEANUP_REPORT.md in project root

If fail: (N/A — generate report regardless of outcome)

Checks

After cleanup:

  • All tests pass (or same failures as before)
  • No new lint warnings introduced
  • Backup created before any deletions
  • CLEANUP_LOG.md documents all removed code
  • Cleanup report generated with metrics
  • Git diff reviewed for unexpected changes
  • CI pipeline passes

Pitfalls

  1. Removing Code Still Used via Reflection: Static analysis misses dynamic calls (e.g., eval(), metaprogramming). Always check git history.

  2. Breaking Implicit Dependencies: Removing imports used by dependencies. Run tests after every import removal.

  3. Deleting Feature Flags for Active Features: Even if unused in current branch, feature flags may be active in other environments. Check deployment configs.

  4. Over-Aggressive Formatting: Tools like black or prettier may reformat code in ways that trigger unnecessary diffs. Configure tools to match project style.

  5. Ignoring Test Coverage: Cannot safely clean codebases without tests. Coverage low? Escalate for test additions first.

  6. Not Backing Up: Always create backup_YYYYMMDD/ directory before deleting anything, even if using git.

  7. Wrong R binary on hybrid systems: On WSL or Docker, Rscript may resolve to cross-platform wrapper instead of native R. Check with which Rscript && Rscript --version. Prefer native R binary (e.g., /usr/local/bin/Rscript on Linux/WSL) for reliability. See Setting Up Your Environment for R path configuration.

See Also

GitHub Repository

pjt222/agent-almanac
Path: i18n/caveman/skills/clean-codebase
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

Related Skills

railway-docs

Documentation

This skill fetches current Railway documentation to answer questions about features, functionality, or specific docs URLs. It ensures developers receive accurate, up-to-date information directly from Railway's official sources. Use it when users ask how Railway works or reference Railway documentation.

View skill

n8n-code-python

Documentation

This Claude Skill provides expert guidance for writing Python code in n8n's Code nodes, specifically for using Python's standard library and working with n8n's special syntax like `_input`, `_json`, and `_node`. It helps developers understand Python's limitations within n8n and recommends using JavaScript for most workflows while offering Python solutions for specific data transformation needs.

View skill

archon

Documentation

The Archon skill provides RAG-powered semantic search and project management through a REST API. Use it for querying documentation, managing hierarchical projects/tasks, and performing knowledge retrieval with document upload capabilities. Always prioritize Archon first when searching external documentation before using other sources.

View skill

n8n-code-javascript

Documentation

This Claude Skill provides expert guidance for writing JavaScript code in n8n's Code nodes. It covers essential n8n-specific syntax like `$input`/`$json` variables, HTTP helpers, and DateTime handling, while troubleshooting common errors. Use it when developing n8n workflows that require custom JavaScript processing in Code nodes.

View skill