@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.
|
|
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.
|
|
21
|
-
"@vzn/vx-linux-arm64": "0.0.
|
|
22
|
-
"@vzn/vx-darwin-x64": "0.0.
|
|
23
|
-
"@vzn/vx-darwin-arm64": "0.0.
|
|
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
|
|
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
|
|
509
|
+
`[vx] telemetry sink '${label(sink)}' failed to flush: ${err instanceof Error ? err.message : String(err)}`,
|
|
504
510
|
)
|
|
505
511
|
}
|
|
506
512
|
}),
|