@vzn/vx 0.0.63 → 0.0.64

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.63",
3
+ "version": "0.0.64",
4
4
  "description": "An open, extensible monorepo task runner.",
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.63",
21
- "@vzn/vx-linux-arm64": "0.0.63",
22
- "@vzn/vx-darwin-x64": "0.0.63",
23
- "@vzn/vx-darwin-arm64": "0.0.63"
20
+ "@vzn/vx-linux-x64": "0.0.64",
21
+ "@vzn/vx-linux-arm64": "0.0.64",
22
+ "@vzn/vx-darwin-x64": "0.0.64",
23
+ "@vzn/vx-darwin-arm64": "0.0.64"
24
24
  },
25
25
  "dependencies": {
26
26
  "@anthropic-ai/sandbox-runtime": "^0.0.76"
@@ -399,6 +399,9 @@ export async function runGraph(options: ScheduleOptions): Promise<Map<string, Ta
399
399
  const restoreRoom = (): boolean =>
400
400
  serial ? active + activeRestore < 1 : activeRestore < restoreConcurrency
401
401
  let resolved = false
402
+ // A refusal's text → the first task that said it. A corrupt cache index
403
+ // reaches every lookup as one UserError; a repeat names the first.
404
+ const refusedBy = new Map<string, string>()
402
405
 
403
406
  // Admission policy over the count limit (a plugin's `admit`). Inactive
404
407
  // → the tick loop short-circuits before any of this and behaves
@@ -717,10 +720,13 @@ export async function runGraph(options: ScheduleOptions): Promise<Map<string, Ta
717
720
  // UserError is a config/input failure (e.g. a failed
718
721
  // `cache.inputs.runtime` command), not a vx bug — report it
719
722
  // plainly, never as an "internal error".
720
- if (isUserError(err)) {
721
- process.stderr.write(`[vx] ${id}: ${message}\n`)
722
- } else if (isFsRefusal(err)) {
723
- process.stderr.write(`[vx] ${id}: ${message} — ${fsRefusalHint(err)}\n`)
723
+ if (isUserError(err) || isFsRefusal(err)) {
724
+ const text = isUserError(err) ? message : `${message} — ${fsRefusalHint(err)}`
725
+ const first = refusedBy.get(text)
726
+ if (first === undefined) refusedBy.set(text, id)
727
+ process.stderr.write(
728
+ `[vx] ${id}: ${first === undefined ? text : `as ${first} above`}\n`,
729
+ )
724
730
  } else {
725
731
  const named = err instanceof Error && err.name !== 'Error' ? `${err.name}: ` : ''
726
732
  // A wrapped error's cause is the fact the reader needs (a