Turbo and Nx config support
Every key turbo.json, nx.json and project.json accept, read from the upstream schemas (@turbo/types 2.11.5, nx 23.2.1), and what vx does with it when @vzn/vx-migrate’s turbo() or nx() runs the repo unchanged. A key a new upstream release adds fails vx’s tests until it has a row here.
- supported: vx honours it with the same meaning.
- mapped, with a note: vx honours it through a translation; the note says how it differs.
- not supported: vx ignores or refuses it; the note says which.
- not applicable: it configures something outside a task runner and its cache.
turbo.json
Section titled “turbo.json”| Key | vx | Note |
|---|---|---|
$schema | not applicable | Editor schema hint only; the mapper never reads it. |
agentGuidance | not applicable | Guidance for AI agents, not task or cache config; vx ignores it. |
boundaries | not applicable | Turbo’s import-rule checker; vx has no module-boundary rules and ignores it. |
cacheDir | not supported | Ignored without a warning; vx uses its own cacheDir in vx.workspace.ts. |
cacheMaxAge | not supported | Ignored without a warning; prune with vx cache prune --older-than. |
cacheMaxSize | not supported | Ignored without a warning; prune with vx cache prune --max-size. |
concurrency | not supported | Ignored without a warning; use --concurrency or the workspace’s concurrency. |
daemon | not applicable | vx has no daemon by design. |
dangerouslyDisablePackageManagerCheck | not applicable | Turbo’s package-manager check; vx has none. |
envMode | mapped, with a note | Strict is vx’s behaviour; loose gets a note, since vx passes only declared variables. |
extends | supported | Package configs’ extends chains are followed as Turbo does; cycles and missing parents are refused. |
futureFlags | mapped, with a note | The flags are not read; what they gate (global, structured inputs) is detected by shape. |
global | mapped, with a note | inputs, env and passThroughEnv are read as the global* fields they replace; envMode: loose gets a note. |
globalDependencies | mapped, with a note | Becomes cache.inputs.workspaceFiles; $NAME entries become env inputs. |
globalEnv | mapped, with a note | Added to every task’s cache.inputs.env and passthrough; a wildcard name is dropped with a note. |
globalPassThroughEnv | mapped, with a note | Added to every task’s exec.env.passThrough, not hashed; a wildcard name is dropped with a note. |
noUpdateNotifier | not applicable | Turbo CLI update notice. |
remoteCache | mapped, with a note | turboCache() reads apiUrl, teamId, teamSlug and enabled, below env vars and options. |
tags | not applicable | Package tags feed only Turbo boundaries; never read. |
tasks | supported | Each task (or Turbo 1 pipeline) becomes a vx task for the packages that declare the script. |
ui | not applicable | Terminal UI choice. |
tasks.*.cache | supported | cache: false means no cache block: the task always runs. |
tasks.*.dependsOn | mapped, with a note | Same syntax; edges to tasks nobody runs are dropped; $TURBO_ROOT$ deps get a TODO; $NAME becomes env. |
tasks.*.description | supported | Copied to the task’s description. |
tasks.*.env | mapped, with a note | Goes to cache.inputs.env and exec.env.passThrough; wildcard names get a TODO. |
tasks.*.inputs | mapped, with a note | Globs translated; $TURBO_DEFAULT$ becomes **/*, $TURBO_ROOT$ workspace files; unsafe globs get a TODO. |
tasks.*.interactive | not supported | Reported as a key with no vx equivalent, then ignored. |
tasks.*.interruptible | not supported | Reported as a key with no vx equivalent, then ignored. |
tasks.*.outputLogs | mapped, with a note | new-only is vx’s default; other values get a TODO pointing at --output-logs. |
tasks.*.outputs | mapped, with a note | Become cache.outputs, negations kept; vx cleans outputs, so a wildcard first segment leaves the task uncached with a TODO. |
tasks.*.passThroughEnv | mapped, with a note | Goes to exec.env.passThrough, not hashed; wildcard names get a TODO. |
tasks.*.persistent | mapped, with a note | An uncached exec.persistent task, with a readyWhen TODO when something depends on it. |
tasks.*.with | not supported | Reported as a key with no vx equivalent, then ignored. |
tasks.*.inputs[].from | not supported | Ignored; vx folds each dependency’s cache key instead of its outputs. |
tasks.*.inputs[].globs | mapped, with a note | For startup and jit entries, keyed like plain input strings. |
tasks.*.inputs[].mode | mapped, with a note | startup and jit are keyed alike (no separate pass); dependencyOutputs adds nothing. |
tasks.*.inputs[].withDefaults | mapped, with a note | true adds $TURBO_DEFAULT$: every package file. |
remoteCache.apiUrl | supported | The cache URL when neither the option nor TURBO_API is set, as in Turbo. |
remoteCache.enabled | mapped, with a note | false turns turboCache() off unless its options name a cache. |
remoteCache.loginUrl | not applicable | Used only by turbo login; vx has no login. |
remoteCache.preflight | not supported | Ignored; turboCache() sends no CORS preflight. |
remoteCache.signature | not supported | The flag is ignored; signing is on whenever a signature key is set. |
remoteCache.teamId | supported | Used when neither the option nor TURBO_TEAMID is set. |
remoteCache.teamSlug | supported | Used when neither the option nor TURBO_TEAM is set. |
remoteCache.timeout | not supported | Not read; set turboCache({ timeoutMs }) (default 30 s). |
remoteCache.uploadTimeout | not supported | Not read; set turboCache({ uploadTimeoutMs }) (default 60 s). |
futureFlags.affectedUsingTaskInputs | not supported | Ignored; --affected selects projects from vx’s own git diff. |
futureFlags.errorsOnlyShowHash | not supported | Ignored. |
futureFlags.experimentalCargoWorkspaces | not supported | Ignored; vx discovers projects from package.json workspaces only. |
futureFlags.experimentalGoWorkspaces | not supported | Ignored; vx discovers projects from package.json workspaces only. |
futureFlags.experimentalObservability | not applicable | Turbo telemetry export; vx’s is a telemetry plugin. |
futureFlags.experimentalPythonWorkspaces | not supported | Ignored; vx discovers projects from package.json workspaces only. |
futureFlags.filterUsingTasks | not supported | Ignored; --filter keeps vx’s semantics. |
futureFlags.githubActionsRemoteBaseRefFallback | not supported | Ignored; --affected defaults to origin/HEAD, else HEAD~1. |
futureFlags.globalConfiguration | supported | The global block is read whenever present, flag or not. |
futureFlags.longerSignatureKey | mapped, with a note | Not read; turboCache() always requires a signature key of at least 32 bytes. |
futureFlags.pruneIncludesGlobalFiles | not applicable | Affects only turbo prune; vx has none. |
futureFlags.strictTaskEntrypointSelection | not supported | Ignored. |
futureFlags.watchUsingTaskInputs | not supported | Ignored; vx watch watches each task’s declared inputs. |
boundaries.dependencies | not applicable | A Turbo boundaries import rule. |
boundaries.dependents | not applicable | A Turbo boundaries import rule. |
boundaries.implicitDependencies | not applicable | A Turbo boundaries import rule. |
boundaries.tags | not applicable | A Turbo boundaries tag rule. |
nx.json
Section titled “nx.json”| Key | vx | Note |
|---|---|---|
implicitDependencies | not supported | The top-level map is not read. |
affected | not supported | Ignored; --affected defaults to origin/HEAD or takes a base. |
extends | supported | The chain is followed and merged as Nx does, before named inputs are read. |
defaultBase | not supported | Ignored; --affected defaults to origin/HEAD or takes a base. |
tasksRunnerOptions | mapped, with a note | Only default.options.cacheableOperations is read, as the legacy cached-targets list. |
namedInputs | mapped, with a note | Expanded per project (project entries win) into each task’s cache.inputs; vx has no named inputs. |
targetDefaults | mapped, with a note | Applied by Nx while it builds the graph vx reads; vx sees the merged targets. |
workspaceLayout | not applicable | Where generators create projects; vx has no generators. |
cli | not applicable | Nx CLI and generator defaults. |
generators | not applicable | Generator defaults; vx has no generators. |
plugins | mapped, with a note | Targets Nx plugins infer arrive in the graph; bunx @vzn/vx-migrate freezes them as written. |
tui | not applicable | Nx terminal UI. |
defaultProject | not supported | Ignored; name tasks as pkg#task or select with --filter. |
nxCloudAccessToken | not applicable | Nx Cloud credential; nxCache() talks to self-hosted /v1/cache servers. |
nxCloudUrl | not applicable | Nx Cloud endpoint; nxCache() talks to self-hosted /v1/cache servers. |
nxCloudEncryptionKey | not applicable | Nx Cloud artifact encryption. |
neverConnectToCloud | not applicable | Nx Cloud opt-out; vx never connects to Nx Cloud. |
parallel | not supported | Ignored; use --concurrency or the workspace’s concurrency. |
cacheDirectory | not supported | Ignored; vx uses its own cacheDir. |
useDaemonProcess | not applicable | vx has no daemon; Nx’s setting still applies when vx asks Nx for the graph. |
useInferencePlugins | mapped, with a note | Applied by Nx when it builds the graph; vx sees the targets that result. |
analytics | not applicable | Nx usage analytics. |
release | not applicable | Nx versioning and publishing; nx-release-publish targets still run through nx-exec. |
sync | not supported | Global sync generators never run; vx warns once per run to run nx sync. |
migrate | not applicable | Settings for nx migrate. |
conformance | not applicable | Nx Powerpack conformance rules. |
owners | not applicable | Nx Powerpack CODEOWNERS generation. |
targetDefaults.*.filter | mapped, with a note | Applied by Nx while it builds the graph vx reads. |
targetDefaults.*.executor | mapped, with a note | Merged into targets by Nx, then mapped as targets.*.executor. |
targetDefaults.*.command | mapped, with a note | Merged into targets by Nx, then run as targets.*.command. |
targetDefaults.*.metadata | mapped, with a note | Merged into targets by Nx, then read as targets.*.metadata. |
targetDefaults.*.options | mapped, with a note | Merged into targets by Nx, then passed on as targets.*.options. |
targetDefaults.*.outputs | mapped, with a note | Merged into targets by Nx, then mapped as targets.*.outputs. |
targetDefaults.*.defaultConfiguration | mapped, with a note | Merged into targets by Nx, then read as targets.*.defaultConfiguration. |
targetDefaults.*.configurations | mapped, with a note | Merged into targets by Nx, then one task per configuration. |
targetDefaults.*.continuous | mapped, with a note | Merged into targets by Nx, then a persistent, uncached task. |
targetDefaults.*.parallelism | not supported | parallelism: false gets a TODO to run with --concurrency 1. |
targetDefaults.*.inputs | mapped, with a note | Merged into targets by Nx, then expanded as targets.*.inputs. |
targetDefaults.*.dependsOn | mapped, with a note | Merged into targets by Nx, then mapped as targets.*.dependsOn. |
targetDefaults.*.cache | mapped, with a note | Merged into targets by Nx, then read as targets.*.cache. |
targetDefaults.*.syncGenerators | not supported | Gets a TODO to run nx sync; vx never runs sync generators. |
project.json
Section titled “project.json”| Key | vx | Note |
|---|---|---|
name | mapped, with a note | Used in nx-exec lines and project:target edges; the vx project takes the package.json name. |
root | supported | Graph nodes are matched to workspace packages by root directory. |
sourceRoot | mapped, with a note | Not read by the mapper; executors still see it through nx-exec. |
projectType | not applicable | App-or-library metadata for generators and tooling. |
generators | not applicable | Per-project generator defaults; vx has no generators. |
namedInputs | mapped, with a note | Merged over nx.json’s and expanded into each task’s cache inputs. |
targets | mapped, with a note | Each target becomes a vx task, plus one per non-default configuration. |
tags | mapped, with a note | Used only to resolve tag: patterns in dependsOn; vx has no project tags. |
implicitDependencies | mapped, with a note | Graph edges without a package.json link become explicit pkg#target edges for ^target. |
metadata | mapped, with a note | Only targetGroups is read, to find non-atomized targets’ .env files. |
release | not applicable | Nx release settings. |
targets.*.executor | mapped, with a note | run-commands and run-script become shell lines, noop a group task; others run through nx-exec. |
targets.*.options | mapped, with a note | Passed as nx-exec’s --options or rendered into run-commands; {args.*} forwarding gets a TODO. |
targets.*.outputs | mapped, with a note | Tokens and {options.x} resolved; paths outside the project become workspace files; negations kept. |
targets.*.defaultConfiguration | supported | The base task carries the default configuration’s options, as nx run does. |
targets.*.configurations | mapped, with a note | One task per configuration (build:ci); ^ edges run dependencies’ default configuration, with a TODO. |
targets.*.inputs | mapped, with a note | Expanded into cache.inputs; none means default and ^default; forms without an equivalent get TODOs. |
targets.*.dependsOn | mapped, with a note | project:target becomes pkg#target; project patterns and tags resolved; params: forward gets a TODO. |
targets.*.command | mapped, with a note | Run as the run-commands shorthand: one POSIX sh line. |
targets.*.cache | supported | cache: true (or cacheableOperations) gives a cache block; persistent tasks stay uncached. |
targets.*.continuous | mapped, with a note | An uncached exec.persistent task, with a readyWhen note when something depends on it. |
targets.*.parallelism | not supported | parallelism: false gets a TODO to run with --concurrency 1; vx has no per-task exclusivity. |
targets.*.metadata | mapped, with a note | Only nonAtomizedTarget is read, to find .env files. |
targets.*.syncGenerators | not supported | Gets a TODO to run nx sync; vx never runs sync generators. |
Nx inputs forms
Section titled “Nx inputs forms”| Key | vx | Note |
|---|---|---|
a string | mapped, with a note | Named inputs expanded, token paths made project or workspace globs, ^name folded over dependencies. |
{fileset, dependencies} | mapped, with a note | The fileset becomes a glob; with dependencies: true it is folded through the dependencies. |
{projects, dependencies, input} | mapped, with a note | Folded through the named projects’ inputs (a superset); unknown project names get a TODO. |
{runtime} | supported | Becomes cache.inputs.workspaceRuntime, run at the workspace root as Nx does. |
{env} | supported | Goes to cache.inputs.env and exec.env.passThrough. |
{externalDependencies} | not supported | Dropped with a TODO; vx keys every task on the lockfile already. |
{dependentTasksOutputFiles, transitive} | not supported | Dropped with a TODO; vx folds each dependency’s cache key instead. |
{json, fields, excludeFields} | mapped, with a note | The whole file is hashed, a superset of the selected fields. |