@vzn/vx 0.0.413 → 0.0.415

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.413",
3
+ "version": "0.0.415",
4
4
  "description": "The fastest 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.413",
25
- "@vzn/vx-linux-arm64": "0.0.413",
26
- "@vzn/vx-darwin-x64": "0.0.413",
27
- "@vzn/vx-darwin-arm64": "0.0.413"
24
+ "@vzn/vx-linux-x64": "0.0.415",
25
+ "@vzn/vx-linux-arm64": "0.0.415",
26
+ "@vzn/vx-darwin-x64": "0.0.415",
27
+ "@vzn/vx-darwin-arm64": "0.0.415"
28
28
  },
29
29
  "dependencies": {
30
30
  "@anthropic-ai/sandbox-runtime": "^0.0.76"
package/src/cli/select.ts CHANGED
@@ -3,7 +3,6 @@
3
3
  // cwd sits in, and the interactive picker. Every read of the workspace
4
4
  // here goes through the staged load, so the answer is the run's.
5
5
 
6
- import readline from 'node:readline/promises'
7
6
  import path from 'node:path'
8
7
  import fs from 'node:fs'
9
8
  import {
@@ -404,6 +403,9 @@ export async function pickTask(
404
403
  const desc = e.description ? ` ${e.description}` : ''
405
404
  out.write(` ${n}. ${id}${desc}\n`)
406
405
  })
406
+ // Imported here, the picker's one use: a run that never asks paid ~0.7 ms
407
+ // for it at every start, past the stdout stream it shares code with.
408
+ const readline = await import('node:readline/promises')
407
409
  const rl = readline.createInterface({
408
410
  input: io.input ?? process.stdin,
409
411
  output: io.output ?? process.stdout,
@@ -682,6 +682,11 @@ export function refusedWrites(
682
682
  if (/^\/(?:dev|proc)\//.test(raw)) continue
683
683
  const abs = toRealPath(raw)
684
684
  if (isUnderAny(abs, binds) || underGlob(abs, globs)) continue
685
+ // A directory a write bind lies in exists, since bwrap made it to mount
686
+ // the bind: `mkdir -p node_modules/.cache/tool` under a grant of
687
+ // `node_modules/.cache/` met EEXIST on `node_modules`, wrote nothing,
688
+ // and the attempt failed a clean task (2026-10-03).
689
+ if (syscall.startsWith('mkdir') && [...binds].some((b) => atOrUnder(b, abs))) continue
685
690
  const key = `${syscall}|${abs}`
686
691
  if (seen.has(key)) continue
687
692
  seen.add(key)
@@ -661,12 +661,15 @@ export function migrateScripts(
661
661
  // the task, so `--all` never runs one check twice.
662
662
  const outsideName =
663
663
  typeof outside?.['name'] === 'string' && outside['name'] !== '' ? outside['name'] : undefined
664
+ // insomnia's root is named as its `packages/insomnia`: a root config made
665
+ // it a project, and every later run was refused for the duplicate (D-129).
666
+ const clash = outsideName === undefined ? undefined : metas.find((m) => m.name === outsideName)
664
667
  const rootMeta: ProjectMeta | undefined =
665
668
  root !== undefined
666
669
  ? root.configPath === null
667
670
  ? root
668
671
  : undefined
669
- : outsideName !== undefined && outsideDir !== undefined
672
+ : outsideName !== undefined && outsideDir !== undefined && clash === undefined
670
673
  ? { name: outsideName, dir: outsideDir, packageJson: outside as never, configPath: null }
671
674
  : undefined
672
675
  const memberTasks = new Set(
@@ -774,6 +777,11 @@ export function migrateScripts(
774
777
  ? `; left out as a member's task name, so \`--all\` never runs one twice: ${listed(shared)} — one that does other work maps by hand under a name of its own`
775
778
  : ''),
776
779
  )
780
+ } else if (clash !== undefined && outsideDir !== undefined && unnamedMaps().length > 0) {
781
+ const would = unnamedMaps()
782
+ notes.push(
783
+ `${clash.name} (the workspace root) not mapped: ${path.relative(outsideDir, clash.dir).split(path.sep).join('/')} has the same "name", and vx names a project by it; rename the root's and run \`vx init\` again to map ${would.length} of its scripts (${would.slice(0, 8).join(', ')}${would.length > 8 ? ', …' : ''})`,
784
+ )
777
785
  } else if (rootName === 'package.json' && outsideDir !== undefined && unnamedMaps().length > 0) {
778
786
  // react's nameless root: "its scripts run the workspace" was not why,
779
787
  // and 30 of its scripts (`build`, `lint`, `test`) map once it has a