@doufunao123/asset-gateway 0.17.0 → 0.18.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/dist/index.js +122 -31
- package/package.json +1 -1
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
|
|
4
|
+
import { Command as Command10 } from "commander";
|
|
5
5
|
|
|
6
6
|
// src/commands/auth.ts
|
|
7
7
|
import { existsSync as existsSync2, unlinkSync } from "fs";
|
|
@@ -1121,11 +1121,101 @@ function createJobCommand() {
|
|
|
1121
1121
|
return command;
|
|
1122
1122
|
}
|
|
1123
1123
|
|
|
1124
|
+
// src/commands/library.ts
|
|
1125
|
+
import { Command as Command5 } from "commander";
|
|
1126
|
+
function createLibraryCommand() {
|
|
1127
|
+
const command = new Command5("library").description(
|
|
1128
|
+
"Search and manage the asset library"
|
|
1129
|
+
);
|
|
1130
|
+
command.addCommand(
|
|
1131
|
+
new Command5("search").description("Search the asset library").argument("[query]", "Search query").option("-t, --type <type>", "Filter by asset type (audio, music, image, etc.)").option("--tags <tags>", "Filter by tags (comma-separated)").option("--source <source>", "Filter by source (manual, generated, imported)").option("-n, --limit <limit>", "Max results", "20").option("--offset <offset>", "Offset for pagination", "0").action(async function(query) {
|
|
1132
|
+
const ctx = createContext(this);
|
|
1133
|
+
const opts = this.opts();
|
|
1134
|
+
try {
|
|
1135
|
+
const params = new URLSearchParams();
|
|
1136
|
+
if (query) params.set("q", query);
|
|
1137
|
+
if (opts.type) params.set("type", opts.type);
|
|
1138
|
+
if (opts.tags) params.set("tags", opts.tags);
|
|
1139
|
+
if (opts.source) params.set("source", opts.source);
|
|
1140
|
+
params.set("limit", opts.limit);
|
|
1141
|
+
params.set("offset", opts.offset);
|
|
1142
|
+
const data = await ctx.client.get(`/api/library/search?${params}`);
|
|
1143
|
+
printSuccess("library.search", data, ctx);
|
|
1144
|
+
} catch (error2) {
|
|
1145
|
+
printError("library.search", error2, ctx.human);
|
|
1146
|
+
}
|
|
1147
|
+
})
|
|
1148
|
+
);
|
|
1149
|
+
command.addCommand(
|
|
1150
|
+
new Command5("add").description("Add an item to the asset library").requiredOption("--name <name>", "Display name").requiredOption("--url <url>", "File URL (public)").requiredOption("-t, --type <type>", "Asset type (audio, music, image, etc.)").option("-d, --description <desc>", "Description").option("--tags <tags>", "Comma-separated tags").option("--duration <seconds>", "Duration in seconds (for audio/video)").option("--source <source>", "Source (manual, generated, imported)", "manual").action(async function() {
|
|
1151
|
+
const ctx = createContext(this);
|
|
1152
|
+
const opts = this.opts();
|
|
1153
|
+
try {
|
|
1154
|
+
const body = {
|
|
1155
|
+
asset_type: opts.type,
|
|
1156
|
+
name: opts.name,
|
|
1157
|
+
file_url: opts.url,
|
|
1158
|
+
source: opts.source
|
|
1159
|
+
};
|
|
1160
|
+
if (opts.description) body.description = opts.description;
|
|
1161
|
+
if (opts.tags)
|
|
1162
|
+
body.tags = opts.tags.split(",").map((t) => t.trim());
|
|
1163
|
+
if (opts.duration)
|
|
1164
|
+
body.duration_seconds = parseFloat(opts.duration);
|
|
1165
|
+
const data = await ctx.client.post("/api/library", body);
|
|
1166
|
+
printSuccess("library.add", data, ctx);
|
|
1167
|
+
} catch (error2) {
|
|
1168
|
+
printError("library.add", error2, ctx.human);
|
|
1169
|
+
}
|
|
1170
|
+
})
|
|
1171
|
+
);
|
|
1172
|
+
command.addCommand(
|
|
1173
|
+
new Command5("get").description("Get a library item by ID").argument("<id>", "Library item ID").action(async function(id) {
|
|
1174
|
+
const ctx = createContext(this);
|
|
1175
|
+
try {
|
|
1176
|
+
const data = await ctx.client.get(`/api/library/${encodeURIComponent(id)}`);
|
|
1177
|
+
printSuccess("library.get", data, ctx);
|
|
1178
|
+
} catch (error2) {
|
|
1179
|
+
printError("library.get", error2, ctx.human);
|
|
1180
|
+
}
|
|
1181
|
+
})
|
|
1182
|
+
);
|
|
1183
|
+
command.addCommand(
|
|
1184
|
+
new Command5("delete").description("Delete a library item (admin only)").argument("<id>", "Library item ID").action(async function(id) {
|
|
1185
|
+
const ctx = createContext(this);
|
|
1186
|
+
try {
|
|
1187
|
+
const data = await ctx.client.delete(`/api/library/${encodeURIComponent(id)}`);
|
|
1188
|
+
printSuccess("library.delete", data, ctx);
|
|
1189
|
+
} catch (error2) {
|
|
1190
|
+
printError("library.delete", error2, ctx.human);
|
|
1191
|
+
}
|
|
1192
|
+
})
|
|
1193
|
+
);
|
|
1194
|
+
command.addCommand(
|
|
1195
|
+
new Command5("catalog-jobs").description("Catalog completed generation jobs into the library (admin)").option("-t, --type <type>", "Filter jobs by asset type").option("--provider <id>", "Filter jobs by provider ID").option("--after <date>", "Only catalog jobs after this date").option("--dry-run", "Just count, don't actually catalog").action(async function() {
|
|
1196
|
+
const ctx = createContext(this);
|
|
1197
|
+
const opts = this.opts();
|
|
1198
|
+
try {
|
|
1199
|
+
const body = {};
|
|
1200
|
+
if (opts.type) body.asset_type = opts.type;
|
|
1201
|
+
if (opts.provider) body.provider_id = opts.provider;
|
|
1202
|
+
if (opts.after) body.after = opts.after;
|
|
1203
|
+
if (opts.dryRun) body.dry_run = true;
|
|
1204
|
+
const data = await ctx.client.post("/api/library/catalog-jobs", body);
|
|
1205
|
+
printSuccess("library.catalog_jobs", data, ctx);
|
|
1206
|
+
} catch (error2) {
|
|
1207
|
+
printError("library.catalog_jobs", error2, ctx.human);
|
|
1208
|
+
}
|
|
1209
|
+
})
|
|
1210
|
+
);
|
|
1211
|
+
return command;
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1124
1214
|
// src/commands/process.ts
|
|
1125
1215
|
import { mkdirSync as mkdirSync3, readFileSync as readFileSync3, writeFileSync as writeFileSync3 } from "fs";
|
|
1126
1216
|
import { existsSync as existsSync4 } from "fs";
|
|
1127
1217
|
import { join as join3 } from "path";
|
|
1128
|
-
import { Command as
|
|
1218
|
+
import { Command as Command6 } from "commander";
|
|
1129
1219
|
function readInputAsBase64(input) {
|
|
1130
1220
|
if (existsSync4(input)) {
|
|
1131
1221
|
const bytes = readFileSync3(input);
|
|
@@ -1159,9 +1249,9 @@ function saveProcessOutput(data, outputDir) {
|
|
|
1159
1249
|
return filePath;
|
|
1160
1250
|
}
|
|
1161
1251
|
function createProcessCommand() {
|
|
1162
|
-
const command = new
|
|
1252
|
+
const command = new Command6("process").description("Post-process images and video (crop, resize, compose, extract-frames, remove-bg)");
|
|
1163
1253
|
command.addCommand(
|
|
1164
|
-
new
|
|
1254
|
+
new Command6("crop").description("Smart crop an image (trim transparent borders)").requiredOption("--input <path>", "Input image (file path or URL)").option("--mode <mode>", "Crop mode: tightest or power_of2", "tightest").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1165
1255
|
try {
|
|
1166
1256
|
const ctx = createContext(this);
|
|
1167
1257
|
const data = await ctx.client.post("/api/process", {
|
|
@@ -1177,7 +1267,7 @@ function createProcessCommand() {
|
|
|
1177
1267
|
})
|
|
1178
1268
|
);
|
|
1179
1269
|
command.addCommand(
|
|
1180
|
-
new
|
|
1270
|
+
new Command6("resize").description("Resize an image to exact dimensions").requiredOption("--input <path>", "Input image (file path or URL)").requiredOption("--width <n>", "Target width").requiredOption("--height <n>", "Target height").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1181
1271
|
try {
|
|
1182
1272
|
const ctx = createContext(this);
|
|
1183
1273
|
const data = await ctx.client.post("/api/process", {
|
|
@@ -1193,7 +1283,7 @@ function createProcessCommand() {
|
|
|
1193
1283
|
})
|
|
1194
1284
|
);
|
|
1195
1285
|
command.addCommand(
|
|
1196
|
-
new
|
|
1286
|
+
new Command6("compose").description("Compose multiple images into a sprite sheet").requiredOption("--input <paths...>", "Input images (files or URLs)").option("--direction <dir>", "Layout: horizontal, vertical, grid", "horizontal").option("--columns <n>", "Columns for grid layout").option("--padding <n>", "Padding between frames in px", "0").option("--frame-width <n>", "Normalize each frame to this width").option("--frame-height <n>", "Normalize each frame to this height").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1197
1287
|
try {
|
|
1198
1288
|
const ctx = createContext(this);
|
|
1199
1289
|
const inputs = Array.isArray(options.input) ? options.input : [options.input];
|
|
@@ -1217,7 +1307,7 @@ function createProcessCommand() {
|
|
|
1217
1307
|
})
|
|
1218
1308
|
);
|
|
1219
1309
|
command.addCommand(
|
|
1220
|
-
new
|
|
1310
|
+
new Command6("extract-frames").description("Extract evenly-spaced frames from a video using ffmpeg").requiredOption("--input <path>", "Input video (file path or URL)").option("--count <n>", "Number of frames to extract", "8").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1221
1311
|
try {
|
|
1222
1312
|
const ctx = createContext(this);
|
|
1223
1313
|
const data = await ctx.client.post("/api/process", {
|
|
@@ -1233,7 +1323,7 @@ function createProcessCommand() {
|
|
|
1233
1323
|
})
|
|
1234
1324
|
);
|
|
1235
1325
|
command.addCommand(
|
|
1236
|
-
new
|
|
1326
|
+
new Command6("remove-bg").description("Remove background from image(s) using rembg or ImageMagick fallback").requiredOption("--input <paths...>", "Input images (files or URLs)").option("--bg-color <color>", "Background color hint for fallback (e.g. white, black)").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1237
1327
|
try {
|
|
1238
1328
|
const ctx = createContext(this);
|
|
1239
1329
|
const inputs = Array.isArray(options.input) ? options.input : [options.input];
|
|
@@ -1257,7 +1347,7 @@ function createProcessCommand() {
|
|
|
1257
1347
|
// src/commands/process3d.ts
|
|
1258
1348
|
import { mkdirSync as mkdirSync4, writeFileSync as writeFileSync4 } from "fs";
|
|
1259
1349
|
import { join as join4 } from "path";
|
|
1260
|
-
import { Command as
|
|
1350
|
+
import { Command as Command7 } from "commander";
|
|
1261
1351
|
function infer3dExtension(format) {
|
|
1262
1352
|
const map = {
|
|
1263
1353
|
fbx: "fbx",
|
|
@@ -1327,9 +1417,9 @@ function isRecord2(value) {
|
|
|
1327
1417
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1328
1418
|
}
|
|
1329
1419
|
function createProcess3dCommand() {
|
|
1330
|
-
const command = new
|
|
1420
|
+
const command = new Command7("process3d").description("3D model post-processing via Tripo pipeline");
|
|
1331
1421
|
command.addCommand(
|
|
1332
|
-
new
|
|
1422
|
+
new Command7("convert").description("Convert 3D model format (FBX/USDZ/OBJ/STL/GLTF/3MF)").requiredOption("--task-id <id>", "Tripo task ID from generate model").requiredOption("--format <fmt>", "Target format: FBX, USDZ, OBJ, STL, GLTF, 3MF").option("--quad", "Enable quad remeshing").option("--face-limit <n>", "Max face count").option("--pack-uv", "Pack UVs during export").option("--bake", "Bake textures during export").option("--texture-format <fmt>", "Texture export format override").option("--force-symmetry", "Force symmetry during conversion").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1333
1423
|
try {
|
|
1334
1424
|
const ctx = createContext(this);
|
|
1335
1425
|
const params = {
|
|
@@ -1355,7 +1445,7 @@ function createProcess3dCommand() {
|
|
|
1355
1445
|
})
|
|
1356
1446
|
);
|
|
1357
1447
|
command.addCommand(
|
|
1358
|
-
new
|
|
1448
|
+
new Command7("texture").description("Re-texture a 3D model with new materials").requiredOption("--task-id <id>", "Tripo task ID").option("--prompt <text>", "Texture description prompt").option("--style-image <input>", "Texture style reference image URL or local file path").option("--pbr", "Enable PBR materials").option("--quality <q>", "Texture quality: standard or detailed").option("--texture-alignment <mode>", "Tripo texture alignment mode").option("--bake", "Bake textures during re-texturing").option("--texture-version <version>", "Tripo texture model version override").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1359
1449
|
try {
|
|
1360
1450
|
const ctx = createContext(this);
|
|
1361
1451
|
const params = {};
|
|
@@ -1380,7 +1470,7 @@ function createProcess3dCommand() {
|
|
|
1380
1470
|
})
|
|
1381
1471
|
);
|
|
1382
1472
|
command.addCommand(
|
|
1383
|
-
new
|
|
1473
|
+
new Command7("rig").description("Auto-rig a 3D model (add skeleton for animation)").requiredOption("--task-id <id>", "Tripo task ID").option("--format <fmt>", "Output format: glb or fbx", "glb").option("--spec <spec>", "Rig spec: mixamo or tripo", "mixamo").option("--rig-type <type>", "Rig type override passed through to Tripo").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1384
1474
|
try {
|
|
1385
1475
|
const ctx = createContext(this);
|
|
1386
1476
|
const params = {
|
|
@@ -1402,7 +1492,7 @@ function createProcess3dCommand() {
|
|
|
1402
1492
|
})
|
|
1403
1493
|
);
|
|
1404
1494
|
command.addCommand(
|
|
1405
|
-
new
|
|
1495
|
+
new Command7("animate").description("Apply preset animation to a rigged model").requiredOption("--task-id <id>", "Tripo task ID (from rig step)").requiredOption("--animation <preset>", "Animation preset (e.g. preset:walk, preset:idle, preset:run)").option("--format <fmt>", "Output format: glb or fbx", "glb").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1406
1496
|
try {
|
|
1407
1497
|
const ctx = createContext(this);
|
|
1408
1498
|
const data = await ctx.client.post("/api/process3d", {
|
|
@@ -1422,7 +1512,7 @@ function createProcess3dCommand() {
|
|
|
1422
1512
|
})
|
|
1423
1513
|
);
|
|
1424
1514
|
command.addCommand(
|
|
1425
|
-
new
|
|
1515
|
+
new Command7("render-sprites").description("Render animated 3D model to 2D sprite frames via Blender").requiredOption("--task-id <id>", "Tripo task ID").option("--frame-count <n>", "Number of frames", "8").option("--resolution <n>", "Frame resolution in pixels", "64").option("--camera-angle <angle>", "Camera: front, side, iso, 3/4, top", "front").option("--directions <n>", "Rotation directions: 1, 4, 8", "1").option("--output-dir <dir>", "Output directory", ".").action(async function(options) {
|
|
1426
1516
|
try {
|
|
1427
1517
|
const ctx = createContext(this);
|
|
1428
1518
|
const data = await ctx.client.post("/api/process3d", {
|
|
@@ -1441,7 +1531,7 @@ function createProcess3dCommand() {
|
|
|
1441
1531
|
})
|
|
1442
1532
|
);
|
|
1443
1533
|
command.addCommand(
|
|
1444
|
-
new
|
|
1534
|
+
new Command7("reduce").description("Reduce polygon count (high-poly to low-poly)").requiredOption("--task-id <id>", "Tripo task ID").option("--face-limit <n>", "Target face count").option("--quad", "Use quad topology").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1445
1535
|
try {
|
|
1446
1536
|
const ctx = createContext(this);
|
|
1447
1537
|
const params = {};
|
|
@@ -1461,7 +1551,7 @@ function createProcess3dCommand() {
|
|
|
1461
1551
|
})
|
|
1462
1552
|
);
|
|
1463
1553
|
command.addCommand(
|
|
1464
|
-
new
|
|
1554
|
+
new Command7("stylize").description("Apply artistic style to a model").requiredOption("--task-id <id>", "Tripo task ID").requiredOption("--style <style>", "Style: lego, voxel, voronoi, minecraft").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1465
1555
|
try {
|
|
1466
1556
|
const ctx = createContext(this);
|
|
1467
1557
|
const data = await ctx.client.post("/api/process3d", {
|
|
@@ -1480,7 +1570,7 @@ function createProcess3dCommand() {
|
|
|
1480
1570
|
})
|
|
1481
1571
|
);
|
|
1482
1572
|
command.addCommand(
|
|
1483
|
-
new
|
|
1573
|
+
new Command7("segment").description("Segment mesh into logical parts").requiredOption("--task-id <id>", "Tripo task ID").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1484
1574
|
try {
|
|
1485
1575
|
const ctx = createContext(this);
|
|
1486
1576
|
const data = await ctx.client.post("/api/process3d", {
|
|
@@ -1497,7 +1587,7 @@ function createProcess3dCommand() {
|
|
|
1497
1587
|
})
|
|
1498
1588
|
);
|
|
1499
1589
|
command.addCommand(
|
|
1500
|
-
new
|
|
1590
|
+
new Command7("prerigcheck").description("Check if a model can be rigged").requiredOption("--task-id <id>", "Tripo task ID").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1501
1591
|
try {
|
|
1502
1592
|
const ctx = createContext(this);
|
|
1503
1593
|
const data = await ctx.client.post("/api/process3d", {
|
|
@@ -1514,7 +1604,7 @@ function createProcess3dCommand() {
|
|
|
1514
1604
|
})
|
|
1515
1605
|
);
|
|
1516
1606
|
command.addCommand(
|
|
1517
|
-
new
|
|
1607
|
+
new Command7("refine").description("Refine a draft model to higher quality").requiredOption("--task-id <id>", "Tripo task ID").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1518
1608
|
try {
|
|
1519
1609
|
const ctx = createContext(this);
|
|
1520
1610
|
const data = await ctx.client.post("/api/process3d", {
|
|
@@ -1531,7 +1621,7 @@ function createProcess3dCommand() {
|
|
|
1531
1621
|
})
|
|
1532
1622
|
);
|
|
1533
1623
|
command.addCommand(
|
|
1534
|
-
new
|
|
1624
|
+
new Command7("import").description("Import an external 3D model for post-processing").option("--file-url <url>", "URL of the 3D model to import").option("--file-path <path>", "Local path of the 3D model to import").option("--output-dir <dir>", "Directory to save output", ".").action(async function(options) {
|
|
1535
1625
|
try {
|
|
1536
1626
|
const ctx = createContext(this);
|
|
1537
1627
|
const params = {};
|
|
@@ -1557,11 +1647,11 @@ function createProcess3dCommand() {
|
|
|
1557
1647
|
}
|
|
1558
1648
|
|
|
1559
1649
|
// src/commands/provider.ts
|
|
1560
|
-
import { Command as
|
|
1650
|
+
import { Command as Command8 } from "commander";
|
|
1561
1651
|
function createProviderCommand() {
|
|
1562
|
-
const command = new
|
|
1652
|
+
const command = new Command8("provider").description("Provider management");
|
|
1563
1653
|
command.addCommand(
|
|
1564
|
-
new
|
|
1654
|
+
new Command8("list").description("List available providers").action(async function() {
|
|
1565
1655
|
try {
|
|
1566
1656
|
const ctx = createContext(this);
|
|
1567
1657
|
const data = await ctx.client.get("/api/providers");
|
|
@@ -1572,7 +1662,7 @@ function createProviderCommand() {
|
|
|
1572
1662
|
})
|
|
1573
1663
|
);
|
|
1574
1664
|
command.addCommand(
|
|
1575
|
-
new
|
|
1665
|
+
new Command8("health").description("Check provider health").argument("[name]", "Specific provider name").action(async function(name) {
|
|
1576
1666
|
try {
|
|
1577
1667
|
const ctx = createContext(this);
|
|
1578
1668
|
const path = name ? `/api/providers/${encodeURIComponent(name)}/health` : "/api/providers/health";
|
|
@@ -1587,11 +1677,11 @@ function createProviderCommand() {
|
|
|
1587
1677
|
}
|
|
1588
1678
|
|
|
1589
1679
|
// src/commands/upload.ts
|
|
1590
|
-
import { Command as
|
|
1680
|
+
import { Command as Command9 } from "commander";
|
|
1591
1681
|
function createUploadCommand() {
|
|
1592
|
-
const command = new
|
|
1682
|
+
const command = new Command9("upload").description("Upload and manage assets");
|
|
1593
1683
|
command.addCommand(
|
|
1594
|
-
new
|
|
1684
|
+
new Command9("file").description("Upload a file and get a public URL").argument("<path>", "Path to file to upload").action(async function(filePath) {
|
|
1595
1685
|
const ctx = createContext(this);
|
|
1596
1686
|
try {
|
|
1597
1687
|
const data = await ctx.client.uploadFile(filePath);
|
|
@@ -1602,7 +1692,7 @@ function createUploadCommand() {
|
|
|
1602
1692
|
})
|
|
1603
1693
|
);
|
|
1604
1694
|
command.addCommand(
|
|
1605
|
-
new
|
|
1695
|
+
new Command9("list").description("List uploaded assets").action(async function() {
|
|
1606
1696
|
const ctx = createContext(this);
|
|
1607
1697
|
try {
|
|
1608
1698
|
const data = await ctx.client.get("/api/assets");
|
|
@@ -1613,7 +1703,7 @@ function createUploadCommand() {
|
|
|
1613
1703
|
})
|
|
1614
1704
|
);
|
|
1615
1705
|
command.addCommand(
|
|
1616
|
-
new
|
|
1706
|
+
new Command9("delete").description("Delete an uploaded asset (admin only)").argument("<filename>", "Filename to delete").action(async function(filename) {
|
|
1617
1707
|
const ctx = createContext(this);
|
|
1618
1708
|
try {
|
|
1619
1709
|
const data = await ctx.client.delete(`/api/assets/${encodeURIComponent(filename)}`);
|
|
@@ -1627,12 +1717,13 @@ function createUploadCommand() {
|
|
|
1627
1717
|
}
|
|
1628
1718
|
|
|
1629
1719
|
// src/index.ts
|
|
1630
|
-
var program = new
|
|
1720
|
+
var program = new Command10().name("asset-gateway").description("Universal asset generation gateway CLI").version(CLI_VERSION).option(
|
|
1631
1721
|
"--gateway-url <url>",
|
|
1632
1722
|
`Gateway URL (default: $ASSET_GATEWAY_URL, auth config, or ${DEFAULT_GATEWAY_URL})`
|
|
1633
1723
|
).option("--token <token>", "API token for authentication").option("--human", "Human-readable output instead of JSON").option("--fields <fields>", "Comma-separated list of output fields");
|
|
1634
1724
|
program.addCommand(createAuthCommand());
|
|
1635
1725
|
program.addCommand(createGenerateCommand());
|
|
1726
|
+
program.addCommand(createLibraryCommand());
|
|
1636
1727
|
program.addCommand(createProcessCommand());
|
|
1637
1728
|
program.addCommand(createProcess3dCommand());
|
|
1638
1729
|
program.addCommand(createProviderCommand());
|