@vzn/vx 0.0.344 → 0.0.345

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vzn/vx",
3
- "version": "0.0.344",
3
+ "version": "0.0.345",
4
4
  "description": "A fast, correct task runner and build cache for JavaScript monorepos.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -21,10 +21,10 @@
21
21
  "node": ">=18"
22
22
  },
23
23
  "optionalDependencies": {
24
- "@vzn/vx-linux-x64": "0.0.344",
25
- "@vzn/vx-linux-arm64": "0.0.344",
26
- "@vzn/vx-darwin-x64": "0.0.344",
27
- "@vzn/vx-darwin-arm64": "0.0.344"
24
+ "@vzn/vx-linux-x64": "0.0.345",
25
+ "@vzn/vx-linux-arm64": "0.0.345",
26
+ "@vzn/vx-darwin-x64": "0.0.345",
27
+ "@vzn/vx-darwin-arm64": "0.0.345"
28
28
  },
29
29
  "dependencies": {
30
30
  "@anthropic-ai/sandbox-runtime": "^0.0.76"
package/src/cli/select.ts CHANGED
@@ -60,18 +60,20 @@ export async function workspaceGlobOwners(
60
60
  }
61
61
  return false
62
62
  }
63
- // A frozen run with no lock is refused here, before the tolerant sweep
64
- // below could answer "nothing affected" and exit 0 without ever reaching
65
- // the run's own refusal.
66
- if (load.frozen === true && (await readLockfile(root)) === null) {
67
- throw new UserError(FROZEN_WITHOUT_LOCK)
68
- }
69
63
  try {
70
64
  const staged = await stagedLoad()
71
65
  return [...staged.values()].filter((p) => declaresMatch(p.config)).map((p) => p.name)
72
66
  } catch {
73
67
  // Fall through to the per-file sweep.
74
68
  }
69
+ // A frozen run with no lock is refused here, before the tolerant sweep
70
+ // below could answer "nothing affected" and exit 0 without ever reaching
71
+ // the run's own refusal. Asked only once the staged load failed: a
72
+ // frozen load that succeeded read the lock, and a second read parsed it
73
+ // again (1,000 projects: a 1.1 MB lock, ~10 ms).
74
+ if (load.frozen === true && (await readLockfile(root)) === null) {
75
+ throw new UserError(FROZEN_WITHOUT_LOCK)
76
+ }
75
77
  const owners: string[] = []
76
78
  await Promise.all(
77
79
  projects.map(async (meta) => {
@@ -187,6 +187,15 @@ export async function sandboxRequestFor(
187
187
  */
188
188
  cacheDir?: string,
189
189
  ): Promise<SandboxRequest> {
190
+ // SRT reads a Linux path holding a bracket as a glob and drops it from
191
+ // the writes, so no grant here could be mounted (B-60).
192
+ const home = toRealPath(node.projectDir)
193
+ if (process.platform === 'linux' && /[[\]]/.test(home)) {
194
+ throw new UserError(
195
+ `exec.sandbox: ${home} holds a bracket ([ or ]), and the Linux sandbox mounts no path ` +
196
+ `that does — rename the directory, or run the task without exec.sandbox`,
197
+ )
198
+ }
190
199
  const depDirs = [
191
200
  path.join(node.projectDir, 'node_modules'),
192
201
  path.join(workspaceRoot, 'node_modules'),