Ward vs running separate linters and scripts
Updated
Running separate linters, test commands and scanners works, but each has its own config and its own moment to run. Ward keeps all checks in one ward.toml and runs them in four layers, so your coding agent gets the same feedback every time.
What do separate linters do well?
Each dedicated tool goes deep on one job, has its own community and rules, and you control it fully. You can use it in your editor, in a script or in CI. If you only need one tool in one place, a plain linter is simpler than anything else.
What does Ward do differently?
Ward is the layer above the tools. In ward.toml you list checks (tests, coverage, security scanners, any command) and assign each to a profile: default after each agent edit, pre-commit, pre-push and ci. Each layer includes the checks of the layers inside it. A failure returns to the agent with file, line and rule, so you stop repeating the rules in every prompt. Ward also ships its own lint, format and architecture rules for every language it supports, so you need fewer separate linters. Ward runs the tools but does not install them: a missing tool is reported as UNAVAILABLE.
When are separate linters the better choice?
- You use one language and one tool, and no coding agent writes your code.
- You need a rule or a plugin that Ward does not include, and nothing else.
- Your project is in a language Ward does not support yet. Ward is in alpha.
Can I keep my linters and add Ward?
Yes. Ward runs any command you add to ward.toml, so your existing linters become gates. Move each one to the layer it fits: fast ones in default, slow ones in pre-push or ci.
[checks.mutation]
profiles = ["ci"]
Where do I go next?
Ready to try it? Install Ward and run ward init in your project.