Every vx setting has one path in .vx/workspace.ts, and its environment variable and flag are spelled from it. run.retries is VX_RUN_RETRIES and --retries. Learn one name and you know all three. A duration carries its unit, and vx info says where each value came from.
DX
DX
A tool with forty knobs usually has three names for each one: a config
key, an environment variable that grew a _MS suffix, and a flag someone
shortened. vx gives every setting one path, and spells the other two
from it.
Setting
Variable
Flag
run.retries
VX_RUN_RETRIES
--retries
run.concurrency
VX_RUN_CONCURRENCY
--concurrency
cache.dir
VX_CACHE_DIR
--cache-dir
cache.scope
VX_CACHE_SCOPE
--cache-scope
The settings live in three groups in .vx/workspace.ts: run, cache
and watch.
A flag beats its variable, which beats the file, which beats the
built-in default. A task’s own field beats all four: exec.retries on
a task is that task’s count, whatever --retries says. vx info lists
every setting that is not at its default and where its value came from:
A duration says its unit ('500ms', '30s', '10m', '2h', '30d'),
and a size says its own ('10GB'). A bare number is refused, because
nobody can tell whether 2000 means milliseconds or seconds:
An old variable such as VX_KILL_GRACE_MS is no longer read; set
VX_RUN_KILL_GRACE instead.
A few settings are read before the workspace file loads, such as
run.outputLogs and debug.timing. Those are set only by a variable
or a flag, never in the file. Every setting, with its variable, flag, values and default, is in
the settings table.
Edges in dependsOn, selections in --filter. A small grammar covers upstream builds, cross-project tasks, groups, dependents, folders and tags. And a name that matches nothing stops the run before it starts.
DX
Config in TypeScript, and why there are no named inputs
A vx.config.ts is a module: it can import a preset, spread it, compute a command. That one choice removes Turborepo's globalDependencies and Nx's namedInputs from the schema, because a language that composes does not need a schema that does.
run.rules.dependencies tags the layers of a monorepo and says which may reach which. vx lock refuses a dependency that breaks a rule and names every broken edge. Runs never check it, so they pay nothing. nx() carries most Nx module-boundary constraints over.
Turborepo, Nx and other product names are trademarks of their owners. vx is not affiliated with or endorsed by them.