---
title: "Keep one tool for each job · Agent Wranglers"
url: https://agentwranglers.se/playbook/stack/how-to-choose/one-tool-per-job
updated: 2026-10-21
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Keep one tool for each job

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers). Updated 2026-10-21.

For AI agents: [llms.txt](https://agentwranglers.se/llms.txt) is a short guide that sends you to the rules your problem needs, and [rules.json](https://agentwranglers.se/playbook/stack/rules.json) holds every rule of this playbook as JSON.

- Level: Recommended
- Chapter: [How to choose](https://agentwranglers.se/playbook/stack/how-to-choose)
- Rule: Keep one tool for each job, such as one test runner, one formatter and one database. Remove the old one when you switch.
- How: Two tools for one job double the setup, the docs to read and the ways things break. Agents also pick between them at random. Write the chosen tool for each job in the instructions file. When you switch, migrate everything in one planned change and delete the old tool in the same change. Name each tool there, as [Write one instructions file for agents](https://agentwranglers.se/playbook/ai-assisted-development/setting-up-the-project/instructions-file) says.
- Check: A script compares the dependency list with a list of categories, such as test runners, formatters, ORMs and HTTP clients. No category has more than one entry.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### JavaScript example

```js
const CATEGORIES = { testRunner: ['jest', 'vitest', 'mocha'], formatter: ['prettier', '@biomejs/biome'] };
export const doubled = deps => Object.entries(CATEGORIES)
  .filter(([, tools]) => tools.filter(tool => deps.includes(tool)).length > 1)
  .map(([category]) => category);
```

### Python example

```python
CATEGORIES = {"test_runner": ["pytest", "nose2"], "formatter": ["black", "ruff", "yapf"]}

def doubled(deps: list[str]) -> list[str]:
    return [category for category, tools in CATEGORIES.items() if sum(tool in deps for tool in tools) > 1]
```

## Related rules

- [Write one instructions file for agents](https://agentwranglers.se/playbook/ai-assisted-development/setting-up-the-project/instructions-file) in AI development

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/stack/how-to-choose/one-tool-per-job">Agent Wranglers software choices playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Keep an open licence or a way out](https://agentwranglers.se/playbook/stack/how-to-choose/open-licence-or-exit)
- [How to choose](https://agentwranglers.se/playbook/stack/how-to-choose)
