cutsdk 1.1.2 → 1.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.
- package/README.md +27 -15
- package/dist/api/setup/install-project-docs.d.ts +13 -0
- package/dist/api/setup/install-project-docs.d.ts.map +1 -0
- package/dist/api/setup/install-project-docs.js +47 -0
- package/dist/api/setup/install-project-docs.js.map +1 -0
- package/dist/api/setup/templates/project/.agents/skills/cut-draft/SKILL.md +93 -66
- package/dist/api/setup/templates/project/cutcli-docs/README.md +24 -3
- package/dist/api/setup/templates/project/cutcli-docs/api-cheatsheet.md +23 -9
- package/dist/api/setup/templates/project/cutcli-docs/examples/02-draft-spec.ts +10 -3
- package/dist/api/setup/templates/project/cutcli-docs/material-browser.html +1 -1
- package/dist/api/setup/templates/project/cutcli-docs/quickstart.md +64 -46
- package/dist/bin/cutsdk.d.ts +3 -0
- package/dist/bin/cutsdk.d.ts.map +1 -0
- package/dist/bin/cutsdk.js +73 -0
- package/dist/bin/cutsdk.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
CapCut / 剪映草稿 Node.js SDK。用于代码化、批量化创建剪映标准草稿,可直接被剪映桌面端打开,也可提交云渲染。
|
|
4
4
|
|
|
5
5
|
- npm 包名:`cutsdk`
|
|
6
|
-
- 当前发布版本:`1.1.
|
|
6
|
+
- 当前发布版本:`1.1.4`(SDK 和 CLI 统一版本)
|
|
7
7
|
- 版本迭代记录:[CHANGELOG.md](./CHANGELOG.md)
|
|
8
8
|
|
|
9
9
|
- Node.js SDK,用于服务端、脚本和批量生成视频
|
|
@@ -58,26 +58,34 @@ await addCaptions({
|
|
|
58
58
|
|
|
59
59
|
### AI Draft Spec
|
|
60
60
|
|
|
61
|
-
面向 AI
|
|
61
|
+
面向 AI 自动生成草稿、本地素材拼接和批量混剪时,推荐使用单一 JSON Spec,并用 `createAndRenderDraft` 统一处理输出目录、草稿名和可选云渲染:
|
|
62
62
|
|
|
63
63
|
```typescript
|
|
64
|
-
import {
|
|
65
|
-
|
|
66
|
-
await
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
64
|
+
import { createAndRenderDraft } from 'cutsdk';
|
|
65
|
+
|
|
66
|
+
await createAndRenderDraft({
|
|
67
|
+
draft: {
|
|
68
|
+
version: '1.0',
|
|
69
|
+
canvas: { width: 1080, height: 1920 },
|
|
70
|
+
duration: '3s',
|
|
71
|
+
tracks: [
|
|
72
|
+
{
|
|
73
|
+
type: 'text',
|
|
74
|
+
clips: [{ type: 'caption', text: '你好世界', start: '0s', duration: '3s' }],
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
output: {
|
|
79
|
+
draftsDir: '/Users/x013/jy_draft/JianyingPro Drafts',
|
|
80
|
+
name: '测试草稿',
|
|
81
|
+
},
|
|
82
|
+
render: false,
|
|
76
83
|
});
|
|
77
84
|
```
|
|
78
85
|
|
|
79
86
|
Spec 只是编排层,底层仍复用现有草稿创建和素材添加方法,保证导出的草稿格式不变。
|
|
80
87
|
顶层 `duration` 可选;不传时会按时间线 clips 自动计算草稿总时长。
|
|
88
|
+
`createDraftFromSpec(spec)` 也可直接创建草稿,但不能传输出目录和草稿名;需要这些控制时使用 `createAndRenderDraft`。
|
|
81
89
|
|
|
82
90
|
需要创建后直接提交云渲染时,可以使用一站式 SDK:
|
|
83
91
|
|
|
@@ -107,6 +115,8 @@ const result = await createAndRenderDraft({
|
|
|
107
115
|
console.log(result.render?.videoUrl);
|
|
108
116
|
```
|
|
109
117
|
|
|
118
|
+
当前 Draft Spec 有两个批量限制需要提前考虑:同一个 Spec 内图片/视频 `transform` 会整批应用,不能每段素材独立设置不同 scale/position;字幕 `style`/`position` 也会整批应用,不能每条字幕完全不同位置样式。需要逐片段差异化时,先用 Spec 创建主体,再在 `afterCreate` 或低层 SDK API 里补后处理。
|
|
119
|
+
|
|
110
120
|
### 云渲染 API Token 配置
|
|
111
121
|
|
|
112
122
|
`cutsdk` 和 `cutcli` 均支持将生成的草稿打包并提交至云端进行快速渲染。使用云渲染需要配置 API Token,有以下三种方式:
|
|
@@ -137,9 +147,11 @@ console.log(result.render?.videoUrl);
|
|
|
137
147
|
CLI 可把项目级 AI 使用说明安装到业务项目:
|
|
138
148
|
|
|
139
149
|
```bash
|
|
140
|
-
|
|
150
|
+
npm install cutsdk && npx cutsdk init
|
|
141
151
|
```
|
|
142
152
|
|
|
153
|
+
如果项目里已存在 `.agents/skills/cut-draft` 或 `cutcli-docs`,`npx cutsdk init` 会询问是否覆盖更新;输入 `y` 或 `yes` 才会覆盖。需要跳过询问时使用 `npx cutsdk init --force`。
|
|
154
|
+
|
|
143
155
|
模板位于 `src/api/setup/templates/project/`,包含 `.agents/skills/cut-draft/SKILL.md`、SDK 快速开始、API 速查和示例代码。
|
|
144
156
|
|
|
145
157
|
## 文档
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface InstallProjectDocsOptions {
|
|
2
|
+
dir?: string;
|
|
3
|
+
force?: boolean;
|
|
4
|
+
onConflict?: (paths: string[]) => boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface InstallProjectDocsResult {
|
|
7
|
+
targetDir: string;
|
|
8
|
+
installed: string[];
|
|
9
|
+
skipped: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function getProjectDocConflicts(options?: Pick<InstallProjectDocsOptions, 'dir'>): string[];
|
|
12
|
+
export declare function installProjectDocs(options?: InstallProjectDocsOptions): InstallProjectDocsResult;
|
|
13
|
+
//# sourceMappingURL=install-project-docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-project-docs.d.ts","sourceRoot":"","sources":["../../../src/api/setup/install-project-docs.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,yBAAyB;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;CAC3C;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAsBD,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,IAAI,CAAC,yBAAyB,EAAE,KAAK,CAAM,GAAG,MAAM,EAAE,CAKrG;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,wBAAwB,CAmBpG"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getProjectDocConflicts = getProjectDocConflicts;
|
|
7
|
+
exports.installProjectDocs = installProjectDocs;
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
function getProjectDocTargets(targetDir) {
|
|
11
|
+
const sourceDir = path_1.default.join(__dirname, 'templates', 'project');
|
|
12
|
+
if (!fs_1.default.existsSync(sourceDir)) {
|
|
13
|
+
throw new Error(`cutsdk project template not found: ${sourceDir}`);
|
|
14
|
+
}
|
|
15
|
+
return [
|
|
16
|
+
{
|
|
17
|
+
from: path_1.default.join(sourceDir, '.agents', 'skills', 'cut-draft'),
|
|
18
|
+
to: path_1.default.join(targetDir, '.agents', 'skills', 'cut-draft'),
|
|
19
|
+
},
|
|
20
|
+
{ from: path_1.default.join(sourceDir, 'cutcli-docs'), to: path_1.default.join(targetDir, 'cutcli-docs') },
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
function getProjectDocConflicts(options = {}) {
|
|
24
|
+
const targetDir = path_1.default.resolve(options.dir || process.cwd());
|
|
25
|
+
return getProjectDocTargets(targetDir)
|
|
26
|
+
.filter((item) => fs_1.default.existsSync(item.to))
|
|
27
|
+
.map((item) => item.to);
|
|
28
|
+
}
|
|
29
|
+
function installProjectDocs(options = {}) {
|
|
30
|
+
const targetDir = path_1.default.resolve(options.dir || process.cwd());
|
|
31
|
+
const targets = getProjectDocTargets(targetDir);
|
|
32
|
+
const conflicts = targets.filter((item) => fs_1.default.existsSync(item.to)).map((item) => item.to);
|
|
33
|
+
const overwriteConflicts = Boolean(options.force || (conflicts.length > 0 && options.onConflict?.(conflicts)));
|
|
34
|
+
const installed = [];
|
|
35
|
+
const skipped = [];
|
|
36
|
+
for (const item of targets) {
|
|
37
|
+
const exists = fs_1.default.existsSync(item.to);
|
|
38
|
+
if (exists && !overwriteConflicts) {
|
|
39
|
+
skipped.push(item.to);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
fs_1.default.cpSync(item.from, item.to, { recursive: true, force: exists ? overwriteConflicts : true });
|
|
43
|
+
installed.push(item.to);
|
|
44
|
+
}
|
|
45
|
+
return { targetDir, installed, skipped };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=install-project-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-project-docs.js","sourceRoot":"","sources":["../../../src/api/setup/install-project-docs.ts"],"names":[],"mappings":";;;;;AAmCA,wDAKC;AAED,gDAmBC;AA7DD,4CAAoB;AACpB,gDAAwB;AAmBxB,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC/D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO;QACL;YACE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC;YAC5D,EAAE,EAAE,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC;SAC3D;QACD,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,EAAE,EAAE,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE;KACvF,CAAC;AACJ,CAAC;AAED,SAAgB,sBAAsB,CAAC,UAAkD,EAAE;IACzF,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7D,OAAO,oBAAoB,CAAC,SAAS,CAAC;SACnC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,kBAAkB,CAAC,UAAqC,EAAE;IACxE,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1F,MAAM,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAE/G,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QACD,YAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9F,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cut-draft
|
|
3
3
|
description: >-
|
|
4
|
-
使用 cutsdk 创建和操作剪映/CapCut
|
|
5
|
-
|
|
4
|
+
使用 cutsdk/cutcli 创建和操作剪映/CapCut 草稿。用户想批量生成草稿、本地素材混剪、Agent 自动编排、
|
|
5
|
+
添加字幕/图片/视频/音频/特效/贴纸/关键帧/遮罩,或提到 Draft Spec、剪映、草稿、cutcli、cutsdk、CapCut draft 时使用此 skill。
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# cutcli 项目级 Skill
|
|
8
|
+
# cutsdk / cutcli 项目级 Skill
|
|
9
9
|
|
|
10
|
-
`cutsdk` 是用于创建剪映/CapCut 桌面端草稿文件夹的 Node.js SDK
|
|
10
|
+
`cutsdk` 是用于创建剪映/CapCut 桌面端草稿文件夹的 Node.js SDK;`cutcli` 是命令行辅助工具。生成后的草稿可直接在剪映桌面端打开。
|
|
11
11
|
|
|
12
12
|
## 先读这些
|
|
13
13
|
|
|
@@ -17,21 +17,71 @@ description: >-
|
|
|
17
17
|
2. `cutcli-docs/quickstart.md`
|
|
18
18
|
3. `cutcli-docs/api-cheatsheet.md`
|
|
19
19
|
|
|
20
|
-
实现时优先从 `cutcli-docs/examples/`
|
|
20
|
+
实现时优先从 `cutcli-docs/examples/` 里选择最接近的示例改起。需要挑选花字、特效、贴纸、转场时,打开 `cutcli-docs/material-browser.html`。
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## 推荐路径
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
1. **首选:AI Draft Spec + `createAndRenderDraft`**
|
|
25
|
+
用于本地素材拼接、批量生成草稿、Agent 自动编排、多轨时间线和模板化复用。需要指定草稿目录或草稿名时,使用 `createAndRenderDraft({ draft: spec, output, render: false })`。
|
|
26
|
+
2. **次选:SDK 函数式 API**
|
|
27
|
+
用于创建后补关键帧、遮罩、特殊后处理,或 Draft Spec 暂未覆盖的能力。优先放在 `createAndRenderDraft` 的 `afterCreate` 里执行。
|
|
28
|
+
3. **最后:`cutcli` 单命令**
|
|
29
|
+
用于临时测试、单素材追加、人工命令行调试。批量混剪不要围绕一串 CLI add 命令组织,优先生成 Spec。
|
|
30
|
+
|
|
31
|
+
## 主路径示例
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import { createAndRenderDraft, validateDraftSpec } from 'cutsdk';
|
|
35
|
+
|
|
36
|
+
const spec = {
|
|
37
|
+
version: '1.0',
|
|
38
|
+
canvas: { width: 1080, height: 1920 },
|
|
39
|
+
duration: '6s',
|
|
40
|
+
assets: {
|
|
41
|
+
cover: { type: 'image', src: '/absolute/path/cover.png', width: 1080, height: 1920 },
|
|
42
|
+
bgm: { type: 'audio', src: '/absolute/path/bgm.mp3', duration: '6s' },
|
|
43
|
+
},
|
|
44
|
+
tracks: [
|
|
45
|
+
{
|
|
46
|
+
type: 'visual',
|
|
47
|
+
clips: [{ type: 'image', asset: 'cover', start: '0s', duration: '6s' }],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
type: 'text',
|
|
51
|
+
clips: [{ type: 'caption', text: '批量混剪示例', start: '0s', duration: '6s', position: 'bottom' }],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'audio',
|
|
55
|
+
clips: [{ type: 'audio', asset: 'bgm', start: '0s', duration: '6s', volume: 0.7 }],
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
} as const;
|
|
59
|
+
|
|
60
|
+
const validation = validateDraftSpec(spec);
|
|
61
|
+
if (!validation.valid) {
|
|
62
|
+
throw new Error(JSON.stringify(validation.errors, null, 2));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const result = await createAndRenderDraft({
|
|
66
|
+
draft: spec,
|
|
67
|
+
output: {
|
|
68
|
+
draftsDir: '/absolute/path/JianyingPro Drafts',
|
|
69
|
+
name: '批量混剪-001',
|
|
70
|
+
},
|
|
71
|
+
render: false,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
console.log(result.draft.filePath);
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`createDraftFromSpec(spec)` 只能按当前配置创建草稿,不能直接传输出目录和草稿名;需要控制 `draftsDir` 或 `name` 时,使用上面的 `createAndRenderDraft`。
|
|
28
78
|
|
|
29
79
|
## 关键规则
|
|
30
80
|
|
|
31
81
|
- 包导入名是 `cutsdk`。
|
|
32
|
-
- 低层 SDK
|
|
33
|
-
-
|
|
34
|
-
- 默认草稿目录是 `~/Movies/JianyingPro Drafts/{draftId}/`;可通过 `CUT_DRAFTS_DIR` 覆盖。
|
|
82
|
+
- 低层 SDK 的数字时间单位是微秒,`1s = 1000000`。
|
|
83
|
+
- AI Draft Spec 和 `cutcli` 便捷命令可写 `1.5s`、`500ms`、`300000us`。
|
|
84
|
+
- 默认草稿目录是 `~/Movies/JianyingPro Drafts/{draftId}/`;可通过 `CUT_DRAFTS_DIR` 或 `createAndRenderDraft().output.draftsDir` 覆盖。
|
|
35
85
|
- 媒体本地路径和 URL 都可用:本地路径会复制到草稿 `resources/`,URL 会下载到 `resources/`。
|
|
36
86
|
- 图片必须提供 `width` 和 `height`。
|
|
37
87
|
- 使用低层 API 添加视频或音频时,要提供素材原始时长。
|
|
@@ -40,64 +90,41 @@ description: >-
|
|
|
40
90
|
- 云渲染只有 `status = 7` 才算成功并写入 `video_url`;`0/1/2` 表示等待或处理中,`3/5/6` 表示失败终态。
|
|
41
91
|
- AI 调用 CLI 时,如需结构化错误,使用 `--json-errors` 或 `CUTCLI_JSON_ERRORS=1`。
|
|
42
92
|
|
|
43
|
-
##
|
|
93
|
+
## 当前 Spec 限制
|
|
44
94
|
|
|
45
|
-
|
|
95
|
+
- 同一个 Spec 内,图片 `transform` 会被合并成一次 `addImages` 批量参数;所有图片的 `scaleX`、`scaleY`、`x`、`y`、`alpha` 必须一致,不能每张图独立设置。
|
|
96
|
+
- 同一个 Spec 内,视频 `transform` 同理会整批应用,不能每段视频独立设置不同 transform。
|
|
97
|
+
- 同一个 Spec 内,字幕 `style` 和 `position` 会被合并成一次 `addCaptions` 批量参数;不要在多条字幕上设置完全不同的位置或样式。
|
|
98
|
+
- 需要逐片段差异化 transform、字幕位置、遮罩或关键帧时,先用 Spec 创建主体,再用 `afterCreate` 或低层 SDK API 后处理。
|
|
46
99
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
{ "type": "caption", "text": "你好剪映", "start": "0s", "duration": "3s" }
|
|
56
|
-
]
|
|
57
|
-
}
|
|
58
|
-
]
|
|
59
|
-
}
|
|
60
|
-
```
|
|
100
|
+
## 转场和素材名
|
|
101
|
+
|
|
102
|
+
- 不要凭空编造转场、动画、花字或特效名。
|
|
103
|
+
- 当前 CLI 可查询:`cutcli query image-animations --type in|out|loop`、`cutcli query text-effects --keyword 火焰 --limit 5`。
|
|
104
|
+
- 转场优先从 `cutcli-docs/material-browser.html` 挑选名称;当前 CLI 还没有 `cutcli query transitions`,不要把它当成可用命令。
|
|
105
|
+
- 如果遇到类似 `Cannot read properties of null` 的转场错误,通常是转场名没有匹配到。换成素材库中存在的名称,或先去掉转场完成草稿生成。
|
|
106
|
+
|
|
107
|
+
## CLI 只作为补充
|
|
61
108
|
|
|
62
|
-
|
|
109
|
+
常用命令:
|
|
63
110
|
|
|
64
111
|
```bash
|
|
65
112
|
cutcli spec validate --file draft.json --pretty
|
|
66
|
-
cutcli spec
|
|
113
|
+
cutcli spec render --file draft.json --name "批量混剪-001" --drafts-dir "/absolute/path/JianyingPro Drafts" --pretty
|
|
114
|
+
cutcli text add <draftId> --text "标题" --start 0s --duration 3s --font-size 8
|
|
115
|
+
cutcli image add <draftId> --src ./素材/bg.png --start 0s --duration 5s --width 1080 --height 1920
|
|
116
|
+
cutcli audio add <draftId> --src ./素材/bgm.mp3 --start 0s --duration 20s
|
|
67
117
|
```
|
|
68
118
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
```env
|
|
82
|
-
CUT_API_TOKEN=your_token
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
3. **SDK 参数显式传入**:
|
|
86
|
-
在调用一站式 SDK 时显式设置 `apiToken` 字段:
|
|
87
|
-
```typescript
|
|
88
|
-
render: {
|
|
89
|
-
cloud: true,
|
|
90
|
-
apiToken: 'your_api_token'
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
`cutcli config show` 可检查配置状态,它只会显示 `<set>`,不会打印 Token 明文。
|
|
95
|
-
|
|
96
|
-
## 常见坑
|
|
97
|
-
|
|
98
|
-
1. 不要混用包名。除非项目明确覆盖,否则始终使用 `cutsdk`。
|
|
99
|
-
2. 本地拼接优先用 `cutcli image/video/audio/text add`;批量 JSON 命令只在需要一次添加多段素材时使用。
|
|
100
|
-
3. 不要把“秒”直接作为低层 API 的数字传入。数字 `3` 表示 3 微秒,不是 3 秒。
|
|
101
|
-
4. 对动画/特效名有精确要求时,不要凭空编造。先用 CLI 查询可用资源,或使用项目里已有示例。
|
|
102
|
-
5. 除非 SDK 无法表达目标操作,否则不要手动改剪映草稿 JSON。
|
|
103
|
-
6. 生成复杂时间线时,先用 `cutcli spec validate --file draft.json` 或 `validateDraftSpec(spec)` 校验 Draft Spec。
|
|
119
|
+
不要使用文档外的旧目录配置命令或旧内置文档命令。配置检查使用:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
cutcli config show --pretty
|
|
123
|
+
cutcli config doctor --pretty
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## 产品改进记录
|
|
127
|
+
|
|
128
|
+
- 更友好的 Spec 模板 DSL 可以建立在 Draft Spec 之上,例如 `createMontage({ output, canvas, durationPerImage, images, captions, style })`,内部展开为标准 Draft Spec。
|
|
129
|
+
- 后续 SDK 可在 Spec validate 阶段校验转场名,错误提示应类似:`transition xxx not found,建议使用素材浏览器或 query transitions 返回的名称`。
|
|
130
|
+
- 后续 SDK 可返回 `actualPath`、`displayName`、`draftFolderName`,并支持 `cleanupOnFailure: true` 清理失败半成品。
|
|
@@ -15,13 +15,15 @@
|
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
17
|
npm install cutsdk
|
|
18
|
+
npx cutsdk init
|
|
18
19
|
```
|
|
19
20
|
|
|
21
|
+
如果项目里已存在 `.agents/skills/cut-draft` 或 `cutcli-docs`,`npx cutsdk init` 会询问是否覆盖更新;输入 `y` 或 `yes` 才会覆盖。需要跳过询问时使用 `npx cutsdk init --force`。
|
|
22
|
+
|
|
20
23
|
如果要使用 CLI:
|
|
21
24
|
|
|
22
25
|
```bash
|
|
23
26
|
npm install -g @cutcli/cutcli
|
|
24
|
-
cutcli agents install
|
|
25
27
|
cutcli login <apiToken>
|
|
26
28
|
cutcli spec validate --file draft.json
|
|
27
29
|
cutcli spec create --file draft.json
|
|
@@ -73,9 +75,22 @@ Token 会保存到本机 `~/.cutcli/config.json`,输出中只显示 `<set>`。
|
|
|
73
75
|
|
|
74
76
|
## 推荐优先使用
|
|
75
77
|
|
|
76
|
-
AI
|
|
78
|
+
AI 生成视频草稿、本地素材拼接、批量混剪和 Agent 自动编排时,优先使用 AI Draft Spec + `createAndRenderDraft`。它允许用一个 JSON 对象描述完整时间线,并在同一次调用里指定输出目录、草稿名和可选云渲染。
|
|
79
|
+
|
|
80
|
+
`createDraftFromSpec(spec)` 只能按当前配置创建草稿,不能直接传输出目录和草稿名;需要 `draftsDir` 或 `name` 时使用:
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
await createAndRenderDraft({
|
|
84
|
+
draft: spec,
|
|
85
|
+
output: {
|
|
86
|
+
draftsDir: process.env.CUT_DRAFTS_DIR,
|
|
87
|
+
name: '批量混剪-001',
|
|
88
|
+
},
|
|
89
|
+
render: false,
|
|
90
|
+
});
|
|
91
|
+
```
|
|
77
92
|
|
|
78
|
-
|
|
93
|
+
创建草稿后还需要补充高级操作时,优先使用 `createAndRenderDraft` 的 `afterCreate`,或直接调用低层 API。
|
|
79
94
|
|
|
80
95
|
使用命令行时,优先使用:
|
|
81
96
|
|
|
@@ -94,3 +109,9 @@ cutcli audio add <draftId> --src ./素材/bgm.mp3 --start 0s --duration 20s
|
|
|
94
109
|
```
|
|
95
110
|
|
|
96
111
|
AI 调用 CLI 时,如果需要结构化错误输出,可以加 `--json-errors` 或设置 `CUTCLI_JSON_ERRORS=1`。
|
|
112
|
+
|
|
113
|
+
## 当前 Draft Spec 限制
|
|
114
|
+
|
|
115
|
+
- 同一个 Spec 内,图片/视频 `transform` 会整批应用,不能每段素材独立设置不同 scale/position。
|
|
116
|
+
- 同一个 Spec 内,字幕 `style` 和 `position` 会整批应用,不能每条字幕完全不同位置样式。
|
|
117
|
+
- 转场、花字、动画、特效名不要凭空编造。当前可用 `cutcli query image-animations`、`cutcli query text-effects` 查询部分素材;转场请先用 `material-browser.html` 挑选名称。
|
|
@@ -24,20 +24,27 @@ import {
|
|
|
24
24
|
} from 'cutsdk';
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
## 优先选择:AI Draft Spec
|
|
27
|
+
## 优先选择:AI Draft Spec + createAndRenderDraft
|
|
28
28
|
|
|
29
29
|
```ts
|
|
30
|
-
const result = await
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
const result = await createAndRenderDraft({
|
|
31
|
+
draft: {
|
|
32
|
+
version: '1.0',
|
|
33
|
+
canvas: { width: 1080, height: 1920 },
|
|
34
|
+
duration: '5s',
|
|
35
|
+
tracks: [
|
|
36
|
+
{ type: 'text', clips: [{ type: 'caption', text: 'Hello', start: '0s', duration: '5s' }] },
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
output: {
|
|
40
|
+
draftsDir: process.env.CUT_DRAFTS_DIR,
|
|
41
|
+
name: 'demo-draft',
|
|
42
|
+
},
|
|
43
|
+
render: false,
|
|
37
44
|
});
|
|
38
45
|
```
|
|
39
46
|
|
|
40
|
-
|
|
47
|
+
用于一次性生成完整时间线,并控制输出目录和草稿名。`createDraftFromSpec(spec)` 只能按当前配置创建草稿,不能直接传 `draftsDir` 和 `name`。
|
|
41
48
|
|
|
42
49
|
## 创建并渲染
|
|
43
50
|
|
|
@@ -57,6 +64,13 @@ const result = await createAndRenderDraft({
|
|
|
57
64
|
console.log(result.render?.videoUrl);
|
|
58
65
|
```
|
|
59
66
|
|
|
67
|
+
## 当前 Draft Spec 限制
|
|
68
|
+
|
|
69
|
+
- 同一个 Spec 内,图片/视频 `transform` 会整批应用,不能每段素材独立设置不同 scale/position。
|
|
70
|
+
- 同一个 Spec 内,字幕 `style` 和 `position` 会整批应用,不能每条字幕完全不同位置样式。
|
|
71
|
+
- 需要逐片段差异化时,先用 Spec 创建主体,再用 `afterCreate` 或低层 SDK API 后处理。
|
|
72
|
+
- 转场名先从 `material-browser.html` 挑选;当前 CLI 还没有 `cutcli query transitions`。
|
|
73
|
+
|
|
60
74
|
## 低层草稿流程
|
|
61
75
|
|
|
62
76
|
```ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createAndRenderDraft, validateDraftSpec } from 'cutsdk';
|
|
2
2
|
|
|
3
3
|
const spec = {
|
|
4
4
|
version: '1.0',
|
|
@@ -63,8 +63,15 @@ async function main() {
|
|
|
63
63
|
process.exit(1);
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
const
|
|
67
|
-
|
|
66
|
+
const result = await createAndRenderDraft({
|
|
67
|
+
draft: spec,
|
|
68
|
+
output: {
|
|
69
|
+
draftsDir: process.env.CUT_DRAFTS_DIR,
|
|
70
|
+
name: 'AI Draft Spec 示例',
|
|
71
|
+
},
|
|
72
|
+
render: false,
|
|
73
|
+
});
|
|
74
|
+
console.log(result.draft);
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
main().catch((error) => {
|
|
@@ -188,7 +188,7 @@
|
|
|
188
188
|
<header>
|
|
189
189
|
<div class="wrap">
|
|
190
190
|
<h1>cutcli 素材选择器</h1>
|
|
191
|
-
<p class="sub">花字、特效、贴纸、转场来自 SDK 本地素材索引。生成时间 2026-06-11 03:
|
|
191
|
+
<p class="sub">花字、特效、贴纸、转场来自 SDK 本地素材索引。生成时间 2026-06-11 03:29:45。</p>
|
|
192
192
|
<div class="toolbar">
|
|
193
193
|
<input id="search" type="search" placeholder="搜索名称、ID、分类、作者">
|
|
194
194
|
<select id="category"></select>
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
npm install cutsdk
|
|
7
|
+
npx cutsdk init
|
|
7
8
|
```
|
|
8
9
|
|
|
9
10
|
## 2. 创建一个简单草稿
|
|
@@ -11,31 +12,38 @@ npm install cutsdk
|
|
|
11
12
|
创建 `create-draft.ts`:
|
|
12
13
|
|
|
13
14
|
```ts
|
|
14
|
-
import {
|
|
15
|
+
import { createAndRenderDraft } from 'cutsdk';
|
|
15
16
|
|
|
16
17
|
async function main() {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
18
|
+
const result = await createAndRenderDraft({
|
|
19
|
+
draft: {
|
|
20
|
+
version: '1.0',
|
|
21
|
+
canvas: { width: 1080, height: 1920 },
|
|
22
|
+
duration: '3s',
|
|
23
|
+
tracks: [
|
|
24
|
+
{
|
|
25
|
+
type: 'text',
|
|
26
|
+
clips: [
|
|
27
|
+
{
|
|
28
|
+
type: 'caption',
|
|
29
|
+
text: '第一个 cutsdk 草稿',
|
|
30
|
+
start: '0s',
|
|
31
|
+
duration: '3s',
|
|
32
|
+
position: 'center',
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
output: {
|
|
39
|
+
draftsDir: process.env.CUT_DRAFTS_DIR,
|
|
40
|
+
name: '第一个 cutsdk 草稿',
|
|
41
|
+
},
|
|
42
|
+
render: false,
|
|
35
43
|
});
|
|
36
44
|
|
|
37
|
-
console.log(draft.draftId);
|
|
38
|
-
console.log(draft.filePath);
|
|
45
|
+
console.log(result.draft.draftId);
|
|
46
|
+
console.log(result.draft.filePath);
|
|
39
47
|
}
|
|
40
48
|
|
|
41
49
|
main().catch((error) => {
|
|
@@ -57,30 +65,34 @@ npx ts-node create-draft.ts
|
|
|
57
65
|
使用 `assets` 定义可复用媒体,再在 clips 中引用:
|
|
58
66
|
|
|
59
67
|
```ts
|
|
60
|
-
import {
|
|
61
|
-
|
|
62
|
-
await
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
tracks: [
|
|
71
|
-
{
|
|
72
|
-
type: 'visual',
|
|
73
|
-
clips: [{ type: 'image', asset: 'bg', start: '0s', duration: '5s' }],
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
type: 'audio',
|
|
77
|
-
clips: [{ type: 'audio', asset: 'music', start: '0s', duration: '5s', volume: 0.7 }],
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
type: 'text',
|
|
81
|
-
clips: [{ type: 'caption', text: '图片 + 音乐 + 字幕', start: '0s', duration: '5s' }],
|
|
68
|
+
import { createAndRenderDraft } from 'cutsdk';
|
|
69
|
+
|
|
70
|
+
await createAndRenderDraft({
|
|
71
|
+
draft: {
|
|
72
|
+
version: '1.0',
|
|
73
|
+
canvas: { width: 1080, height: 1920 },
|
|
74
|
+
duration: '5s',
|
|
75
|
+
assets: {
|
|
76
|
+
bg: { type: 'image', src: '/absolute/path/bg.png', width: 1080, height: 1920 },
|
|
77
|
+
music: { type: 'audio', src: '/absolute/path/music.mp3', duration: '5s' },
|
|
82
78
|
},
|
|
83
|
-
|
|
79
|
+
tracks: [
|
|
80
|
+
{
|
|
81
|
+
type: 'visual',
|
|
82
|
+
clips: [{ type: 'image', asset: 'bg', start: '0s', duration: '5s' }],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
type: 'audio',
|
|
86
|
+
clips: [{ type: 'audio', asset: 'music', start: '0s', duration: '5s', volume: 0.7 }],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
type: 'text',
|
|
90
|
+
clips: [{ type: 'caption', text: '图片 + 音乐 + 字幕', start: '0s', duration: '5s' }],
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
output: { draftsDir: process.env.CUT_DRAFTS_DIR, name: '图片音乐字幕' },
|
|
95
|
+
render: false,
|
|
84
96
|
});
|
|
85
97
|
```
|
|
86
98
|
|
|
@@ -109,7 +121,13 @@ AI Draft Spec:
|
|
|
109
121
|
{ start: '0s', duration: '3s' }
|
|
110
122
|
```
|
|
111
123
|
|
|
112
|
-
## 6.
|
|
124
|
+
## 6. 当前 Spec 限制
|
|
125
|
+
|
|
126
|
+
- 同一个 Spec 内,图片/视频 `transform` 会整批应用,不能每段素材独立设置不同 scale/position。
|
|
127
|
+
- 同一个 Spec 内,字幕 `style` 和 `position` 会整批应用,不能每条字幕完全不同位置样式。
|
|
128
|
+
- 需要逐片段差异化时,先用 Spec 创建主体,再用 `createAndRenderDraft` 的 `afterCreate` 或低层 SDK API 后处理。
|
|
129
|
+
|
|
130
|
+
## 7. CLI 本地路径与文字效果
|
|
113
131
|
|
|
114
132
|
```bash
|
|
115
133
|
cutcli draft easy <draftId> --audio-src ./素材/bgm.mp3 --image-src ./素材/bg.png \
|
|
@@ -120,7 +138,7 @@ cutcli text add <draftId> --text "爆款标题" --start 0s --duration 3s \
|
|
|
120
138
|
--text-effect "红黄火焰综艺花字" --shadow --shadow-color "#000000"
|
|
121
139
|
```
|
|
122
140
|
|
|
123
|
-
##
|
|
141
|
+
## 8. 云渲染状态
|
|
124
142
|
|
|
125
143
|
```bash
|
|
126
144
|
cutcli cloud render <draftId> --wait --pretty
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cutsdk.d.ts","sourceRoot":"","sources":["../../src/bin/cutsdk.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const promises_1 = require("readline/promises");
|
|
5
|
+
const install_project_docs_1 = require("../api/setup/install-project-docs");
|
|
6
|
+
function getVersion() {
|
|
7
|
+
return require('../../package.json').version;
|
|
8
|
+
}
|
|
9
|
+
function printHelp() {
|
|
10
|
+
console.log(`cutsdk ${getVersion()}
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
cutsdk init [--dir <path>] [--force] [--pretty]
|
|
14
|
+
|
|
15
|
+
Commands:
|
|
16
|
+
init 初始化或更新当前项目的 .agents/skills/cut-draft 和 cutcli-docs
|
|
17
|
+
`);
|
|
18
|
+
}
|
|
19
|
+
function readOption(args, name) {
|
|
20
|
+
const index = args.indexOf(name);
|
|
21
|
+
if (index === -1)
|
|
22
|
+
return undefined;
|
|
23
|
+
return args[index + 1];
|
|
24
|
+
}
|
|
25
|
+
async function confirmOverwrite(paths) {
|
|
26
|
+
console.error('检测到项目中已存在 cutsdk 文档/skill:');
|
|
27
|
+
for (const item of paths) {
|
|
28
|
+
console.error(` - ${item}`);
|
|
29
|
+
}
|
|
30
|
+
const rl = (0, promises_1.createInterface)({ input: process.stdin, output: process.stderr });
|
|
31
|
+
try {
|
|
32
|
+
const answer = await rl.question('是否覆盖更新?输入 y 确认:');
|
|
33
|
+
return /^(y|yes)$/i.test(answer.trim());
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
rl.close();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function run() {
|
|
40
|
+
const args = process.argv.slice(2);
|
|
41
|
+
const command = args[0];
|
|
42
|
+
if (!command || command === '--help' || command === '-h') {
|
|
43
|
+
printHelp();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (command === '--version' || command === '-v') {
|
|
47
|
+
console.log(getVersion());
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (command !== 'init') {
|
|
51
|
+
throw new Error(`Unknown command: ${command}. Usage: cutsdk init [--dir <path>] [--force]`);
|
|
52
|
+
}
|
|
53
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
54
|
+
printHelp();
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const dir = readOption(args, '--dir');
|
|
58
|
+
const force = args.includes('--force');
|
|
59
|
+
const conflicts = force ? [] : (0, install_project_docs_1.getProjectDocConflicts)({ dir });
|
|
60
|
+
const shouldOverwrite = force || (conflicts.length > 0 ? await confirmOverwrite(conflicts) : false);
|
|
61
|
+
const result = (0, install_project_docs_1.installProjectDocs)({ dir, force: shouldOverwrite });
|
|
62
|
+
if (args.includes('--pretty')) {
|
|
63
|
+
console.log(JSON.stringify(result, null, 2));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log(JSON.stringify(result));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
run().catch((error) => {
|
|
70
|
+
console.error(error?.message || String(error));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=cutsdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cutsdk.js","sourceRoot":"","sources":["../../src/bin/cutsdk.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { validateDraftSpec } from './api/draft-spec/create-draft-from-spec';
|
|
2
2
|
import { normalizeDraftRenderUrl } from './api/cloud/submit-video-render-task';
|
|
3
|
+
import { installProjectDocs } from './api/setup/install-project-docs';
|
|
3
4
|
import { registerDraftUrl } from './shared/draft-service';
|
|
4
|
-
export { validateDraftSpec, normalizeDraftRenderUrl, registerDraftUrl };
|
|
5
|
+
export { validateDraftSpec, normalizeDraftRenderUrl, registerDraftUrl, installProjectDocs };
|
|
5
6
|
export { CutSdkError, isCutSdkError, normalizeSdkError, parseSdkJson, withSdkErrorContext } from './shared/errors';
|
|
6
7
|
export type { CutSdkErrorCode, CutSdkErrorOptions, SdkErrorContext } from './shared/errors';
|
|
7
8
|
export declare const createDraft: (params?: import("./types").CreateDraftInput | undefined) => Promise<import("./types").CreateDraftOutput>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkD,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAmB5H,OAAO,EAAE,uBAAuB,EAAsD,MAAM,sCAAsC,CAAC;AAMnI,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkD,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAmB5H,OAAO,EAAE,uBAAuB,EAAsD,MAAM,sCAAsC,CAAC;AAMnI,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACnH,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE5F,eAAO,MAAM,WAAW,2GAAsD,CAAC;AAC/E,eAAO,MAAM,YAAY;;0CAAwD,CAAC;AAClF,eAAO,MAAM,UAAU,kDAAoD,CAAC;AAC5E,eAAO,MAAM,kBAAkB,4GAAoE,CAAC;AACpG,eAAO,MAAM,mBAAmB,6FAAsE,CAAC;AACvG,eAAO,MAAM,oBAAoB,+GAAwE,CAAC;AAC1G,eAAO,MAAM,WAAW,8FAAsD,CAAC;AAC/E,eAAO,MAAM,WAAW;;8CAAsD,CAAC;AAC/E,eAAO,MAAM,SAAS,0FAAkD,CAAC;AACzE,eAAO,MAAM,SAAS;;4CAAkD,CAAC;AACzE,eAAO,MAAM,SAAS,0FAAkD,CAAC;AACzE,eAAO,MAAM,SAAS;;4CAAkD,CAAC;AACzE,eAAO,MAAM,SAAS,0FAAkD,CAAC;AACzE,eAAO,MAAM,SAAS;;4CAAkD,CAAC;AACzE,eAAO,MAAM,UAAU,4FAAoD,CAAC;AAC5E,eAAO,MAAM,UAAU;;6CAAoD,CAAC;AAC5E,eAAO,MAAM,UAAU,4FAAoD,CAAC;AAC5E,eAAO,MAAM,WAAW;;8CAAsD,CAAC;AAC/E,eAAO,MAAM,YAAY,gGAAwD,CAAC;AAClF,eAAO,MAAM,YAAY;;;+CAAwD,CAAC;AAClF,eAAO,MAAM,QAAQ,wFAAgD,CAAC;AACtE,eAAO,MAAM,QAAQ;;;2CAAgD,CAAC;AACtE,eAAO,MAAM,YAAY,gGAAwD,CAAC;AAClF,eAAO,MAAM,qBAAqB,kHAA0E,CAAC;AAC7G,eAAO,MAAM,WAAW,6FAAsD,CAAC;AAC/E,eAAO,MAAM,WAAW,6FAAsD,CAAC;AAC/E,eAAO,MAAM,oBAAoB;;;sCAAwE,CAAC;AAC1G,eAAO,MAAM,gBAAgB,wGAAgE,CAAC;AAC9F,eAAO,MAAM,kBAAkB,yHAAoE,CAAC;AACpG,eAAO,MAAM,cAAc,iHAA4D,CAAC;AACxF,eAAO,MAAM,aAAa,kGAA0D,CAAC;AAErF,cAAc,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.getTextEffect = exports.getTextEffects = exports.getImageAnimations = exports.getAudioDuration = exports.getCloudRenderStatus = exports.renderDraft = exports.uploadDraft = exports.submitVideoRenderTask = exports.addTextStyle = exports.getMasks = exports.addMasks = exports.getKeyframes = exports.addKeyframes = exports.getStickers = exports.addSticker = exports.getEffects = exports.addEffects = exports.getAudios = exports.addAudios = exports.getVideos = exports.addVideos = exports.getImages = exports.addImages = exports.getCaptions = exports.addCaptions = exports.createAndRenderDraft = exports.createDraftFromSpec = exports.easyCreateMaterial = exports.listDrafts = exports.getDraftInfo = exports.createDraft = exports.withSdkErrorContext = exports.parseSdkJson = exports.normalizeSdkError = exports.isCutSdkError = exports.CutSdkError = exports.registerDraftUrl = exports.normalizeDraftRenderUrl = exports.validateDraftSpec = void 0;
|
|
17
|
+
exports.getTextEffect = exports.getTextEffects = exports.getImageAnimations = exports.getAudioDuration = exports.getCloudRenderStatus = exports.renderDraft = exports.uploadDraft = exports.submitVideoRenderTask = exports.addTextStyle = exports.getMasks = exports.addMasks = exports.getKeyframes = exports.addKeyframes = exports.getStickers = exports.addSticker = exports.getEffects = exports.addEffects = exports.getAudios = exports.addAudios = exports.getVideos = exports.addVideos = exports.getImages = exports.addImages = exports.getCaptions = exports.addCaptions = exports.createAndRenderDraft = exports.createDraftFromSpec = exports.easyCreateMaterial = exports.listDrafts = exports.getDraftInfo = exports.createDraft = exports.withSdkErrorContext = exports.parseSdkJson = exports.normalizeSdkError = exports.isCutSdkError = exports.CutSdkError = exports.installProjectDocs = exports.registerDraftUrl = exports.normalizeDraftRenderUrl = exports.validateDraftSpec = void 0;
|
|
18
18
|
const errors_1 = require("./shared/errors");
|
|
19
19
|
const create_draft_1 = require("./api/draft/create-draft");
|
|
20
20
|
const get_draft_info_1 = require("./api/draft/get-draft-info");
|
|
@@ -47,6 +47,8 @@ const render_draft_1 = require("./api/cloud/render-draft");
|
|
|
47
47
|
const get_audio_duration_1 = require("./api/query/get-audio-duration");
|
|
48
48
|
const get_image_animations_1 = require("./api/query/get-image-animations");
|
|
49
49
|
const get_text_effects_1 = require("./api/query/get-text-effects");
|
|
50
|
+
const install_project_docs_1 = require("./api/setup/install-project-docs");
|
|
51
|
+
Object.defineProperty(exports, "installProjectDocs", { enumerable: true, get: function () { return install_project_docs_1.installProjectDocs; } });
|
|
50
52
|
const draft_service_1 = require("./shared/draft-service");
|
|
51
53
|
Object.defineProperty(exports, "registerDraftUrl", { enumerable: true, get: function () { return draft_service_1.registerDraftUrl; } });
|
|
52
54
|
var errors_2 = require("./shared/errors");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,4CAAsD;AAEtD,2DAA0E;AAC1E,+DAA8E;AAC9E,yDAAuE;AACvE,2EAAgG;AAChG,oFAA4H;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cutsdk",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"description": "CapCut 草稿 Node.js SDK — 用代码批量创建剪映标准草稿,支持字幕/图片/视频/音频/特效/贴纸/关键帧/遮罩",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"cutsdk": "dist/bin/cutsdk.js"
|
|
9
|
+
},
|
|
7
10
|
"license": "MIT",
|
|
8
11
|
"author": "m007",
|
|
9
12
|
"keywords": [
|