@vzn/vx 0.0.31 → 0.0.33

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.31",
3
+ "version": "0.0.33",
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.31",
21
- "@vzn/vx-linux-arm64": "0.0.31",
22
- "@vzn/vx-darwin-x64": "0.0.31",
23
- "@vzn/vx-darwin-arm64": "0.0.31"
20
+ "@vzn/vx-linux-x64": "0.0.33",
21
+ "@vzn/vx-linux-arm64": "0.0.33",
22
+ "@vzn/vx-darwin-x64": "0.0.33",
23
+ "@vzn/vx-darwin-arm64": "0.0.33"
24
24
  },
25
25
  "dependencies": {
26
26
  "@anthropic-ai/sandbox-runtime": "^0.0.76"
@@ -9,7 +9,7 @@
9
9
 
10
10
  import path from 'node:path'
11
11
  import type { WorkspaceConfig } from '../config.js'
12
- import { mark, UserError } from '../util/index.js'
12
+ import { mark, nearest, UserError } from '../util/index.js'
13
13
  import {
14
14
  Cache,
15
15
  noteSchemaReset,
@@ -408,6 +408,30 @@ export async function prepareRun(options: RunOptions, log: Logger): Promise<Prep
408
408
  loadProjects({ ...loadArgs, seeds: 'all', closure: false, staged: projects }),
409
409
  )
410
410
  }
411
+ // An `--exclude-dependencies` name no project declares drops nothing:
412
+ // `=biuld` planned the whole chain and ran it, exit 0 (item 1026). Every
413
+ // other name the user types must resolve; so must this one. After the
414
+ // graph, so a config error (`^biuld` nobody declares) is named first.
415
+ const excludeNames = options.excludeDependencies
416
+ if (Array.isArray(excludeNames) && excludeNames.length > 0) {
417
+ const declared = new Set<string>()
418
+ for (const p of projects.values())
419
+ for (const t of Object.keys(p.config.tasks ?? {})) declared.add(t)
420
+ let unknown = excludeNames.filter((n) => !declared.has(n))
421
+ if (unknown.length > 0 && projects.size < projectsWithConfigs.length) {
422
+ unknown = await declaredNowhere(unknown, () =>
423
+ loadProjects({ ...loadArgs, seeds: 'all', closure: false, staged: projects }),
424
+ )
425
+ }
426
+ if (unknown.length > 0) {
427
+ cache.close()
428
+ const hints = new Set(unknown.flatMap((n) => nearest(n, declared) ?? []))
429
+ const hint = hints.size === 0 ? '' : ` Did you mean ${[...hints].join(', ')}?`
430
+ throw new UserError(
431
+ `--exclude-dependencies names a task no project declares: ${unknown.join(', ')}.${hint}`,
432
+ )
433
+ }
434
+ }
411
435
  // The graph is built; what follows is the plugins' (graph, key,
412
436
  // schedule). Two rows, so a plugin's key stage reads as its own cost
413
437
  // and not as graph building — a lockfile plugin's 1000 stats per run
@@ -70,6 +70,7 @@ export async function subscribeTelemetry(
70
70
  extraSinks?: readonly TelemetrySink[],
71
71
  ): Promise<TelemetryHandle | undefined> {
72
72
  const sinks: TelemetrySink[] = extraSinks === undefined ? [] : [...extraSinks]
73
+ const owners = new Map<TelemetrySink, string>()
73
74
  for (const plugin of plugins) {
74
75
  if (plugin.telemetry === undefined) continue
75
76
  // A plugin's return value is user input, so it is checked here rather
@@ -100,12 +101,15 @@ export async function subscribeTelemetry(
100
101
  )
101
102
  continue
102
103
  }
104
+ for (const [i, sink] of accepted.entries()) {
105
+ owners.set(sink, accepted.length === 1 ? plugin.name : `${plugin.name} #${i + 1}`)
106
+ }
103
107
  sinks.push(...accepted)
104
108
  }
105
109
 
106
110
  if (sinks.length === 0) return undefined
107
111
 
108
- const source = createTelemetrySource({ sinks, run, warn: (m) => ctx.warn(m) })
112
+ const source = createTelemetrySource({ sinks, run, warn: (m) => ctx.warn(m), owners })
109
113
  // The bus's unsubscribe is idempotent, so it is the handle's dispose as
110
114
  // is (a once-flag here survived item 654).
111
115
  const dispose = bus.subscribe(source.subscriber)
@@ -364,9 +364,15 @@ export function createTelemetrySource(args: {
364
364
  run: RunContextRecord
365
365
  /** Where a dropped-flush notice goes; absent = stay silent. */
366
366
  warn?: (message: string) => void
367
+ /** What a sink with no `name` of its own is called: its plugin's (the host's map). */
368
+ owners?: ReadonlyMap<TelemetrySink, string>
367
369
  }): TelemetrySource {
368
370
  const { sinks, run, warn } = args
369
371
  const runId = run.runId
372
+ // `name` is optional, and a nameless sink was reported as 'undefined'
373
+ // (item 1027): it goes by its plugin's name, else its place in the list.
374
+ const label = (sink: TelemetrySink): string =>
375
+ sink.name ?? args.owners?.get(sink) ?? `#${sinks.indexOf(sink) + 1}`
370
376
  // A sink is disabled the first time it throws — its name (or index) goes
371
377
  // here and it's skipped for the rest of the run, FLUSH INCLUDED. Flushing a
372
378
  // disabled sink would write a buffer that is incomplete by construction: it
@@ -381,7 +387,7 @@ export function createTelemetrySource(args: {
381
387
  const disable = (sink: TelemetrySink, hook: string, err: unknown): void => {
382
388
  disabled.add(sink)
383
389
  warn?.(
384
- `[vx] telemetry sink '${sink.name}' threw in ${hook}; disabled for this run: ${err instanceof Error ? err.message : String(err)}`,
390
+ `[vx] telemetry sink '${label(sink)}' threw in ${hook}; disabled for this run: ${err instanceof Error ? err.message : String(err)}`,
385
391
  )
386
392
  }
387
393
  // Precompute which sinks want each kind, so per-event fan-out is a plain
@@ -500,7 +506,7 @@ export function createTelemetrySource(args: {
500
506
  // A flush failure can never break the run — but it still costs
501
507
  // this sink its export, so say so rather than dropping it.
502
508
  warn?.(
503
- `[vx] telemetry sink '${sink.name}' failed to flush: ${err instanceof Error ? err.message : String(err)}`,
509
+ `[vx] telemetry sink '${label(sink)}' failed to flush: ${err instanceof Error ? err.message : String(err)}`,
504
510
  )
505
511
  }
506
512
  }),