@vzn/vx 0.0.151 → 0.0.153

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 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
- Eleven public monorepos, each run with its own `turbo.json` or Nx graph
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 | 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
- | [TanStack/query](https://github.com/TanStack/query) | Nx | 34.6 s / 37.1 s | 910 ms / 1.62 s | 291 ms / 1.60 s |
159
- | [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 |
160
- | [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 |
161
- | [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 |
162
- | [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 |
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 and
167
- TanStack/router through `nx()` on 2026-09-28, the rest 2026-09-10 and -11).
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.151",
3
+ "version": "0.0.153",
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.151",
21
- "@vzn/vx-linux-arm64": "0.0.151",
22
- "@vzn/vx-darwin-x64": "0.0.151",
23
- "@vzn/vx-darwin-arm64": "0.0.151"
20
+ "@vzn/vx-linux-x64": "0.0.153",
21
+ "@vzn/vx-linux-arm64": "0.0.153",
22
+ "@vzn/vx-darwin-x64": "0.0.153",
23
+ "@vzn/vx-darwin-arm64": "0.0.153"
24
24
  },
25
25
  "dependencies": {
26
26
  "@anthropic-ai/sandbox-runtime": "^0.0.76"
@@ -11,6 +11,7 @@ import { lstatSync, readlinkSync } from 'node:fs'
11
11
  import path from 'node:path'
12
12
  import { fileIdentity, repoFacts } from './git-inputs.js'
13
13
  import { FILE_HASH_RACY_MS, isIndexFull, racyWindowMs } from './layer.js'
14
+ import { isPermissionError, UserError } from '../util/index.js'
14
15
 
15
16
  const FILE_HASHES_SWEPT_AT = 'file_hashes_swept_at'
16
17
  const DAY_MS = 24 * 60 * 60 * 1000
@@ -301,7 +302,19 @@ export class FileHashStore {
301
302
  * spawn per file.
302
303
  */
303
304
  private async hashFileFromDisk(filePath: string): Promise<string> {
304
- return this.hashBytes(await Bun.file(filePath).bytes(), filePath)
305
+ let bytes: Uint8Array
306
+ try {
307
+ bytes = await Bun.file(filePath).bytes()
308
+ } catch (err) {
309
+ // Left raw, the scheduler added the write hint to an input vx only
310
+ // reads: "a path vx must write is not writable by this user".
311
+ if (!isPermissionError(err)) throw err
312
+ throw new UserError(
313
+ `${filePath} is not readable by this user (${err.code}), and vx reads it to derive a ` +
314
+ 'cache key. Make it readable, or, for a task input, take it out of cache.inputs.files.',
315
+ )
316
+ }
317
+ return this.hashBytes(bytes, filePath)
305
318
  }
306
319
 
307
320
  /**
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 {