@maestro-js/cli 1.0.0-alpha.2 → 1.0.0-alpha.20

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/bin.js +121 -49
  2. package/package.json +15 -8
package/dist/bin.js CHANGED
@@ -196,9 +196,10 @@ async function createDockerDb() {
196
196
  }
197
197
  var DATABASE_CONFIGS = {
198
198
  mysql: {
199
- image: "mysql:8",
199
+ image: "mysql:8.0",
200
200
  defaultPort: 3306,
201
- envFlags: (dbName, password) => ["-e", `MYSQL_ROOT_PASSWORD=${password}`, "-e", `MYSQL_DATABASE=${dbName}`]
201
+ envFlags: (dbName, password) => ["-e", `MYSQL_ROOT_PASSWORD=${password}`, "-e", `MYSQL_DATABASE=${dbName}`],
202
+ cmdArgs: ["--default-authentication-plugin=mysql_native_password"]
202
203
  },
203
204
  postgres: {
204
205
  image: "postgres:17",
@@ -295,7 +296,8 @@ function run(config, db) {
295
296
  "-p",
296
297
  `${config.port}:${db.defaultPort}`,
297
298
  ...db.envFlags(config.dbName, config.password),
298
- db.image
299
+ db.image,
300
+ ...db.cmdArgs ?? []
299
301
  ];
300
302
  try {
301
303
  execSync(args.join(" "), { stdio: "pipe" });
@@ -318,12 +320,20 @@ Container "${config.containerName}" is running.`);
318
320
 
319
321
  // src/commands/agent.ts
320
322
  import { execSync as execSync2 } from "child_process";
321
- import { AgentContainer } from "@maestro-js/agent-container";
322
323
  import prompts3 from "prompts";
323
324
 
325
+ // src/utils/require-peer.ts
326
+ function requirePeer(pkg) {
327
+ console.error(`This command requires "${pkg}". Install it with:
328
+
329
+ pnpm add ${pkg}
330
+ `);
331
+ process.exit(1);
332
+ }
333
+
324
334
  // src/utils/agent.ts
325
- import { Config } from "@maestro-js/config";
326
335
  async function resolveAgentConfig(opts) {
336
+ const { Config } = await import("@maestro-js/config").catch(() => requirePeer("@maestro-js/config"));
327
337
  const config = await Config.getConfig({
328
338
  rootDir: process.cwd(),
329
339
  configName: "agent-container",
@@ -334,12 +344,16 @@ async function resolveAgentConfig(opts) {
334
344
  memory: opts.memory ?? process.env.AGENT_MEMORY ?? config.AGENT_MEMORY,
335
345
  cpus: opts.cpus ?? (process.env.AGENT_CPUS ?? config.AGENT_CPUS ? Number(process.env.AGENT_CPUS ?? config.AGENT_CPUS) : void 0),
336
346
  workDir: process.env.AGENT_WORK_DIR ?? config.AGENT_WORK_DIR,
337
- dockerfile: config.AGENT_DOCKERFILE
347
+ dockerfile: config.AGENT_DOCKERFILE,
348
+ network: opts.network ?? process.env.AGENT_NETWORK ?? config.AGENT_NETWORK,
349
+ setup: config.AGENT_SETUP
338
350
  };
339
351
  }
340
352
 
341
353
  // src/commands/agent.ts
354
+ var loadModule = () => import("@maestro-js/agent-container").catch(() => requirePeer("@maestro-js/agent-container"));
342
355
  async function agentMake(name, opts) {
356
+ const { AgentContainer } = await loadModule();
343
357
  const repoPath = opts.repo ?? findGitRoot();
344
358
  const env = parseEnv(opts.env);
345
359
  const agentConfig = await resolveAgentConfig(opts);
@@ -347,22 +361,26 @@ async function agentMake(name, opts) {
347
361
  console.log(`Make container: ${container.id}`);
348
362
  }
349
363
  async function agentKill(name) {
364
+ const { AgentContainer } = await loadModule();
350
365
  const target = name ?? await selectContainer("Select a container to kill");
351
366
  if (!target) return;
352
367
  await AgentContainer.kill(target);
353
368
  console.log(`Killed container: ${target}`);
354
369
  }
355
370
  async function agentShell(name) {
371
+ const { AgentContainer } = await loadModule();
356
372
  const target = name ?? await selectContainer("Select a container to shell into");
357
373
  if (!target) return;
358
374
  await AgentContainer.shell(target);
359
375
  }
360
376
  async function agentOpen(name) {
377
+ const { AgentContainer } = await loadModule();
361
378
  const target = name ?? await selectContainer("Select a container to open in VS Code");
362
379
  if (!target) return;
363
380
  await AgentContainer.open(target);
364
381
  }
365
382
  async function agentPull(name, opts) {
383
+ const { AgentContainer } = await loadModule();
366
384
  const target = name ?? await selectContainer("Select a container to pull from");
367
385
  if (!target) return;
368
386
  const repoPath = opts.repo ?? findGitRoot();
@@ -374,6 +392,7 @@ async function agentPull(name, opts) {
374
392
  }
375
393
  }
376
394
  async function selectContainer(message) {
395
+ const { AgentContainer } = await loadModule();
377
396
  const containers = await AgentContainer.list();
378
397
  if (containers.length === 0) {
379
398
  console.log("No running agent containers.");
@@ -411,13 +430,11 @@ function parseEnv(env) {
411
430
 
412
431
  // src/commands/db-migrations.ts
413
432
  import { join } from "path";
414
- import { DbMigrations } from "@maestro-js/db-migrate";
415
433
 
416
434
  // src/utils/db.ts
417
- import { Config as Config2 } from "@maestro-js/config";
418
- import { Db } from "@maestro-js/db";
419
435
  async function resolveDbConfig(opts) {
420
- const config = await Config2.getConfig({
436
+ const { Config } = await import("@maestro-js/config").catch(() => requirePeer("@maestro-js/config"));
437
+ const config = await Config.getConfig({
421
438
  rootDir: process.cwd(),
422
439
  configName: "db-migrate",
423
440
  envName: null,
@@ -439,10 +456,10 @@ async function resolveDbConfig(opts) {
439
456
  password,
440
457
  database
441
458
  };
442
- console.log(resolved);
443
459
  return resolved;
444
460
  }
445
461
  async function createDb(config) {
462
+ const { Db } = await import("@maestro-js/db").catch(() => requirePeer("@maestro-js/db"));
446
463
  return Db.Provider.create({
447
464
  driver: Db.drivers.mysql({
448
465
  host: config.host,
@@ -456,7 +473,9 @@ async function createDb(config) {
456
473
  }
457
474
 
458
475
  // src/commands/db-migrations.ts
476
+ var loadModule2 = () => import("@maestro-js/db-migrate").catch(() => requirePeer("@maestro-js/db-migrate"));
459
477
  async function dbMakeMigration(name) {
478
+ const { DbMigrations } = await loadModule2();
460
479
  const dir = join(process.cwd(), "infrastructure", "db-migrations");
461
480
  const files = await DbMigrations.scaffold({ name, dir });
462
481
  const cwd = process.cwd();
@@ -466,6 +485,7 @@ async function dbMakeMigration(name) {
466
485
  console.log(` ${files.downSql.replace(cwd + "/", "")}`);
467
486
  }
468
487
  async function dbMigrate(opts) {
488
+ const { DbMigrations } = await loadModule2();
469
489
  const config = await resolveDbConfig(opts);
470
490
  const db = await createDb(config);
471
491
  try {
@@ -487,6 +507,7 @@ async function dbMigrate(opts) {
487
507
  }
488
508
  }
489
509
  async function dbRollback(opts) {
510
+ const { DbMigrations } = await loadModule2();
490
511
  const config = await resolveDbConfig(opts);
491
512
  const db = await createDb(config);
492
513
  try {
@@ -508,6 +529,7 @@ async function dbRollback(opts) {
508
529
  }
509
530
  }
510
531
  async function dbStatus(opts) {
532
+ const { DbMigrations } = await loadModule2();
511
533
  const config = await resolveDbConfig(opts);
512
534
  const db = await createDb(config);
513
535
  try {
@@ -530,40 +552,41 @@ async function dbStatus(opts) {
530
552
  }
531
553
 
532
554
  // src/commands/env.ts
533
- import { Config as Config3 } from "@maestro-js/config";
534
- function envGenKey() {
535
- const key = Config3.generateEncryptionKey();
555
+ var loadModule3 = () => import("@maestro-js/config").catch(() => requirePeer("@maestro-js/config"));
556
+ async function envGenKey() {
557
+ const { Config } = await loadModule3();
558
+ const key = Config.generateEncryptionKey();
536
559
  console.log(key);
537
560
  }
538
- function envEncrypt(opts) {
561
+ async function envEncrypt(envName, opts) {
562
+ const { Config } = await loadModule3();
539
563
  const encryptionKey = opts.key || process.env.MAESTRO_ENV_ENCRYPTION_KEY;
540
564
  if (!encryptionKey) {
541
565
  console.error("Encryption key is required. Use --key or set MAESTRO_ENV_ENCRYPTION_KEY.");
542
566
  process.exit(1);
543
567
  }
544
- const envName = opts.env || null;
545
- Config3.generateEncryptedEnvFile({
568
+ Config.generateEncryptedEnvFile({
546
569
  rootDir: process.cwd(),
547
570
  envName,
548
571
  encryptionKey
549
572
  });
550
- const base = envName ? `.env.${envName}` : ".env";
573
+ const base = `.env.${envName}`;
551
574
  console.log(`Encrypted ${base} \u2192 ${base}.encrypted`);
552
575
  }
553
- function envDecrypt(opts) {
576
+ async function envDecrypt(envName, opts) {
577
+ const { Config } = await loadModule3();
554
578
  const encryptionKey = opts.key || process.env.MAESTRO_ENV_ENCRYPTION_KEY;
555
579
  if (!encryptionKey) {
556
580
  console.error("Encryption key is required. Use --key or set MAESTRO_ENV_ENCRYPTION_KEY.");
557
581
  process.exit(1);
558
582
  }
559
- const envName = opts.env || null;
560
- Config3.generateDecryptedEnvFile({
583
+ Config.generateDecryptedEnvFile({
561
584
  rootDir: process.cwd(),
562
585
  envName,
563
586
  encryptionKey,
564
587
  force: opts.force
565
588
  });
566
- const base = envName ? `.env.${envName}` : ".env";
589
+ const base = `.env.${envName}`;
567
590
  console.log(`Decrypted ${base}.encrypted \u2192 ${base}`);
568
591
  }
569
592
 
@@ -583,17 +606,21 @@ function hashMakeKey() {
583
606
 
584
607
  // src/commands/config.ts
585
608
  import { execSync as execSync3 } from "child_process";
586
- import { Config as Config4 } from "@maestro-js/config";
587
609
  async function configRun(opts) {
588
- const configName = opts.config;
589
- if (!configName) {
610
+ const { Config } = await import("@maestro-js/config").catch(() => requirePeer("@maestro-js/config"));
611
+ const configNames = opts.config ? Array.isArray(opts.config) ? opts.config : [opts.config] : [];
612
+ if (configNames.length === 0) {
590
613
  console.error("Missing required --config <name> option");
591
614
  process.exit(1);
592
615
  }
593
616
  const rootDir = opts.root ?? process.cwd();
594
617
  const envName = opts.env ?? null;
595
618
  const encryptionKey = opts.key ?? process.env["MAESTRO_ENV_ENCRYPTION_KEY"] ?? null;
596
- const config = await Config4.getConfig({ rootDir, configName, envName, encryptionKey });
619
+ const merged = {};
620
+ for (const configName of configNames) {
621
+ const config = await Config.getConfig({ rootDir, configName, envName, encryptionKey });
622
+ Object.assign(merged, config);
623
+ }
597
624
  const command = opts._.join(" ");
598
625
  if (!command) {
599
626
  console.error("No command provided. Usage: maestro config:run --config <name> [options] -- <command>");
@@ -601,19 +628,21 @@ async function configRun(opts) {
601
628
  }
602
629
  execSync3(command, {
603
630
  stdio: "inherit",
604
- env: { ...process.env, ...config }
631
+ env: { ...process.env, ...merged }
605
632
  });
606
633
  }
607
634
 
608
635
  // src/commands/components.ts
609
- import { Components } from "@maestro-js/components";
636
+ var loadModule4 = () => import("@maestro-js/components").catch(() => requirePeer("@maestro-js/components"));
610
637
  async function componentsList() {
638
+ const { Components } = await loadModule4();
611
639
  const names = await Components.list();
612
640
  for (const name of names) {
613
641
  console.log(name);
614
642
  }
615
643
  }
616
644
  async function componentsAdd(name, opts) {
645
+ const { Components } = await loadModule4();
617
646
  const components = opts.all ? await Components.list() : [name, ...opts._ || []];
618
647
  const directory = opts.directory || process.cwd();
619
648
  const written = await Components.add({ components, directory, overwrite: opts.overwrite });
@@ -622,15 +651,37 @@ async function componentsAdd(name, opts) {
622
651
  }
623
652
  }
624
653
 
625
- // src/commands/upgrade.ts
654
+ // src/commands/skills.ts
626
655
  import { execSync as execSync4 } from "child_process";
627
656
  import fs from "fs";
628
657
  import path from "path";
629
658
  import { fileURLToPath } from "url";
659
+ function skillsInstall(opts) {
660
+ const args = ["npx", "--yes", `@maestro-js/agent-skills@${getCurrentVersion()}`];
661
+ if (opts.interactive) args.push("--interactive");
662
+ if (opts.copy) args.push("--copy");
663
+ try {
664
+ execSync4(args.join(" "), { stdio: "inherit" });
665
+ } catch {
666
+ process.exit(1);
667
+ }
668
+ }
669
+ function getCurrentVersion() {
670
+ const dir = path.dirname(fileURLToPath(import.meta.url));
671
+ const raw = fs.readFileSync(path.join(dir, "../package.json"), "utf-8");
672
+ const pkg = JSON.parse(raw);
673
+ return pkg.version;
674
+ }
675
+
676
+ // src/commands/upgrade.ts
677
+ import { execSync as execSync5 } from "child_process";
678
+ import fs2 from "fs";
679
+ import path2 from "path";
680
+ import { fileURLToPath as fileURLToPath2 } from "url";
630
681
  import prompts4 from "prompts";
631
682
  var onCancel2 = () => process.exit(0);
632
683
  async function upgrade() {
633
- const current = getCurrentVersion();
684
+ const current = getCurrentVersion2();
634
685
  console.log(`Current @maestro-js version: ${current}`);
635
686
  const versions = fetchAvailableVersions();
636
687
  const newer = filterNewerVersions(versions, current);
@@ -649,15 +700,15 @@ async function upgrade() {
649
700
  Updated ${updated} package.json file${updated === 1 ? "" : "s"}.`);
650
701
  await runInstall();
651
702
  }
652
- function getCurrentVersion() {
653
- const dir = path.dirname(fileURLToPath(import.meta.url));
654
- const raw = fs.readFileSync(path.join(dir, "../package.json"), "utf-8");
703
+ function getCurrentVersion2() {
704
+ const dir = path2.dirname(fileURLToPath2(import.meta.url));
705
+ const raw = fs2.readFileSync(path2.join(dir, "../package.json"), "utf-8");
655
706
  const pkg = JSON.parse(raw);
656
707
  return pkg.version;
657
708
  }
658
709
  function fetchAvailableVersions() {
659
710
  try {
660
- const raw = execSync4("npm view @maestro-js/cli versions --json", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
711
+ const raw = execSync5("npm view @maestro-js/cli versions --json", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
661
712
  const parsed = JSON.parse(raw);
662
713
  if (typeof parsed === "string") return [parsed];
663
714
  if (Array.isArray(parsed)) return parsed;
@@ -716,19 +767,19 @@ function findAndUpdatePackageJsonFiles(targetVersion) {
716
767
  function findPackageJsonFiles(dir) {
717
768
  const results = [];
718
769
  const skipDirs = /* @__PURE__ */ new Set(["node_modules", ".git", "dist", ".next", ".nuxt"]);
719
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
770
+ for (const entry of fs2.readdirSync(dir, { withFileTypes: true })) {
720
771
  if (entry.isDirectory()) {
721
772
  if (!skipDirs.has(entry.name)) {
722
- results.push(...findPackageJsonFiles(path.join(dir, entry.name)));
773
+ results.push(...findPackageJsonFiles(path2.join(dir, entry.name)));
723
774
  }
724
775
  } else if (entry.name === "package.json") {
725
- results.push(path.join(dir, entry.name));
776
+ results.push(path2.join(dir, entry.name));
726
777
  }
727
778
  }
728
779
  return results;
729
780
  }
730
781
  function updateMaestroDependencies(filePath, targetVersion) {
731
- const raw = fs.readFileSync(filePath, "utf-8");
782
+ const raw = fs2.readFileSync(filePath, "utf-8");
732
783
  const pkg = JSON.parse(raw);
733
784
  let changed = false;
734
785
  for (const depKey of ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"]) {
@@ -751,8 +802,8 @@ function updateMaestroDependencies(filePath, targetVersion) {
751
802
  const trailingNewline = raw.endsWith("\n");
752
803
  let output = JSON.stringify(pkg, null, indent);
753
804
  if (trailingNewline) output += "\n";
754
- fs.writeFileSync(filePath, output, "utf-8");
755
- console.log(` Updated ${path.relative(process.cwd(), filePath)}`);
805
+ fs2.writeFileSync(filePath, output, "utf-8");
806
+ console.log(` Updated ${path2.relative(process.cwd(), filePath)}`);
756
807
  }
757
808
  return changed;
758
809
  }
@@ -761,7 +812,7 @@ async function runInstall() {
761
812
  console.log(`
762
813
  Running ${pm} install...`);
763
814
  try {
764
- execSync4(`${pm} install`, { stdio: "inherit", cwd: process.cwd() });
815
+ execSync5(`${pm} install`, { stdio: "inherit", cwd: process.cwd() });
765
816
  console.log("Done.");
766
817
  } catch {
767
818
  console.warn(`
@@ -771,7 +822,7 @@ ${pm} install failed. package.json files have been updated \u2014 run install ma
771
822
  function detectPackageManager() {
772
823
  const root = process.cwd();
773
824
  try {
774
- const raw = fs.readFileSync(path.join(root, "package.json"), "utf-8");
825
+ const raw = fs2.readFileSync(path2.join(root, "package.json"), "utf-8");
775
826
  const pkg = JSON.parse(raw);
776
827
  if (pkg.packageManager) {
777
828
  const name = pkg.packageManager.split("@")[0];
@@ -779,8 +830,8 @@ function detectPackageManager() {
779
830
  }
780
831
  } catch {
781
832
  }
782
- if (fs.existsSync(path.join(root, "pnpm-lock.yaml"))) return "pnpm";
783
- if (fs.existsSync(path.join(root, "yarn.lock"))) return "yarn";
833
+ if (fs2.existsSync(path2.join(root, "pnpm-lock.yaml"))) return "pnpm";
834
+ if (fs2.existsSync(path2.join(root, "yarn.lock"))) return "yarn";
784
835
  return "npm";
785
836
  }
786
837
  function detectIndent(json) {
@@ -821,6 +872,25 @@ function compareSemver(a, b) {
821
872
  return 0;
822
873
  }
823
874
 
875
+ // src/commands/init.ts
876
+ import { execSync as execSync6 } from "child_process";
877
+ import fs3 from "fs";
878
+ import path3 from "path";
879
+ import { fileURLToPath as fileURLToPath3 } from "url";
880
+ function init(name) {
881
+ try {
882
+ execSync6(`npx --yes @maestro-js/init@${getCurrentVersion3()} ${name}`, { stdio: "inherit" });
883
+ } catch {
884
+ process.exit(1);
885
+ }
886
+ }
887
+ function getCurrentVersion3() {
888
+ const dir = path3.dirname(fileURLToPath3(import.meta.url));
889
+ const raw = fs3.readFileSync(path3.join(dir, "../package.json"), "utf-8");
890
+ const pkg = JSON.parse(raw);
891
+ return pkg.version;
892
+ }
893
+
824
894
  // src/bin.ts
825
895
  var require2 = createRequire(import.meta.url);
826
896
  var { version } = require2("../package.json");
@@ -831,16 +901,18 @@ prog.command("db:make-container").describe("Create a Docker database container")
831
901
  prog.command("db:migrate").describe("Run pending database migrations").option("--host", "Database host (env: DB_HOST)").option("--port", "Database port (env: DB_PORT)").option("--user", "Database user (env: DB_USER)").option("--password", "Database password (env: DB_PASSWORD)").option("--database", "Database name (env: DB_DATABASE)").option("--dry-run", "Preview migrations without executing").option("--count", "Number of migrations to run").action(dbMigrate);
832
902
  prog.command("db:rollback").describe("Rollback database migrations").option("--host", "Database host (env: DB_HOST)").option("--port", "Database port (env: DB_PORT)").option("--user", "Database user (env: DB_USER)").option("--password", "Database password (env: DB_PASSWORD)").option("--database", "Database name (env: DB_DATABASE)").option("--dry-run", "Preview rollback without executing").option("--count", "Number of migrations to rollback", 1).action(dbRollback);
833
903
  prog.command("db:status").describe("Show database migration status").option("--host", "Database host (env: DB_HOST)").option("--port", "Database port (env: DB_PORT)").option("--user", "Database user (env: DB_USER)").option("--password", "Database password (env: DB_PASSWORD)").option("--database", "Database name (env: DB_DATABASE)").action(dbStatus);
834
- prog.command("env:generate-key").describe("Generate an encryption key").action(envGenKey);
904
+ prog.command("env:gen-key").describe("Generate an encryption key").action(envGenKey);
835
905
  prog.command("crypt:make-key").describe("Generate an encryption key for use with @maestro-js/crypt").action(cryptMakeKey);
836
906
  prog.command("hash:make-key").describe("Generate a signing key for use with @maestro-js/hash").action(hashMakeKey);
837
- prog.command("env:encrypt").describe("Encrypt a .env file").option("--env", "Environment name (e.g. production)").option("--key", "Encryption key (env: MAESTRO_ENV_ENCRYPTION_KEY)").action(envEncrypt);
838
- prog.command("env:decrypt").describe("Decrypt a .env.encrypted file").option("--env", "Environment name (e.g. production)").option("--key", "Encryption key (env: MAESTRO_ENV_ENCRYPTION_KEY)").option("--force", "Overwrite existing .env file").action(envDecrypt);
907
+ prog.command("env:encrypt <env>").describe("Encrypt a .env file").option("--key <value>", "Encryption key (env: MAESTRO_ENV_ENCRYPTION_KEY)").action(envEncrypt);
908
+ prog.command("env:decrypt <env>").describe("Decrypt a .env.encrypted file").option("--key <value>", "Encryption key (env: MAESTRO_ENV_ENCRYPTION_KEY)").option("--force", "Overwrite existing .env file").action(envDecrypt);
839
909
  prog.command("components:list").describe("List available components").action(componentsList);
840
910
  prog.command("components:add [name]").describe("Add components to the current project").option("--directory", "Target directory (default: cwd)").option("--overwrite", "Overwrite existing files").option("--all", "Add all available components").action(componentsAdd);
841
- prog.command("config:run").describe("Resolve config and run a command with the config values as environment variables").option("--config", "Config name (required)").option("--root", "Project root directory (default: cwd)").option("--env", "Environment name (e.g. production)").option("--key", "Encryption key (env: MAESTRO_ENV_ENCRYPTION_KEY)").action(configRun);
911
+ prog.command("config:run").describe("Resolve config and run a command with the config values as environment variables").option("--config <name>", "Config name (required, repeatable; later configs override earlier)").option("--root <path>", "Project root directory (default: cwd)").option("--env <name>", "Environment name (e.g. production)").option("--key <value>", "Encryption key (env: MAESTRO_ENV_ENCRYPTION_KEY)").action(configRun);
912
+ prog.command("skills:install").describe("Install agent skills from @maestro-js/agent-skills").option("--interactive", "Run in interactive mode (select skills manually)").option("--copy", "Copy skill files instead of symlinking").action(skillsInstall);
842
913
  prog.command("upgrade").describe("Upgrade @maestro-js/* packages to a newer version").action(upgrade);
843
- prog.command("agent:make [name]").describe("Launch an interactive shell in an isolated Docker agent container").option("--repo", "Path to the repository (default: cwd)").option("--env", "Environment variable as KEY=VALUE (repeatable)").option("--memory", "Memory limit (env: AGENT_MEMORY)").option("--cpus", "Number of CPUs (env: AGENT_CPUS)").action(agentMake);
914
+ prog.command("init <name>").describe("Scaffold a new Maestro project").action(init);
915
+ prog.command("agent:make [name]").describe("Launch an interactive shell in an isolated Docker agent container").option("--repo", "Path to the repository (default: cwd)").option("--env", "Environment variable as KEY=VALUE (repeatable)").option("--memory", "Memory limit (env: AGENT_MEMORY)").option("--cpus", "Number of CPUs (env: AGENT_CPUS)").option("--network", "Docker network to attach to (env: AGENT_NETWORK)").action(agentMake);
844
916
  prog.command("agent:kill [name]").describe("Kill an agent container (prompts if no name given)").action(agentKill);
845
917
  prog.command("agent:shell [name]").describe("Shell into an agent container (prompts if no name given)").action(agentShell);
846
918
  prog.command("agent:pull [name]").describe("Pull container changes onto the host working tree (prompts if no name given)").option("--repo", "Path to the repository (default: cwd git root)").action(agentPull);
package/package.json CHANGED
@@ -10,18 +10,25 @@
10
10
  "@aws-sdk/client-ssm": "^3.750.0",
11
11
  "@aws-sdk/client-sts": "^3.993.0",
12
12
  "prompts": "^2.4.2",
13
- "sade": "^1.8.1",
14
- "@maestro-js/components": "1.0.0-alpha.2",
15
- "@maestro-js/agent-container": "1.0.0-alpha.2",
16
- "@maestro-js/config": "1.0.0-alpha.2",
17
- "@maestro-js/db": "1.0.0-alpha.2",
18
- "@maestro-js/db-migrate": "1.0.0-alpha.2"
13
+ "sade": "^1.8.1"
14
+ },
15
+ "peerDependencies": {
16
+ "@maestro-js/components": "1.0.0-alpha.20",
17
+ "@maestro-js/config": "1.0.0-alpha.20",
18
+ "@maestro-js/agent-container": "1.0.0-alpha.20",
19
+ "@maestro-js/db": "1.0.0-alpha.20",
20
+ "@maestro-js/db-migrate": "1.0.0-alpha.20"
19
21
  },
20
22
  "devDependencies": {
21
23
  "@types/node": "^22.19.11",
22
- "@types/prompts": "^2.4.9"
24
+ "@types/prompts": "^2.4.9",
25
+ "@maestro-js/agent-container": "1.0.0-alpha.20",
26
+ "@maestro-js/components": "1.0.0-alpha.20",
27
+ "@maestro-js/config": "1.0.0-alpha.20",
28
+ "@maestro-js/db": "1.0.0-alpha.20",
29
+ "@maestro-js/db-migrate": "1.0.0-alpha.20"
23
30
  },
24
- "version": "1.0.0-alpha.2",
31
+ "version": "1.0.0-alpha.20",
25
32
  "publishConfig": {
26
33
  "access": "restricted"
27
34
  },