@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.
- package/index.js +249 -65
- 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").
|
|
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
|
-
|
|
5357
|
-
|
|
5358
|
-
|
|
5359
|
-
|
|
5360
|
-
|
|
5361
|
-
|
|
5362
|
-
|
|
5363
|
-
|
|
5364
|
-
|
|
5365
|
-
|
|
5366
|
-
|
|
5367
|
-
|
|
5368
|
-
|
|
5369
|
-
|
|
5370
|
-
|
|
5371
|
-
|
|
5372
|
-
|
|
5373
|
-
|
|
5374
|
-
|
|
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
|
-
|
|
5379
|
-
|
|
5380
|
-
|
|
5381
|
-
|
|
5382
|
-
|
|
5383
|
-
|
|
5384
|
-
|
|
5385
|
-
|
|
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").
|
|
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.
|
|
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
|
|
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 =
|
|
8732
|
-
var COOK_STATE_FILE =
|
|
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.
|
|
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
|
|
9709
|
-
import { join as
|
|
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(
|
|
9746
|
-
const tarPath =
|
|
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
|
|
9929
|
+
await rm4(tmpDir, { recursive: true, force: true });
|
|
9754
9930
|
return false;
|
|
9755
9931
|
}
|
|
9756
|
-
const destPath =
|
|
9932
|
+
const destPath = join8(destination, instructionsPath);
|
|
9757
9933
|
await mkdir7(dirname3(destPath), { recursive: true });
|
|
9758
|
-
await copyFile(
|
|
9759
|
-
await
|
|
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 =
|
|
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(
|
|
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(
|
|
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.
|
|
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);
|