@aspects-ai/workspace-cli 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +90 -3
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/index.ts
4
- import { Command as Command5 } from "commander";
4
+ import { Command as Command6 } from "commander";
5
5
 
6
6
  // src/commands/init.ts
7
7
  import { Command } from "commander";
@@ -272,7 +272,10 @@ async function fetchDirectory(options) {
272
272
  if (!await fs3.pathExists(sourceDir)) {
273
273
  throw new Error(`Directory '${options.directory}' not found in repository`);
274
274
  }
275
- await fs3.ensureDir(options.targetPath);
275
+ if (await fs3.pathExists(options.targetPath)) {
276
+ await fs3.remove(options.targetPath);
277
+ }
278
+ await fs3.ensureDir(path3.dirname(options.targetPath));
276
279
  await fs3.copy(sourceDir, options.targetPath, {
277
280
  overwrite: true,
278
281
  errorOnExist: false
@@ -428,11 +431,95 @@ Use 'workspace-cli add ${libraryName}' to install it first.`
428
431
  });
429
432
  }
430
433
 
434
+ // src/commands/create-frame.ts
435
+ import chalk5 from "chalk";
436
+ import { Command as Command5 } from "commander";
437
+ import fs5 from "fs-extra";
438
+ import path5 from "path";
439
+ function parseManifestOption(manifestStr) {
440
+ try {
441
+ return JSON.parse(manifestStr);
442
+ } catch (error) {
443
+ throw new Error(`Invalid manifest JSON: ${error instanceof Error ? error.message : "Unknown error"}`);
444
+ }
445
+ }
446
+ function validateAndFixManifest(manifest, toolName, frameName) {
447
+ const now = (/* @__PURE__ */ new Date()).toISOString();
448
+ const validatedManifest = {
449
+ id: manifest.id || frameName,
450
+ projectId: manifest.projectId || "default-project",
451
+ title: manifest.title || frameName.split("-").map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" "),
452
+ description: manifest.description || `Frame for ${toolName}`,
453
+ createdAt: now,
454
+ // Always update createdAt
455
+ type: manifest.type || "animationComposition"
456
+ };
457
+ if (toolName === "animate-core") {
458
+ validatedManifest.type = "animationComposition";
459
+ }
460
+ return validatedManifest;
461
+ }
462
+ async function getNextFrameName(framesDir, baseName) {
463
+ if (!await fs5.pathExists(path5.join(framesDir, baseName))) {
464
+ return baseName;
465
+ }
466
+ let counter = 1;
467
+ let nextName = `${baseName}-${counter}`;
468
+ while (await fs5.pathExists(path5.join(framesDir, nextName))) {
469
+ counter++;
470
+ nextName = `${baseName}-${counter}`;
471
+ }
472
+ return nextName;
473
+ }
474
+ async function fetchExampleFrame(toolName, targetPath) {
475
+ const library = await getLibrary(toolName);
476
+ const token = getToken();
477
+ logger.info(`Fetching example frame from ${chalk5.cyan(library.repository.url)}`);
478
+ const exampleFrameDirectory = library.repository.directory.replace("/src", "/example-frame");
479
+ await fetchDirectory({
480
+ repository: library.repository.url,
481
+ directory: exampleFrameDirectory,
482
+ branch: library.repository.branch,
483
+ token,
484
+ targetPath
485
+ });
486
+ }
487
+ function createCreateFrameCommand() {
488
+ return new Command5("create-frame").description("Create a new frame for a given tool").argument("<tool>", "Name of the tool (e.g., animate-core)").argument("<manifest>", "Manifest data as JSON string").option("-n, --name <name>", "Name for the new frame", "new-frame").action(async (toolName, manifestStr, options) => {
489
+ try {
490
+ const workspaceRoot = await ensureWorkspaceRoot();
491
+ const framesDir = path5.join(workspaceRoot, "frames");
492
+ await fs5.ensureDir(framesDir);
493
+ const baseName = options.name || "new-frame";
494
+ const frameName = await getNextFrameName(framesDir, baseName);
495
+ const frameDir = path5.join(framesDir, frameName);
496
+ logger.info(`Creating frame: ${chalk5.cyan(frameName)} for ${chalk5.cyan(toolName)}`);
497
+ await fetchExampleFrame(toolName, frameDir);
498
+ const manifestData = parseManifestOption(manifestStr);
499
+ const validatedManifest = validateAndFixManifest(manifestData, toolName, frameName);
500
+ const manifestPath = path5.join(frameDir, "manifest.json");
501
+ await fs5.writeJson(manifestPath, validatedManifest, { spaces: 4 });
502
+ logger.success(`Frame created at: ${chalk5.green(path5.relative(workspaceRoot, frameDir))}`);
503
+ logger.log("");
504
+ logger.log(chalk5.bold("Manifest:"));
505
+ logger.log(JSON.stringify(validatedManifest, null, 2));
506
+ logger.log("");
507
+ logger.log(chalk5.bold("Next steps:"));
508
+ logger.log(` ${chalk5.gray("Edit frame:")} ${path5.relative(workspaceRoot, path5.join(frameDir, "main.tsx"))}`);
509
+ logger.log("");
510
+ } catch (error) {
511
+ logger.error(error.message);
512
+ process.exit(1);
513
+ }
514
+ });
515
+ }
516
+
431
517
  // src/index.ts
432
- var program = new Command5();
518
+ var program = new Command6();
433
519
  program.name("workspace-cli").description("Lightweight CLI for installing libraries into workspaces").version("0.1.0");
434
520
  program.addCommand(createInitCommand());
435
521
  program.addCommand(createListCommand());
436
522
  program.addCommand(createAddCommand());
437
523
  program.addCommand(createUpdateCommand());
524
+ program.addCommand(createCreateFrameCommand());
438
525
  program.parse(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aspects-ai/workspace-cli",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "private": false,
5
5
  "description": "Lightweight CLI for installing libraries into workspaces",
6
6
  "type": "module",
@@ -18,19 +18,19 @@
18
18
  "src/registry"
19
19
  ],
20
20
  "dependencies": {
21
- "commander": "^12.0.0",
22
21
  "chalk": "^5.3.0",
22
+ "commander": "^12.0.0",
23
23
  "execa": "^8.0.0",
24
24
  "fs-extra": "^11.2.0",
25
25
  "zod": "^3.22.0"
26
26
  },
27
27
  "devDependencies": {
28
- "@types/node": "^20",
29
28
  "@types/fs-extra": "^11.0.0",
29
+ "@types/node": "^20",
30
30
  "tsup": "^8.0.0",
31
31
  "typescript": "^5"
32
32
  },
33
33
  "engines": {
34
34
  "node": ">=18.0.0"
35
35
  }
36
- }
36
+ }