@vm0/cli 9.19.0 → 9.20.0

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/index.js +249 -65
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -236,9 +236,9 @@ var infoCommand = new Command6().name("info").description("Display environment i
236
236
  // src/commands/compose/index.ts
237
237
  import { Command as Command7, Option } from "commander";
238
238
  import chalk4 from "chalk";
239
- import { readFile as readFile4 } from "fs/promises";
239
+ import { readFile as readFile4, rm as rm3 } from "fs/promises";
240
240
  import { existsSync as existsSync4 } from "fs";
241
- import { dirname as dirname2 } from "path";
241
+ import { dirname as dirname2, join as join6 } from "path";
242
242
  import { parse as parseYaml2 } from "yaml";
243
243
 
244
244
  // ../../packages/core/src/variable-expander.ts
@@ -4447,11 +4447,6 @@ function validateAgentCompose(config) {
4447
4447
  return { valid: true };
4448
4448
  }
4449
4449
 
4450
- // src/lib/storage/system-storage.ts
4451
- import * as fs4 from "fs/promises";
4452
- import * as path4 from "path";
4453
- import * as os3 from "os";
4454
-
4455
4450
  // src/lib/domain/github-skills.ts
4456
4451
  import * as fs from "fs/promises";
4457
4452
  import * as path from "path";
@@ -4494,6 +4489,49 @@ async function downloadGitHubSkill(parsed, destDir) {
4494
4489
  await fs.rm(tempDir, { recursive: true, force: true });
4495
4490
  }
4496
4491
  }
4492
+ async function downloadGitHubDirectory(url) {
4493
+ const parsed = parseGitHubTreeUrl2(url);
4494
+ const repoUrl = `https://github.com/${parsed.owner}/${parsed.repo}.git`;
4495
+ const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "vm0-github-"));
4496
+ try {
4497
+ try {
4498
+ await execAsync("git --version");
4499
+ } catch {
4500
+ throw new Error(
4501
+ "git command not found. Please install git to use GitHub URLs."
4502
+ );
4503
+ }
4504
+ await execAsync(`git init`, { cwd: tempDir });
4505
+ await execAsync(`git remote add origin "${repoUrl}"`, { cwd: tempDir });
4506
+ await execAsync(`git config core.sparseCheckout true`, { cwd: tempDir });
4507
+ const sparseFile = path.join(tempDir, ".git", "info", "sparse-checkout");
4508
+ await fs.writeFile(sparseFile, parsed.path + "\n");
4509
+ try {
4510
+ await execAsync(`git fetch --depth 1 origin "${parsed.branch}"`, {
4511
+ cwd: tempDir
4512
+ });
4513
+ } catch (error) {
4514
+ const message = error instanceof Error ? error.message : String(error);
4515
+ if (message.includes("Authentication failed") || message.includes("could not read Username")) {
4516
+ throw new Error(`Cannot access repository. Is it private? URL: ${url}`);
4517
+ }
4518
+ if (message.includes("couldn't find remote ref")) {
4519
+ throw new Error(
4520
+ `Branch "${parsed.branch}" not found in repository: ${url}`
4521
+ );
4522
+ }
4523
+ throw error;
4524
+ }
4525
+ await execAsync(`git checkout "${parsed.branch}"`, { cwd: tempDir });
4526
+ return {
4527
+ dir: path.join(tempDir, parsed.path),
4528
+ tempRoot: tempDir
4529
+ };
4530
+ } catch (error) {
4531
+ await fs.rm(tempDir, { recursive: true, force: true });
4532
+ throw error;
4533
+ }
4534
+ }
4497
4535
  async function validateSkillDirectory(skillDir) {
4498
4536
  const skillMdPath = path.join(skillDir, "SKILL.md");
4499
4537
  try {
@@ -4536,6 +4574,11 @@ async function readSkillFrontmatter(skillDir) {
4536
4574
  return parseSkillFrontmatter(content);
4537
4575
  }
4538
4576
 
4577
+ // src/lib/storage/system-storage.ts
4578
+ import * as fs4 from "fs/promises";
4579
+ import * as path4 from "path";
4580
+ import * as os3 from "os";
4581
+
4539
4582
  // src/lib/storage/direct-upload.ts
4540
4583
  import { createHash } from "crypto";
4541
4584
  import * as fs3 from "fs";
@@ -5164,6 +5207,9 @@ async function silentUpgradeAfterCommand(currentVersion) {
5164
5207
 
5165
5208
  // src/commands/compose/index.ts
5166
5209
  var DEFAULT_CONFIG_FILE = "vm0.yaml";
5210
+ function isGitHubTreeUrl(input) {
5211
+ return input.startsWith("https://github.com/") && input.includes("/tree/");
5212
+ }
5167
5213
  function getSecretsFromComposeContent(content) {
5168
5214
  const refs = extractVariableReferences(content);
5169
5215
  const grouped = groupVariablesBySource(refs);
@@ -5197,6 +5243,14 @@ async function loadAndValidateConfig(configFile) {
5197
5243
  const basePath = dirname2(configFile);
5198
5244
  return { config, agentName, agent, basePath };
5199
5245
  }
5246
+ function hasVolumes(config) {
5247
+ if (typeof config !== "object" || config === null) {
5248
+ return false;
5249
+ }
5250
+ const cfg = config;
5251
+ const volumes = cfg.volumes;
5252
+ return typeof volumes === "object" && volumes !== null && Object.keys(volumes).length > 0;
5253
+ }
5200
5254
  function checkLegacyImageFormat(config) {
5201
5255
  const cfg = config;
5202
5256
  const agentsConfig = cfg.agents;
@@ -5346,47 +5400,140 @@ function mergeSkillVariables(agent, variables) {
5346
5400
  agent.environment = environment;
5347
5401
  }
5348
5402
  }
5403
+ async function finalizeCompose(config, agent, variables, options) {
5404
+ const confirmed = await displayAndConfirmVariables(variables, options);
5405
+ if (!confirmed) {
5406
+ process.exit(0);
5407
+ }
5408
+ mergeSkillVariables(agent, variables);
5409
+ console.log("Uploading compose...");
5410
+ const response = await createOrUpdateCompose({ content: config });
5411
+ const scopeResponse = await getScope();
5412
+ const shortVersionId = response.versionId.slice(0, 8);
5413
+ const displayName = `${scopeResponse.slug}/${response.name}`;
5414
+ if (response.action === "created") {
5415
+ console.log(chalk4.green(`\u2713 Compose created: ${displayName}`));
5416
+ } else {
5417
+ console.log(chalk4.green(`\u2713 Compose version exists: ${displayName}`));
5418
+ }
5419
+ console.log(chalk4.dim(` Version: ${shortVersionId}`));
5420
+ console.log();
5421
+ console.log(" Run your agent:");
5422
+ console.log(
5423
+ chalk4.cyan(
5424
+ ` vm0 run ${displayName}:${shortVersionId} --artifact-name <artifact> "your prompt"`
5425
+ )
5426
+ );
5427
+ if (options.autoUpdate !== false) {
5428
+ await silentUpgradeAfterCommand("9.20.0");
5429
+ }
5430
+ }
5431
+ async function handleGitHubCompose(url, options) {
5432
+ console.log(`Downloading from GitHub: ${url}`);
5433
+ const { dir: downloadedDir, tempRoot } = await downloadGitHubDirectory(url);
5434
+ const configFile = join6(downloadedDir, "vm0.yaml");
5435
+ try {
5436
+ if (!existsSync4(configFile)) {
5437
+ console.error(chalk4.red(`\u2717 vm0.yaml not found in the GitHub directory`));
5438
+ console.error(chalk4.dim(` URL: ${url}`));
5439
+ process.exit(1);
5440
+ }
5441
+ const { config, agentName, agent, basePath } = await loadAndValidateConfig(configFile);
5442
+ const existingCompose = await getComposeByName(agentName);
5443
+ if (existingCompose) {
5444
+ console.log();
5445
+ console.log(
5446
+ chalk4.yellow(`\u26A0 An agent named "${agentName}" already exists.`)
5447
+ );
5448
+ if (!isInteractive()) {
5449
+ if (!options.yes) {
5450
+ console.error(
5451
+ chalk4.red(
5452
+ `\u2717 Cannot overwrite existing agent in non-interactive mode`
5453
+ )
5454
+ );
5455
+ console.error(
5456
+ chalk4.dim(
5457
+ ` Use --yes flag to confirm overwriting the existing agent.`
5458
+ )
5459
+ );
5460
+ process.exit(1);
5461
+ }
5462
+ } else {
5463
+ const confirmed = await promptConfirm(
5464
+ "Do you want to overwrite it?",
5465
+ false
5466
+ );
5467
+ if (!confirmed) {
5468
+ console.log(chalk4.yellow("Compose cancelled."));
5469
+ process.exit(0);
5470
+ }
5471
+ }
5472
+ }
5473
+ if (hasVolumes(config)) {
5474
+ console.error(
5475
+ chalk4.red(`\u2717 Volumes are not supported for GitHub URL compose`)
5476
+ );
5477
+ console.error(
5478
+ chalk4.dim(
5479
+ ` Clone the repository locally and run: vm0 compose ./path/to/vm0.yaml`
5480
+ )
5481
+ );
5482
+ process.exit(1);
5483
+ }
5484
+ checkLegacyImageFormat(config);
5485
+ const skillResults = await uploadAssets(agentName, agent, basePath);
5486
+ const environment = agent.environment || {};
5487
+ const variables = await collectSkillVariables(
5488
+ skillResults,
5489
+ environment,
5490
+ agentName
5491
+ );
5492
+ await finalizeCompose(config, agent, variables, options);
5493
+ } finally {
5494
+ await rm3(tempRoot, { recursive: true, force: true });
5495
+ }
5496
+ }
5349
5497
  var composeCommand = new Command7().name("compose").description("Create or update agent compose (e.g., vm0.yaml)").argument(
5350
5498
  "[agent-yaml]",
5351
- `Path to agent YAML file (default: ${DEFAULT_CONFIG_FILE})`
5352
- ).option("-y, --yes", "Skip confirmation prompts for skill requirements").addOption(new Option("--no-auto-update").hideHelp()).action(
5499
+ `Path to agent YAML file or GitHub tree URL (default: ${DEFAULT_CONFIG_FILE})`
5500
+ ).option("-y, --yes", "Skip confirmation prompts for skill requirements").option(
5501
+ "--experimental-shared-compose",
5502
+ "Enable GitHub URL compose (experimental)"
5503
+ ).addOption(new Option("--no-auto-update").hideHelp()).action(
5353
5504
  async (configFile, options) => {
5354
5505
  const resolvedConfigFile = configFile ?? DEFAULT_CONFIG_FILE;
5355
5506
  try {
5356
- const { config, agentName, agent, basePath } = await loadAndValidateConfig(resolvedConfigFile);
5357
- checkLegacyImageFormat(config);
5358
- const skillResults = await uploadAssets(agentName, agent, basePath);
5359
- const environment = agent.environment || {};
5360
- const variables = await collectSkillVariables(
5361
- skillResults,
5362
- environment,
5363
- agentName
5364
- );
5365
- const confirmed = await displayAndConfirmVariables(variables, options);
5366
- if (!confirmed) {
5367
- process.exit(0);
5368
- }
5369
- mergeSkillVariables(agent, variables);
5370
- console.log("Uploading compose...");
5371
- const response = await createOrUpdateCompose({ content: config });
5372
- const scopeResponse = await getScope();
5373
- const shortVersionId = response.versionId.slice(0, 8);
5374
- const displayName = `${scopeResponse.slug}/${response.name}`;
5375
- if (response.action === "created") {
5376
- console.log(chalk4.green(`\u2713 Compose created: ${displayName}`));
5507
+ if (isGitHubTreeUrl(resolvedConfigFile)) {
5508
+ if (!options.experimentalSharedCompose) {
5509
+ console.error(
5510
+ chalk4.red(
5511
+ "\u2717 Composing shared agents requires --experimental-shared-compose flag"
5512
+ )
5513
+ );
5514
+ console.error();
5515
+ console.error(
5516
+ chalk4.dim(
5517
+ " Composing agents from other users carries security risks."
5518
+ )
5519
+ );
5520
+ console.error(
5521
+ chalk4.dim(" Only compose agents from users you trust.")
5522
+ );
5523
+ process.exit(1);
5524
+ }
5525
+ await handleGitHubCompose(resolvedConfigFile, options);
5377
5526
  } else {
5378
- console.log(chalk4.green(`\u2713 Compose version exists: ${displayName}`));
5379
- }
5380
- console.log(chalk4.dim(` Version: ${shortVersionId}`));
5381
- console.log();
5382
- console.log(" Run your agent:");
5383
- console.log(
5384
- chalk4.cyan(
5385
- ` vm0 run ${displayName}:${shortVersionId} --artifact-name <artifact> "your prompt"`
5386
- )
5387
- );
5388
- if (options.autoUpdate !== false) {
5389
- await silentUpgradeAfterCommand("9.19.0");
5527
+ const { config, agentName, agent, basePath } = await loadAndValidateConfig(resolvedConfigFile);
5528
+ checkLegacyImageFormat(config);
5529
+ const skillResults = await uploadAssets(agentName, agent, basePath);
5530
+ const environment = agent.environment || {};
5531
+ const variables = await collectSkillVariables(
5532
+ skillResults,
5533
+ environment,
5534
+ agentName
5535
+ );
5536
+ await finalizeCompose(config, agent, variables, options);
5390
5537
  }
5391
5538
  } catch (error) {
5392
5539
  if (error instanceof Error) {
@@ -7544,10 +7691,39 @@ var mainRunCommand = new Command8().name("run").description("Run an agent").argu
7544
7691
  ).option(
7545
7692
  "--model-provider <type>",
7546
7693
  "Override model provider (e.g., anthropic-api-key)"
7547
- ).option("--verbose", "Show full tool inputs and outputs").addOption(new Option2("--debug-no-mock-claude").hideHelp()).addOption(new Option2("--no-auto-update").hideHelp()).action(
7694
+ ).option("--verbose", "Show full tool inputs and outputs").option(
7695
+ "--experimental-shared-agent",
7696
+ "Allow running agents shared by other users (required when running scope/agent format)"
7697
+ ).addOption(new Option2("--debug-no-mock-claude").hideHelp()).addOption(new Option2("--no-auto-update").hideHelp()).action(
7548
7698
  async (identifier, prompt, options) => {
7549
7699
  try {
7550
7700
  const { scope, name, version } = parseIdentifier(identifier);
7701
+ if (scope && !options.experimentalSharedAgent) {
7702
+ const userScope = await getScope();
7703
+ const isOwnScope = userScope.slug === scope;
7704
+ if (!isOwnScope) {
7705
+ console.error(
7706
+ chalk9.red(
7707
+ `\u2717 Running shared agents requires --experimental-shared-agent flag`
7708
+ )
7709
+ );
7710
+ console.error();
7711
+ console.error(
7712
+ chalk9.dim(
7713
+ " Running agent from other users carries security risks."
7714
+ )
7715
+ );
7716
+ console.error(chalk9.dim(" Only run agents from users you trust."));
7717
+ console.error();
7718
+ console.error("Example:");
7719
+ console.error(
7720
+ chalk9.cyan(
7721
+ ` vm0 run ${identifier} --experimental-shared-agent "your prompt"`
7722
+ )
7723
+ );
7724
+ process.exit(1);
7725
+ }
7726
+ }
7551
7727
  let composeId;
7552
7728
  let composeContent;
7553
7729
  if (isUUID(name)) {
@@ -7617,7 +7793,7 @@ var mainRunCommand = new Command8().name("run").description("Run an agent").argu
7617
7793
  }
7618
7794
  showNextSteps(result);
7619
7795
  if (options.autoUpdate !== false) {
7620
- await silentUpgradeAfterCommand("9.19.0");
7796
+ await silentUpgradeAfterCommand("9.20.0");
7621
7797
  }
7622
7798
  } catch (error) {
7623
7799
  handleRunError(error, identifier);
@@ -8725,11 +8901,11 @@ import { config as dotenvConfig2 } from "dotenv";
8725
8901
 
8726
8902
  // src/lib/domain/cook-state.ts
8727
8903
  import { homedir as homedir2 } from "os";
8728
- import { join as join6 } from "path";
8904
+ import { join as join7 } from "path";
8729
8905
  import { readFile as readFile6, writeFile as writeFile5, mkdir as mkdir5 } from "fs/promises";
8730
8906
  import { existsSync as existsSync7 } from "fs";
8731
- var CONFIG_DIR2 = join6(homedir2(), ".vm0");
8732
- var COOK_STATE_FILE = join6(CONFIG_DIR2, "cook.json");
8907
+ var CONFIG_DIR2 = join7(homedir2(), ".vm0");
8908
+ var COOK_STATE_FILE = join7(CONFIG_DIR2, "cook.json");
8733
8909
  var STALE_THRESHOLD_MS = 48 * 60 * 60 * 1e3;
8734
8910
  async function loadCookStateFile() {
8735
8911
  if (!existsSync7(COOK_STATE_FILE)) {
@@ -9124,7 +9300,7 @@ var cookAction = new Command27().name("cook").description("Quick start: prepare,
9124
9300
  ).option("-y, --yes", "Skip confirmation prompts").option("-v, --verbose", "Show full tool inputs and outputs").addOption(new Option5("--debug-no-mock-claude").hideHelp()).addOption(new Option5("--no-auto-update").hideHelp()).action(
9125
9301
  async (prompt, options) => {
9126
9302
  if (options.autoUpdate !== false) {
9127
- const shouldExit = await checkAndUpgrade("9.19.0", prompt);
9303
+ const shouldExit = await checkAndUpgrade("9.20.0", prompt);
9128
9304
  if (shouldExit) {
9129
9305
  process.exit(0);
9130
9306
  }
@@ -9705,8 +9881,8 @@ import { Command as Command43 } from "commander";
9705
9881
  import { Command as Command35 } from "commander";
9706
9882
  import chalk36 from "chalk";
9707
9883
  import { mkdtempSync as mkdtempSync5 } from "fs";
9708
- import { mkdir as mkdir7, writeFile as writeFile6, readdir, copyFile, rm as rm3 } from "fs/promises";
9709
- import { join as join7, dirname as dirname3 } from "path";
9884
+ import { mkdir as mkdir7, writeFile as writeFile6, readdir, copyFile, rm as rm4 } from "fs/promises";
9885
+ import { join as join8, dirname as dirname3 } from "path";
9710
9886
  import { tmpdir as tmpdir7 } from "os";
9711
9887
  import * as tar6 from "tar";
9712
9888
  import { stringify as yamlStringify } from "yaml";
@@ -9742,21 +9918,21 @@ async function downloadInstructions(agentName, instructionsPath, destination) {
9742
9918
  throw new Error(`Failed to download instructions: ${response.status}`);
9743
9919
  }
9744
9920
  const buffer = Buffer.from(await response.arrayBuffer());
9745
- const tmpDir = mkdtempSync5(join7(tmpdir7(), "vm0-clone-"));
9746
- const tarPath = join7(tmpDir, "archive.tar.gz");
9921
+ const tmpDir = mkdtempSync5(join8(tmpdir7(), "vm0-clone-"));
9922
+ const tarPath = join8(tmpDir, "archive.tar.gz");
9747
9923
  await writeFile6(tarPath, buffer);
9748
9924
  await tar6.extract({ file: tarPath, cwd: tmpDir, gzip: true });
9749
9925
  const files = await readdir(tmpDir);
9750
9926
  const mdFile = files.find((f) => f === "CLAUDE.md" || f === "AGENTS.md");
9751
9927
  if (!mdFile) {
9752
9928
  console.log(chalk36.yellow("\u26A0 No instructions file found in volume"));
9753
- await rm3(tmpDir, { recursive: true, force: true });
9929
+ await rm4(tmpDir, { recursive: true, force: true });
9754
9930
  return false;
9755
9931
  }
9756
- const destPath = join7(destination, instructionsPath);
9932
+ const destPath = join8(destination, instructionsPath);
9757
9933
  await mkdir7(dirname3(destPath), { recursive: true });
9758
- await copyFile(join7(tmpDir, mdFile), destPath);
9759
- await rm3(tmpDir, { recursive: true, force: true });
9934
+ await copyFile(join8(tmpDir, mdFile), destPath);
9935
+ await rm4(tmpDir, { recursive: true, force: true });
9760
9936
  return true;
9761
9937
  }
9762
9938
  var cloneCommand3 = new Command35().name("clone").description("Clone agent compose to local directory (latest version)").argument("<name>", "Agent compose name to clone").argument("[destination]", "Destination directory (default: agent name)").action(async (name, destination) => {
@@ -9781,7 +9957,7 @@ var cloneCommand3 = new Command35().name("clone").description("Clone agent compo
9781
9957
  const cleanedContent = cleanComposeContent(content);
9782
9958
  const yamlContent = yamlStringify(cleanedContent);
9783
9959
  await mkdir7(targetDir, { recursive: true });
9784
- const yamlPath = join7(targetDir, "vm0.yaml");
9960
+ const yamlPath = join8(targetDir, "vm0.yaml");
9785
9961
  await writeFile6(yamlPath, yamlContent, "utf8");
9786
9962
  console.log(chalk36.green("\u2713 Created vm0.yaml"));
9787
9963
  const agentKey = Object.keys(content.agents)[0];
@@ -10122,7 +10298,7 @@ var statusCommand5 = new Command37().name("status").description("Show status of
10122
10298
  // src/commands/agent/public.ts
10123
10299
  import { Command as Command38 } from "commander";
10124
10300
  import chalk39 from "chalk";
10125
- var publicCommand = new Command38().name("public").description("Make an agent public (accessible to all authenticated users)").argument("<name>", "Agent name").action(async (name) => {
10301
+ var publicCommand = new Command38().name("experimental-public").description("Make an agent public (accessible to all authenticated users)").argument("<name>", "Agent name").action(async (name) => {
10126
10302
  try {
10127
10303
  const compose = await getComposeByName(name);
10128
10304
  if (!compose) {
@@ -10146,7 +10322,11 @@ var publicCommand = new Command38().name("public").description("Make an agent pu
10146
10322
  console.log(chalk39.green(`\u2713 Agent "${name}" is now public`));
10147
10323
  console.log();
10148
10324
  console.log("Others can now run your agent with:");
10149
- console.log(chalk39.cyan(` vm0 run ${fullName} "your prompt"`));
10325
+ console.log(
10326
+ chalk39.cyan(
10327
+ ` vm0 run ${fullName} --experimental-shared-agent "your prompt"`
10328
+ )
10329
+ );
10150
10330
  } catch (error) {
10151
10331
  console.error(chalk39.red("\u2717 Failed to make agent public"));
10152
10332
  if (error instanceof Error) {
@@ -10159,7 +10339,7 @@ var publicCommand = new Command38().name("public").description("Make an agent pu
10159
10339
  // src/commands/agent/private.ts
10160
10340
  import { Command as Command39 } from "commander";
10161
10341
  import chalk40 from "chalk";
10162
- var privateCommand = new Command39().name("private").description("Make an agent private (remove public access)").argument("<name>", "Agent name").action(async (name) => {
10342
+ var privateCommand = new Command39().name("experimental-private").description("Make an agent private (remove public access)").argument("<name>", "Agent name").action(async (name) => {
10163
10343
  try {
10164
10344
  const compose = await getComposeByName(name);
10165
10345
  if (!compose) {
@@ -10190,7 +10370,7 @@ var privateCommand = new Command39().name("private").description("Make an agent
10190
10370
  // src/commands/agent/share.ts
10191
10371
  import { Command as Command40 } from "commander";
10192
10372
  import chalk41 from "chalk";
10193
- var shareCommand = new Command40().name("share").description("Share an agent with a user by email").argument("<name>", "Agent name").requiredOption("--email <email>", "Email address to share with").action(async (name, options) => {
10373
+ var shareCommand = new Command40().name("experimental-share").description("Share an agent with a user by email").argument("<name>", "Agent name").requiredOption("--email <email>", "Email address to share with").action(async (name, options) => {
10194
10374
  try {
10195
10375
  const compose = await getComposeByName(name);
10196
10376
  if (!compose) {
@@ -10220,7 +10400,11 @@ var shareCommand = new Command40().name("share").description("Share an agent wit
10220
10400
  );
10221
10401
  console.log();
10222
10402
  console.log("They can now run your agent with:");
10223
- console.log(chalk41.cyan(` vm0 run ${fullName} "your prompt"`));
10403
+ console.log(
10404
+ chalk41.cyan(
10405
+ ` vm0 run ${fullName} --experimental-shared-agent "your prompt"`
10406
+ )
10407
+ );
10224
10408
  } catch (error) {
10225
10409
  console.error(chalk41.red("\u2717 Failed to share agent"));
10226
10410
  if (error instanceof Error) {
@@ -10233,7 +10417,7 @@ var shareCommand = new Command40().name("share").description("Share an agent wit
10233
10417
  // src/commands/agent/unshare.ts
10234
10418
  import { Command as Command41 } from "commander";
10235
10419
  import chalk42 from "chalk";
10236
- var unshareCommand = new Command41().name("unshare").description("Remove sharing from a user").argument("<name>", "Agent name").requiredOption("--email <email>", "Email address to unshare").action(async (name, options) => {
10420
+ var unshareCommand = new Command41().name("experimental-unshare").description("Remove sharing from a user").argument("<name>", "Agent name").requiredOption("--email <email>", "Email address to unshare").action(async (name, options) => {
10237
10421
  try {
10238
10422
  const compose = await getComposeByName(name);
10239
10423
  if (!compose) {
@@ -10268,7 +10452,7 @@ var unshareCommand = new Command41().name("unshare").description("Remove sharing
10268
10452
  // src/commands/agent/permission.ts
10269
10453
  import { Command as Command42 } from "commander";
10270
10454
  import chalk43 from "chalk";
10271
- var permissionCommand = new Command42().name("permission").description("List all permissions for an agent").argument("<name>", "Agent name").action(async (name) => {
10455
+ var permissionCommand = new Command42().name("experimental-permission").description("List all permissions for an agent").argument("<name>", "Agent name").action(async (name) => {
10272
10456
  try {
10273
10457
  const compose = await getComposeByName(name);
10274
10458
  if (!compose) {
@@ -13231,7 +13415,7 @@ var setupClaudeCommand = new Command67().name("setup-claude").description("Insta
13231
13415
 
13232
13416
  // src/index.ts
13233
13417
  var program = new Command68();
13234
- program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.19.0");
13418
+ program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.20.0");
13235
13419
  program.addCommand(authCommand);
13236
13420
  program.addCommand(infoCommand);
13237
13421
  program.addCommand(composeCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vm0/cli",
3
- "version": "9.19.0",
3
+ "version": "9.20.0",
4
4
  "description": "CLI application",
5
5
  "repository": {
6
6
  "type": "git",