Run knip to find and remove unused files, dependencies, and exports. Use for cleaning up dead code and unused dependencies.
---
name: knip
description: Run knip to find and remove unused files, dependencies, and exports. Use for cleaning up dead code and unused dependencies.
---
# Knip Code Cleanup
Run knip to find and remove unused files, dependencies, and exports from this codebase.
## Setup
1. Check if knip is available:
- Run `npx knip --version` to test
- If it fails or is very slow, check if `knip` is in package.json devDependencies
- If not installed locally, install with `npm install -D knip` (or pnpm/yarn/bun equivalent based on lockfile present)
2. Knip does NOT remove unused imports/variables inside files — that's a linter's job. Knip finds unused files, dependencies, and exports across the project.
## Workflow
Always follow this configuration-first workflow. Even for simple "run knip" or "clean up codebase" prompts, configure knip properly before acting on reported issues.
### Step 1: Understand the project
- Check what frameworks and tools the project uses (look at package.json)
- Check if a knip config exists (`knip.json`, `knip.jsonc`, or `knip` key in package.json)
- If a config exists, review it for improvements (see Configuration Best Practices below)
### Step 2: Run knip and read configuration hints first
```bash
npx knip
```
Focus on **configuration hints** before anything else. These appear at the top of the output and suggest config adjustments to reduce false positives.
### Step 3: Address hints by adjusting knip.json
Fix configuration hints before addressing reported issues. Common adjustments:
- Enable/disable plugins for detected frameworks
- Add entry patterns for non-standard entry points
- Configure workspace settings for monorepos
### Step 4: Repeat steps 2-3
Re-run knip after each config change. Repeat until configuration hints are resolved and false positives are minimized.
### Step 5: Address actual issues
Once the configuration is settled, work through reported issues. Prioritize in this order:
1. **Unused files** — address these first ("inbox zero" approach removes the most noise)
2. **Unused dependencies** — remove from package.json
3. **Unused devDependencies** — remove from package.json
4. **Unused exports** — remove or mark as internal
5. **Unused types** — remove, or configure `ignoreExportsUsedInFile` (see below)
### Step 6: Re-run and repeat
Re-run knip after each batch of fixes. Removing unused files often exposes newly-unused exports and dependencies.
## Configuration Best Practices
When reviewing or creating a knip config, follow these rules:
- **Never use `ignore` patterns** — `ignore` hides real issues and should almost never be used. Always prefer specific solutions. Other `ignore*` options (like `ignoreDependencies`, `ignoreExportsUsedInFile`) are fine because they target specific issue types.
- **Many unused exported types?** Add `ignoreExportsUsedInFile: { interface: true, type: true }` — this handles the common case of types only used in the same file. Prefer this over broader ignore options.
- **Remove redundant patterns** — Knip already respects `.gitignore`, so ignoring `node_modules`, `dist`, `build`, `.git` is redundant.
- **Remove entry patterns covered by defaults** — Auto-detected plugins already add standard entry points. Don't duplicate them.
- **Config files showing as unused** (e.g. `vite.config.ts`) — Enable or disable the corresponding plugin explicitly rather than ignoring the file.
- **Dependencies matching Node.js builtins** (e.g. `buffer`, `process`) — Add to `ignoreDependencies`.
- **Unresolved imports from path aliases** — Add `paths` to knip config (uses tsconfig.json semantics).
## Production Mode
Use `--production` to focus on production code only:
```bash
npx knip --production
```
This excludes test files, config files, and other non-production entry points. Do NOT use `project` or `ignore` patterns to exclude test files — use `--production` instead.
## Cleanup Confidence Levels
### Auto-delete (high confidence):
- Unused exports that are clearly internal (not part of public API)
- Unused type exports
- Unused dependencies (remove from package.json)
- Unused files that are clearly orphaned (not entry points, not config files)
### Ask first (needs clarification):
- Files that might be entry points or dynamically imported
- Exports that might be part of a public API (index.ts, lib exports)
- Dependencies that might be used via CLI or peer dependencies
- Anything in paths like `src/index`, `lib/`, or files with "public" or "api" in the name
Use the AskUserQuestion tool to clarify before deleting these.
## Auto-fix
Once configuration is settled and you're confident in the results:
```bash
# Auto-fix safe changes (removes unused exports and dependencies)
npx knip --fix
# Auto-fix including file deletion
npx knip --fix --allow-remove-files
```
Only use `--fix` after the configuration-first workflow is complete.
## Error Handling
If knip exits with code 2 (unexpected error like "error loading file"):
- Check if a config file exists — if not, create `knip.json` in the project root
- Check for known issues at knip.dev
- Review the configuration reference for syntax/option errors
- Run knip again after fixes
## Common Commands
```bash
# Basic run
npx knip
# Production only (excludes test/config entry points)
npx knip --production
# Auto-fix what's safe
npx knip --fix
# Auto-fix including file deletion
npx knip --fix --allow-remove-files
# JSON output for parsing
npx knip --reporter json
```
## Notes
- Watch for monorepo setups — may need `--workspace` flag
- Some frameworks need plugins enabled in config
- Knip does not handle unused imports/variables inside files — use ESLint or Biome for that
Creator's repository · brianlovin/agent-config