@vzn/vx 0.0.150 → 0.0.152
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -16
- package/package.json +5 -5
- package/src/index.ts +4 -0
- package/src/orchestrator/placement.ts +11 -4
- package/src/orchestrator/plan.ts +5 -2
package/README.md
CHANGED
|
@@ -143,28 +143,29 @@ keep your Turbo or Nx remote cache. [Parity map](packages/vx/docs/parity.md) ·
|
|
|
143
143
|
|
|
144
144
|
## Tried on real repos
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
Twelve public monorepos, each run with its own `turbo.json` or Nx graph
|
|
147
147
|
and nothing rewritten, against the tool it ships with. Same machine and
|
|
148
148
|
tasks per row, medians; vx first, theirs second.
|
|
149
149
|
|
|
150
|
-
| Repo | Against | Cold build | Restore outputs
|
|
151
|
-
| ----------------------------------------------------------- | ------- | --------------------- |
|
|
152
|
-
| [solidjs/solid](https://github.com/solidjs/solid) | Turbo | 40.6 s / 45.5 s | 66 ms / 127 ms
|
|
153
|
-
| [withastro/astro](https://github.com/withastro/astro) | Turbo | 48.0 s / 57.9 s | 478 ms / 1.43 s
|
|
154
|
-
| [payloadcms/payload](https://github.com/payloadcms/payload) | Turbo | 126.9 s / 127.5 s | 3.44 s / 3.46 s
|
|
155
|
-
| [medusajs/medusa](https://github.com/medusajs/medusa) | Turbo | 308 s / 315 s | 3.86 s / 7.16 s
|
|
156
|
-
| [n8n-io/n8n](https://github.com/n8n-io/n8n) | Turbo | 137.2 s / **133.7 s** | 8.27 s / 12.5 s
|
|
157
|
-
| [calcom/cal.com](https://github.com/calcom/cal.com) | Turbo | 245.7 s / 250.7 s | 17.4 s / 19.9 s
|
|
158
|
-
| [
|
|
159
|
-
| [
|
|
160
|
-
| [
|
|
161
|
-
| [
|
|
162
|
-
| [
|
|
150
|
+
| Repo | Against | Cold build | Restore outputs | Nothing to do |
|
|
151
|
+
| ----------------------------------------------------------- | ------- | --------------------- | ------------------- | ------------------- |
|
|
152
|
+
| [solidjs/solid](https://github.com/solidjs/solid) | Turbo | 40.6 s / 45.5 s | 66 ms / 127 ms | 51 ms / 95 ms |
|
|
153
|
+
| [withastro/astro](https://github.com/withastro/astro) | Turbo | 48.0 s / 57.9 s | 478 ms / 1.43 s | 249 ms / 1.38 s |
|
|
154
|
+
| [payloadcms/payload](https://github.com/payloadcms/payload) | Turbo | 126.9 s / 127.5 s | 3.44 s / 3.46 s | 256 ms / **237 ms** |
|
|
155
|
+
| [medusajs/medusa](https://github.com/medusajs/medusa) | Turbo | 308 s / 315 s | 3.86 s / 7.16 s | 947 ms / 3.29 s |
|
|
156
|
+
| [n8n-io/n8n](https://github.com/n8n-io/n8n) | Turbo | 137.2 s / **133.7 s** | 8.27 s / 12.5 s | 842 ms / 1.36 s |
|
|
157
|
+
| [calcom/cal.com](https://github.com/calcom/cal.com) | Turbo | 245.7 s / 250.7 s | 17.4 s / 19.9 s | 14.7 s / 18.5 s |
|
|
158
|
+
| [unocss/unocss](https://github.com/unocss/unocss) | Turbo | 45.1 s / 47.3 s | 859 ms / **185 ms** | 770 ms / **126 ms** |
|
|
159
|
+
| [TanStack/query](https://github.com/TanStack/query) | Nx | 34.6 s / 37.1 s | 910 ms / 1.62 s | 291 ms / 1.60 s |
|
|
160
|
+
| [strapi/strapi](https://github.com/strapi/strapi) | Nx | 238.2 s / 245.7 s | 1.61 s / 3.94 s | 341 ms / 4.02 s |
|
|
161
|
+
| [novuhq/novu](https://github.com/novuhq/novu) | Nx | 291.2 s / 299.4 s | 3.10 s / 9.05 s | 655 ms / 8.55 s |
|
|
162
|
+
| [TanStack/router](https://github.com/TanStack/router) | Nx | 123.0 s / 138.0 s | 1.27 s / 3.82 s | 626 ms / 3.91 s |
|
|
163
|
+
| [refinedev/refine](https://github.com/refinedev/refine) | Nx | 96.2 s / 105.9 s | 1.06 s / 1.19 s | 303 ms / 1.16 s |
|
|
163
164
|
|
|
164
165
|
**Bold** marks the other tool winning. Versions, revisions, scopes and
|
|
165
166
|
harness per repo: [benchmarks](packages/vx/docs/benchmarks.md) (astro
|
|
166
|
-
and refine as re-measured on 2026-09-27, TanStack/query
|
|
167
|
-
TanStack/router through
|
|
167
|
+
and refine as re-measured on 2026-09-27, TanStack/query,
|
|
168
|
+
TanStack/router and unocss through their plugin on 2026-09-28, the rest 2026-09-10 and -11).
|
|
168
169
|
|
|
169
170
|
## How it compares
|
|
170
171
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vzn/vx",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.152",
|
|
4
4
|
"description": "A fast, correct task runner and build cache for JavaScript monorepos.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
"node": ">=18"
|
|
18
18
|
},
|
|
19
19
|
"optionalDependencies": {
|
|
20
|
-
"@vzn/vx-linux-x64": "0.0.
|
|
21
|
-
"@vzn/vx-linux-arm64": "0.0.
|
|
22
|
-
"@vzn/vx-darwin-x64": "0.0.
|
|
23
|
-
"@vzn/vx-darwin-arm64": "0.0.
|
|
20
|
+
"@vzn/vx-linux-x64": "0.0.152",
|
|
21
|
+
"@vzn/vx-linux-arm64": "0.0.152",
|
|
22
|
+
"@vzn/vx-darwin-x64": "0.0.152",
|
|
23
|
+
"@vzn/vx-darwin-arm64": "0.0.152"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@anthropic-ai/sandbox-runtime": "^0.0.76"
|
package/src/index.ts
CHANGED
|
@@ -31,6 +31,10 @@ export { machineMemoryBytes, machineParallelism } from './util/index.js'
|
|
|
31
31
|
// wildcards (`[` `]` are not; item 667) — for a plugin that turns declared
|
|
32
32
|
// outputs into something else (`@vzn/vx-reapi`'s literal `output_paths`).
|
|
33
33
|
export { isLiteralPattern, normalizeGlob } from './util/index.js'
|
|
34
|
+
// A task's command as vx prints it: values of its `exec.env.secret` names
|
|
35
|
+
// masked. `vx show` and telemetry show this; a plugin that hands a command
|
|
36
|
+
// to someone else (`@vzn/vx-mcp`'s `listTasks`, an AI agent) does too (L-26).
|
|
37
|
+
export { maskedCommand } from './util/index.js'
|
|
34
38
|
|
|
35
39
|
// Schema types and helpers (used by user vx.config files and presets).
|
|
36
40
|
export type {
|
|
@@ -144,8 +144,11 @@ export function placeTasks(
|
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
/**
|
|
147
|
-
* `executorOf` for `planRun`, or nothing.
|
|
148
|
-
* executor
|
|
147
|
+
* `executorOf` for `planRun`, or nothing. A remote-only task no remote
|
|
148
|
+
* executor takes is labelled `noop` whatever the executor count: the run
|
|
149
|
+
* does nothing for it, and a plan line without the label promises an
|
|
150
|
+
* execution. Otherwise declining plugins, a single executor, or a
|
|
151
|
+
* resolution error all yield nothing: `--dry` is an
|
|
149
152
|
* inspection command and must not fail over a label. The error is still
|
|
150
153
|
* said, on the status line, in the plugin's name: the run this plan
|
|
151
154
|
* previews would refuse on it, and a plan that hid that would read as
|
|
@@ -188,11 +191,15 @@ export async function planExecutorOf(
|
|
|
188
191
|
remoteOnly: placements.remoteOnly,
|
|
189
192
|
})
|
|
190
193
|
return {
|
|
191
|
-
...(executors.length < 2
|
|
194
|
+
...(executors.length < 2 && placements.remoteOnlyNoop.size === 0
|
|
192
195
|
? {}
|
|
193
196
|
: {
|
|
194
197
|
executorOf: (id: string) =>
|
|
195
|
-
placements.remoteOnlyNoop.has(id)
|
|
198
|
+
placements.remoteOnlyNoop.has(id)
|
|
199
|
+
? 'noop'
|
|
200
|
+
: executors.length < 2
|
|
201
|
+
? undefined
|
|
202
|
+
: placements.executors.get(id)?.name,
|
|
196
203
|
}),
|
|
197
204
|
...(download === undefined
|
|
198
205
|
? {}
|
package/src/orchestrator/plan.ts
CHANGED
|
@@ -40,7 +40,8 @@ export interface PlannedTask {
|
|
|
40
40
|
/**
|
|
41
41
|
* Name of the executor this task would be PLACED on. Attached only when
|
|
42
42
|
* the workspace declares more than one executor — with a single one every
|
|
43
|
-
* line would carry the same label and say nothing
|
|
43
|
+
* line would carry the same label and say nothing — except `'noop'`: a
|
|
44
|
+
* remote-only task no remote executor takes, which the run skips. Absent for group tasks
|
|
44
45
|
* and persistent tasks, which never reach an executor.
|
|
45
46
|
*/
|
|
46
47
|
executor?: string
|
|
@@ -105,7 +106,7 @@ export interface PlanArgs {
|
|
|
105
106
|
/** When provided, per-task p50s are attached and `RunPlan.predicted` is
|
|
106
107
|
* computed. Failing open: a history error yields a plan without them. */
|
|
107
108
|
history?: HistoryProvider
|
|
108
|
-
/** Placement lookup (`
|
|
109
|
+
/** Placement lookup (`placement.ts`): >1 executor declared, or a `noop` task. */
|
|
109
110
|
executorOf?: (id: string) => string | undefined
|
|
110
111
|
}
|
|
111
112
|
|
|
@@ -212,6 +213,8 @@ function downgradeField(args: PlanArgs): {
|
|
|
212
213
|
|
|
213
214
|
/** A task the plan expects to EXECUTE (a no-cache task executes every run). */
|
|
214
215
|
function wouldRun(t: PlannedTask): boolean {
|
|
216
|
+
// A `noop` task succeeds without running (execute-task.ts), whatever its key.
|
|
217
|
+
if (t.executor === 'noop') return false
|
|
215
218
|
return t.cacheStatus === 'miss' || t.cacheStatus === 'no-cache'
|
|
216
219
|
}
|
|
217
220
|
|