@vgai/cli 0.5.50 → 0.5.51

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.
Files changed (2) hide show
  1. package/dist/index.js +218 -123
  2. package/package.json +7 -7
package/dist/index.js CHANGED
@@ -319407,7 +319407,7 @@ var require_sync = __commonJS({
319407
319407
  "../../../donor-main/node_modules/get-package-type/sync.cjs"(exports, module) {
319408
319408
  "use strict";
319409
319409
  var path = __require("path");
319410
- var { readFileSync: readFileSync34 } = __require("fs");
319410
+ var { readFileSync: readFileSync33 } = __require("fs");
319411
319411
  var isNodeModules = require_is_node_modules();
319412
319412
  var resultsCache = require_cache5();
319413
319413
  function getDirectoryTypeActual(directory) {
@@ -319415,7 +319415,7 @@ var require_sync = __commonJS({
319415
319415
  return "commonjs";
319416
319416
  }
319417
319417
  try {
319418
- return JSON.parse(readFileSync34(path.resolve(directory, "package.json"))).type || "commonjs";
319418
+ return JSON.parse(readFileSync33(path.resolve(directory, "package.json"))).type || "commonjs";
319419
319419
  } catch (_) {
319420
319420
  }
319421
319421
  const parent = path.dirname(directory);
@@ -333438,7 +333438,7 @@ import {
333438
333438
  mkdirSync as mkdirSync17,
333439
333439
  openSync as openSync3,
333440
333440
  readdirSync as readdirSync16,
333441
- readFileSync as readFileSync33,
333441
+ readFileSync as readFileSync32,
333442
333442
  realpathSync as realpathSync8,
333443
333443
  statSync as statSync12,
333444
333444
  writeFileSync as writeFileSync15
@@ -333447,7 +333447,7 @@ import { createRequire as createRequire2 } from "node:module";
333447
333447
  import { homedir as homedir7 } from "node:os";
333448
333448
  import { basename as basename6, dirname as dirname26, isAbsolute as isAbsolute12, join as join39, relative as relative12, resolve as resolve21, sep as sep6 } from "node:path";
333449
333449
  import { setTimeout as delay } from "node:timers/promises";
333450
- import { fileURLToPath as fileURLToPath5, pathToFileURL as pathToFileURL2 } from "node:url";
333450
+ import { fileURLToPath as fileURLToPath4, pathToFileURL as pathToFileURL2 } from "node:url";
333451
333451
  import { inspect } from "node:util";
333452
333452
 
333453
333453
  // ../create-vgai-project/src/scaffold.ts
@@ -333459,7 +333459,7 @@ import {
333459
333459
  lstatSync as lstatSync2,
333460
333460
  mkdirSync as mkdirSync5,
333461
333461
  readdirSync as readdirSync6,
333462
- readFileSync as readFileSync12,
333462
+ readFileSync as readFileSync11,
333463
333463
  rmSync as rmSync2,
333464
333464
  writeFileSync as writeFileSync4
333465
333465
  } from "node:fs";
@@ -335628,12 +335628,101 @@ function satisfiesTilde(version2, base) {
335628
335628
  return version2[0] === base[0] && version2[1] === base[1];
335629
335629
  }
335630
335630
 
335631
+ // ../create-vgai-project/templates.json
335632
+ var templates_default = {
335633
+ $comment: "The empty project, named presets of additions, and focused reference examples.",
335634
+ registryVersion: 1,
335635
+ templates: [
335636
+ {
335637
+ id: "empty",
335638
+ title: "Empty project",
335639
+ description: "A project that declares nothing yet \u2014 add a 3D world, a UI, a server or models from here.",
335640
+ source: "template:empty",
335641
+ thumbnail: "packages/create-vgai-project/thumbnails/default.png",
335642
+ whatsInside: [
335643
+ "No roots, no configurations",
335644
+ "The four settings layers",
335645
+ "Add what the project needs"
335646
+ ]
335647
+ },
335648
+ {
335649
+ id: "prototype",
335650
+ title: "Game prototype",
335651
+ description: "A 3D world for a playable prototype, without required Data, Game Inspector or Analytics panels.",
335652
+ source: "template:prototype",
335653
+ thumbnail: "packages/create-vgai-project/thumbnails/default.png",
335654
+ whatsInside: [
335655
+ "Three.js world root",
335656
+ "Neutral daylight scene + focal cube prefab",
335657
+ "No required development panels",
335658
+ "No preselected genre"
335659
+ ]
335660
+ },
335661
+ {
335662
+ id: "game",
335663
+ title: "Game development",
335664
+ description: "A 3D world, multiplayer configuration and required game-specific Data, Game Inspector and Analytics panels to implement.",
335665
+ source: "template:game",
335666
+ thumbnail: "packages/create-vgai-project/thumbnails/default.png",
335667
+ whatsInside: [
335668
+ "Three.js world root",
335669
+ "Neutral daylight scene + focal cube prefab",
335670
+ "server + multiplayer configurations",
335671
+ "Data, Game Inspector and Analytics stubs",
335672
+ "No preselected genre"
335673
+ ]
335674
+ },
335675
+ {
335676
+ id: "website",
335677
+ title: "Website / UI",
335678
+ description: "A React root mounted as a DOM layer \u2014 JSX as the authored truth.",
335679
+ source: "template:website",
335680
+ thumbnail: "packages/create-vgai-project/thumbnails/react.png",
335681
+ whatsInside: [
335682
+ "React DOM root",
335683
+ "Styled shell page",
335684
+ "react-root capability"
335685
+ ]
335686
+ },
335687
+ {
335688
+ id: "models",
335689
+ title: "Models",
335690
+ description: "The mesh capability alone: authored models, Edit Mesh, the model finder \u2014 no world to run.",
335691
+ source: "template:models",
335692
+ thumbnail: "packages/create-vgai-project/thumbnails/default.png",
335693
+ whatsInside: [
335694
+ "mesh capability",
335695
+ "src/models/ + the model finder",
335696
+ "Opens in the Model workspace"
335697
+ ]
335698
+ },
335699
+ {
335700
+ id: "first-person",
335701
+ title: "First Person",
335702
+ description: "Premium bright arena shooter with Quaternius enemies, layered combat animation, and three weapons.",
335703
+ source: "example:first-person",
335704
+ thumbnail: "examples/first-person/learn/thumbnail.png"
335705
+ },
335706
+ {
335707
+ id: "third-person",
335708
+ title: "Third Person",
335709
+ description: "Premium coastal-citadel TPS with over-shoulder combat, layered Quaternius animation, AI, and a complete match.",
335710
+ source: "example:third-person",
335711
+ thumbnail: "examples/third-person/learn/thumbnail.png"
335712
+ },
335713
+ {
335714
+ id: "top-down-strategy",
335715
+ title: "Top Down Strategy",
335716
+ description: "Premium orthographic strategy sample with multi-selection, formation movement, navigation, physics props, automatic doors, and roof reveal.",
335717
+ source: "example:top-down-strategy",
335718
+ thumbnail: "examples/top-down-strategy/learn/thumbnail.png"
335719
+ }
335720
+ ]
335721
+ };
335722
+
335631
335723
  // ../create-vgai-project/src/templates.ts
335632
- import { readFileSync as readFileSync11 } from "node:fs";
335633
- import { fileURLToPath as fileURLToPath2 } from "node:url";
335634
335724
  var TEMPLATE_COMPOSITION_IDS = ["empty", "prototype", "game", "website", "models"];
335635
335725
  var SCAFFOLD_PRESENTATIONS = ["blank"];
335636
- var REGISTRY_PATH = fileURLToPath2(new URL("../templates.json", import.meta.url));
335637
335726
  function parseTemplateSource(source) {
335638
335727
  const exampleId = source.startsWith("example:") ? source.slice("example:".length) : void 0;
335639
335728
  if (exampleId !== void 0) {
@@ -335690,7 +335779,7 @@ function isEntryScaffoldable(entry, scaffoldTemplates) {
335690
335779
  return source.type === "example" ? scaffoldTemplates.includes("example") : scaffoldTemplates.includes(source.template);
335691
335780
  }
335692
335781
  function loadTemplateRegistry() {
335693
- const raw = JSON.parse(readFileSync11(REGISTRY_PATH, "utf-8"));
335782
+ const raw = templates_default;
335694
335783
  if (typeof raw !== "object" || raw === null) {
335695
335784
  throw new Error("Template registry: templates.json is not an object");
335696
335785
  }
@@ -335776,7 +335865,7 @@ var PROJECT_DEVELOPMENT_LOG_RELATIVE_PATH = "DEVLOG.md";
335776
335865
  function rewriteRoadmap(targetDir, name) {
335777
335866
  const path = join15(targetDir, PROJECT_ROADMAP_RELATIVE_PATH);
335778
335867
  if (!existsSync10(path)) return;
335779
- const body = readFileSync12(path, "utf-8").replace(/^# .*$/m, `# Roadmap \u2014 ${name}`);
335868
+ const body = readFileSync11(path, "utf-8").replace(/^# .*$/m, `# Roadmap \u2014 ${name}`);
335780
335869
  writeFileSync4(path, body, "utf-8");
335781
335870
  }
335782
335871
  function resolveEngineDependencyNames(engineDir, fallbackDir) {
@@ -335793,7 +335882,7 @@ function readInstalledVersionWithFallback(monoRoot, fallbackDir, name) {
335793
335882
  }
335794
335883
  function readEngineDependencyNames(engineDir) {
335795
335884
  try {
335796
- const enginePkg = JSON.parse(readFileSync12(join15(engineDir, "package.json"), "utf-8"));
335885
+ const enginePkg = JSON.parse(readFileSync11(join15(engineDir, "package.json"), "utf-8"));
335797
335886
  return new Set(Object.keys(enginePkg.dependencies ?? {}));
335798
335887
  } catch {
335799
335888
  return void 0;
@@ -335802,7 +335891,7 @@ function readEngineDependencyNames(engineDir) {
335802
335891
  function readInstalledVersion(monoRoot, packageName) {
335803
335892
  try {
335804
335893
  const installed = JSON.parse(
335805
- readFileSync12(join15(monoRoot, "node_modules", packageName, "package.json"), "utf-8")
335894
+ readFileSync11(join15(monoRoot, "node_modules", packageName, "package.json"), "utf-8")
335806
335895
  );
335807
335896
  return installed.version;
335808
335897
  } catch {
@@ -335959,7 +336048,7 @@ function shouldCopyStarterPath(templateDir, sourcePath) {
335959
336048
  function rewritePackageJson(targetDir, slug, engineDir, monoRoot) {
335960
336049
  const pkgPath = join15(targetDir, "package.json");
335961
336050
  if (!existsSync10(pkgPath)) return;
335962
- const pkg = JSON.parse(readFileSync12(pkgPath, "utf-8"));
336051
+ const pkg = JSON.parse(readFileSync11(pkgPath, "utf-8"));
335963
336052
  pkg.name = slug;
335964
336053
  pkg.dependencies = pkg.dependencies ?? {};
335965
336054
  pkg.dependencies["@vgai/engine"] = engineDependencySpec(monoRoot, "@vgai/engine");
@@ -336006,7 +336095,7 @@ function versionFromCheckout(monoRoot, relPath) {
336006
336095
  const candidate = resolve9(monoRoot, cleaned, "package.json");
336007
336096
  if (!existsSync10(candidate)) return void 0;
336008
336097
  try {
336009
- const parsed = JSON.parse(readFileSync12(candidate, "utf8"));
336098
+ const parsed = JSON.parse(readFileSync11(candidate, "utf8"));
336010
336099
  return typeof parsed.version === "string" ? parsed.version : void 0;
336011
336100
  } catch {
336012
336101
  return void 0;
@@ -336024,7 +336113,7 @@ function rewriteGameManifest(targetDir, name, slug, additions, monoRoot) {
336024
336113
  const engineVersion = readInstalledVersion(monoRoot, "@vgai/engine");
336025
336114
  let manifest;
336026
336115
  if (existsSync10(manifestPath)) {
336027
- manifest = JSON.parse(readFileSync12(manifestPath, "utf-8"));
336116
+ manifest = JSON.parse(readFileSync11(manifestPath, "utf-8"));
336028
336117
  } else {
336029
336118
  manifest = {
336030
336119
  manifestVersion: 2,
@@ -336070,7 +336159,7 @@ function repinEngineAfterInstall(targetDir) {
336070
336159
  const manifestPath = resolveManifestPath(targetDir);
336071
336160
  let manifest;
336072
336161
  try {
336073
- manifest = JSON.parse(readFileSync12(manifestPath, "utf-8"));
336162
+ manifest = JSON.parse(readFileSync11(manifestPath, "utf-8"));
336074
336163
  } catch {
336075
336164
  return null;
336076
336165
  }
@@ -336081,7 +336170,7 @@ function repinEngineAfterInstall(targetDir) {
336081
336170
  writeJson(manifestPath, manifest);
336082
336171
  const baselinePath = join15(targetDir, SCAFFOLD_BASELINE_RELATIVE_PATH);
336083
336172
  try {
336084
- const baseline = JSON.parse(readFileSync12(baselinePath, "utf-8"));
336173
+ const baseline = JSON.parse(readFileSync11(baselinePath, "utf-8"));
336085
336174
  baseline.engineVersion = installed;
336086
336175
  baseline.files["vgai.project.json"] = hashFile(manifestPath);
336087
336176
  writeFileSync4(baselinePath, `${JSON.stringify(baseline, null, 2)}
@@ -336115,7 +336204,7 @@ function checkoutVgaiPackageDirs(monoRoot) {
336115
336204
  if (!existsSync10(join15(dir, "src"))) continue;
336116
336205
  let name;
336117
336206
  try {
336118
- name = JSON.parse(readFileSync12(join15(dir, "package.json"), "utf-8")).name;
336207
+ name = JSON.parse(readFileSync11(join15(dir, "package.json"), "utf-8")).name;
336119
336208
  } catch {
336120
336209
  continue;
336121
336210
  }
@@ -336126,7 +336215,7 @@ function checkoutVgaiPackageDirs(monoRoot) {
336126
336215
  function declaredVgaiDependencies(projectDir) {
336127
336216
  let pkg;
336128
336217
  try {
336129
- pkg = JSON.parse(readFileSync12(join15(projectDir, "package.json"), "utf-8"));
336218
+ pkg = JSON.parse(readFileSync11(join15(projectDir, "package.json"), "utf-8"));
336130
336219
  } catch {
336131
336220
  return [];
336132
336221
  }
@@ -336156,7 +336245,7 @@ var runPackageBuild = (packageDir) => {
336156
336245
  function declaredBins(packageDir) {
336157
336246
  let pkg;
336158
336247
  try {
336159
- pkg = JSON.parse(readFileSync12(join15(packageDir, "package.json"), "utf-8"));
336248
+ pkg = JSON.parse(readFileSync11(join15(packageDir, "package.json"), "utf-8"));
336160
336249
  } catch {
336161
336250
  return [];
336162
336251
  }
@@ -336206,7 +336295,7 @@ function rewriteTemplateVariantFiles(targetDir, additions) {
336206
336295
  writeFileSync4(join15(targetDir, "vgai.adapter.ts"), adapterSourceFor(additions), "utf-8");
336207
336296
  } else {
336208
336297
  const adapterPath = join15(targetDir, "vgai.adapter.ts");
336209
- const source = joinAdditionFinders(readFileSync12(adapterPath, "utf-8"), additions);
336298
+ const source = joinAdditionFinders(readFileSync11(adapterPath, "utf-8"), additions);
336210
336299
  writeFileSync4(adapterPath, source, "utf-8");
336211
336300
  }
336212
336301
  if (additions.has("mesh")) {
@@ -336228,7 +336317,7 @@ function relaxIndexAccessForModels(targetDir) {
336228
336317
  const tsconfigPath = join15(targetDir, "tsconfig.json");
336229
336318
  if (!existsSync10(tsconfigPath)) return;
336230
336319
  const parseErrors = [];
336231
- const tsconfig = parse4(readFileSync12(tsconfigPath, "utf-8"), parseErrors, {
336320
+ const tsconfig = parse4(readFileSync11(tsconfigPath, "utf-8"), parseErrors, {
336232
336321
  allowTrailingComma: true
336233
336322
  });
336234
336323
  if (parseErrors.length > 0) return;
@@ -336239,7 +336328,7 @@ function rewriteTsconfig(targetDir, engineRelPath, editorRelPath) {
336239
336328
  const tsconfigPath = join15(targetDir, "tsconfig.json");
336240
336329
  if (!existsSync10(tsconfigPath)) return;
336241
336330
  const parseErrors = [];
336242
- const tsconfig = parse4(readFileSync12(tsconfigPath, "utf-8"), parseErrors, {
336331
+ const tsconfig = parse4(readFileSync11(tsconfigPath, "utf-8"), parseErrors, {
336243
336332
  allowTrailingComma: true
336244
336333
  });
336245
336334
  if (parseErrors.length > 0) {
@@ -336261,7 +336350,7 @@ function rewriteTsconfig(targetDir, engineRelPath, editorRelPath) {
336261
336350
  function rewriteViteConfig(targetDir) {
336262
336351
  const vitePath = join15(targetDir, "vite.config.ts");
336263
336352
  if (!existsSync10(vitePath)) return;
336264
- writeFileSync4(vitePath, rewriteViteConfigContent(readFileSync12(vitePath, "utf-8")), "utf-8");
336353
+ writeFileSync4(vitePath, rewriteViteConfigContent(readFileSync11(vitePath, "utf-8")), "utf-8");
336265
336354
  }
336266
336355
  function rewriteViteConfigContent(content) {
336267
336356
  return ensureReactDedupe(content);
@@ -336287,7 +336376,7 @@ function ensureReactDedupe(content) {
336287
336376
  function rewriteIndexHtml(targetDir, name) {
336288
336377
  const htmlPath = join15(targetDir, "index.html");
336289
336378
  if (!existsSync10(htmlPath)) return;
336290
- const html = readFileSync12(htmlPath, "utf-8").replace(
336379
+ const html = readFileSync11(htmlPath, "utf-8").replace(
336291
336380
  /<title>.*<\/title>/,
336292
336381
  `<title>${name}</title>`
336293
336382
  );
@@ -336346,7 +336435,7 @@ function scaffoldProject(opts) {
336346
336435
  // ../create-vgai-project/src/dep-cache.ts
336347
336436
  import { spawnSync as spawnSync4 } from "node:child_process";
336348
336437
  import { createHash as createHash4 } from "node:crypto";
336349
- import { existsSync as existsSync11, mkdirSync as mkdirSync6, readFileSync as readFileSync13, renameSync as renameSync2, rmSync as rmSync3, statSync as statSync4 } from "node:fs";
336438
+ import { existsSync as existsSync11, mkdirSync as mkdirSync6, readFileSync as readFileSync12, renameSync as renameSync2, rmSync as rmSync3, statSync as statSync4 } from "node:fs";
336350
336439
  import { homedir as homedir2 } from "node:os";
336351
336440
  import { dirname as dirname10, isAbsolute as isAbsolute7, join as join16, resolve as resolve10 } from "node:path";
336352
336441
  var LOCAL_SPECIFIER_PREFIXES = ["file:", "link:", "portal:"];
@@ -336454,7 +336543,7 @@ function cacheDependencies(targetDir, env3, clone2 = cloneTree) {
336454
336543
  }
336455
336544
  function readKey(targetDir) {
336456
336545
  try {
336457
- const pkg = JSON.parse(readFileSync13(join16(targetDir, "package.json"), "utf8"));
336546
+ const pkg = JSON.parse(readFileSync12(join16(targetDir, "package.json"), "utf8"));
336458
336547
  return computeDepCacheKey({
336459
336548
  dependencies: pkg.dependencies ?? {},
336460
336549
  devDependencies: pkg.devDependencies ?? {},
@@ -336500,7 +336589,7 @@ import {
336500
336589
  existsSync as existsSync12,
336501
336590
  mkdtempSync,
336502
336591
  readdirSync as readdirSync7,
336503
- readFileSync as readFileSync14,
336592
+ readFileSync as readFileSync13,
336504
336593
  statSync as statSync5,
336505
336594
  writeFileSync as writeFileSync5
336506
336595
  } from "node:fs";
@@ -336592,7 +336681,7 @@ ${detail}`
336592
336681
  );
336593
336682
  }
336594
336683
  const stagedManifestPath = join17(stagedDir, "vgai.project.json");
336595
- const staged = JSON.parse(readFileSync14(stagedManifestPath, "utf-8"));
336684
+ const staged = JSON.parse(readFileSync13(stagedManifestPath, "utf-8"));
336596
336685
  staged.relay = {
336597
336686
  grant: minted.grant,
336598
336687
  expiresAt: minted.expiresAt,
@@ -336602,7 +336691,7 @@ ${detail}`
336602
336691
  writeFileSync5(stagedManifestPath, `${JSON.stringify(staged, null, 2)}
336603
336692
  `, "utf-8");
336604
336693
  const sourceManifestPath = resolveManifestPath(projectDir);
336605
- const source = JSON.parse(readFileSync14(sourceManifestPath, "utf-8"));
336694
+ const source = JSON.parse(readFileSync13(sourceManifestPath, "utf-8"));
336606
336695
  if (source.relay !== void 0) {
336607
336696
  throw new DeployError(
336608
336697
  `vgai deploy: internal invariant violated \u2014 the SOURCE manifest at ${sourceManifestPath} gained a relay grant. The grant must live only in the staged bundle.`
@@ -336646,7 +336735,7 @@ async function deployProject(opts) {
336646
336735
  }
336647
336736
 
336648
336737
  // ../create-vgai-project/src/deploy-itch.ts
336649
- import { mkdirSync as mkdirSync7, readdirSync as readdirSync8, readFileSync as readFileSync15, writeFileSync as writeFileSync6 } from "node:fs";
336738
+ import { mkdirSync as mkdirSync7, readdirSync as readdirSync8, readFileSync as readFileSync14, writeFileSync as writeFileSync6 } from "node:fs";
336650
336739
  import { dirname as dirname11, isAbsolute as isAbsolute8, join as join18, relative as relative7, sep as sep3 } from "node:path";
336651
336740
 
336652
336741
  // ../../../donor-main/node_modules/fflate/esm/index.mjs
@@ -337652,7 +337741,7 @@ function collectZippable(dir, base = dir) {
337652
337741
  Object.assign(out, collectZippable(full, base));
337653
337742
  } else if (entry.isFile()) {
337654
337743
  const relPath = relative7(base, full).split(sep3).join("/");
337655
- out[relPath] = new Uint8Array(readFileSync15(full));
337744
+ out[relPath] = new Uint8Array(readFileSync14(full));
337656
337745
  }
337657
337746
  }
337658
337747
  return out;
@@ -337671,7 +337760,7 @@ function assertItchZipEntries(entries) {
337671
337760
  }
337672
337761
  }
337673
337762
  function validateItchZipFile(zipPath) {
337674
- const bytes = readFileSync15(zipPath);
337763
+ const bytes = readFileSync14(zipPath);
337675
337764
  const entries = [];
337676
337765
  unzipSync(new Uint8Array(bytes), {
337677
337766
  filter(file2) {
@@ -337789,7 +337878,7 @@ import {
337789
337878
  mkdirSync as mkdirSync8,
337790
337879
  mkdtempSync as mkdtempSync2,
337791
337880
  readdirSync as readdirSync9,
337792
- readFileSync as readFileSync16,
337881
+ readFileSync as readFileSync15,
337793
337882
  rmSync as rmSync4,
337794
337883
  writeFileSync as writeFileSync7
337795
337884
  } from "node:fs";
@@ -337941,7 +338030,7 @@ function classifyTemplateFiles(projectDir, baseline, newTemplateAbsPaths) {
337941
338030
  status: "user-edited",
337942
338031
  diff: unifiedDiff(
337943
338032
  path,
337944
- readFileSync16(currentAbsPath, "utf-8"),
338033
+ readFileSync15(currentAbsPath, "utf-8"),
337945
338034
  readTextSafe(newTemplateAbsPath)
337946
338035
  )
337947
338036
  });
@@ -337958,7 +338047,7 @@ function classifyTemplateFiles(projectDir, baseline, newTemplateAbsPaths) {
337958
338047
  if (currentHash !== newTemplateHash) {
337959
338048
  report.diff = unifiedDiff(
337960
338049
  path,
337961
- readFileSync16(currentAbsPath, "utf-8"),
338050
+ readFileSync15(currentAbsPath, "utf-8"),
337962
338051
  readTextSafe(newTemplateAbsPath)
337963
338052
  );
337964
338053
  }
@@ -337973,7 +338062,7 @@ function classifyTemplateFiles(projectDir, baseline, newTemplateAbsPaths) {
337973
338062
  }
337974
338063
  function readTextSafe(absPath) {
337975
338064
  try {
337976
- return readFileSync16(absPath, "utf-8");
338065
+ return readFileSync15(absPath, "utf-8");
337977
338066
  } catch {
337978
338067
  return "";
337979
338068
  }
@@ -338038,7 +338127,7 @@ function buildDependencyVersionsReport(projectDir, currentEngineVersion, targetP
338038
338127
  if (!existsSync13(pkgPath)) return [];
338039
338128
  let pkg;
338040
338129
  try {
338041
- pkg = JSON.parse(readFileSync16(pkgPath, "utf-8"));
338130
+ pkg = JSON.parse(readFileSync15(pkgPath, "utf-8"));
338042
338131
  } catch {
338043
338132
  return [];
338044
338133
  }
@@ -338064,7 +338153,7 @@ function rewriteDependencyVersions(projectDir, entries) {
338064
338153
  if (toWrite.length === 0) return;
338065
338154
  const pkgPath = join19(projectDir, "package.json");
338066
338155
  if (!existsSync13(pkgPath)) return;
338067
- const pkg = JSON.parse(readFileSync16(pkgPath, "utf-8"));
338156
+ const pkg = JSON.parse(readFileSync15(pkgPath, "utf-8"));
338068
338157
  for (const entry of toWrite) {
338069
338158
  const bucket = entry.field === "dependencies" ? pkg.dependencies : pkg.devDependencies;
338070
338159
  if (!bucket || bucket[entry.name] === void 0) continue;
@@ -338075,7 +338164,7 @@ function rewriteDependencyVersions(projectDir, entries) {
338075
338164
  }
338076
338165
  function rewriteEngineVersionPin(projectDir, newVersion) {
338077
338166
  const manifestPath = resolveManifestPath(projectDir);
338078
- const raw = readFileSync16(manifestPath, "utf-8");
338167
+ const raw = readFileSync15(manifestPath, "utf-8");
338079
338168
  const manifest = JSON.parse(raw);
338080
338169
  manifest.engine = { ...manifest.engine, version: newVersion };
338081
338170
  writeFileSync7(manifestPath, `${JSON.stringify(manifest, null, 2)}
@@ -338096,7 +338185,7 @@ function buildNewTemplateSnapshot(monoRoot, projectDir, scratchDir, currentEngin
338096
338185
  const catalogDir = join19(templateDir, "..", "catalog");
338097
338186
  copyTemplateTree(templateDir, scratchDir);
338098
338187
  const currentManifestPath = resolveManifestPath(projectDir);
338099
- const name = existsSync13(currentManifestPath) ? JSON.parse(readFileSync16(currentManifestPath, "utf-8")).name ?? "game" : "game";
338188
+ const name = existsSync13(currentManifestPath) ? JSON.parse(readFileSync15(currentManifestPath, "utf-8")).name ?? "game" : "game";
338100
338189
  reapplyScaffoldRewrites(
338101
338190
  scratchDir,
338102
338191
  projectDir,
@@ -338125,7 +338214,7 @@ var R3F_STARTER_WORLD_PATHS = /* @__PURE__ */ new Set([
338125
338214
  ]);
338126
338215
  function projectUsesR3fStarterWorld(projectDir) {
338127
338216
  try {
338128
- const manifest = JSON.parse(readFileSync16(resolveManifestPath(projectDir), "utf8"));
338217
+ const manifest = JSON.parse(readFileSync15(resolveManifestPath(projectDir), "utf8"));
338129
338218
  return manifest.roots?.some(
338130
338219
  (root) => root.adapter === "three" && root.entry?.replace(/^\.\//, "") === "src/world.tsx"
338131
338220
  ) ?? false;
@@ -338166,12 +338255,12 @@ function copyTemplateTree(templateDir, targetDir) {
338166
338255
  const src = join19(templateDir, relPath);
338167
338256
  const dest = join19(targetDir, relPath);
338168
338257
  mkdirSync8(join19(dest, ".."), { recursive: true });
338169
- writeFileSync7(dest, readFileSync16(src));
338258
+ writeFileSync7(dest, readFileSync15(src));
338170
338259
  }
338171
338260
  }
338172
338261
  function projectHasThreeRoot(projectDir) {
338173
338262
  try {
338174
- const manifest = JSON.parse(readFileSync16(resolveManifestPath(projectDir), "utf8"));
338263
+ const manifest = JSON.parse(readFileSync15(resolveManifestPath(projectDir), "utf8"));
338175
338264
  return manifest.roots?.some((root) => root.adapter === "three") ?? false;
338176
338265
  } catch {
338177
338266
  return false;
@@ -338193,9 +338282,9 @@ function reapplyScaffoldRewrites(scratchDir, projectDir, monoRoot, name, current
338193
338282
  };
338194
338283
  const pkgPath = join19(scratchDir, "package.json");
338195
338284
  if (existsSync13(pkgPath)) {
338196
- const pkg = JSON.parse(readFileSync16(pkgPath, "utf-8"));
338285
+ const pkg = JSON.parse(readFileSync15(pkgPath, "utf-8"));
338197
338286
  const projectPkgPath = join19(projectDir, "package.json");
338198
- const projectPkg = existsSync13(projectPkgPath) ? JSON.parse(readFileSync16(projectPkgPath, "utf-8")) : void 0;
338287
+ const projectPkg = existsSync13(projectPkgPath) ? JSON.parse(readFileSync15(projectPkgPath, "utf-8")) : void 0;
338199
338288
  const slug = projectPkg?.name;
338200
338289
  if (slug) pkg.name = slug;
338201
338290
  pkg.dependencies = pkg.dependencies ?? {};
@@ -338234,9 +338323,9 @@ function reapplyScaffoldRewrites(scratchDir, projectDir, monoRoot, name, current
338234
338323
  }
338235
338324
  const manifestPath = resolveManifestPath(scratchDir);
338236
338325
  if (existsSync13(manifestPath)) {
338237
- const manifest = JSON.parse(readFileSync16(manifestPath, "utf-8"));
338326
+ const manifest = JSON.parse(readFileSync15(manifestPath, "utf-8"));
338238
338327
  const currentManifestPath = resolveManifestPath(projectDir);
338239
- const currentManifest = existsSync13(currentManifestPath) ? JSON.parse(readFileSync16(currentManifestPath, "utf-8")) : void 0;
338328
+ const currentManifest = existsSync13(currentManifestPath) ? JSON.parse(readFileSync15(currentManifestPath, "utf-8")) : void 0;
338240
338329
  manifest["name"] = name;
338241
338330
  if (currentManifest?.["appId"] !== void 0) manifest["appId"] = currentManifest["appId"];
338242
338331
  writeFileSync7(manifestPath, `${JSON.stringify(manifest, null, 2)}
@@ -338244,7 +338333,7 @@ function reapplyScaffoldRewrites(scratchDir, projectDir, monoRoot, name, current
338244
338333
  }
338245
338334
  const tsconfigPath = join19(scratchDir, "tsconfig.json");
338246
338335
  if (existsSync13(tsconfigPath)) {
338247
- const tsconfig = JSON.parse(readFileSync16(tsconfigPath, "utf-8"));
338336
+ const tsconfig = JSON.parse(readFileSync15(tsconfigPath, "utf-8"));
338248
338337
  tsconfig.compilerOptions = tsconfig.compilerOptions ?? {};
338249
338338
  tsconfig.compilerOptions.paths = {
338250
338339
  // Kept byte-identical to `scaffold.ts`'s `rewriteTsconfig` — see its doc
@@ -338264,12 +338353,12 @@ function reapplyScaffoldRewrites(scratchDir, projectDir, monoRoot, name, current
338264
338353
  }
338265
338354
  const vitePath = join19(scratchDir, "vite.config.ts");
338266
338355
  if (existsSync13(vitePath)) {
338267
- const content = rewriteViteConfigContent(readFileSync16(vitePath, "utf-8"));
338356
+ const content = rewriteViteConfigContent(readFileSync15(vitePath, "utf-8"));
338268
338357
  writeFileSync7(vitePath, content, "utf-8");
338269
338358
  }
338270
338359
  const htmlPath = join19(scratchDir, "index.html");
338271
338360
  if (existsSync13(htmlPath)) {
338272
- const html = readFileSync16(htmlPath, "utf-8").replace(
338361
+ const html = readFileSync15(htmlPath, "utf-8").replace(
338273
338362
  /<title>.*<\/title>/,
338274
338363
  `<title>${name}</title>`
338275
338364
  );
@@ -338277,14 +338366,14 @@ function reapplyScaffoldRewrites(scratchDir, projectDir, monoRoot, name, current
338277
338366
  }
338278
338367
  const roadmapPath = join19(scratchDir, PROJECT_ROADMAP_RELATIVE_PATH);
338279
338368
  if (existsSync13(roadmapPath)) {
338280
- const roadmap = readFileSync16(roadmapPath, "utf-8").replace(/^# .*$/m, `# ${name} \u2014 Roadmap`);
338369
+ const roadmap = readFileSync15(roadmapPath, "utf-8").replace(/^# .*$/m, `# ${name} \u2014 Roadmap`);
338281
338370
  writeFileSync7(roadmapPath, roadmap, "utf-8");
338282
338371
  }
338283
338372
  }
338284
338373
  function readBaseline(projectDir) {
338285
338374
  const path = join19(projectDir, SCAFFOLD_BASELINE_RELATIVE_PATH);
338286
338375
  if (!existsSync13(path)) return void 0;
338287
- return JSON.parse(readFileSync16(path, "utf-8"));
338376
+ return JSON.parse(readFileSync15(path, "utf-8"));
338288
338377
  }
338289
338378
  function refreshBaselineAfterUpgrade(projectDir, engineVersion, newTemplateFiles, engineDir) {
338290
338379
  const files = {};
@@ -338315,7 +338404,7 @@ async function upgradeProject(opts) {
338315
338404
  const { projectDir, monoRoot, currentEngineVersion } = opts;
338316
338405
  const manifestPath = resolveManifestPath(projectDir);
338317
338406
  const pinBefore = existsSync13(manifestPath) ? compareEnginePin(
338318
- JSON.parse(readFileSync16(manifestPath, "utf-8")).engine?.version ?? "",
338407
+ JSON.parse(readFileSync15(manifestPath, "utf-8")).engine?.version ?? "",
338319
338408
  currentEngineVersion
338320
338409
  ) : {
338321
338410
  status: "invalid",
@@ -338420,7 +338509,7 @@ async function upgradeProject(opts) {
338420
338509
  if (!newAbsPath) continue;
338421
338510
  const destPath = join19(projectDir, file2.path);
338422
338511
  mkdirSync8(join19(destPath, ".."), { recursive: true });
338423
- writeFileSync7(destPath, readFileSync16(newAbsPath));
338512
+ writeFileSync7(destPath, readFileSync15(newAbsPath));
338424
338513
  } else if (file2.status === "removed-incompatible-starter") {
338425
338514
  const destPath = join19(projectDir, file2.path);
338426
338515
  const baselineHash = baseline.files[file2.path];
@@ -338460,7 +338549,7 @@ function editorServerNodeOptions(inherited) {
338460
338549
  }
338461
338550
 
338462
338551
  // ../editor/server/open-browser.ts
338463
- import { existsSync as existsSync14, readFileSync as readFileSync17 } from "node:fs";
338552
+ import { existsSync as existsSync14, readFileSync as readFileSync16 } from "node:fs";
338464
338553
 
338465
338554
  // ../editor/server/spawn-opener.ts
338466
338555
  import { spawn as spawn2 } from "node:child_process";
@@ -338506,7 +338595,7 @@ function spawnOpener(cmd, cmdArgs, fallback) {
338506
338595
  function isWSL() {
338507
338596
  if (process.platform !== "linux") return false;
338508
338597
  try {
338509
- return readFileSync17("/proc/version", "utf8").toLowerCase().includes("microsoft");
338598
+ return readFileSync16("/proc/version", "utf8").toLowerCase().includes("microsoft");
338510
338599
  } catch {
338511
338600
  return false;
338512
338601
  }
@@ -338705,7 +338794,7 @@ init_load_file();
338705
338794
 
338706
338795
  // ../vgai-sdk/src/project/build-discipline.ts
338707
338796
  import { spawnSync as spawnSync6 } from "node:child_process";
338708
- import { existsSync as existsSync15, mkdirSync as mkdirSync9, readdirSync as readdirSync10, readFileSync as readFileSync18, statSync as statSync6, writeFileSync as writeFileSync8 } from "node:fs";
338797
+ import { existsSync as existsSync15, mkdirSync as mkdirSync9, readdirSync as readdirSync10, readFileSync as readFileSync17, statSync as statSync6, writeFileSync as writeFileSync8 } from "node:fs";
338709
338798
  import { dirname as dirname12, join as join20 } from "node:path";
338710
338799
  function formatElapsed(ms2) {
338711
338800
  const totalMinutes = Math.floor(ms2 / 6e4);
@@ -338933,7 +339022,7 @@ function unplayedSessionBanner(sessionStartedAtMs, newestEvidence, now, playable
338933
339022
  var TRIPWIRE_GATE_PATH = join20(".vgai", "tripwire-gate.json");
338934
339023
 
338935
339024
  // ../vgai-sdk/src/project/session-journal.ts
338936
- import { appendFileSync, mkdirSync as mkdirSync10, readdirSync as readdirSync11, readFileSync as readFileSync19, unlinkSync } from "node:fs";
339025
+ import { appendFileSync, mkdirSync as mkdirSync10, readdirSync as readdirSync11, readFileSync as readFileSync18, unlinkSync } from "node:fs";
338937
339026
  import { join as join21 } from "node:path";
338938
339027
  var PREFIX = "editor-";
338939
339028
  var SUFFIX = ".jsonl";
@@ -338951,7 +339040,7 @@ function readRecentJournalEvents(projectRoot, kinds, limit) {
338951
339040
  if (path === null || limit <= 0) return [];
338952
339041
  let raw;
338953
339042
  try {
338954
- raw = readFileSync19(path, "utf-8");
339043
+ raw = readFileSync18(path, "utf-8");
338955
339044
  } catch {
338956
339045
  return [];
338957
339046
  }
@@ -339087,7 +339176,7 @@ function sessionJournalPointerLine(journalPath) {
339087
339176
  }
339088
339177
 
339089
339178
  // src/account-session.ts
339090
- import { readFileSync as readFileSync20 } from "node:fs";
339179
+ import { readFileSync as readFileSync19 } from "node:fs";
339091
339180
  import { homedir as homedir3 } from "node:os";
339092
339181
  import { join as join22, resolve as resolve11 } from "node:path";
339093
339182
 
@@ -339224,7 +339313,7 @@ function cliAccountPath() {
339224
339313
  }
339225
339314
  function readCliAccountState() {
339226
339315
  try {
339227
- const value = JSON.parse(readFileSync20(cliAccountPath(), "utf8"));
339316
+ const value = JSON.parse(readFileSync19(cliAccountPath(), "utf8"));
339228
339317
  if (value.version !== 1 || value.backend !== "mock" && value.backend !== "live") {
339229
339318
  return void 0;
339230
339319
  }
@@ -339714,7 +339803,7 @@ function formatAssetPackFailure(outcome, projectDir) {
339714
339803
 
339715
339804
  // src/check-idioms-status.ts
339716
339805
  import { spawnSync as spawnSync7 } from "node:child_process";
339717
- import { existsSync as existsSync16, readFileSync as readFileSync21, statSync as statSync7 } from "node:fs";
339806
+ import { existsSync as existsSync16, readFileSync as readFileSync20, statSync as statSync7 } from "node:fs";
339718
339807
  import { dirname as dirname15, join as join25 } from "node:path";
339719
339808
  var SCANNER_SOURCE = "check-idioms.ts";
339720
339809
  var FINDINGS_RECORD = join25(".vgai", "check-idioms.json");
@@ -339778,7 +339867,7 @@ function readCheckIdiomsFindings(projectRoot, changedAt) {
339778
339867
  const at = recordedAt(projectRoot);
339779
339868
  if (at === null || changedAt !== null && changedAt > at) refreshFindings(projectRoot);
339780
339869
  try {
339781
- const raw = JSON.parse(readFileSync21(join25(projectRoot, FINDINGS_RECORD), "utf-8"));
339870
+ const raw = JSON.parse(readFileSync20(join25(projectRoot, FINDINGS_RECORD), "utf-8"));
339782
339871
  if (!Array.isArray(raw.findings)) {
339783
339872
  return [gateFailure("record-malformed", `${FINDINGS_RECORD} has no findings array`)];
339784
339873
  }
@@ -339802,16 +339891,16 @@ function gateFailure(kind, detail) {
339802
339891
  // src/colyseus-autoboot.ts
339803
339892
  init_load_file();
339804
339893
  import { spawn as spawn3 } from "node:child_process";
339805
- import { existsSync as existsSync17, readFileSync as readFileSync23 } from "node:fs";
339894
+ import { existsSync as existsSync17, readFileSync as readFileSync22 } from "node:fs";
339806
339895
  import { join as join27 } from "node:path";
339807
339896
 
339808
339897
  // ../engine/src/manifest/runtime-environment.ts
339809
339898
  var import_semver = __toESM(require_semver2(), 1);
339810
- import { readFileSync as readFileSync22 } from "node:fs";
339899
+ import { readFileSync as readFileSync21 } from "node:fs";
339811
339900
  import { join as join26 } from "node:path";
339812
339901
  function declaredNodeRange(projectDir) {
339813
339902
  try {
339814
- const raw = JSON.parse(readFileSync22(join26(projectDir, "package.json"), "utf-8"));
339903
+ const raw = JSON.parse(readFileSync21(join26(projectDir, "package.json"), "utf-8"));
339815
339904
  const engines = raw?.engines;
339816
339905
  return typeof engines?.node === "string" && engines.node.trim() ? engines.node.trim() : null;
339817
339906
  } catch {
@@ -339910,7 +339999,7 @@ function readDeclaredProcess(projectDir) {
339910
339999
  try {
339911
340000
  const manifestPath = resolveManifestPath(projectDir);
339912
340001
  if (!existsSync17(manifestPath)) return null;
339913
- const parsed = JSON.parse(readFileSync23(manifestPath, "utf8"));
340002
+ const parsed = JSON.parse(readFileSync22(manifestPath, "utf8"));
339914
340003
  const declared = (parsed.configurations ?? []).find(
339915
340004
  (c) => c?.kind === "process" && typeof c.entry === "string"
339916
340005
  );
@@ -340661,7 +340750,7 @@ function describeEditorBootFailure(outcome, ctx) {
340661
340750
  // src/editor-sessions.ts
340662
340751
  init_session_registry_format();
340663
340752
  import { execFileSync as execFileSync2 } from "node:child_process";
340664
- import { readFileSync as readFileSync24, realpathSync as realpathSync4, statSync as statSync9 } from "node:fs";
340753
+ import { readFileSync as readFileSync23, realpathSync as realpathSync4, statSync as statSync9 } from "node:fs";
340665
340754
  import { join as join29 } from "node:path";
340666
340755
 
340667
340756
  // src/loopback-port.ts
@@ -340869,7 +340958,7 @@ function restartPendingSessionHint(projectDir, opts = {}) {
340869
340958
  let parsed;
340870
340959
  try {
340871
340960
  mtimeMs = statSync9(file2).mtimeMs;
340872
- parsed = JSON.parse(readFileSync24(file2, "utf8"));
340961
+ parsed = JSON.parse(readFileSync23(file2, "utf8"));
340873
340962
  } catch {
340874
340963
  return null;
340875
340964
  }
@@ -350627,7 +350716,7 @@ function livePlaneLine(shape) {
350627
350716
  }
350628
350717
 
350629
350718
  // src/integrations.ts
350630
- import { existsSync as existsSync21, mkdirSync as mkdirSync11, readFileSync as readFileSync26, renameSync as renameSync3, writeFileSync as writeFileSync9 } from "node:fs";
350719
+ import { existsSync as existsSync21, mkdirSync as mkdirSync11, readFileSync as readFileSync25, renameSync as renameSync3, writeFileSync as writeFileSync9 } from "node:fs";
350631
350720
  import { homedir as homedir4 } from "node:os";
350632
350721
  import { dirname as dirname17, join as join30 } from "node:path";
350633
350722
 
@@ -350752,7 +350841,7 @@ function handleIntegrationHook(event, stdinRaw, env3 = process.env) {
350752
350841
  function readJsonObject(path) {
350753
350842
  if (!existsSync21(path)) return null;
350754
350843
  try {
350755
- const raw = JSON.parse(readFileSync26(path, "utf8"));
350844
+ const raw = JSON.parse(readFileSync25(path, "utf8"));
350756
350845
  if (typeof raw === "object" && raw !== null && !Array.isArray(raw)) {
350757
350846
  return raw;
350758
350847
  }
@@ -350997,7 +351086,7 @@ function uninstallFromClaude(path) {
350997
351086
  function defaultReadStdinSync() {
350998
351087
  try {
350999
351088
  if (process.stdin.isTTY) return "";
351000
- return readFileSync26(0, "utf8");
351089
+ return readFileSync25(0, "utf8");
351001
351090
  } catch {
351002
351091
  return "";
351003
351092
  }
@@ -351071,14 +351160,14 @@ import {
351071
351160
  mkdirSync as mkdirSync12,
351072
351161
  openSync as openSync2,
351073
351162
  readdirSync as readdirSync13,
351074
- readFileSync as readFileSync27,
351163
+ readFileSync as readFileSync26,
351075
351164
  renameSync as renameSync4,
351076
351165
  rmSync as rmSync5,
351077
351166
  writeFileSync as writeFileSync10
351078
351167
  } from "node:fs";
351079
351168
  import { homedir as homedir5 } from "node:os";
351080
351169
  import { dirname as dirname18, isAbsolute as isAbsolute10, join as join31, relative as relative10, resolve as resolve14, sep as sep5 } from "node:path";
351081
- import { fileURLToPath as fileURLToPath3, pathToFileURL } from "node:url";
351170
+ import { fileURLToPath as fileURLToPath2, pathToFileURL } from "node:url";
351082
351171
 
351083
351172
  // ../editor/server/worktree-identity.ts
351084
351173
  import { execFileSync as execFileSync4 } from "node:child_process";
@@ -351172,7 +351261,7 @@ function resolveWorktreeIdentity(projectRoot) {
351172
351261
  // src/isolated-worktree.ts
351173
351262
  var CONTAINER_IMAGE_REVISION = 7;
351174
351263
  var CLI_VERSION = JSON.parse(
351175
- readFileSync27(resolve14(dirname18(fileURLToPath3(import.meta.url)), "../package.json"), "utf8")
351264
+ readFileSync26(resolve14(dirname18(fileURLToPath2(import.meta.url)), "../package.json"), "utf8")
351176
351265
  ).version;
351177
351266
  var IMAGE = `vgai/isolated-worktree:${CLI_VERSION}-${CONTAINER_IMAGE_REVISION}`;
351178
351267
  var CONTAINER_PORT = 25680;
@@ -351237,7 +351326,7 @@ function writeRecord(record2) {
351237
351326
  chmodSync(statePath(record2.id), 384);
351238
351327
  }
351239
351328
  function readRecord(id) {
351240
- const record2 = JSON.parse(readFileSync27(statePath(id), "utf8"));
351329
+ const record2 = JSON.parse(readFileSync26(statePath(id), "utf8"));
351241
351330
  if (record2.version !== STATE_VERSION || record2.id !== id) {
351242
351331
  throw new Error(`Unsupported isolated-worktree state: ${statePath(id)}`);
351243
351332
  }
@@ -351259,7 +351348,7 @@ function isolatedId(repositoryId, branch) {
351259
351348
  return createHash7("sha256").update(`${repositoryId}\0${branch}`).digest("hex").slice(0, 16);
351260
351349
  }
351261
351350
  function imageContext() {
351262
- return resolve14(dirname18(fileURLToPath3(import.meta.url)), "../container");
351351
+ return resolve14(dirname18(fileURLToPath2(import.meta.url)), "../container");
351263
351352
  }
351264
351353
  function ensureImage(runner) {
351265
351354
  try {
@@ -351282,7 +351371,7 @@ function assertCleanRepository(root, runner) {
351282
351371
  function assertLocalDependencyInsideRepository(root, ownerPath, label, rawSpecifier) {
351283
351372
  let target;
351284
351373
  if (rawSpecifier.startsWith("file:")) {
351285
- target = fileURLToPath3(new URL(rawSpecifier, pathToFileURL(`${dirname18(ownerPath)}/`)));
351374
+ target = fileURLToPath2(new URL(rawSpecifier, pathToFileURL(`${dirname18(ownerPath)}/`)));
351286
351375
  } else if (rawSpecifier.startsWith("link:")) {
351287
351376
  target = resolve14(dirname18(ownerPath), rawSpecifier.slice("link:".length));
351288
351377
  }
@@ -351327,7 +351416,7 @@ function assertReproducibleLocalDependencies(root, runner) {
351327
351416
  ];
351328
351417
  for (const manifestRelative of manifests) {
351329
351418
  const manifestPath = resolve14(root, manifestRelative);
351330
- const manifest = JSON.parse(readFileSync27(manifestPath, "utf8"));
351419
+ const manifest = JSON.parse(readFileSync26(manifestPath, "utf8"));
351331
351420
  for (const group of dependencyGroups) {
351332
351421
  for (const [name, rawSpecifier] of Object.entries(manifest[group] ?? {})) {
351333
351422
  if (typeof rawSpecifier !== "string") continue;
@@ -351342,7 +351431,7 @@ function assertReproducibleLocalDependencies(root, runner) {
351342
351431
  assertLockResolutionsInsideRepository(
351343
351432
  root,
351344
351433
  lockPath,
351345
- JSON.parse(readFileSync27(lockPath, "utf8"))
351434
+ JSON.parse(readFileSync26(lockPath, "utf8"))
351346
351435
  );
351347
351436
  }
351348
351437
  }
@@ -351726,7 +351815,7 @@ async function hydrateManagedDeployEnv(resolveToken = cliAccountAccessToken) {
351726
351815
  var import_core13 = __toESM(require_lib(), 1);
351727
351816
  init_src2();
351728
351817
  import { dirname as dirname19, resolve as resolvePath2 } from "node:path";
351729
- import { fileURLToPath as fileURLToPath4 } from "node:url";
351818
+ import { fileURLToPath as fileURLToPath3 } from "node:url";
351730
351819
 
351731
351820
  // src/oclif/exit-codes.ts
351732
351821
  var EXIT_CODES = {
@@ -351788,7 +351877,7 @@ function exitCodeForErrorCode(code) {
351788
351877
 
351789
351878
  // src/oclif/operation-command.ts
351790
351879
  var import_core12 = __toESM(require_lib(), 1);
351791
- import { readFileSync as readFileSync28 } from "node:fs";
351880
+ import { readFileSync as readFileSync27 } from "node:fs";
351792
351881
  import { resolve as resolve15 } from "node:path";
351793
351882
 
351794
351883
  // src/oclif/schema-to-flags.ts
@@ -351956,7 +352045,7 @@ function applyScalarFlags(scalarFields, flags, input) {
351956
352045
  function readInputFile(inputFile) {
351957
352046
  let raw;
351958
352047
  try {
351959
- raw = readFileSync28(resolve15(inputFile), "utf-8");
352048
+ raw = readFileSync27(resolve15(inputFile), "utf-8");
351960
352049
  } catch (err2) {
351961
352050
  return {
351962
352051
  ok: false,
@@ -352178,7 +352267,7 @@ function createOperationCommand(def, registry3) {
352178
352267
  }
352179
352268
 
352180
352269
  // src/oclif/dispatch.ts
352181
- var __dirname3 = dirname19(fileURLToPath4(import.meta.url));
352270
+ var __dirname3 = dirname19(fileURLToPath3(import.meta.url));
352182
352271
  var CLI_PACKAGE_ROOT = resolvePath2(__dirname3, "..", "..");
352183
352272
  var cachedConfig;
352184
352273
  async function loadConfig() {
@@ -352261,7 +352350,7 @@ import { join as join33 } from "node:path";
352261
352350
 
352262
352351
  // src/perf.ts
352263
352352
  init_load();
352264
- import { existsSync as existsSync23, mkdirSync as mkdirSync13, readdirSync as readdirSync14, readFileSync as readFileSync29, rmSync as rmSync6, writeFileSync as writeFileSync11 } from "node:fs";
352353
+ import { existsSync as existsSync23, mkdirSync as mkdirSync13, readdirSync as readdirSync14, readFileSync as readFileSync28, rmSync as rmSync6, writeFileSync as writeFileSync11 } from "node:fs";
352265
352354
  import { dirname as dirname20, join as join32, resolve as resolve16 } from "node:path";
352266
352355
  function percentile2(values, fraction) {
352267
352356
  if (values.length === 0) return 0;
@@ -352439,7 +352528,7 @@ function readTrendEntries(projectRoot, limit) {
352439
352528
  const entries = [];
352440
352529
  for (const f of files) {
352441
352530
  try {
352442
- entries.push(JSON.parse(readFileSync29(join32(dir, f), "utf8")));
352531
+ entries.push(JSON.parse(readFileSync28(join32(dir, f), "utf8")));
352443
352532
  } catch {
352444
352533
  }
352445
352534
  }
@@ -352500,7 +352589,7 @@ function readManifestBudget(manifestPath) {
352500
352589
  }
352501
352590
  let raw;
352502
352591
  try {
352503
- raw = JSON.parse(readFileSync29(manifestPath, "utf8"));
352592
+ raw = JSON.parse(readFileSync28(manifestPath, "utf8"));
352504
352593
  } catch (err2) {
352505
352594
  throw new PerfGateError(
352506
352595
  `Could not parse ${manifestPath}: ${err2 instanceof Error ? err2.message : String(err2)}`
@@ -352519,7 +352608,7 @@ function readReportFile(path) {
352519
352608
  if (!existsSync23(abs)) throw new PerfGateError(`No perf report at ${abs}.`);
352520
352609
  let parsed;
352521
352610
  try {
352522
- parsed = JSON.parse(readFileSync29(abs, "utf8"));
352611
+ parsed = JSON.parse(readFileSync28(abs, "utf8"));
352523
352612
  } catch (err2) {
352524
352613
  throw new PerfGateError(
352525
352614
  `Could not parse perf report ${abs}: ${err2 instanceof Error ? err2.message : String(err2)}`
@@ -352881,7 +352970,7 @@ async function playWithRelayReloadRetry(client, opts, dependencies = {}) {
352881
352970
 
352882
352971
  // src/project-editor-port.ts
352883
352972
  import { createHash as createHash8 } from "node:crypto";
352884
- import { mkdirSync as mkdirSync14, readFileSync as readFileSync30, renameSync as renameSync5, rmdirSync, statSync as statSync10, writeFileSync as writeFileSync12 } from "node:fs";
352973
+ import { mkdirSync as mkdirSync14, readFileSync as readFileSync29, renameSync as renameSync5, rmdirSync, statSync as statSync10, writeFileSync as writeFileSync12 } from "node:fs";
352885
352974
  import { homedir as homedir6 } from "node:os";
352886
352975
  import { dirname as dirname21, join as join34 } from "node:path";
352887
352976
  var MIN_PORT = 1024;
@@ -352905,7 +352994,7 @@ function isEntry(value) {
352905
352994
  function readEntries2(registryFile) {
352906
352995
  let raw;
352907
352996
  try {
352908
- raw = readFileSync30(registryFile, "utf8");
352997
+ raw = readFileSync29(registryFile, "utf8");
352909
352998
  } catch (error48) {
352910
352999
  if (error48.code === "ENOENT") return [];
352911
353000
  throw new Error(
@@ -353611,7 +353700,7 @@ function describeTabAttachment(outcome, editorUrl) {
353611
353700
  // src/validate.ts
353612
353701
  var import_typescript2 = __toESM(require_typescript(), 1);
353613
353702
  init_zod();
353614
- import { existsSync as existsSync24, readdirSync as readdirSync15, readFileSync as readFileSync31, statSync as statSync11 } from "node:fs";
353703
+ import { existsSync as existsSync24, readdirSync as readdirSync15, readFileSync as readFileSync30, statSync as statSync11 } from "node:fs";
353615
353704
  import { dirname as dirname22, join as join36, resolve as resolve18 } from "node:path";
353616
353705
  init_load_file();
353617
353706
 
@@ -353699,7 +353788,7 @@ function collectSourceFiles2(dir) {
353699
353788
  }
353700
353789
  function collectUnmanagedReactRoots(folder) {
353701
353790
  return collectSourceFiles2(join36(folder, "src")).flatMap(
353702
- (file2) => detectUnmanagedReactRoots(readFileSync31(file2, "utf-8"), file2)
353791
+ (file2) => detectUnmanagedReactRoots(readFileSync30(file2, "utf-8"), file2)
353703
353792
  );
353704
353793
  }
353705
353794
  var MIN_REACT_ROOT_DESIGN_STATES = 3;
@@ -353832,7 +353921,7 @@ function readDefaultExportedComponentName(source) {
353832
353921
  function parseStoryModule(file2) {
353833
353922
  let text2;
353834
353923
  try {
353835
- text2 = readFileSync31(file2, "utf-8");
353924
+ text2 = readFileSync30(file2, "utf-8");
353836
353925
  } catch {
353837
353926
  return null;
353838
353927
  }
@@ -353868,7 +353957,7 @@ function collectReactDesignStateChecks(folder, manifest) {
353868
353957
  if (!existsSync24(entryPath)) return skip(`${entry} does not exist`);
353869
353958
  let entrySource;
353870
353959
  try {
353871
- entrySource = readFileSync31(entryPath, "utf-8");
353960
+ entrySource = readFileSync30(entryPath, "utf-8");
353872
353961
  } catch {
353873
353962
  return skip(`${entry} could not be read`);
353874
353963
  }
@@ -353935,7 +354024,7 @@ function checkEngineSourceDrift(folder, engineDir) {
353935
354024
  if (!existsSync24(baselinePath)) return void 0;
353936
354025
  let recorded;
353937
354026
  try {
353938
- recorded = JSON.parse(readFileSync31(baselinePath, "utf-8")).engineSource;
354027
+ recorded = JSON.parse(readFileSync30(baselinePath, "utf-8")).engineSource;
353939
354028
  } catch {
353940
354029
  return void 0;
353941
354030
  }
@@ -354003,7 +354092,7 @@ import { execFile as execFile2, execFileSync as execFileSync7 } from "node:child
354003
354092
  // ../editor/server/worktree-retention.mjs
354004
354093
  import { execFileSync as execFileSync6 } from "node:child_process";
354005
354094
  import { createHash as createHash9, randomUUID as randomUUID2 } from "node:crypto";
354006
- import { existsSync as existsSync25, linkSync, mkdirSync as mkdirSync15, readFileSync as readFileSync32, realpathSync as realpathSync6, renameSync as renameSync6, rmSync as rmSync7, writeFileSync as writeFileSync13 } from "node:fs";
354095
+ import { existsSync as existsSync25, linkSync, mkdirSync as mkdirSync15, readFileSync as readFileSync31, realpathSync as realpathSync6, renameSync as renameSync6, rmSync as rmSync7, writeFileSync as writeFileSync13 } from "node:fs";
354007
354096
  import { basename as basename4, dirname as dirname23, join as join37, resolve as resolve19 } from "node:path";
354008
354097
  var git4 = (root, args2) => execFileSync6("git", ["-C", root, ...args2], { encoding: "utf8" }).trim();
354009
354098
  function canonical2(target) {
@@ -354033,7 +354122,7 @@ function locked(repo, target, action) {
354033
354122
  }
354034
354123
  }
354035
354124
  function read(file2) {
354036
- return existsSync25(file2) ? JSON.parse(readFileSync32(file2, "utf8")) : null;
354125
+ return existsSync25(file2) ? JSON.parse(readFileSync31(file2, "utf8")) : null;
354037
354126
  }
354038
354127
  function registered(repo, path) {
354039
354128
  return git4(repo, ["worktree", "list", "--porcelain", "-z"]).split("\0").includes(`worktree ${path}`);
@@ -354046,7 +354135,7 @@ function generationFile(repo, path) {
354046
354135
  function markGeneration(repo, path, record2) {
354047
354136
  const file2 = generationFile(repo, path);
354048
354137
  if (existsSync25(file2)) {
354049
- if (readFileSync32(file2, "utf8") !== record2.generation) throw new Error("Worktree generation differs from creation intent.");
354138
+ if (readFileSync31(file2, "utf8") !== record2.generation) throw new Error("Worktree generation differs from creation intent.");
354050
354139
  } else {
354051
354140
  const temporary = `${file2}.${randomUUID2()}.tmp`;
354052
354141
  try {
@@ -354058,7 +354147,7 @@ function markGeneration(repo, path, record2) {
354058
354147
  }
354059
354148
  }
354060
354149
  function verifyGeneration(repo, path, record2) {
354061
- if (readFileSync32(generationFile(repo, path), "utf8") !== record2.generation) throw new Error("Worktree generation changed; old completion cannot remove it.");
354150
+ if (readFileSync31(generationFile(repo, path), "utf8") !== record2.generation) throw new Error("Worktree generation changed; old completion cannot remove it.");
354062
354151
  }
354063
354152
  function preserve(repo, ref, head) {
354064
354153
  try {
@@ -354300,7 +354389,7 @@ function archiveRepositoryWorktree(projectRoot, targetRoot, sessions2) {
354300
354389
  }
354301
354390
 
354302
354391
  // src/index.ts
354303
- var __dirname4 = dirname26(fileURLToPath5(import.meta.url));
354392
+ var __dirname4 = dirname26(fileURLToPath4(import.meta.url));
354304
354393
  function resolveCliEngineRoot(cliDir) {
354305
354394
  const candidate = resolve21(cliDir, "..", "..", "..");
354306
354395
  return basename6(candidate) === "node_modules" ? dirname26(candidate) : candidate;
@@ -354313,11 +354402,11 @@ function catalogDistributionDir() {
354313
354402
  );
354314
354403
  }
354315
354404
  function cliVersion() {
354316
- if ("0.5.50") {
354317
- return "0.5.50";
354405
+ if ("0.5.51") {
354406
+ return "0.5.51";
354318
354407
  }
354319
354408
  try {
354320
- const pkg = JSON.parse(readFileSync33(join39(__dirname4, "..", "package.json"), "utf8"));
354409
+ const pkg = JSON.parse(readFileSync32(join39(__dirname4, "..", "package.json"), "utf8"));
354321
354410
  return typeof pkg.version === "string" ? pkg.version : "unknown";
354322
354411
  } catch {
354323
354412
  return "unknown";
@@ -354333,7 +354422,7 @@ function bakedTargetVersions() {
354333
354422
  if (false)
354334
354423
  return void 0;
354335
354424
  try {
354336
- return JSON.parse('{"@vgai/engine":"0.5.50","@vgai/editor":"0.5.50","@vgai/p2p-colyseus":"0.5.50","@vgai/live":"0.5.50","@vgai/sdk":"0.5.50","@vgai/editor-sdk":"0.5.50","@vgai/cli":"0.5.50"}');
354425
+ return JSON.parse('{"@vgai/engine":"0.5.51","@vgai/editor":"0.5.51","@vgai/p2p-colyseus":"0.5.51","@vgai/live":"0.5.51","@vgai/sdk":"0.5.51","@vgai/editor-sdk":"0.5.51","@vgai/cli":"0.5.51"}');
354337
354426
  } catch {
354338
354427
  return void 0;
354339
354428
  }
@@ -354450,11 +354539,12 @@ Drive the running game or editor \u2014 THE general door:
354450
354539
  eval <js> Literal JS with { editor, game, page, tools, session }.
354451
354540
  A game names its OWN commands, so no fixed verb set can
354452
354541
  cover them. Start with: vgai eval --list
354453
- run <name> Invoke one registered project tool with validated JSON
354542
+ tool <name> Invoke one registered project tool with validated JSON
354454
354543
  input (--list names them, --describe prints its schemas,
354455
354544
  --input <file|-> pipes the input in)
354456
354545
 
354457
354546
  Run and look at it:
354547
+ run [id] List or start a declared run configuration; --stop <id> stops it
354458
354548
  play / stop Enter / leave play mode
354459
354549
  restart Reload stale public/ assets when needed, then remount \u2014 acks
354460
354550
  only when the session is READY (tab attached, play running)
@@ -354606,8 +354696,10 @@ Project:
354606
354696
  open <path> Switch project in running editor
354607
354697
  project Show current project info
354608
354698
  projects List recent projects
354609
- run --list List project-local runnable capabilities
354610
- run <name> Run a Node-hosted project capability with validated JSON input
354699
+ run [id] List or start a declared run configuration
354700
+ --stop <id> Stop the selected configuration
354701
+ tool --list List project-local runnable capabilities
354702
+ tool <name> Run a Node-hosted project capability with validated JSON input
354611
354703
  --describe Print the selected capability's schemas and metadata without running
354612
354704
  --input <file|-> Read input JSON from a file or stdin (default: {})
354613
354705
  --yes Confirm write/destructive tool execution
@@ -355217,7 +355309,7 @@ async function colyseusPresenceWarning(projectDir) {
355217
355309
  try {
355218
355310
  const manifestPath = resolveManifestPath(projectDir);
355219
355311
  if (!existsSync27(manifestPath)) return null;
355220
- const parsed = JSON.parse(readFileSync33(manifestPath, "utf8"));
355312
+ const parsed = JSON.parse(readFileSync32(manifestPath, "utf8"));
355221
355313
  if (typeof parsed.server?.room !== "string") return null;
355222
355314
  room = parsed.server.room;
355223
355315
  } catch {
@@ -355359,7 +355451,7 @@ function readNewestPlayLog(projectRoot) {
355359
355451
  const name = newestPlayLogName(readdirSync16(logsDir));
355360
355452
  if (!name) return { logFile: null, logErrors: [] };
355361
355453
  const file2 = join39(logsDir, name);
355362
- return { logFile: file2, logErrors: playLogErrorMessages(readFileSync33(file2, "utf-8")) };
355454
+ return { logFile: file2, logErrors: playLogErrorMessages(readFileSync32(file2, "utf-8")) };
355363
355455
  } catch {
355364
355456
  return { logFile: null, logErrors: [] };
355365
355457
  }
@@ -355626,7 +355718,7 @@ add requires at least one capability id`);
355626
355718
  }
355627
355719
  function projectToolIdentities(projectDir) {
355628
355720
  try {
355629
- const pkg = JSON.parse(readFileSync33(join39(projectDir, "package.json"), "utf8"));
355721
+ const pkg = JSON.parse(readFileSync32(join39(projectDir, "package.json"), "utf8"));
355630
355722
  const identities = /* @__PURE__ */ new Set();
355631
355723
  for (const tool of pkg.vgai?.tools ?? []) {
355632
355724
  const identity = typeof tool === "string" ? tool : tool.entry ?? tool.id;
@@ -355687,7 +355779,7 @@ function listAvailableExamples(monoRoot = ENGINE_ROOT) {
355687
355779
  const manifestPath = join39(examplesDir, entry.name, "vgai.project.json");
355688
355780
  if (!existsSync27(manifestPath)) continue;
355689
355781
  try {
355690
- const manifest = JSON.parse(readFileSync33(manifestPath, "utf-8"));
355782
+ const manifest = JSON.parse(readFileSync32(manifestPath, "utf-8"));
355691
355783
  examples.push({
355692
355784
  id: entry.name,
355693
355785
  name: typeof manifest.name === "string" ? manifest.name : entry.name
@@ -356267,7 +356359,7 @@ function describeEditorProvenance(packagedEntry, engineRoot) {
356267
356359
  const editorPkgDir = dirname26(dirname26(packagedEntry));
356268
356360
  let version2 = "unknown";
356269
356361
  try {
356270
- version2 = JSON.parse(readFileSync33(join39(editorPkgDir, "package.json"), "utf8")).version ?? "unknown";
356362
+ version2 = JSON.parse(readFileSync32(join39(editorPkgDir, "package.json"), "utf8")).version ?? "unknown";
356271
356363
  } catch {
356272
356364
  }
356273
356365
  return `Editor: packaged @vgai/editor@${version2} (${editorPkgDir})`;
@@ -357197,7 +357289,7 @@ async function runAssetLabLook(source, flags, outputDirectory, defaultStage) {
357197
357289
  screenshotUsageError("--compare stages its own subject; --stage does not apply");
357198
357290
  }
357199
357291
  const refAbsolute = resolve21(flags.compare);
357200
- const refBytes = readFileSync33(refAbsolute);
357292
+ const refBytes = readFileSync32(refAbsolute);
357201
357293
  const maxRefBytes = 32 * 1024 * 1024;
357202
357294
  if (refBytes.byteLength > maxRefBytes) {
357203
357295
  throw new Error(`--compare reference GLB must be ${maxRefBytes / 1024 / 1024} MiB or less.`);
@@ -357939,7 +358031,7 @@ async function run() {
357939
358031
  try {
357940
358032
  await dispatchCommand();
357941
358033
  } finally {
357942
- await drainConsoleLoudness(resolveConsoleLoudnessUrl());
358034
+ if (command !== "close") await drainConsoleLoudness(resolveConsoleLoudnessUrl());
357943
358035
  }
357944
358036
  }
357945
358037
  async function dispatchCommand() {
@@ -358053,7 +358145,7 @@ ${JSON.stringify(operation.resultSchema, null, 2)}`);
358053
358145
  if (inputPath) {
358054
358146
  try {
358055
358147
  input = JSON.parse(
358056
- inputPath === "-" ? readFileSync33(0, "utf8") : readFileSync33(resolve21(inputPath), "utf8")
358148
+ inputPath === "-" ? readFileSync32(0, "utf8") : readFileSync32(resolve21(inputPath), "utf8")
358057
358149
  );
358058
358150
  } catch (error48) {
358059
358151
  console.error(
@@ -358188,7 +358280,7 @@ Inspects first. Without --write this is a preview. With --write it creates only
358188
358280
  throw new Error("vgai blender-mcp: run it from inside a vgai project.");
358189
358281
  }
358190
358282
  if (!await hasLiveEditorSession(project)) {
358191
- spawnSync10(process.execPath, [fileURLToPath5(import.meta.url), "edit", project], {
358283
+ spawnSync10(process.execPath, [fileURLToPath4(import.meta.url), "edit", project], {
358192
358284
  cwd: project,
358193
358285
  stdio: ["ignore", 2, 2],
358194
358286
  env: { ...process.env, VGAI_DETACH_AFTER_READY: "1" }
@@ -359429,7 +359521,7 @@ Choose exactly one target: project, --port/--url, --all, or --everywhere.`
359429
359521
  let source;
359430
359522
  if (fileFlag) {
359431
359523
  try {
359432
- source = readFileSync33(resolve21(process.cwd(), rest[1] ?? ""), "utf-8");
359524
+ source = readFileSync32(resolve21(process.cwd(), rest[1] ?? ""), "utf-8");
359433
359525
  } catch (err2) {
359434
359526
  console.error(
359435
359527
  `vgai eval: cannot read ${rest[1]} \u2014 ${err2 instanceof Error ? err2.message : String(err2)}`
@@ -359567,24 +359659,27 @@ Choose exactly one target: project, --port/--url, --all, or --everywhere.`
359567
359659
  case "run": {
359568
359660
  if (hasHelpFlag(args)) {
359569
359661
  console.log(
359570
- "Usage: vgai run (list the project's configurations and their status)\n vgai run <id> (start a declared run-role configuration through the live editor session)\n vgai run --stop <id> (stop it)\n Configurations are the manifest's `run[]` (ARCHITECTURE-CORE \xA7The project model): an id and a\n registered kind. The editor's transport, this verb and a harness start the same declaration."
359662
+ "Usage: vgai run (list the project's configurations and their status)\n vgai run <id> (start a declared run-role configuration through the live editor session)\n vgai run --stop <id> (stop it)\n The editor's transport, this verb and a harness start the same declared configuration."
359571
359663
  );
359572
359664
  break;
359573
359665
  }
359574
- const base = resolveEditorTargetUrl();
359575
359666
  const rest = args.slice(1);
359667
+ const validArgs = rest.length === 0 || rest.length === 1 && !rest[0].startsWith("-") || rest.length === 2 && rest[0] === "--stop" && !rest[1].startsWith("-");
359668
+ if (!validArgs) throw new Error("Usage: vgai run [id] | vgai run --stop <id>");
359669
+ const base = resolveEditorTargetUrl();
359576
359670
  const stopFlag = rest.indexOf("--stop");
359577
359671
  const targetId = stopFlag >= 0 ? rest[stopFlag + 1] : rest.find((a) => !a.startsWith("-"));
359578
359672
  if (!targetId) {
359579
359673
  const res2 = await fetch(`${base}/__editor/configurations`);
359580
359674
  const body2 = await res2.json();
359581
359675
  if (!res2.ok) throw new Error(body2.error ?? `vgai run: ${res2.status}`);
359582
- for (const c of (body2.configurations ?? []).filter((c2) => c2.role === "run")) {
359676
+ const configurations = (body2.configurations ?? []).filter((c) => c.role === "run");
359677
+ for (const c of configurations) {
359583
359678
  console.log(
359584
359679
  `${c.status === "running" ? "\u25CF" : "\u25CB"} ${c.id} ${c.kind}${c.port ? ` :${c.port}` : ""}`
359585
359680
  );
359586
359681
  }
359587
- if ((body2.configurations ?? []).length === 0)
359682
+ if (configurations.length === 0)
359588
359683
  console.log("(this project declares no run configurations)");
359589
359684
  break;
359590
359685
  }
@@ -359757,7 +359852,7 @@ Choose exactly one target: project, --port/--url, --all, or --everywhere.`
359757
359852
  );
359758
359853
  let playable = true;
359759
359854
  try {
359760
- const raw = JSON.parse(readFileSync33(resolveManifestPath(statusProjectRoot), "utf8"));
359855
+ const raw = JSON.parse(readFileSync32(resolveManifestPath(statusProjectRoot), "utf8"));
359761
359856
  playable = Array.isArray(raw.roots) && raw.roots.length > 0;
359762
359857
  } catch {
359763
359858
  }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@vgai/cli",
3
3
  "author": "Volter AI, Inc.",
4
4
  "license": "Apache-2.0",
5
- "version": "0.5.50",
5
+ "version": "0.5.51",
6
6
  "description": "Create, open, control, validate, and playtest VGAI game projects.",
7
7
  "keywords": [
8
8
  "game-engine",
@@ -39,12 +39,12 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@oclif/core": "^4.11.14",
42
- "@vgai/editor": "0.5.50",
43
- "@vgai/editor-sdk": "0.5.50",
44
- "@vgai/engine": "0.5.50",
45
- "@vgai/live": "0.5.50",
46
- "@vgai/p2p-colyseus": "0.5.50",
47
- "@vgai/sdk": "0.5.50",
42
+ "@vgai/editor": "0.5.51",
43
+ "@vgai/editor-sdk": "0.5.51",
44
+ "@vgai/engine": "0.5.51",
45
+ "@vgai/live": "0.5.51",
46
+ "@vgai/p2p-colyseus": "0.5.51",
47
+ "@vgai/sdk": "0.5.51",
48
48
  "ink": "^7.1.0",
49
49
  "playwright": "^1.58.2",
50
50
  "react": "^19.2.4",