autoresearch
Autonomous experiment loop for optimization research. Use when the user wants to: - Optimize a metric through systematic…
Fix knip "Unused exports" violations. Handles all violation categories: test-only exports (extract to new file), dead barrel re-exports (remove from index.ts), and internally-only-used exports (un-export). Use when `npm run knip` reports unused exports.
$ npx -y skills add factory-ai/factory-plugins --skill fix-knip-unused-exports --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/fix-knip-unused-exportsContext preview
The summary Claude sees to decide when to auto-load this skill.
Fix knip "Unused exports" violations. Handles all violation categories: test-only exports (extract to new file), dead barrel re-exports (remove from index.ts), and internally-only-used exports (un-export). Use when `npm run knip` reports unused exports.
name: fix-knip-unused-exports description: | Fix knip "Unused exports" violations. Handles all violation categories: test-only exports (extract to new file), dead barrel re-exports (remove from index.ts), and internally-only-used exports (un-export). Use when `npm run knip` reports unused exports.
Fix knip "Unused exports" violations. There are several categories of violation, each with a different fix strategy.
npm run knip
Output looks like:
Unused exports (3) ::error file=packages/foo/src/bar.ts,line=42,title=Unused exports::myFunction
For each flagged export, grep the **entire repository** (not just the package):
rg "myFunction"
Determine which category it falls into:
| Category | Callers | Fix | |----------|---------|-----| | **Test-only export** | Used in same file + test files only | Extract to new file | | **Dead barrel re-export** | Re-exported from `index.ts`, but production code imports via relative paths or other subpaths instead | Remove the re-export from the barrel | | **Internally-only-used export** | Used only within the same file, not by tests or other files | Remove the `export` keyword | | **Dead code** | No callers anywhere | Delete the export | | **Production consumer exists** | Used by non-test code in another file | Not a knip issue -- investigate further |
**Important**: When grepping, exclude test files to identify production consumers:
rg "myFunction" --glob '!**/*.test.*'
When a function is exported solely for test access but is also used internally in the same file.
Before writing code, answer these questions:
**a) What moves to the new file?**
**b) Are any helpers shared with functions staying behind?**
**c) Will the new file have exactly one exported function?**
**d) Does a test file with a matching name exist?**
**e) Any circular dependency risk?**
**f) Does it export a constant?**
Create the new file in the same directory:
// myFunction.ts (new file)
import { SomeType } from '../types';
function privateHelper(): void { /* ... */ }
export function myFunction(): SomeType {
return privateHelper();
}Update the original file to import from the new file:
// bar.ts (original file, updated)
import { myFunction } from './myFunction';
function otherFunction() {
const result = myFunction(); // Now imports from new file
}Update test files to import from the new file:
// bar.test.ts (updated)
import { myFunction } from './myFunction';
// If bar.ts still exists, you may need to also import something from './bar'
// to satisfy any test-imports-source ruleAfter extracting, run `npm run knip` again. If function A was extracted to a new file alongside function B that A calls, but B is also only consumed by tests externally, knip will flag B too. You need to extract B to its own file so that A's file creates a genuine production import of B.
Example: suppose `throwMappedError` was first extracted alongside `mapResponseFailure` into `error-mappers.ts`. If `throwMappedError` is only called internally within that file (by `mapResponseFailure`), it will still be flagged. Fix: extract it to `throwMappedError.ts`, making the import from `error-mappers.ts` a genuine production consumer.
When a barrel `index.ts` re-exports something, but no production code imports it through the barrel. This happens when:
Grep excluding test files. If the only hits are:
Then the barrel re-export is unused. Simply remove it from `index.ts`.
If a test in another package imports the symbol through the barrel (e.g., `import { x } from '@scope/pkg/feature'`), you need to provide an alternative import path after removing the barrel re-ex
Official Factory plugins marketplace containing curated skills, droids, and tools.
Autonomous experiment loop for optimization research. Use when the user wants to: - Optimize a metric through systematic…
Create a pull request with Conventional Commits formatting, a templated body, and local verification. Use when the user asks to…
Follow up on an existing PR by rebasing on the base branch, addressing reviewer comments, fixing CI issues, and pushing updates.…
Intercept and debug HTTP traffic from any CLI, service, or script using HTTP Toolkit. Use when you need to inspect LLM API calls,…
Control terminal TUIs, browsers, and native desktop apps for testing, demos, QA, and computer-use tasks. Use when you need to…
Automate browser interactions for web testing, form filling, screenshots, and data extraction. Use when the user needs to: -…