Custom Commands and Workflows Are Now a Complete Task Runner Replacement
· 5 min read
If you've ever tried to move a Taskfile.yml over to Atmos, you've hit the gap: deps: had no
clean equivalent in custom commands, sources:/generates: up-to-date checking didn't exist at
all, and a failed lint step stopped your whole release pipeline even when you just wanted to see
every check's result. So teams ended up running two tools side by side — go-task for the parts
Atmos couldn't do, Atmos for everything else — instead of one.
The Problem
Atmos workflows and custom commands already covered most of what a task runner needs: steps, templating, conditionals, parallel execution. But a handful of real gaps kept people from fully retiring go-task:
- No dependency ordering between named commands or workflows. You could make steps within
one command run in parallel, but you couldn't say "run
buildbeforetestandlint, and don't runbuildtwice just because two things depend on it." - No up-to-date checking. go-task's
sources:/generates:skip a task when nothing has changed. Atmos had nothing like it — every step ran every time, even a slow compile step whose inputs hadn't changed since the last successful run. - No continue-on-error. A single failing step stopped everything downstream, even for steps — like a linter — where you'd rather collect every result and report at the end.
- No precondition shortcut. Skipping an install step when a tool is already on
PATHmeant hand-rolling a shell check. - Custom commands couldn't use
parallel/matrixat all. The migration guide's own suggested workaround — wrap dependents in aparallelstep withneeds:— silently failed on custom commands; it only worked in workflows.
