@cutcli/cutcli 0.0.1 → 1.1.1

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/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # @cutcli/cutcli
2
+
3
+ AI 友好的 CapCut / 剪映草稿命令行工具。它适合被 Agent 实时调用,用命令创建草稿、添加素材、查询状态并提交云渲染。
4
+
5
+ ```bash
6
+ npm install -g @cutcli/cutcli
7
+ cutcli draft create --width 1080 --height 1920
8
+ cutcli image add <draftId> --src ./素材/bg.png --start 0s --duration 5s --width 1080 --height 1920
9
+ cutcli audio add <draftId> --src ./素材/bgm.mp3 --start 0s --duration 5s
10
+ ```
11
+
12
+ ### 云渲染管理
13
+
14
+ `cutcli` 支持直接将草稿一键打包、上传并提交至云渲染服务,最终获取可下载的视频 URL。
15
+
16
+ 1. **配置云渲染 API Token**:
17
+ 运行 `login` 命令将 API Token 保存到本地配置(或设置 `CUT_API_TOKEN` 环境变量):
18
+ ```bash
19
+ cutcli login your_api_token_here
20
+ ```
21
+
22
+ 2. **提交云渲染任务**:
23
+ ```bash
24
+ # 提交渲染并持续轮询直到渲染完成 (--wait)
25
+ cutcli cloud render <draftId> --wait
26
+ ```
27
+
28
+ 3. **查询渲染任务结果**:
29
+ ```bash
30
+ cutcli cloud result <jobId>
31
+ ```
32
+
33
+ ### 接入 AI Agent
34
+
35
+ 给某个项目安装 AI 使用说明(Agent Skills):
36
+
37
+ ```bash
38
+ cutcli agents install
39
+ ```
package/dist/cli.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import * as defaultSdk from 'cutsdk';
4
+ export type CutcliDeps = Partial<typeof defaultSdk>;
5
+ export declare function createProgram(deps?: CutcliDeps): Command;
6
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,KAAK,UAAU,MAAM,QAAQ,CAAC;AA6JrC,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,wBAAgB,aAAa,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAg0B5D"}
package/dist/cli.js ADDED
@@ -0,0 +1,987 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.createProgram = createProgram;
41
+ const commander_1 = require("commander");
42
+ const fs_1 = __importDefault(require("fs"));
43
+ const os_1 = __importDefault(require("os"));
44
+ const path_1 = __importDefault(require("path"));
45
+ const dotenv_1 = __importDefault(require("dotenv"));
46
+ const defaultSdk = __importStar(require("cutsdk"));
47
+ function parseJsonArg(val) {
48
+ if (val.startsWith('@')) {
49
+ const filePath = val.slice(1);
50
+ return JSON.parse(fs_1.default.readFileSync(filePath, 'utf-8'));
51
+ }
52
+ return JSON.parse(val);
53
+ }
54
+ function readJsonFile(filePath) {
55
+ return JSON.parse(fs_1.default.readFileSync(filePath, 'utf-8'));
56
+ }
57
+ function parseTimeArg(val, field) {
58
+ if (val === undefined || val === null || val === '')
59
+ return undefined;
60
+ if (typeof val === 'number')
61
+ return val;
62
+ const raw = String(val).toLowerCase().trim();
63
+ let unit = 'us';
64
+ let numeric = raw;
65
+ if (raw.endsWith('ms')) {
66
+ unit = 'ms';
67
+ numeric = raw.slice(0, -2).trim();
68
+ }
69
+ else if (raw.endsWith('us')) {
70
+ unit = 'us';
71
+ numeric = raw.slice(0, -2).trim();
72
+ }
73
+ else if (raw.endsWith('s')) {
74
+ unit = 's';
75
+ numeric = raw.slice(0, -1).trim();
76
+ }
77
+ const match = numeric.match(/^-?\d+(?:\.\d+)?$/);
78
+ if (!match) {
79
+ throw new Error(`${field} must be a number or time string like 1.5s, 300ms, 1500000us`);
80
+ }
81
+ const amount = Number(numeric);
82
+ if (unit === 's')
83
+ return Math.round(amount * 1000000);
84
+ if (unit === 'ms')
85
+ return Math.round(amount * 1000);
86
+ if (unit === 'us')
87
+ return Math.round(amount);
88
+ return Math.round(amount);
89
+ }
90
+ function toNumber(val) {
91
+ if (val === undefined || val === null || val === '')
92
+ return undefined;
93
+ return Number(val);
94
+ }
95
+ function buildShadowInfo(opts) {
96
+ const shadowInfo = {
97
+ shadowColor: opts.shadowColor,
98
+ shadowAlpha: toNumber(opts.shadowAlpha),
99
+ shadowDiffuse: toNumber(opts.shadowDiffuse),
100
+ shadowDistance: toNumber(opts.shadowDistance),
101
+ shadowAngle: toNumber(opts.shadowAngle),
102
+ };
103
+ const hasShadowInfo = Object.values(shadowInfo).some((value) => value !== undefined);
104
+ return hasShadowInfo ? shadowInfo : undefined;
105
+ }
106
+ function hasShadow(opts) {
107
+ return opts.shadow || Boolean(opts.shadowColor || opts.shadowAlpha || opts.shadowDiffuse || opts.shadowDistance || opts.shadowAngle) || undefined;
108
+ }
109
+ function resolveEndTime(opts) {
110
+ const start = parseTimeArg(opts.start, 'start') ?? 0;
111
+ const end = parseTimeArg(opts.end, 'end');
112
+ const duration = parseTimeArg(opts.duration, 'duration');
113
+ if (end === undefined && duration === undefined) {
114
+ throw new Error('Either --end or --duration is required');
115
+ }
116
+ const resolvedEnd = end ?? start + duration;
117
+ const resolvedDuration = duration ?? resolvedEnd - start;
118
+ if (resolvedEnd <= start)
119
+ throw new Error('end must be greater than start');
120
+ return { start, end: resolvedEnd, duration: resolvedDuration };
121
+ }
122
+ function readDraftSpec(filePath) {
123
+ const spec = readJsonFile(filePath);
124
+ if (spec?.draft && spec?.render !== undefined)
125
+ return spec.draft;
126
+ return spec;
127
+ }
128
+ function getDefaultDraftsDir() {
129
+ if (process.env.CUT_DRAFTS_DIR)
130
+ return process.env.CUT_DRAFTS_DIR;
131
+ if (process.platform === 'darwin') {
132
+ return path_1.default.join(process.env.HOME || '', 'Movies', 'JianyingPro Drafts');
133
+ }
134
+ return path_1.default.join(process.env.HOME || '', '.cut', 'drafts');
135
+ }
136
+ function getCutcliConfigPath() {
137
+ if (process.env.CUTCLI_CONFIG_FILE)
138
+ return process.env.CUTCLI_CONFIG_FILE;
139
+ return path_1.default.join(os_1.default.homedir(), '.cutcli', 'config.json');
140
+ }
141
+ function readCutcliConfig() {
142
+ const configPath = getCutcliConfigPath();
143
+ if (!fs_1.default.existsSync(configPath))
144
+ return {};
145
+ return JSON.parse(fs_1.default.readFileSync(configPath, 'utf-8'));
146
+ }
147
+ function writeCutcliConfig(config) {
148
+ const configPath = getCutcliConfigPath();
149
+ fs_1.default.mkdirSync(path_1.default.dirname(configPath), { recursive: true });
150
+ fs_1.default.writeFileSync(configPath, JSON.stringify(config, null, 2), { encoding: 'utf-8', mode: 0o600 });
151
+ try {
152
+ fs_1.default.chmodSync(configPath, 0o600);
153
+ }
154
+ catch {
155
+ // Best effort on platforms that support POSIX file modes.
156
+ }
157
+ return configPath;
158
+ }
159
+ function resolveApiToken(token) {
160
+ return token || process.env.CUT_API_TOKEN || readCutcliConfig().apiToken;
161
+ }
162
+ function output(data, pretty) {
163
+ console.log(pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data));
164
+ }
165
+ function getCliVersion() {
166
+ return require('../package.json').version;
167
+ }
168
+ function copyProjectTemplate(targetDir, force) {
169
+ const sdkPackageJson = require.resolve('cutsdk/package.json');
170
+ const sdkRoot = path_1.default.dirname(sdkPackageJson);
171
+ const sourceDir = path_1.default.join(sdkRoot, 'dist', 'api', 'setup', 'templates', 'project');
172
+ if (!fs_1.default.existsSync(sourceDir)) {
173
+ throw new Error(`cutsdk project template not found: ${sourceDir}`);
174
+ }
175
+ const targets = [
176
+ { from: path_1.default.join(sourceDir, '.agents'), to: path_1.default.join(targetDir, '.agents') },
177
+ { from: path_1.default.join(sourceDir, 'cutcli-docs'), to: path_1.default.join(targetDir, 'cutcli-docs') },
178
+ ];
179
+ const installed = [];
180
+ const skipped = [];
181
+ for (const item of targets) {
182
+ if (fs_1.default.existsSync(item.to) && !force) {
183
+ skipped.push(item.to);
184
+ continue;
185
+ }
186
+ fs_1.default.cpSync(item.from, item.to, { recursive: true, force });
187
+ installed.push(item.to);
188
+ }
189
+ return { targetDir, installed, skipped };
190
+ }
191
+ function createProgram(deps = {}) {
192
+ const sdk = { ...defaultSdk, ...deps };
193
+ const { addAudios, addCaptions, addEffects, addImages, addKeyframes, addMasks, addSticker, addTextStyle, addVideos, createAndRenderDraft, createDraft, createDraftFromSpec, easyCreateMaterial, getAudioDuration, getAudios, getCaptions, getCloudRenderStatus, getDraftInfo, getEffects, getImageAnimations, getImages, getKeyframes, getMasks, getStickers, getTextEffect, getTextEffects, getVideos, listDrafts, renderDraft, submitVideoRenderTask, validateDraftSpec, } = sdk;
194
+ const program = new commander_1.Command();
195
+ program
196
+ .name('cutcli')
197
+ .description('AI 友好的 CapCut / 剪映草稿命令行工具')
198
+ .version(getCliVersion())
199
+ .option('--env-file <path>', '指定 .env 文件路径')
200
+ .option('--pretty', '美化 JSON 输出', false)
201
+ .option('--json-errors', '以 JSON 输出错误,便于 AI/脚本解析', false)
202
+ .hook('preAction', (thisCommand) => {
203
+ const opts = thisCommand.opts();
204
+ if (opts.envFile)
205
+ dotenv_1.default.config({ path: opts.envFile });
206
+ });
207
+ const pretty = () => program.opts().pretty;
208
+ program.command('login')
209
+ .description('保存云渲染 API Token 到本机 cutcli 配置')
210
+ .argument('[apiToken]', '云渲染 API Token')
211
+ .option('--api-token <token>', '云渲染 API Token')
212
+ .action(async (_apiToken, opts) => {
213
+ const apiToken = opts.apiToken || _apiToken;
214
+ if (!apiToken)
215
+ throw new Error('apiToken is required. Usage: cutcli login <apiToken>');
216
+ const existing = readCutcliConfig();
217
+ const configPath = writeCutcliConfig({ ...existing, apiToken });
218
+ output({ ok: true, configPath, apiToken: '<set>' }, pretty());
219
+ });
220
+ // ========== draft ==========
221
+ const draft = program.command('draft').description('草稿管理');
222
+ draft.command('create')
223
+ .description('创建新草稿')
224
+ .option('--width <n>', '画布宽度', '1080')
225
+ .option('--height <n>', '画布高度', '1920')
226
+ .option('--user-id <id>', '用户ID')
227
+ .action(async (opts) => {
228
+ const result = await createDraft({ width: +opts.width, height: +opts.height, userId: opts.userId });
229
+ output(result, pretty());
230
+ });
231
+ draft.command('list')
232
+ .description('列出所有草稿')
233
+ .action(async () => {
234
+ const result = await listDrafts();
235
+ output(result, pretty());
236
+ });
237
+ draft.command('info <draftId>')
238
+ .description('查看草稿信息')
239
+ .action(async (draftId) => {
240
+ const result = await getDraftInfo({ draftId });
241
+ output(result, pretty());
242
+ });
243
+ draft.command('easy <draftId>')
244
+ .description('快速添加素材')
245
+ .option('--audio-url <pathOrUrl>', '音频路径或 URL')
246
+ .option('--audio-src <pathOrUrl>', '音频路径或 URL')
247
+ .option('--img-url <pathOrUrl>', '图片路径或 URL')
248
+ .option('--image-src <pathOrUrl>', '图片路径或 URL')
249
+ .option('--video-url <pathOrUrl>', '视频路径或 URL')
250
+ .option('--video-src <pathOrUrl>', '视频路径或 URL')
251
+ .option('--text <text>', '文字内容')
252
+ .option('--text-color <hex>', '文字颜色')
253
+ .option('--font-size <n>', '字号')
254
+ .option('--text-transform-y <n>', '文字 Y 位置')
255
+ .action(async (draftId, opts) => {
256
+ const audioUrl = opts.audioSrc || opts.audioUrl;
257
+ if (!audioUrl)
258
+ throw new Error('Either --audio-src or --audio-url is required');
259
+ const result = await easyCreateMaterial({
260
+ draftId,
261
+ audioUrl,
262
+ imgUrl: opts.imageSrc || opts.imgUrl,
263
+ videoUrl: opts.videoSrc || opts.videoUrl,
264
+ text: opts.text,
265
+ textColor: opts.textColor,
266
+ fontSize: toNumber(opts.fontSize),
267
+ textTransformY: toNumber(opts.textTransformY),
268
+ });
269
+ output(result, pretty());
270
+ });
271
+ // ========== captions ==========
272
+ const captions = program.command('captions').description('字幕管理');
273
+ captions.command('add <draftId>')
274
+ .description('添加字幕')
275
+ .requiredOption('--captions <json>', '字幕数据 (JSON 或 @file.json)')
276
+ .option('--font <name>', '字体名称')
277
+ .option('--alignment <n>', '对齐方式')
278
+ .option('--alpha <n>', '透明度')
279
+ .option('--text-color <hex>', '文字颜色')
280
+ .option('--font-size <n>', '字号')
281
+ .option('--bold', '加粗')
282
+ .option('--italic', '斜体')
283
+ .option('--underline', '下划线')
284
+ .option('--text-effect <name>', '花字/文字特效名称')
285
+ .option('--border-color <hex>', '描边颜色')
286
+ .option('--letter-spacing <n>', '字间距')
287
+ .option('--line-spacing <n>', '行间距')
288
+ .option('--style-text', '使用纯文本样式内容')
289
+ .option('--shadow', '启用阴影')
290
+ .option('--shadow-color <hex>', '阴影颜色')
291
+ .option('--shadow-alpha <n>', '阴影透明度')
292
+ .option('--shadow-diffuse <n>', '阴影模糊')
293
+ .option('--shadow-distance <n>', '阴影距离')
294
+ .option('--shadow-angle <n>', '阴影角度')
295
+ .option('--scale-x <n>', 'X 缩放')
296
+ .option('--scale-y <n>', 'Y 缩放')
297
+ .option('--transform-x <n>', 'X轴位置,归一化值 (0=居中, -1=最左, 1=最右)')
298
+ .option('--transform-y <n>', 'Y轴位置,归一化值 (0=居中, 1=最上, -1=最下)')
299
+ .action(async (draftId, opts) => {
300
+ const result = await addCaptions({
301
+ draftId, captions: parseJsonArg(opts.captions), font: opts.font,
302
+ alignment: toNumber(opts.alignment),
303
+ alpha: toNumber(opts.alpha),
304
+ textColor: opts.textColor, fontSize: toNumber(opts.fontSize),
305
+ bold: opts.bold, italic: opts.italic, underline: opts.underline,
306
+ textEffect: opts.textEffect,
307
+ borderColor: opts.borderColor,
308
+ letterSpacing: toNumber(opts.letterSpacing),
309
+ lineSpacing: toNumber(opts.lineSpacing),
310
+ styleText: opts.styleText,
311
+ hasShadow: hasShadow(opts),
312
+ shadowInfo: buildShadowInfo(opts),
313
+ scaleX: toNumber(opts.scaleX),
314
+ scaleY: toNumber(opts.scaleY),
315
+ transformX: toNumber(opts.transformX),
316
+ transformY: toNumber(opts.transformY),
317
+ });
318
+ output(result, pretty());
319
+ });
320
+ captions.command('list <draftId>')
321
+ .description('查看已有字幕')
322
+ .action(async (draftId) => {
323
+ const result = await getCaptions({ draftId });
324
+ output(result, pretty());
325
+ });
326
+ // ========== images ==========
327
+ const images = program.command('images').description('图片管理');
328
+ images.command('add <draftId>')
329
+ .description('添加图片')
330
+ .requiredOption('--image-infos <json>', '图片数据 (JSON 或 @file.json)')
331
+ .option('--alpha <n>', '透明度')
332
+ .option('--scale-x <n>', 'X 缩放')
333
+ .option('--scale-y <n>', 'Y 缩放')
334
+ .option('--transform-x <n>', 'X 位置')
335
+ .option('--transform-y <n>', 'Y 位置')
336
+ .action(async (draftId, opts) => {
337
+ const result = await addImages({
338
+ draftId,
339
+ imageInfos: parseJsonArg(opts.imageInfos),
340
+ alpha: toNumber(opts.alpha),
341
+ scaleX: toNumber(opts.scaleX),
342
+ scaleY: toNumber(opts.scaleY),
343
+ transformX: toNumber(opts.transformX),
344
+ transformY: toNumber(opts.transformY),
345
+ });
346
+ output(result, pretty());
347
+ });
348
+ images.command('list <draftId>')
349
+ .description('查看已有图片')
350
+ .action(async (draftId) => {
351
+ const result = await getImages({ draftId });
352
+ output(result, pretty());
353
+ });
354
+ // ========== videos ==========
355
+ const videos = program.command('videos').description('视频管理');
356
+ videos.command('add <draftId>')
357
+ .description('添加视频')
358
+ .requiredOption('--video-infos <json>', '视频数据 (JSON 或 @file.json)')
359
+ .option('--alpha <n>', '透明度')
360
+ .option('--scale-x <n>', 'X 缩放')
361
+ .option('--scale-y <n>', 'Y 缩放')
362
+ .option('--transform-x <n>', 'X 位置')
363
+ .option('--transform-y <n>', 'Y 位置')
364
+ .option('--scene-timelines <json>', '变速场景时间线 (JSON 或 @file.json)')
365
+ .action(async (draftId, opts) => {
366
+ const result = await addVideos({
367
+ draftId,
368
+ videoInfos: parseJsonArg(opts.videoInfos),
369
+ alpha: toNumber(opts.alpha),
370
+ scaleX: toNumber(opts.scaleX),
371
+ scaleY: toNumber(opts.scaleY),
372
+ transformX: toNumber(opts.transformX),
373
+ transformY: toNumber(opts.transformY),
374
+ sceneTimelines: opts.sceneTimelines ? parseJsonArg(opts.sceneTimelines) : undefined,
375
+ });
376
+ output(result, pretty());
377
+ });
378
+ videos.command('list <draftId>')
379
+ .description('查看已有视频')
380
+ .action(async (draftId) => {
381
+ const result = await getVideos({ draftId });
382
+ output(result, pretty());
383
+ });
384
+ // ========== audios ==========
385
+ const audios = program.command('audios').description('音频管理');
386
+ audios.command('add <draftId>')
387
+ .description('添加音频')
388
+ .requiredOption('--audio-infos <json>', '音频数据 (JSON 或 @file.json)')
389
+ .action(async (draftId, opts) => {
390
+ const result = await addAudios({ draftId, audioInfos: parseJsonArg(opts.audioInfos) });
391
+ output(result, pretty());
392
+ });
393
+ audios.command('list <draftId>')
394
+ .description('查看已有音频')
395
+ .action(async (draftId) => {
396
+ const result = await getAudios({ draftId });
397
+ output(result, pretty());
398
+ });
399
+ // ========== effects ==========
400
+ const effects = program.command('effects').description('特效管理');
401
+ effects.command('add <draftId>')
402
+ .description('添加特效')
403
+ .requiredOption('--effect-infos <json>', '特效数据 (JSON 或 @file.json)')
404
+ .action(async (draftId, opts) => {
405
+ const result = await addEffects({ draftId, effectInfos: parseJsonArg(opts.effectInfos) });
406
+ output(result, pretty());
407
+ });
408
+ effects.command('list <draftId>')
409
+ .description('查看已有特效')
410
+ .action(async (draftId) => {
411
+ const result = await getEffects({ draftId });
412
+ output(result, pretty());
413
+ });
414
+ // ========== sticker ==========
415
+ const sticker = program.command('sticker').description('贴纸管理');
416
+ sticker.command('add <draftId>')
417
+ .description('添加贴纸')
418
+ .requiredOption('--sticker-id <id>', '贴纸ID')
419
+ .requiredOption('--start <time>', '开始时间,如 0s、500ms、1000000us')
420
+ .option('--end <time>', '结束时间')
421
+ .option('--duration <time>', '持续时间')
422
+ .option('--scale <n>', '缩放')
423
+ .option('--transform-x <n>', 'X 位置')
424
+ .option('--transform-y <n>', 'Y 位置')
425
+ .action(async (draftId, opts) => {
426
+ const time = resolveEndTime(opts);
427
+ const result = await addSticker({
428
+ draftId,
429
+ stickerId: opts.stickerId,
430
+ start: time.start,
431
+ end: time.end,
432
+ scale: toNumber(opts.scale),
433
+ transformX: toNumber(opts.transformX),
434
+ transformY: toNumber(opts.transformY),
435
+ });
436
+ output(result, pretty());
437
+ });
438
+ sticker.command('list <draftId>')
439
+ .description('查看已有贴纸')
440
+ .action(async (draftId) => {
441
+ const result = await getStickers({ draftId });
442
+ output(result, pretty());
443
+ });
444
+ // ========== keyframes ==========
445
+ const kf = program.command('keyframes').description('关键帧管理');
446
+ kf.command('add <draftId>')
447
+ .description('添加关键帧')
448
+ .requiredOption('--keyframes <json>', '关键帧数据 (JSON 或 @file.json)')
449
+ .action(async (draftId, opts) => {
450
+ const result = await addKeyframes({ draftId, keyframes: parseJsonArg(opts.keyframes) });
451
+ output(result, pretty());
452
+ });
453
+ kf.command('list <draftId>')
454
+ .description('查看关键帧')
455
+ .requiredOption('--segment-id <id>', '片段ID')
456
+ .action(async (draftId, opts) => {
457
+ const result = await getKeyframes({ draftId, segmentId: opts.segmentId });
458
+ output(result, pretty());
459
+ });
460
+ // ========== masks ==========
461
+ const masks = program.command('masks').description('遮罩管理');
462
+ masks.command('add <draftId>')
463
+ .description('添加遮罩')
464
+ .requiredOption('--segment-ids <ids>', '片段ID列表 (逗号分隔)')
465
+ .option('--name <name>', '遮罩类型', '线性')
466
+ .option('--width <n>', '宽度')
467
+ .option('--height <n>', '高度')
468
+ .option('--x <n>', '遮罩中心 X 像素')
469
+ .option('--y <n>', '遮罩中心 Y 像素')
470
+ .option('--feather <n>', '羽化')
471
+ .option('--rotation <n>', '旋转')
472
+ .option('--round-corner <n>', '圆角')
473
+ .option('--invert', '反转')
474
+ .action(async (draftId, opts) => {
475
+ const result = await addMasks({
476
+ draftId, segmentIds: opts.segmentIds.split(','), name: opts.name,
477
+ width: toNumber(opts.width), height: toNumber(opts.height),
478
+ X: toNumber(opts.x), Y: toNumber(opts.y),
479
+ feather: toNumber(opts.feather), rotation: toNumber(opts.rotation),
480
+ roundCorner: toNumber(opts.roundCorner),
481
+ invert: opts.invert,
482
+ });
483
+ output(result, pretty());
484
+ });
485
+ masks.command('list <draftId>')
486
+ .description('查看遮罩')
487
+ .option('--segment-id <id>', '片段ID')
488
+ .action(async (draftId, opts) => {
489
+ const result = await getMasks({ draftId, segmentId: opts.segmentId });
490
+ output(result, pretty());
491
+ });
492
+ // ========== text-style ==========
493
+ program.command('text-style')
494
+ .description('生成文字样式')
495
+ .requiredOption('--text <text>', '文字内容')
496
+ .requiredOption('--keyword <keywords>', '关键词 (| 分隔)')
497
+ .option('--keyword-color <hex>', '关键词颜色')
498
+ .option('--font-size <n>', '默认字号')
499
+ .option('--keyword-font-size <n>', '关键词字号')
500
+ .action(async (opts) => {
501
+ const result = await addTextStyle({
502
+ text: opts.text, keyword: opts.keyword,
503
+ keywordColor: opts.keywordColor,
504
+ fontSize: opts.fontSize ? +opts.fontSize : undefined,
505
+ keywordFontSize: opts.keywordFontSize ? +opts.keywordFontSize : undefined,
506
+ });
507
+ output(result, pretty());
508
+ });
509
+ // ========== query ==========
510
+ const query = program.command('query').description('工具查询');
511
+ query.command('audio-duration')
512
+ .description('获取音频时长')
513
+ .requiredOption('--url <url>', '音频URL')
514
+ .action(async (opts) => {
515
+ const result = await getAudioDuration({ url: opts.url });
516
+ output(result, pretty());
517
+ });
518
+ query.command('image-animations')
519
+ .description('查看图片动画列表')
520
+ .option('--mode <n>', '模式', '0')
521
+ .option('--type <type>', '类型: in/out/loop', 'in')
522
+ .action(async (opts) => {
523
+ const result = await getImageAnimations({ mode: +opts.mode, type: opts.type });
524
+ output(result, pretty());
525
+ });
526
+ query.command('text-effects')
527
+ .description('搜索花字/文字特效')
528
+ .option('--keyword <keyword>', '搜索关键词', '')
529
+ .option('--limit <n>', '返回数量', '20')
530
+ .action(async (opts) => {
531
+ const result = await getTextEffects({ keyword: opts.keyword, limit: Number(opts.limit) });
532
+ output(result, pretty());
533
+ });
534
+ query.command('text-effect')
535
+ .description('查询单个花字/文字特效')
536
+ .requiredOption('--name <name>', '花字/文字特效名称')
537
+ .action(async (opts) => {
538
+ const result = await getTextEffect({ name: opts.name });
539
+ output(result, pretty());
540
+ });
541
+ // ========== spec ==========
542
+ const spec = program.command('spec').description('AI Draft Spec 草稿生成');
543
+ spec.command('validate')
544
+ .description('校验 AI Draft Spec JSON 文件')
545
+ .requiredOption('--file <path>', 'Draft Spec JSON 文件')
546
+ .action(async (opts) => {
547
+ const draftSpec = readDraftSpec(opts.file);
548
+ const result = validateDraftSpec(draftSpec);
549
+ output(result, pretty());
550
+ if (!result.valid)
551
+ process.exitCode = 1;
552
+ });
553
+ spec.command('create')
554
+ .description('从 AI Draft Spec JSON 创建草稿')
555
+ .requiredOption('--file <path>', 'Draft Spec JSON 文件')
556
+ .action(async (opts) => {
557
+ const draftSpec = readDraftSpec(opts.file);
558
+ const result = await createDraftFromSpec(draftSpec);
559
+ output(result, pretty());
560
+ });
561
+ spec.command('render')
562
+ .description('从 AI Draft Spec JSON 创建草稿,并可提交云渲染')
563
+ .requiredOption('--file <path>', 'Draft Spec JSON 文件')
564
+ .option('--name <name>', '草稿显示名称')
565
+ .option('--drafts-dir <path>', '草稿输出目录')
566
+ .option('--cloud', '提交云渲染', false)
567
+ .option('--api-token <token>', 'API Token;也可使用 CUT_API_TOKEN 环境变量')
568
+ .option('--wait', '提交后持续轮询,直到渲染完成/失败或超时', false)
569
+ .option('--poll-interval <seconds>', '轮询间隔秒数;默认 15', '15')
570
+ .option('--timeout <seconds>', '最长等待秒数;默认 1800', '1800')
571
+ .option('--keep-zip', '保留临时 zip 文件', false)
572
+ .action(async (opts) => {
573
+ const fileInput = readJsonFile(opts.file);
574
+ const draftSpec = fileInput?.draft ? fileInput.draft : fileInput;
575
+ const fileRender = fileInput?.render && typeof fileInput.render === 'object' ? fileInput.render : undefined;
576
+ const shouldRender = Boolean(opts.cloud || fileRender?.cloud);
577
+ const apiToken = resolveApiToken(opts.apiToken || fileRender?.apiToken);
578
+ const result = await createAndRenderDraft({
579
+ draft: draftSpec,
580
+ output: {
581
+ name: opts.name || fileInput?.output?.name,
582
+ draftsDir: opts.draftsDir || fileInput?.output?.draftsDir,
583
+ },
584
+ render: shouldRender ? {
585
+ cloud: true,
586
+ apiToken,
587
+ keepZip: opts.keepZip || fileRender?.keepZip,
588
+ wait: opts.wait || fileRender?.wait,
589
+ pollIntervalMs: Number(opts.pollInterval) * 1000,
590
+ timeoutMs: Number(opts.timeout) * 1000,
591
+ } : false,
592
+ });
593
+ output(result, pretty());
594
+ });
595
+ // ========== AI-friendly single item commands ==========
596
+ program.command('image')
597
+ .description('便捷添加单个图片素材')
598
+ .command('add <draftId>')
599
+ .description('添加单个图片素材')
600
+ .requiredOption('--src <pathOrUrl>', '图片路径或 URL')
601
+ .option('--start <time>', '开始时间,如 0s、500ms、1000000us', '0s')
602
+ .option('--end <time>', '结束时间')
603
+ .option('--duration <time>', '持续时间')
604
+ .option('--width <n>', '图片宽度', '1080')
605
+ .option('--height <n>', '图片高度', '1920')
606
+ .option('--alpha <n>', '透明度')
607
+ .option('--scale-x <n>', 'X 缩放')
608
+ .option('--scale-y <n>', 'Y 缩放')
609
+ .option('--transform-x <n>', 'X 位置')
610
+ .option('--transform-y <n>', 'Y 位置')
611
+ .option('--in-animation <name>', '入场动画')
612
+ .option('--out-animation <name>', '出场动画')
613
+ .option('--loop-animation <name>', '循环动画')
614
+ .option('--in-animation-duration <time>', '入场动画时长')
615
+ .option('--out-animation-duration <time>', '出场动画时长')
616
+ .option('--loop-animation-duration <time>', '循环动画时长')
617
+ .option('--transition <name>', '转场效果')
618
+ .option('--transition-duration <time>', '转场时长')
619
+ .action(async (draftId, opts) => {
620
+ const time = resolveEndTime(opts);
621
+ const result = await addImages({
622
+ draftId,
623
+ imageInfos: [{
624
+ imageUrl: opts.src,
625
+ width: +opts.width,
626
+ height: +opts.height,
627
+ start: time.start,
628
+ end: time.end,
629
+ inAnimation: opts.inAnimation,
630
+ outAnimation: opts.outAnimation,
631
+ loopAnimation: opts.loopAnimation,
632
+ inAnimationDuration: parseTimeArg(opts.inAnimationDuration, 'in-animation-duration'),
633
+ outAnimationDuration: parseTimeArg(opts.outAnimationDuration, 'out-animation-duration'),
634
+ loopAnimationDuration: parseTimeArg(opts.loopAnimationDuration, 'loop-animation-duration'),
635
+ transition: opts.transition,
636
+ transitionDuration: parseTimeArg(opts.transitionDuration, 'transition-duration'),
637
+ }],
638
+ alpha: toNumber(opts.alpha),
639
+ scaleX: toNumber(opts.scaleX),
640
+ scaleY: toNumber(opts.scaleY),
641
+ transformX: toNumber(opts.transformX),
642
+ transformY: toNumber(opts.transformY),
643
+ });
644
+ output(result, pretty());
645
+ });
646
+ program.command('video')
647
+ .description('便捷添加单个视频素材')
648
+ .command('add <draftId>')
649
+ .description('添加单个视频素材')
650
+ .requiredOption('--src <pathOrUrl>', '视频路径或 URL')
651
+ .option('--start <time>', '开始时间,如 0s、500ms、1000000us', '0s')
652
+ .option('--end <time>', '结束时间')
653
+ .option('--duration <time>', '持续时间')
654
+ .option('--source-duration <time>', '源视频时长;默认等于持续时间')
655
+ .option('--width <n>', '视频宽度', '1080')
656
+ .option('--height <n>', '视频高度', '1920')
657
+ .option('--volume <n>', '音量')
658
+ .option('--alpha <n>', '透明度')
659
+ .option('--mask <name>', '遮罩名称')
660
+ .option('--transition <name>', '转场效果')
661
+ .option('--transition-duration <time>', '转场时长')
662
+ .option('--scale-x <n>', 'X 缩放')
663
+ .option('--scale-y <n>', 'Y 缩放')
664
+ .option('--transform-x <n>', 'X 位置')
665
+ .option('--transform-y <n>', 'Y 位置')
666
+ .action(async (draftId, opts) => {
667
+ const time = resolveEndTime(opts);
668
+ const sourceDuration = parseTimeArg(opts.sourceDuration, 'source-duration') ?? time.duration;
669
+ const result = await addVideos({
670
+ draftId,
671
+ videoInfos: [{
672
+ videoUrl: opts.src,
673
+ width: +opts.width,
674
+ height: +opts.height,
675
+ duration: sourceDuration,
676
+ start: time.start,
677
+ end: time.end,
678
+ volume: toNumber(opts.volume),
679
+ mask: opts.mask,
680
+ transition: opts.transition,
681
+ transitionDuration: parseTimeArg(opts.transitionDuration, 'transition-duration'),
682
+ }],
683
+ alpha: toNumber(opts.alpha),
684
+ scaleX: toNumber(opts.scaleX),
685
+ scaleY: toNumber(opts.scaleY),
686
+ transformX: toNumber(opts.transformX),
687
+ transformY: toNumber(opts.transformY),
688
+ });
689
+ output(result, pretty());
690
+ });
691
+ program.command('audio')
692
+ .description('便捷添加单个音频素材')
693
+ .command('add <draftId>')
694
+ .description('添加单个音频素材')
695
+ .requiredOption('--src <pathOrUrl>', '音频路径或 URL')
696
+ .option('--start <time>', '开始时间,如 0s、500ms、1000000us', '0s')
697
+ .option('--end <time>', '结束时间')
698
+ .option('--duration <time>', '持续时间')
699
+ .option('--source-duration <time>', '源音频时长;默认等于持续时间')
700
+ .option('--volume <n>', '音量')
701
+ .option('--audio-effect <name>', '音频效果')
702
+ .action(async (draftId, opts) => {
703
+ const time = resolveEndTime(opts);
704
+ const sourceDuration = parseTimeArg(opts.sourceDuration, 'source-duration') ?? time.duration;
705
+ const result = await addAudios({
706
+ draftId,
707
+ audioInfos: [{
708
+ audioUrl: opts.src,
709
+ duration: sourceDuration,
710
+ start: time.start,
711
+ end: time.end,
712
+ volume: opts.volume ? +opts.volume : undefined,
713
+ audioEffect: opts.audioEffect,
714
+ }],
715
+ });
716
+ output(result, pretty());
717
+ });
718
+ program.command('text')
719
+ .description('便捷添加单条字幕')
720
+ .command('add <draftId>')
721
+ .description('添加单条字幕')
722
+ .requiredOption('--text <text>', '字幕文本')
723
+ .option('--start <time>', '开始时间,如 0s、500ms、1000000us', '0s')
724
+ .option('--end <time>', '结束时间')
725
+ .option('--duration <time>', '持续时间')
726
+ .option('--font <name>', '字体名称')
727
+ .option('--font-size <n>', '字号')
728
+ .option('--text-color <hex>', '文字颜色')
729
+ .option('--bold', '加粗')
730
+ .option('--italic', '斜体')
731
+ .option('--underline', '下划线')
732
+ .option('--alignment <n>', '对齐方式')
733
+ .option('--alpha <n>', '透明度')
734
+ .option('--text-effect <name>', '花字/文字特效名称')
735
+ .option('--border-color <hex>', '描边颜色')
736
+ .option('--letter-spacing <n>', '字间距')
737
+ .option('--line-spacing <n>', '行间距')
738
+ .option('--style-text', '使用纯文本样式内容')
739
+ .option('--shadow', '启用阴影')
740
+ .option('--shadow-color <hex>', '阴影颜色')
741
+ .option('--shadow-alpha <n>', '阴影透明度')
742
+ .option('--shadow-diffuse <n>', '阴影模糊')
743
+ .option('--shadow-distance <n>', '阴影距离')
744
+ .option('--shadow-angle <n>', '阴影角度')
745
+ .option('--keyword <text>', '关键词')
746
+ .option('--keyword-color <hex>', '关键词颜色')
747
+ .option('--keyword-font-size <n>', '关键词字号')
748
+ .option('--scale-x <n>', 'X 缩放')
749
+ .option('--scale-y <n>', 'Y 缩放')
750
+ .option('--transform-x <n>', 'X 位置')
751
+ .option('--transform-y <n>', 'Y 位置')
752
+ .option('--in-animation <name>', '入场动画')
753
+ .option('--out-animation <name>', '出场动画')
754
+ .option('--loop-animation <name>', '循环动画')
755
+ .option('--in-animation-duration <time>', '入场动画时长')
756
+ .option('--out-animation-duration <time>', '出场动画时长')
757
+ .option('--loop-animation-duration <time>', '循环动画时长')
758
+ .action(async (draftId, opts) => {
759
+ const time = resolveEndTime(opts);
760
+ const result = await addCaptions({
761
+ draftId,
762
+ captions: [{
763
+ text: opts.text,
764
+ start: time.start,
765
+ end: time.end,
766
+ keyword: opts.keyword,
767
+ keywordColor: opts.keywordColor,
768
+ fontSize: toNumber(opts.fontSize),
769
+ keywordFontSize: opts.keywordFontSize ? +opts.keywordFontSize : undefined,
770
+ inAnimation: opts.inAnimation,
771
+ outAnimation: opts.outAnimation,
772
+ loopAnimation: opts.loopAnimation,
773
+ inAnimationDuration: parseTimeArg(opts.inAnimationDuration, 'in-animation-duration'),
774
+ outAnimationDuration: parseTimeArg(opts.outAnimationDuration, 'out-animation-duration'),
775
+ loopAnimationDuration: parseTimeArg(opts.loopAnimationDuration, 'loop-animation-duration'),
776
+ }],
777
+ font: opts.font,
778
+ alignment: toNumber(opts.alignment),
779
+ alpha: toNumber(opts.alpha),
780
+ fontSize: toNumber(opts.fontSize),
781
+ textColor: opts.textColor,
782
+ bold: opts.bold,
783
+ italic: opts.italic,
784
+ underline: opts.underline,
785
+ textEffect: opts.textEffect,
786
+ borderColor: opts.borderColor,
787
+ letterSpacing: toNumber(opts.letterSpacing),
788
+ lineSpacing: toNumber(opts.lineSpacing),
789
+ styleText: opts.styleText,
790
+ hasShadow: hasShadow(opts),
791
+ shadowInfo: buildShadowInfo(opts),
792
+ scaleX: toNumber(opts.scaleX),
793
+ scaleY: toNumber(opts.scaleY),
794
+ transformX: toNumber(opts.transformX),
795
+ transformY: toNumber(opts.transformY),
796
+ });
797
+ output(result, pretty());
798
+ });
799
+ program.command('effect')
800
+ .description('便捷添加单个特效')
801
+ .command('add <draftId>')
802
+ .description('添加单个特效')
803
+ .requiredOption('--effect-title <name>', '特效名称')
804
+ .option('--start <time>', '开始时间,如 0s、500ms、1000000us', '0s')
805
+ .option('--end <time>', '结束时间')
806
+ .option('--duration <time>', '持续时间')
807
+ .action(async (draftId, opts) => {
808
+ const time = resolveEndTime(opts);
809
+ const result = await addEffects({
810
+ draftId,
811
+ effectInfos: [{ effectTitle: opts.effectTitle, start: time.start, end: time.end }],
812
+ });
813
+ output(result, pretty());
814
+ });
815
+ program.command('keyframe')
816
+ .description('便捷添加单个关键帧')
817
+ .command('add <draftId>')
818
+ .description('添加单个关键帧')
819
+ .requiredOption('--segment-id <id>', '片段ID')
820
+ .requiredOption('--property <name>', '关键帧属性')
821
+ .requiredOption('--offset <time>', '片段内偏移时间,如 500ms')
822
+ .requiredOption('--value <n>', '关键帧值')
823
+ .action(async (draftId, opts) => {
824
+ const result = await addKeyframes({
825
+ draftId,
826
+ keyframes: [{
827
+ segmentId: opts.segmentId,
828
+ property: opts.property,
829
+ offset: parseTimeArg(opts.offset, 'offset') ?? 0,
830
+ value: Number(opts.value),
831
+ }],
832
+ });
833
+ output(result, pretty());
834
+ });
835
+ // ========== config ==========
836
+ const configCmd = program.command('config').description('配置检查');
837
+ configCmd.command('show')
838
+ .description('显示 cutcli 当前读取到的配置')
839
+ .action(async () => {
840
+ const savedConfig = readCutcliConfig();
841
+ const apiToken = resolveApiToken();
842
+ output({
843
+ draftsDir: getDefaultDraftsDir(),
844
+ configPath: getCutcliConfigPath(),
845
+ hasApiToken: Boolean(apiToken),
846
+ apiToken: apiToken ? '<set>' : undefined,
847
+ backendUrl: 'https://cutsdk-api.51sux.com',
848
+ env: {
849
+ CUT_DRAFTS_DIR: process.env.CUT_DRAFTS_DIR,
850
+ CUT_API_TOKEN: process.env.CUT_API_TOKEN ? '<set>' : undefined,
851
+ },
852
+ saved: {
853
+ apiToken: savedConfig.apiToken ? '<set>' : undefined,
854
+ },
855
+ }, pretty());
856
+ });
857
+ configCmd.command('doctor')
858
+ .description('检查 cutcli 常用配置是否可用')
859
+ .action(async () => {
860
+ const draftsDir = getDefaultDraftsDir();
861
+ const savedConfig = readCutcliConfig();
862
+ const apiToken = resolveApiToken();
863
+ const checks = [
864
+ {
865
+ name: 'draftsDir',
866
+ ok: fs_1.default.existsSync(draftsDir),
867
+ value: draftsDir,
868
+ message: fs_1.default.existsSync(draftsDir) ? '草稿目录存在' : '草稿目录不存在;创建草稿时通常会自动创建',
869
+ },
870
+ {
871
+ name: 'apiToken',
872
+ ok: Boolean(apiToken),
873
+ value: apiToken ? '<set>' : undefined,
874
+ message: apiToken
875
+ ? `云渲染 token 已设置${savedConfig.apiToken ? '(来自 cutcli login 或环境变量)' : '(来自环境变量)'}`
876
+ : '未设置 API Token;运行 cutcli login --api-token <token> 后可使用云渲染',
877
+ },
878
+ ];
879
+ output({ ok: checks.every((check) => check.ok || check.name === 'apiToken'), checks }, pretty());
880
+ });
881
+ // ========== cloud ==========
882
+ const cloud = program.command('cloud').description('云渲染');
883
+ cloud.command('render <draftId>')
884
+ .description('上传草稿并创建云渲染任务')
885
+ .option('--draft-path <path>', '草稿目录路径;默认使用 CUT_DRAFTS_DIR/<draftId>')
886
+ .option('--zip-path <path>', '指定已有 zip 文件路径')
887
+ .option('--api-token <token>', 'API Token;也可使用 CUT_API_TOKEN 环境变量')
888
+ .option('--wait', '提交后持续轮询,直到渲染完成/失败或超时', false)
889
+ .option('--poll-interval <seconds>', '轮询间隔秒数;默认 15', '15')
890
+ .option('--timeout <seconds>', '最长等待秒数;默认 1800', '1800')
891
+ .option('--keep-zip', '保留临时 zip 文件', false)
892
+ .action(async (draftId, opts) => {
893
+ const result = await renderDraft({
894
+ draftId,
895
+ draftPath: opts.draftPath,
896
+ zipPath: opts.zipPath,
897
+ apiToken: resolveApiToken(opts.apiToken),
898
+ keepZip: opts.keepZip,
899
+ wait: opts.wait,
900
+ pollIntervalMs: Number(opts.pollInterval) * 1000,
901
+ timeoutMs: Number(opts.timeout) * 1000,
902
+ onPoll: opts.wait ? (job) => console.error(`[cloud] job ${job.id}: ${job.status}`) : undefined,
903
+ });
904
+ output(result, pretty());
905
+ });
906
+ cloud.command('result <jobId>')
907
+ .description('查看云渲染任务结果')
908
+ .option('--api-token <token>', 'API Token;也可使用 CUT_API_TOKEN 环境变量')
909
+ .action(async (jobId, opts) => {
910
+ const result = await getCloudRenderStatus({
911
+ taskId: jobId,
912
+ apiToken: resolveApiToken(opts.apiToken),
913
+ });
914
+ output(result, pretty());
915
+ });
916
+ cloud.command('render-legacy <draftUrl>')
917
+ .description('使用旧 submit_video_render_task 接口提交云渲染任务')
918
+ .option('--api-token <token>', 'API Token;也可使用 CUT_API_TOKEN 环境变量')
919
+ .action(async (draftUrl, opts) => {
920
+ const result = await submitVideoRenderTask({
921
+ draftUrl,
922
+ apiToken: resolveApiToken(opts.apiToken),
923
+ });
924
+ output(result, pretty());
925
+ });
926
+ const agents = program.command('agents').description('AI Agent 项目辅助');
927
+ agents.command('install')
928
+ .description('把 cutcli/cutsdk 使用说明安装到当前项目的 .agents 和 cutcli-docs 目录')
929
+ .option('--dir <path>', '目标项目目录', process.cwd())
930
+ .option('--force', '覆盖已有 .agents 或 cutcli-docs 目录', false)
931
+ .action(async (opts) => {
932
+ const targetDir = path_1.default.resolve(opts.dir);
933
+ const result = copyProjectTemplate(targetDir, Boolean(opts.force));
934
+ output(result, pretty());
935
+ });
936
+ return program;
937
+ }
938
+ async function run() {
939
+ await createProgram().parseAsync(process.argv);
940
+ }
941
+ function shouldUseJsonErrors(argv = process.argv) {
942
+ return process.env.CUTCLI_JSON_ERRORS === '1' || argv.includes('--json-errors');
943
+ }
944
+ function formatCliError(err) {
945
+ const code = err?.code;
946
+ let msg = err?.message || String(err);
947
+ if (code === 'INVALID_INPUT') {
948
+ return `输入参数无效:${msg}`;
949
+ }
950
+ if (code === 'DRAFT_NOT_FOUND') {
951
+ return `未找到草稿,请确认草稿 ID 是否正确。`;
952
+ }
953
+ if (code === 'MISSING_API_TOKEN') {
954
+ return `未设置 API Token;运行 cutcli login --api-token <token> 后可使用云渲染`;
955
+ }
956
+ if (code === 'INVALID_TIME' || msg.includes('time') || msg.includes('duration')) {
957
+ return `时间格式错误;支持 1.5s、300ms、1500000us`;
958
+ }
959
+ return msg;
960
+ }
961
+ function serializeCliError(err) {
962
+ return {
963
+ ok: false,
964
+ error: {
965
+ name: err?.name || 'Error',
966
+ code: err?.code,
967
+ message: err?.message || String(err),
968
+ humanMessage: formatCliError(err),
969
+ operation: err?.operation,
970
+ path: err?.path,
971
+ status: err?.status,
972
+ details: err?.details,
973
+ },
974
+ };
975
+ }
976
+ if (require.main === module) {
977
+ run().catch((err) => {
978
+ if (shouldUseJsonErrors()) {
979
+ console.error(JSON.stringify(serializeCliError(err)));
980
+ }
981
+ else {
982
+ console.error(formatCliError(err));
983
+ }
984
+ process.exit(1);
985
+ });
986
+ }
987
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,29 @@
1
1
  {
2
2
  "name": "@cutcli/cutcli",
3
- "version": "0.0.1",
4
- "description": "Reserved package name for CutCLI.",
5
- "main": "index.js",
3
+ "version": "1.1.1",
4
+ "description": "AI 友好的 CapCut / 剪映草稿命令行工具",
5
+ "main": "dist/cli.js",
6
+ "types": "dist/cli.d.ts",
7
+ "license": "MIT",
8
+ "author": "m007",
6
9
  "bin": {
7
- "cutcli": "index.js"
10
+ "cutcli": "dist/cli.js"
8
11
  },
9
- "license": "MIT"
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "scripts": {
16
+ "build": "rm -rf dist && tsc -p tsconfig.json",
17
+ "test": "npm run build && node dist/cli.js --help >/dev/null && node dist/cli.js spec --help >/dev/null && node dist/cli.js config --help >/dev/null",
18
+ "start": "node dist/cli.js"
19
+ },
20
+ "dependencies": {
21
+ "commander": "^12.1.0",
22
+ "cutsdk": "1.1.1",
23
+ "dotenv": "^16.4.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^20.0.0",
27
+ "typescript": "^5.4.0"
28
+ }
10
29
  }
package/index.js DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- console.log('@cutcli/cutcli package reserved');