@docyrus/animaguru 0.39.0 → 0.39.2

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/animaguru.js CHANGED
@@ -8083,17 +8083,17 @@ If you're a developer and you believe this is a bug in isomorphic-git, please fi
8083
8083
  const length = Math.ceil((62 + bpath.length + 1) / 8) * 8;
8084
8084
  const written = Buffer.alloc(length);
8085
8085
  const writer = new BufferCursor(written);
8086
- const stat13 = normalizeStats(entry);
8087
- writer.writeUInt32BE(stat13.ctimeSeconds);
8088
- writer.writeUInt32BE(stat13.ctimeNanoseconds);
8089
- writer.writeUInt32BE(stat13.mtimeSeconds);
8090
- writer.writeUInt32BE(stat13.mtimeNanoseconds);
8091
- writer.writeUInt32BE(stat13.dev);
8092
- writer.writeUInt32BE(stat13.ino);
8093
- writer.writeUInt32BE(stat13.mode);
8094
- writer.writeUInt32BE(stat13.uid);
8095
- writer.writeUInt32BE(stat13.gid);
8096
- writer.writeUInt32BE(stat13.size);
8086
+ const stat14 = normalizeStats(entry);
8087
+ writer.writeUInt32BE(stat14.ctimeSeconds);
8088
+ writer.writeUInt32BE(stat14.ctimeNanoseconds);
8089
+ writer.writeUInt32BE(stat14.mtimeSeconds);
8090
+ writer.writeUInt32BE(stat14.mtimeNanoseconds);
8091
+ writer.writeUInt32BE(stat14.dev);
8092
+ writer.writeUInt32BE(stat14.ino);
8093
+ writer.writeUInt32BE(stat14.mode);
8094
+ writer.writeUInt32BE(stat14.uid);
8095
+ writer.writeUInt32BE(stat14.gid);
8096
+ writer.writeUInt32BE(stat14.size);
8097
8097
  writer.write(entry.oid, 20, "hex");
8098
8098
  writer.writeUInt16BE(renderCacheEntryFlags(entry));
8099
8099
  writer.write(entry.path, bpath.length, "utf8");
@@ -8145,13 +8145,13 @@ If you're a developer and you believe this is a bug in isomorphic-git, please fi
8145
8145
  };
8146
8146
  }
8147
8147
  async function updateCachedIndexFile(fs2, filepath, cache) {
8148
- const [stat13, rawIndexFile] = await Promise.all([
8148
+ const [stat14, rawIndexFile] = await Promise.all([
8149
8149
  fs2.lstat(filepath),
8150
8150
  fs2.read(filepath)
8151
8151
  ]);
8152
8152
  const index3 = await GitIndex.from(rawIndexFile);
8153
8153
  cache.map.set(filepath, index3);
8154
- cache.stats.set(filepath, stat13);
8154
+ cache.stats.set(filepath, stat14);
8155
8155
  }
8156
8156
  async function isIndexStale(fs2, filepath, cache) {
8157
8157
  const savedStats = cache.stats.get(filepath);
@@ -11179,23 +11179,23 @@ ${obj.gpgsig ? obj.gpgsig : ""}`;
11179
11179
  async stat(entry) {
11180
11180
  if (entry._stat === false) {
11181
11181
  const { fs: fs2, dir } = this;
11182
- let stat13 = await fs2.lstat(`${dir}/${entry._fullpath}`);
11183
- if (!stat13) {
11182
+ let stat14 = await fs2.lstat(`${dir}/${entry._fullpath}`);
11183
+ if (!stat14) {
11184
11184
  throw new Error(
11185
11185
  `ENOENT: no such file or directory, lstat '${entry._fullpath}'`
11186
11186
  );
11187
11187
  }
11188
- let type = stat13.isDirectory() ? "tree" : "blob";
11189
- if (type === "blob" && !stat13.isFile() && !stat13.isSymbolicLink()) {
11188
+ let type = stat14.isDirectory() ? "tree" : "blob";
11189
+ if (type === "blob" && !stat14.isFile() && !stat14.isSymbolicLink()) {
11190
11190
  type = "special";
11191
11191
  }
11192
11192
  entry._type = type;
11193
- stat13 = normalizeStats(stat13);
11194
- entry._mode = stat13.mode;
11195
- if (stat13.size === -1 && entry._actualSize) {
11196
- stat13.size = entry._actualSize;
11193
+ stat14 = normalizeStats(stat14);
11194
+ entry._mode = stat14.mode;
11195
+ if (stat14.size === -1 && entry._actualSize) {
11196
+ stat14.size = entry._actualSize;
11197
11197
  }
11198
- entry._stat = stat13;
11198
+ entry._stat = stat14;
11199
11199
  }
11200
11200
  return entry._stat;
11201
11201
  }
@@ -11416,9 +11416,9 @@ ${obj.gpgsig ? obj.gpgsig : ""}`;
11416
11416
  await Promise.all(
11417
11417
  entries.map((entry) => {
11418
11418
  const subpath = join21(filepath, entry);
11419
- return fs2.lstat(subpath).then((stat13) => {
11420
- if (!stat13) return;
11421
- return stat13.isDirectory() ? rmRecursive(fs2, subpath) : fs2.rm(subpath);
11419
+ return fs2.lstat(subpath).then((stat14) => {
11420
+ if (!stat14) return;
11421
+ return stat14.isDirectory() ? rmRecursive(fs2, subpath) : fs2.rm(subpath);
11422
11422
  });
11423
11423
  })
11424
11424
  ).then(() => fs2.rmdir(filepath));
@@ -19761,7 +19761,7 @@ var require_ignore2 = __commonJS({
19761
19761
  // cli/package.json
19762
19762
  var package_default = {
19763
19763
  name: "@docyrus/animaguru",
19764
- version: "0.39.0",
19764
+ version: "0.39.2",
19765
19765
  description: "Agent-friendly AnimaGuru CLI built with CrustJS",
19766
19766
  type: "module",
19767
19767
  bin: {
@@ -50996,7 +50996,7 @@ var socialProfileRequest = external_exports.object({
50996
50996
 
50997
50997
  // cli/src/curl.ts
50998
50998
  import { createWriteStream as createWriteStream2, openAsBlob as openAsBlob2 } from "node:fs";
50999
- import { readFile as readFile20, unlink as unlink3 } from "node:fs/promises";
50999
+ import { readFile as readFile20, stat as stat13, unlink as unlink3 } from "node:fs/promises";
51000
51000
  import { extname as extname4, resolve as resolve17 } from "node:path";
51001
51001
  import { Readable as Readable2 } from "node:stream";
51002
51002
  import { pipeline as pipeline2 } from "node:stream/promises";
@@ -51037,7 +51037,16 @@ var readStdin = async () => {
51037
51037
  };
51038
51038
  async function bodyValue(value, io) {
51039
51039
  if (value === "@-") return (io.stdin ?? readStdin)();
51040
- return value.startsWith("@") ? readFile20(resolve17(value.slice(1))) : value;
51040
+ return value.startsWith("@") ? readFile20(await localFile(value.slice(1))) : value;
51041
+ }
51042
+ async function localFile(path) {
51043
+ const file2 = resolve17(path);
51044
+ const info = await stat13(file2).catch((error62) => {
51045
+ if (error62.code === "ENOENT" || error62.code === "ENOTDIR") throw new Error(`File not found: ${file2}`);
51046
+ throw new Error(`Can't open ${file2}: ${error62.message}`);
51047
+ });
51048
+ if (!info.isFile()) throw new Error(`Not a file: ${file2}`);
51049
+ return file2;
51041
51050
  }
51042
51051
  var parsesAsJson = (body) => {
51043
51052
  try {
@@ -51053,7 +51062,7 @@ async function curl(options, io) {
51053
51062
  if ([options.data, options.json, options.uploadFile].filter((value) => value !== void 0).length > 1) throw new Error("Use one of --data, --json and --upload-file.");
51054
51063
  let body;
51055
51064
  if (options.uploadFile !== void 0) {
51056
- const file2 = resolve17(options.uploadFile);
51065
+ const file2 = await localFile(options.uploadFile);
51057
51066
  body = await openAsBlob2(file2);
51058
51067
  if (!headers.has("content-type")) headers.set("Content-Type", UPLOAD_TYPES[extname4(file2).toLowerCase()] ?? "application/octet-stream");
51059
51068
  } else if (options.json !== void 0) {
@@ -51420,7 +51429,7 @@ Confirm code: ${device.user_code}`);
51420
51429
  { name: "output", type: "string", required: true, description: "Workspace root to receive the branding/ folder" },
51421
51430
  { name: "file", type: "string", description: "Download only this brand file ID" },
51422
51431
  { name: "force", type: "boolean", description: "Replace existing files" }
51423
- ).action(async ({ args, flags, stdout, signal }) => out(stdout, await downloadBrand(new Client(flags.url, signal), args.id, flags.output, flags)))))).command("library", (library) => library.add(defineCommand("search", { description: "Search the asset library (Pro and Team plans): ready-made sprites, images, videos, music, speech and sound effects, by natural language and keywords" }, (command) => command.args({ name: "query", type: "string", variadic: true, description: "What you need, e.g. whoosh transition, upbeat piano background, pixel knight" }).flags(
51432
+ ).action(async ({ args, flags, stdout, signal }) => out(stdout, await downloadBrand(new Client(flags.url, signal), args.id, flags.output, flags)))))).command("library", (library) => library.add(defineCommand("search", { description: "Search the asset library (every plan, including the Starter trial): ready-made sprites, images, videos, music, speech and sound effects, by natural language and keywords" }, (command) => command.args({ name: "query", type: "string", variadic: true, description: "What you need, e.g. whoosh transition, upbeat piano background, pixel knight" }).flags(
51424
51433
  urlFlag,
51425
51434
  { name: "type", type: "string", choices: LIBRARY_ASSET_TYPES, description: "Only this type" },
51426
51435
  { name: "labels", type: "string", description: "Comma-separated labels every result must have, e.g. loop,transparent" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@docyrus/animaguru",
3
- "version": "0.39.0",
3
+ "version": "0.39.2",
4
4
  "description": "Agent-friendly AnimaGuru CLI built with CrustJS",
5
5
  "type": "module",
6
6
  "bin": {
@@ -92,7 +92,7 @@ Before choreographing a scene from scratch, search the AnimaGuru motion library
92
92
 
93
93
  ## Asset library
94
94
 
95
- Pro and Team accounts can take ready-made music, sound effects, voice-overs, clips, images and sprites from the AnimaGuru asset library instead of generating them: `animaguru library search DESCRIPTION --type music|sfx|speech|video|image|sprite` (natural language and keywords). `animaguru library download ID --output public/assets/` saves a file into the film (sprites save their sheets with `animation.json` frame rectangles and timing); `animaguru library import ID --project PROJECT_ID` adds it to an AnimaGuru project's assets instead. Prefer a library whoosh or background track over generating one; it spends no credits.
95
+ Every plan (Individual Starter and its trial, Individual Pro, Team), and members of a team on the Team plan, can take ready-made music, sound effects, voice-overs, clips, images and sprites from the AnimaGuru asset library instead of generating them: `animaguru library search DESCRIPTION --type music|sfx|speech|video|image|sprite` (natural language and keywords). `animaguru library download ID --output public/assets/` saves a file into the film (sprites save their sheets with `animation.json` frame rectangles and timing); `animaguru library import ID --project PROJECT_ID` adds it to an AnimaGuru project's assets instead. Prefer a library whoosh or background track over generating one; it spends no credits.
96
96
 
97
97
  ## Vectors
98
98
 
@@ -118,4 +118,4 @@ After signing in with `animaguru auth login`, run `animaguru submit --yes` here
118
118
 
119
119
  ## Cloud versions
120
120
 
121
- On Individual Pro or Team, `animaguru cloud link` syncs this folder with a new AnimaGuru project, or with an existing one through `--project PROJECT_ID`. `animaguru cloud push -m "What changed"` then saves a version, `animaguru cloud pull` brings in versions saved elsewhere, and `animaguru cloud clone PROJECT_ID` continues on another computer. `animaguru cloud restore VERSION` returns to an earlier version; push afterwards to keep it. Dependencies, exports, frames, `.env` files, credentials and anything in `.gitignore` or `.animaguruignore` stay local. The project's Animations tab in the studio lists every version and its files.
121
+ On any plan (Individual Starter, including its 7-day trial, Individual Pro or Team), `animaguru cloud link` syncs this folder with a new AnimaGuru project, or with an existing one through `--project PROJECT_ID`. `animaguru cloud push -m "What changed"` then saves a version, `animaguru cloud pull` brings in versions saved elsewhere, and `animaguru cloud clone PROJECT_ID` continues on another computer. `animaguru cloud restore VERSION` returns to an earlier version; push afterwards to keep it. Dependencies, exports, frames, `.env` files, credentials and anything in `.gitignore` or `.animaguruignore` stay local. The project's Animations tab in the studio lists every version and its files.