@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.
- package/dist/bin.js +121 -49
- 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
|
|
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
|
-
|
|
534
|
-
function envGenKey() {
|
|
535
|
-
const
|
|
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
|
-
|
|
545
|
-
Config3.generateEncryptedEnvFile({
|
|
568
|
+
Config.generateEncryptedEnvFile({
|
|
546
569
|
rootDir: process.cwd(),
|
|
547
570
|
envName,
|
|
548
571
|
encryptionKey
|
|
549
572
|
});
|
|
550
|
-
const base =
|
|
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
|
-
|
|
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 =
|
|
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
|
|
589
|
-
|
|
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
|
|
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, ...
|
|
631
|
+
env: { ...process.env, ...merged }
|
|
605
632
|
});
|
|
606
633
|
}
|
|
607
634
|
|
|
608
635
|
// src/commands/components.ts
|
|
609
|
-
|
|
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/
|
|
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 =
|
|
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
|
|
653
|
-
const dir =
|
|
654
|
-
const raw =
|
|
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 =
|
|
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
|
|
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(
|
|
773
|
+
results.push(...findPackageJsonFiles(path2.join(dir, entry.name)));
|
|
723
774
|
}
|
|
724
775
|
} else if (entry.name === "package.json") {
|
|
725
|
-
results.push(
|
|
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 =
|
|
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
|
-
|
|
755
|
-
console.log(` Updated ${
|
|
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
|
-
|
|
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 =
|
|
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 (
|
|
783
|
-
if (
|
|
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:
|
|
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("--
|
|
838
|
-
prog.command("env:decrypt").describe("Decrypt a .env.encrypted file").option("--
|
|
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("
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
"@maestro-js/
|
|
17
|
-
"@maestro-js/
|
|
18
|
-
"@maestro-js/
|
|
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.
|
|
31
|
+
"version": "1.0.0-alpha.20",
|
|
25
32
|
"publishConfig": {
|
|
26
33
|
"access": "restricted"
|
|
27
34
|
},
|