Config with autocomplete
defineProject gives you completion and errors while you type.

A YAML or JSON config tells you about a typo when the run fails. A typed config tells you in the editor.
defineProject and defineWorkspace type every key, so wrong keys and wrong value types are underlined before you save.
// config
// packages/app/vx.config.ts
import { defineProject } from '@vzn/vx/config'
export default defineProject({
tasks: {
build: { exec: { command: 'tsc -b' } },
test: { exec: { command: 'vitest run' }, dependsOn: ['build'] },
},
})More in Config

One command per task
A task is a shell command with edges and a cache block; nothing boots in between.

Rules that catch slow configs
Checks for configs that would make runs slow or wrong, on by default, each one optional.

A config that hangs, named
A config whose evaluation runs away fails after a deadline, naming the file.

No runs inside runs
A vx run inside a task of the same workspace is refused, with the reason.

Presets are just functions
Share task setups across projects with a TypeScript function, no new concept.

Config errors that point
A bad config fails at load with the file, the line and the key, no stack trace.