@vzn/vx 0.0.608 → 0.0.609

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.608",
3
+ "version": "0.0.609",
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.608",
25
- "@vzn/vx-linux-arm64": "0.0.608",
26
- "@vzn/vx-darwin-x64": "0.0.608",
27
- "@vzn/vx-darwin-arm64": "0.0.608"
24
+ "@vzn/vx-linux-x64": "0.0.609",
25
+ "@vzn/vx-linux-arm64": "0.0.609",
26
+ "@vzn/vx-darwin-x64": "0.0.609",
27
+ "@vzn/vx-darwin-arm64": "0.0.609"
28
28
  },
29
29
  "dependencies": {
30
30
  "@anthropic-ai/sandbox-runtime": "^0.0.76"
@@ -9,6 +9,7 @@ import type { ProjectConfig, TaskConfig } from '../config.js'
9
9
  import {
10
10
  frozenProjectConfigs,
11
11
  loadProjectConfigs,
12
+ LOCKFILE_NAME,
12
13
  validateProjectConfig,
13
14
  type LoadProjectConfigOptions,
14
15
  type LoadReads,
@@ -243,6 +244,21 @@ export async function loadProjects(args: LoadProjectsArgs): Promise<LoadedProjec
243
244
  // alike. With no root project it stays, and the graph's refusal says so.
244
245
  const root = path.resolve(workspaceRoot)
245
246
  const rootName = args.projectMetas.find((m) => path.resolve(m.dir) === root)?.name
247
+ // A project the lock holds whose config file is gone ran nothing under
248
+ // --frozen, green, though the lock promises what runs is what was
249
+ // locked (X-144); a run never even asks such a project for a task.
250
+ // Refused as a moved config is (D-88). With no lock at all, nothing was
251
+ // locked: a repo of config-less projects needs none.
252
+ if (lock) {
253
+ const bare = args.projectMetas.filter((m) => m.configPath === null)
254
+ const held = bare.length === 0 ? null : await lock().catch(() => null)
255
+ const gone = held === null ? undefined : bare.find((m) => Object.hasOwn(held.projects, m.name))
256
+ if (gone !== undefined && held !== null)
257
+ throw new UserError(
258
+ `${LOCKFILE_NAME} locks "${gone.name}" at ${held.projects[gone.name]!.configPath}, but it has no config now — ` +
259
+ `run \`vx lock\` to refresh, or delete ${LOCKFILE_NAME}`,
260
+ )
261
+ }
246
262
  const projects = new Map<string, ProjectEntry>()
247
263
  while (pending.length > 0) {
248
264
  const round = pending.splice(0, pending.length)