@gitruck/cli 0.2.4 → 0.2.6

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/AGENT.md CHANGED
@@ -1,241 +1,241 @@
1
- # gtrk-cli · Agent Playbook
2
-
3
- 给 **agent** 看的操作手册:把用户「想剪一条口播」的自然语言需求,落成对 `gtrk` CLI 的一次调用,
4
- 再把产物目录 + 三端(客户端 / 剪映 / PR)打开方式回给用户。任何 agent(Claude / Cursor / …)读完
5
- 这一份就能驱动整条闭环;Claude 的 `/口播剪辑` skill 只是这份 playbook 的薄壳。
6
-
7
- > 这条 CLI 做的事:**本地抽音频/720p(毛片永不上传)→ 只传抽出物 → 云端智能口播剪辑(video_oral_cut)
8
- > → 拉回 gtrk/剪映/PR 三方工程文件 →(可选)本地 ffmpeg 渲染成片 → 三端打开**。云端零改动、纯结构产物,
9
- > 源视频不出本地。结果/报告恒落盘 `result.json`,可按 `task_id` 秒级取回、无需重跑(见 §2.1 / §4)。
10
-
11
- ---
12
-
13
- ## 0. 一句话流程
14
-
15
- ```
16
- gtrk init # 一次性配置(API Key + 剪映目录)
17
- gtrk oralcut <毛片.mp4> [--script 文字稿.txt] # 剪一条;剪完自动打开产物目录
18
- ```
19
-
20
- 跑完得到一个产物目录:`<毛片同目录>/<毛片名>-video-project-<YYMMDD-HHMMSS>/`,里面按格式分子目录,
21
- 三端各自打开即可。
22
-
23
- ---
24
-
25
- ## 1. 一次性准备(只做一次)
26
-
27
- 1. **装 bun**(运行时):https://bun.sh 。
28
- 2. **拿到 CLI**:进入 `gtrk-cli/` 仓库,`bun install`。
29
- 3. **调用方式**(二选一):仓库内 `bun run src/index.ts <命令> …`;或 `bun link` 后全局 `gtrk <命令> …`(本文档统一写 `gtrk`)。
30
- 4. **跑 `gtrk init` 引导式配置**(对标飞书 lark-cli install,只做一次):
31
- - 填 **API Key**(鉴权 Header `Authorization` 的裸值,非 Bearer);根地址默认生产、回车即用。
32
- - **自动扫描剪映草稿目录**:扫到让你确认;扫不到会**自动打开一张指引图**(剪映 → 全局设置 → 草稿 →「草稿位置」)让你把路径粘过来;可留空跳过。
33
- - 配置写到 `~/.gitruck/config.json`,之后所有命令免重复配置。
34
- - 环境变量 `GITRUCK_API_KEY` / `GITRUCK_API_BASE` 仍可覆盖(CI / 临时切换)。
35
-
36
- > agent 自检:没配 Key 时任何命令会明确报「缺 API Key —— 先跑 `gtrk init`」。剪映目录没配只影响剪映直开,不挡 gtrk/PR。
37
- > `init` 是**人手一次性**交互配置(会弹提示);agent 日常只跑非交互的 `oralcut`。
38
-
39
- ---
40
-
41
- ## 2. 核心命令:`gtrk oralcut <毛片>`
42
-
43
- | 参数 | 作用 | 缺省 |
44
- |---|---|---|
45
- | `<毛片>`(位置参数) | 本地口播原视频路径 | 必填 |
46
- | `-s, --script <file>` | 文字稿 txt 路径(**有稿**:按稿对齐裁剪) | 不传 = **无稿智能重建** |
47
- | `-p, --preset <preset>` | 节奏预设 `steady`\|`concise`\|`compact`(松→紧) | `concise` |
48
- | `-o, --out <dir>` | 自定义产物目录 | `<毛片同目录>/<毛片名>-video-project-<YYMMDD-HHMMSS>` |
49
- | `-f, --formats <list>` | 三方格式逗号分隔 | `gtrk,jianying,xml` |
50
- | `--jianying-draft-dir <dir>` | 剪映草稿根目录;传路径或 `auto` | 读 `gtrk init` 配置 / 自动探测 |
51
- | `--lang <code>` | 语言代码(英文 `en-US`、日文 `ja-JP`…) | `zh-CN` |
52
- | `--visual-assist` | **视觉兜底**:改传 **720p 代理**(非原片)+ 人脸/说话检测保护漏识别段并重识别(剪不准时开) | 关 |
53
- | `--no-adaptive-rhythm` | 关闭自适应节奏,改用固定标点停顿表 | 自适应开 |
54
- | `--render` | 额外**本地 ffmpeg** 按 gtrk EDL 渲染成片 mp4(毛片仍不上传、云端不渲染) | 只出工程 |
55
- | `--crf <n>` / `--codec <c>` | 本地渲染视频质量 14-28(默认 18,越小越清晰)/ 编码(默认 h264),配 `--render` | — |
56
- | `--ffmpeg-path <dir>` | 指定 ffmpeg/ffprobe 所在目录(本地抽音频/渲染用) | `~/.gitruck/ffmpeg` → 系统 PATH |
57
- | `--param k=v` / `--params-json '{…}'` | **通用透传**:任意云端参数(标量可重复 / JSON 嵌套),优先级最高 | — |
58
- | `--reupload` | 强制重新上传,忽略本地上传缓存 | 关 |
59
- | `--no-open` | 完成后**不**自动打开产物目录 | **默认会自动打开** |
60
-
61
- **关键行为(agent 需知道,不用解释给用户):**
62
-
63
- - **上传缓存**:同一毛片(按 `size:mtime` 指纹)二次跑直接复用 `file_id`,跳过整段上传。缓存在
64
- `~/.gitruck/upload-cache.json`。云端 file_id 失效会自动重传兜底。毛片改了但指纹意外没变 → `--reupload`。
65
- - **大文件分片断点续传**:≥256MiB 自动走分片上传(32MiB/片、3 并发、单片自动重试)。上传中断(断网/
66
- Ctrl+C/进程崩)→ **重跑同一命令即自动续传**,只补缺片不重来(会话在 `~/.gitruck/upload-sessions.json`)。
67
- 云端已有同内容文件(未过期)时**秒传**:零字节上传直接拿 file_id。`--reupload` 同时跳过缓存/续传会话/秒传,
68
- 强制整传。小文件路径与输出契约完全不变。
69
- - **剪映草稿自动落位**:探到剪映/CapCut 草稿目录时,下载后自动把草稿拷进
70
- `<草稿根>/<毛片名>-video-project-<时间戳>/`(与产物目录同名、含时间戳)→ 剪映项目列表里每次剪辑
71
- 各为独立条目、不互相覆盖。探不到会警告并提示加 `--jianying-draft-dir`(此时剪映只产 `draft_content.json`、
72
- 缺 meta、无法直接打开)。
73
- - **节奏预设**:`steady` 保留更多停顿(稳)、`concise` 默认精炼、`compact` 最紧凑(压停顿最狠)。
74
- - **部分格式失败不致命**:CLI 如实回显云端 `errors`(某格式没出来不影响其余)。
75
- - **本地预处理 · 只传抽出物**:跑批先本地探几何 + 抽 16k 单声道 mp3(默认)/ 压 720p 代理(`--visual-assist`);**毛片永不上传**,只传几十 MB 抽出物。抽出物按原片 `size:mtime` 指纹缓存在 `~/.gitruck/audio-cache/`,同毛片重剪免重抽(720p 与 mp3 各缓存各的、互不覆盖)。
76
- - **结果恒落盘 · 可按 task_id 恢复**:每次跑批恒写 `<产物目录>/result.json`(含完整 `report`,**不受 `--json` 约束**);submit 一成功就写 `task.json`(含 `taskId`)面包屑,且产物目录**延后到首次写入才建**(提交前失败不留空壳、提交后失败留 `task.json` 可恢复)。→ stdout 丢了 / 中途崩了,报告与 `taskId` 都在盘上,用 `gtrk oralcut-result <taskId>` 秒级取回、**别重跑整条 `oralcut`**(见 §2.1)。
77
-
78
- **细节微调 —— 按用户诉求因势象形、自由组合**(上表是常用一等 flag;下面是节奏细调 + 完整取值)。你有云端全部参数,按需自由决定用哪些。**唯一要求:名字 / 取值 / 范围照文档用**(别记错拼错);传越界云端报 `6016` 附原因、照改即可(乱传不产错误成片、只明确报错)。没特别诉求就跑默认。
79
-
80
- - **剪不准 / 剪掉真内容 / 有句话没剪进去** → `--visual-assist`:ASR 之外并行跑人脸 + 说话检测,画面在说话却没识别出字的地方**保护不剪**并重识别捞回(需说话人面部基本可见),捞不回的进 `report.review_points` 复核;引擎挂了只降级不失败;会增加处理耗时(与主识别并行、约两者较大值),但不额外计费、绝不凭空生成。**「剪不准」的兜底。**
81
- - **节奏散参数**(无一等 flag,走 `--param 键=值` / `--params-json`,单位秒、范围 0–5):
82
- - `punctuation_breaks`:逐标点停顿,键 `,、;:。!?—……` + `paragraph`(段落)。例 `--params-json '{"punctuation_breaks":{"。":0.6,",":0.3}}'`。
83
- - `intra_gap_max`(>此值算气口,默认 0.35)/ `intra_gap_target`(收到多长,默认 0.10)/ `pad_in`(0.05) / `pad_out`(0.08)。例「气口留白多点」`--param pad_out=0.15`。
84
- - `render.audio_crossfade_ms`(切点淡化毫秒 0–50、默认 8)等也能透传。
85
- - **节奏预设完整值**(选最贴内容的、再逐项覆盖;「默认」列 = 不选预设时各标点的默认停顿):
86
-
87
- | 参数(秒) | steady 稳健 | concise 精练 | compact 紧凑 | 默认 |
88
- |---|---|---|---|---|
89
- | 适用 | 讲述/教学 | 自媒体中长 | 短视频/广告 | 通用 |
90
- | `、`/`,`/`;` | 0.18/0.25/0.36 | 0.12/0.18/0.26 | 0.06/0.08/0.12 | 0.15/0.20/0.30 |
91
- | `:`/`—` | 0.45/0.55 | 0.32/0.40 | 0.15/0.18 | 0.35/0.45 |
92
- | `。``!`/`?` | 0.55/0.60 | 0.40/0.45 | 0.18/0.20 | 0.45/0.50 |
93
- | `……`/`paragraph` | 0.75/1.20 | 0.55/0.90 | 0.25/0.40 | 0.60/1.00 |
94
- | `intra_gap_max`/`intra_gap_target` | 0.45/0.15 | 0.35/0.10 | 0.25/0.05 | 0.35/0.10 |
95
- | `pad_in`/`pad_out` | 0.05/0.10 | 0.05/0.08 | 0.03/0.05 | 0.05/0.08 |
96
-
97
- - 优先级:`--preset` → 一等 flag → 透传(后者覆盖前者)。用户**自己点名**某参数 + 值 → 照他原样透传(CLI 底层支持任意云端参数)。**以上即 agent 需要的全部参数、本文档自足**(`gtrk oralcut --help` 也列全部 flag);官网的原始 HTTP API 文档是给人看的,agent 不必也无法访问。
98
-
99
- ### 2.1 取回命令:`gtrk oralcut-result <taskId>`(报告丢了别重跑)
100
-
101
- 按 `task_id` 从云端取回一个**已完成**任务的报告 + 三方工程产物(可选本地渲染成片),**跳过预处理 / 上传 / 提交 / 轮询**。用在:`--json` 的 stdout 丢了、进程中途崩了、或想换台机器再拉一次产物 —— **不要重跑整条 `gtrk oralcut`**(后端 `get_task_by_id` 幂等,报告本就存着)。`taskId` 从产物目录 `task.json`、上次结果 JSON 或日志里取。
102
-
103
- | 参数 | 作用 | 缺省 |
104
- |---|---|---|
105
- | `<taskId>`(位置参数) | 任务 id | 必填 |
106
- | `-o, --out <dir>` | 产物目录 | `<当前目录>/<taskId>-video-project-<时间戳>` |
107
- | `--render` | 额外本地渲染成片(需原毛片仍在 gtrk 内嵌路径 + ffmpeg) | 关 |
108
- | `--jianying-draft-dir` / `--ffmpeg-path` / `--crf` / `--codec` / `--no-open` / `--json` | 同 `oralcut` | — |
109
-
110
- - **同账号**:取结果需用**提交该任务的同一账号** API Key;异账号 / 已删任务报 `TASK_NOT_FOUND`(CLI 会提示「须用同账号 key」)。
111
- - **报告长期可取、产物约 60 天**:报告存于任务记录、长期可取;底层产物文件约 **60 天**后被 GC,届时产物下载 404、命令会提示「已过期」并**照常落盘 / 输出报告**(报告不随文件过期)。
112
- - **输出契约同 `oralcut --json`**:单行 `{ok,outDir,files,jianyingDraftPath,rendered,report,errors,taskId,fileId}`,恢复场景 `fileId=null`。
113
-
114
- ```bash
115
- # 报告丢了、按 task_id 取回(不重跑云端)
116
- gtrk oralcut-result 88269671080189958 --json
117
- # 顺带本地重渲成片(原毛片需仍在 gtrk 内嵌路径)
118
- gtrk oralcut-result 88269671080189958 --render --out "D:/回收/某条"
119
- ```
120
-
121
- ---
122
-
123
- ## 2.2 视觉拆分派单器:`gtrk split`(成片 → 分镜派单)
124
-
125
- `oralcut` 出的是「剪好的口播成片」;`split` 把它拆成 **beat 级视觉分镜**并派单给下游四车道(真人 A-roll / RRV_MG 动态图 / AI_DRAMA 再现 / FILM_BROLL 影视素材)。**纯本地、同步、无云端任务**。上游依赖 `transcript.json`(oralcut 家族恒出的句级词表,源时基)。
126
-
127
- 编排顺序(脑=`gtrk-splitter` skill / 手=本命令):
128
-
129
- ```
130
- gtrk oralcut <毛片> # ① 出成片工程(gtrk + transcript)
131
- (用户可在客户端手调切点后保存) # ② 时间线随时可改,所见即所得
132
- gtrk split --project <产物目录> --json # ③ 导出「发起那一刻」的投影视图 split/view.json(skill 创作输入)
133
- (skill 按视图句级 id 拆 beat、选 lane、写 handoff) # ④ 产机器 JSON 拆分稿(零时码、只引用 utterance id)
134
- gtrk split <拆分稿.json> --project <目录> --md --json # ⑤ 校验落地:写回 struct_meta.split + 产 dispatch.json
135
- ```
136
-
137
- | 用法 | 作用 |
138
- |---|---|
139
- | `gtrk split --project <dir>` | **投影视图导出**:transcript × 当刻 `.gtrk` 的 clips → `split/view.json`(句级轨道时基视图,含 dropped 标注) |
140
- | `gtrk split <拆分稿.json> --project <dir>` | **校验落地**:v1 门 → 结构/枚举/id/hash 校验 → 现场投影 → ① `.gtrk` 的 `struct_meta.split` 原子写回(只改这一个键、mtime 冲突拒写)② `split/dispatch.json` 派单清单(`composition_id`=`<工程slug>-<beatId>`)③ `--md` 人读稿 |
141
- | `--gtrk` / `--transcript` | 非标准布局兜底:显式指定工程/词表路径(缺省从 `--project` 自动定位 `gtrk/project.gtrk` 与 `transcript/transcript.json`) |
142
- | `--words` | 视图模式附字级明细(缺省只出句级) |
143
-
144
- **关键行为(agent 需知):**
145
- - **时码恒挂源时基、每次发起现场投影**:用户手调切点后重导视图即跟随;此前被剪、现落回 clip 的句子自动复活,无需重跑转写。「拖入已剪好成片」= 恒等投影,同一套逻辑。
146
- - **拆分稿零时码、id 区间引用**:beat 的文稿范围 = `span:{from:"u0007",to:"u0011"}`(utterance id 区间),**绝不抄原句文字、绝不自造时码**(防 LLM 幻觉)。幻觉 id / 区间倒序 / 跨 beat 重叠 / `transcript_hash` 错版 → **硬拒、非 0 退出、零副作用**。
147
- - **dropped 处理**:beat 的 span 内 utterance 全被剪 → 跳过该 beat 并入报告;部分被剪 → 按存活句包络收缩、标 `shrunk`。均不使命令失败。
148
- - **transcript 缺失**(旧任务)→ 明确报错引导「用新版本重跑 oralcut(恒出 transcript)或 transcribe(规划中)」,不做降级猜测。
149
- - **只动 `struct_meta.split`**:写回不碰 materials/tracks,配合客户端「保存 → 发起 → 写回 → 重载」闭环(opencut 联动)。
150
- - **下游消费**:`dispatch.json` 的 `film_broll` 队列 → `gtrk matrix`(B-roll 检索,另立项);`rrv_mg` 槽位表 → real-roam-viz 产颗粒;`ai_drama` 队列 → ai-drama-prompter。
151
-
152
- > **skill 分工**:拆 beat / 选 lane / 写 handoff 是脑(`gtrk-splitter` skill)的活;投影 / 校验 / 落地 / 写时码是手(本命令)的活。skill 铁律:只引用视图存在的 utterance id、不抄原文定位、不碰时码。
153
-
154
- ---
155
-
156
- ## 3. 产物结构 + 三端打开
157
-
158
- ```
159
- <毛片名>-video-project-<YYMMDD-HHMMSS>/
160
- ├── gtrk/project.gtrk → 客户端(OpenCut Gitruck Edition):「打开工程」选它
161
- ├── jianying/ → 剪映:已自动拷进剪映草稿根,剪映里直接见草稿
162
- │ ├── draft_content.json
163
- │ └── draft_meta_info.json (仅当探到/指定了剪映草稿目录才有)
164
- ├── xml/premiere.xml → Premiere Pro:文件 > 导入
165
- ├── <毛片名>.mp4 → 成片(仅 --render;本地 ffmpeg 按 gtrk EDL 渲染,云端不产成片)
166
- ├── result.json → 机读结果清单(含完整 report;恒写、不受 --json 约束;可 gtrk oralcut-result 复现)
167
- └── task.json → 任务面包屑(taskId 等;submit 成功即写,供崩溃后按 task_id 恢复)
168
- ```
169
-
170
- **默认跑完自动打开产物目录文件夹**(`--no-open` 关)——用户常不知道文件落哪,直接帮他打开、自己挑工具。三端切点正确、同源一致(gtrk 是真超集)。
171
-
172
- ---
173
-
174
- ## 4. Agent 决策清单(自然语言 → 参数)
175
-
176
- 把用户的话映射到一次调用,按这几条判断:
177
-
178
- 1. **毛片路径**:用户给的视频文件绝对路径 → 位置参数。缺则先问。
179
- 2. **有稿 / 无稿**:
180
- - 用户给了文字稿/逐字稿文件 → `--script <该文件>`(按稿剪,最准)。
181
- - 没稿 → 不传 `--script`,走云端无稿智能重建(CLI 默认)。
182
- 3. **节奏**:用户说「快/紧凑/卡点狠」→ `--preset compact`;「稳一点/别删太多停顿」→ `steady`;
183
- 没特别要求 → 默认 `concise`,不用传。
184
- 4. **要不要自动打开**:默认就开(用户常不知道文件去哪了,别让他找)。只有明确「别打开 / 批处理」才加 `--no-open`。
185
- 5. **剪映装在非标准位置 / 多版本**:若用户没跑过 `gtrk init` 或探测失败,问剪映草稿根目录、传 `--jianying-draft-dir`(或让他先 `gtrk init`)。
186
- 6. **只要某一两端**:用户只要客户端 → `--formats gtrk`;只要剪映 → `--formats jianying`;默认三端全给。
187
- 7. **有具体细节诉求**(剪不准 / 换语言 / 要成片 / 调某个停顿)→ 见上「细节微调」,按需自由取用(`--visual-assist` / `--lang` / `--render` / 散参数);没特别诉求跑默认即可。
188
-
189
- **跑完读 `report`、验证、给用户交代**(`--json` 的 stdout 那行带 `files` / `errors` / **`report`**;别只信"成功"、别谎报三端都好):
190
- - **读 `report`(因势象形的另一半)**:`duration_before`→`after`(剪了多少);`script_source`/`final_script`(无稿 `rebuilt` 时把 `final_script` 回给用户核对);`dropped[]`(剔了哪些、`reason` retake/misread);`coverage`(<0.6 附 `low_coverage` = 文稿与实拍严重不符);`uncovered_script[]`(**漏读**:文稿有、实拍没找到 → 如实说,疑似漏识别则建议 `--visual-assist` 重跑);`review_points[]`(建议复核处);开了 visual_assist 还有 `suspect_omissions` / `stt_recovered` / `visual_assist_degraded`。**据此因势象形**:覆盖率低 / 漏读多 → 开 `--visual-assist` 或核对文稿重跑;节奏不满意 → 调 `--preset` / 散参数重跑(同毛片可反复剪对比)。
191
- - **报告也在盘上、丢了能取回**:同一份 `report` 恒写在 `<产物目录>/result.json`(不必依赖 stdout)。万一 stdout 没接住或进程崩了 → 直接读 `result.json`,或 `gtrk oralcut-result <taskId> --json` 按 task_id 重新取回,**不要重跑 `oralcut`**(见 §2.1)。
192
- - 确认产物目录在、`gtrk/project.gtrk` 非空(>0 字节);要剪映就确认剪映草稿根里有**同名工程目录** + `draft_meta_info.json`。
193
- - 云端 `errors` 非空 → 如实告知哪个格式失败、原因。
194
- - 然后**回给用户**:产物目录路径 + 三端各自怎么打开(客户端选 `gtrk/project.gtrk`、剪映已在项目列表、PR 导入 `xml/premiere.xml`),并**据 `report` 给一句交代**(剪了多久 → 多久、去掉了什么、有无漏读需复核)。
195
-
196
- ---
197
-
198
- ## 5. 典型调用
199
-
200
- > 下面示例为聚焦某个参数、**省略了 `--json`**;你(agent)实际调用**一律带 `--json`**(见 §4),stdout 才只剩结果 JSON、便于解析。
201
-
202
- ```bash
203
- # 有稿 + 剪完就看(最常见;剪完默认自动打开产物目录,无需额外 flag)
204
- gtrk oralcut "D:/素材/某选题-原始口播.mp4" --script "D:/素材/某选题-文字稿.txt" --json
205
-
206
- # 无稿、要最紧凑节奏
207
- gtrk oralcut "D:/素材/某条.mp4" --preset compact
208
-
209
- # 只要客户端工程,不碰剪映/PR
210
- gtrk oralcut "D:/素材/某条.mp4" --formats gtrk
211
-
212
- # 剪映装在非标准盘符,手动指目录
213
- gtrk oralcut "D:/素材/某条.mp4" --jianying-draft-dir "F:/JianyingPro/User Data/Projects/com.lveditor.draft"
214
-
215
- # 用户抱怨"剪掉了真内容 / 剪不准" → 开视觉兜底重跑
216
- gtrk oralcut "D:/素材/某条.mp4" --visual-assist
217
-
218
- # 细到某标点停顿 + 顺手渲一个成片
219
- gtrk oralcut "D:/素材/某条.mp4" --params-json '{"punctuation_breaks":{"。":0.6}}' --render --crf 20
220
- ```
221
-
222
- ---
223
-
224
- ## 6. 排错
225
-
226
- | 现象 | 处置 |
227
- |---|---|
228
- | `缺 API Key —— 先跑 gtrk init` | 没配过 → 跑 `gtrk init`(或设环境变量 `GITRUCK_API_KEY`) |
229
- | 剪映警告「没找到草稿目录」 | 剪映/CapCut 没装在标准位置 → 加 `--jianying-draft-dir <你的草稿根>` 重跑 |
230
- | 云端 errors 含某格式 | 该格式单独失败、其余可用;把 errors 原文回给用户/反馈维护方 |
231
- | 同毛片改了内容但产物像旧的 | 指纹意外没变 → 加 `--reupload` 强制重传 |
232
- | 任务很久不动 | 轮询有 30min 墙钟上限;超时 CLI 会报,稍后重试或查云端任务 |
233
- | 结果 JSON / 报告丢了(stdout 没接住、进程崩了) | 别重跑 → 读产物目录 `result.json`,或 `gtrk oralcut-result <taskId> --json` 按 task_id 取回 |
234
- | 想换机器再拉产物 / 补渲成片 | `gtrk oralcut-result <taskId> [--out <目录>] [--render]`(须同账号 key;产物约 60 天有效,过期仍可取报告) |
235
-
236
- ---
237
-
238
- ## 7. 扩展(给改 CLI 的 agent)
239
-
240
- 新增命令 = 写 `src/commands/<name>.ts` 的 `register<Name>(program)` + 在 `src/index.ts` 注册一行。
241
- 云端调用走 `src/lib/cloud.ts`(`{code,msg,data}` 包装、鉴权 Header `Authorization:<裸key>`;单发取结果 `getTaskResult`、`pollTask` 复用之);上传一律走 `src/lib/upload-cache.ts` 的 `uploadCached`(白嫖指纹缓存;≥256MiB 自动分片断点续传,见 `src/lib/chunk-upload.ts`)。本地预处理(探几何 / 抽音频 / 压 720p)在 `src/lib/media.ts`;本地渲染(gtrk EDL → ffmpeg filter_complex)在 `src/lib/render.ts`;三方产物落地 + `result.json` 两段写在 `src/lib/materialize.ts`(`oralcut` 与 `oralcut-result` 共用)。已上线:`oralcut`(云剪)、`oralcut-result`(按 task_id 取回)、`render`(本地渲染 gtrk)、`split`(视觉拆分派单器:`src/lib/projection.ts` 投影纯函数 + `src/lib/splitdoc.ts` 拆分稿校验/落地 + `src/lib/gtrk-writeback.ts` 原子写回 `struct_meta.split`,随包分发 `skills/gtrk-splitter/`)。规划中:`struct`(已有 gtrk → 三方工程)、`matrix`(B-roll 检索,读 split `dispatch.json`)。
1
+ # gtrk-cli · Agent Playbook
2
+
3
+ 给 **agent** 看的操作手册:把用户「想剪一条口播」的自然语言需求,落成对 `gtrk` CLI 的一次调用,
4
+ 再把产物目录 + 三端(客户端 / 剪映 / PR)打开方式回给用户。任何 agent(Claude / Cursor / …)读完
5
+ 这一份就能驱动整条闭环;Claude 的 `/口播剪辑` skill 只是这份 playbook 的薄壳。
6
+
7
+ > 这条 CLI 做的事:**本地抽音频/720p(毛片永不上传)→ 只传抽出物 → 云端智能口播剪辑(video_oral_cut)
8
+ > → 拉回 gtrk/剪映/PR 三方工程文件 →(可选)本地 ffmpeg 渲染成片 → 三端打开**。云端零改动、纯结构产物,
9
+ > 源视频不出本地。结果/报告恒落盘 `result.json`,可按 `task_id` 秒级取回、无需重跑(见 §2.1 / §4)。
10
+
11
+ ---
12
+
13
+ ## 0. 一句话流程
14
+
15
+ ```
16
+ gtrk init # 一次性配置(API Key + 剪映目录)
17
+ gtrk oralcut <毛片.mp4> [--script 文字稿.txt] # 剪一条;剪完自动打开产物目录
18
+ ```
19
+
20
+ 跑完得到一个产物目录:`<毛片同目录>/<毛片名>-video-project-<YYMMDD-HHMMSS>/`,里面按格式分子目录,
21
+ 三端各自打开即可。
22
+
23
+ ---
24
+
25
+ ## 1. 一次性准备(只做一次)
26
+
27
+ 1. **装 bun**(运行时):https://bun.sh 。
28
+ 2. **拿到 CLI**:进入 `gtrk-cli/` 仓库,`bun install`。
29
+ 3. **调用方式**(二选一):仓库内 `bun run src/index.ts <命令> …`;或 `bun link` 后全局 `gtrk <命令> …`(本文档统一写 `gtrk`)。
30
+ 4. **跑 `gtrk init` 引导式配置**(对标飞书 lark-cli install,只做一次):
31
+ - 填 **API Key**(鉴权 Header `Authorization` 的裸值,非 Bearer);根地址默认生产、回车即用。
32
+ - **自动扫描剪映草稿目录**:扫到让你确认;扫不到会**自动打开一张指引图**(剪映 → 全局设置 → 草稿 →「草稿位置」)让你把路径粘过来;可留空跳过。
33
+ - 配置写到 `~/.gitruck/config.json`,之后所有命令免重复配置。
34
+ - 环境变量 `GITRUCK_API_KEY` / `GITRUCK_API_BASE` 仍可覆盖(CI / 临时切换)。
35
+
36
+ > agent 自检:没配 Key 时任何命令会明确报「缺 API Key —— 先跑 `gtrk init`」。剪映目录没配只影响剪映直开,不挡 gtrk/PR。
37
+ > `init` 是**人手一次性**交互配置(会弹提示);agent 日常只跑非交互的 `oralcut`。
38
+
39
+ ---
40
+
41
+ ## 2. 核心命令:`gtrk oralcut <毛片>`
42
+
43
+ | 参数 | 作用 | 缺省 |
44
+ |---|---|---|
45
+ | `<毛片>`(位置参数) | 本地口播原视频路径 | 必填 |
46
+ | `-s, --script <file>` | 文字稿 txt 路径(**有稿**:按稿对齐裁剪) | 不传 = **无稿智能重建** |
47
+ | `-p, --preset <preset>` | 节奏预设 `steady`\|`concise`\|`compact`(松→紧) | `concise` |
48
+ | `-o, --out <dir>` | 自定义产物目录 | `<毛片同目录>/<毛片名>-video-project-<YYMMDD-HHMMSS>` |
49
+ | `-f, --formats <list>` | 三方格式逗号分隔 | `gtrk,jianying,xml` |
50
+ | `--jianying-draft-dir <dir>` | 剪映草稿根目录;传路径或 `auto` | 读 `gtrk init` 配置 / 自动探测 |
51
+ | `--lang <code>` | 语言代码(英文 `en-US`、日文 `ja-JP`…) | `zh-CN` |
52
+ | `--visual-assist` | **视觉兜底**:改传 **720p 代理**(非原片)+ 人脸/说话检测保护漏识别段并重识别(剪不准时开) | 关 |
53
+ | `--no-adaptive-rhythm` | 关闭自适应节奏,改用固定标点停顿表 | 自适应开 |
54
+ | `--render` | 额外**本地 ffmpeg** 按 gtrk EDL 渲染成片 mp4(毛片仍不上传、云端不渲染) | 只出工程 |
55
+ | `--crf <n>` / `--codec <c>` | 本地渲染视频质量 14-28(默认 18,越小越清晰)/ 编码(默认 h264),配 `--render` | — |
56
+ | `--ffmpeg-path <dir>` | 指定 ffmpeg/ffprobe 所在目录(本地抽音频/渲染用) | `~/.gitruck/ffmpeg` → 系统 PATH |
57
+ | `--param k=v` / `--params-json '{…}'` | **通用透传**:任意云端参数(标量可重复 / JSON 嵌套),优先级最高 | — |
58
+ | `--reupload` | 强制重新上传,忽略本地上传缓存 | 关 |
59
+ | `--no-open` | 完成后**不**自动打开产物目录 | **默认会自动打开** |
60
+
61
+ **关键行为(agent 需知道,不用解释给用户):**
62
+
63
+ - **上传缓存**:同一毛片(按 `size:mtime` 指纹)二次跑直接复用 `file_id`,跳过整段上传。缓存在
64
+ `~/.gitruck/upload-cache.json`。云端 file_id 失效会自动重传兜底。毛片改了但指纹意外没变 → `--reupload`。
65
+ - **大文件分片断点续传**:≥256MiB 自动走分片上传(32MiB/片、3 并发、单片自动重试)。上传中断(断网/
66
+ Ctrl+C/进程崩)→ **重跑同一命令即自动续传**,只补缺片不重来(会话在 `~/.gitruck/upload-sessions.json`)。
67
+ 云端已有同内容文件(未过期)时**秒传**:零字节上传直接拿 file_id。`--reupload` 同时跳过缓存/续传会话/秒传,
68
+ 强制整传。小文件路径与输出契约完全不变。
69
+ - **剪映草稿自动落位**:探到剪映/CapCut 草稿目录时,下载后自动把草稿拷进
70
+ `<草稿根>/<毛片名>-video-project-<时间戳>/`(与产物目录同名、含时间戳)→ 剪映项目列表里每次剪辑
71
+ 各为独立条目、不互相覆盖。探不到会警告并提示加 `--jianying-draft-dir`(此时剪映只产 `draft_content.json`、
72
+ 缺 meta、无法直接打开)。
73
+ - **节奏预设**:`steady` 保留更多停顿(稳)、`concise` 默认精炼、`compact` 最紧凑(压停顿最狠)。
74
+ - **部分格式失败不致命**:CLI 如实回显云端 `errors`(某格式没出来不影响其余)。
75
+ - **本地预处理 · 只传抽出物**:跑批先本地探几何 + 抽 16k 单声道 mp3(默认)/ 压 720p 代理(`--visual-assist`);**毛片永不上传**,只传几十 MB 抽出物。抽出物按原片 `size:mtime` 指纹缓存在 `~/.gitruck/audio-cache/`,同毛片重剪免重抽(720p 与 mp3 各缓存各的、互不覆盖)。
76
+ - **结果恒落盘 · 可按 task_id 恢复**:每次跑批恒写 `<产物目录>/result.json`(含完整 `report`,**不受 `--json` 约束**);submit 一成功就写 `task.json`(含 `taskId`)面包屑,且产物目录**延后到首次写入才建**(提交前失败不留空壳、提交后失败留 `task.json` 可恢复)。→ stdout 丢了 / 中途崩了,报告与 `taskId` 都在盘上,用 `gtrk oralcut-result <taskId>` 秒级取回、**别重跑整条 `oralcut`**(见 §2.1)。
77
+
78
+ **细节微调 —— 按用户诉求因势象形、自由组合**(上表是常用一等 flag;下面是节奏细调 + 完整取值)。你有云端全部参数,按需自由决定用哪些。**唯一要求:名字 / 取值 / 范围照文档用**(别记错拼错);传越界云端报 `6016` 附原因、照改即可(乱传不产错误成片、只明确报错)。没特别诉求就跑默认。
79
+
80
+ - **剪不准 / 剪掉真内容 / 有句话没剪进去** → `--visual-assist`:ASR 之外并行跑人脸 + 说话检测,画面在说话却没识别出字的地方**保护不剪**并重识别捞回(需说话人面部基本可见),捞不回的进 `report.review_points` 复核;引擎挂了只降级不失败;会增加处理耗时(与主识别并行、约两者较大值),但不额外计费、绝不凭空生成。**「剪不准」的兜底。**
81
+ - **节奏散参数**(无一等 flag,走 `--param 键=值` / `--params-json`,单位秒、范围 0–5):
82
+ - `punctuation_breaks`:逐标点停顿,键 `,、;:。!?—……` + `paragraph`(段落)。例 `--params-json '{"punctuation_breaks":{"。":0.6,",":0.3}}'`。
83
+ - `intra_gap_max`(>此值算气口,默认 0.35)/ `intra_gap_target`(收到多长,默认 0.10)/ `pad_in`(0.05) / `pad_out`(0.08)。例「气口留白多点」`--param pad_out=0.15`。
84
+ - `render.audio_crossfade_ms`(切点淡化毫秒 0–50、默认 8)等也能透传。
85
+ - **节奏预设完整值**(选最贴内容的、再逐项覆盖;「默认」列 = 不选预设时各标点的默认停顿):
86
+
87
+ | 参数(秒) | steady 稳健 | concise 精练 | compact 紧凑 | 默认 |
88
+ |---|---|---|---|---|
89
+ | 适用 | 讲述/教学 | 自媒体中长 | 短视频/广告 | 通用 |
90
+ | `、`/`,`/`;` | 0.18/0.25/0.36 | 0.12/0.18/0.26 | 0.06/0.08/0.12 | 0.15/0.20/0.30 |
91
+ | `:`/`—` | 0.45/0.55 | 0.32/0.40 | 0.15/0.18 | 0.35/0.45 |
92
+ | `。``!`/`?` | 0.55/0.60 | 0.40/0.45 | 0.18/0.20 | 0.45/0.50 |
93
+ | `……`/`paragraph` | 0.75/1.20 | 0.55/0.90 | 0.25/0.40 | 0.60/1.00 |
94
+ | `intra_gap_max`/`intra_gap_target` | 0.45/0.15 | 0.35/0.10 | 0.25/0.05 | 0.35/0.10 |
95
+ | `pad_in`/`pad_out` | 0.05/0.10 | 0.05/0.08 | 0.03/0.05 | 0.05/0.08 |
96
+
97
+ - 优先级:`--preset` → 一等 flag → 透传(后者覆盖前者)。用户**自己点名**某参数 + 值 → 照他原样透传(CLI 底层支持任意云端参数)。**以上即 agent 需要的全部参数、本文档自足**(`gtrk oralcut --help` 也列全部 flag);官网的原始 HTTP API 文档是给人看的,agent 不必也无法访问。
98
+
99
+ ### 2.1 取回命令:`gtrk oralcut-result <taskId>`(报告丢了别重跑)
100
+
101
+ 按 `task_id` 从云端取回一个**已完成**任务的报告 + 三方工程产物(可选本地渲染成片),**跳过预处理 / 上传 / 提交 / 轮询**。用在:`--json` 的 stdout 丢了、进程中途崩了、或想换台机器再拉一次产物 —— **不要重跑整条 `gtrk oralcut`**(后端 `get_task_by_id` 幂等,报告本就存着)。`taskId` 从产物目录 `task.json`、上次结果 JSON 或日志里取。
102
+
103
+ | 参数 | 作用 | 缺省 |
104
+ |---|---|---|
105
+ | `<taskId>`(位置参数) | 任务 id | 必填 |
106
+ | `-o, --out <dir>` | 产物目录 | `<当前目录>/<taskId>-video-project-<时间戳>` |
107
+ | `--render` | 额外本地渲染成片(需原毛片仍在 gtrk 内嵌路径 + ffmpeg) | 关 |
108
+ | `--jianying-draft-dir` / `--ffmpeg-path` / `--crf` / `--codec` / `--no-open` / `--json` | 同 `oralcut` | — |
109
+
110
+ - **同账号**:取结果需用**提交该任务的同一账号** API Key;异账号 / 已删任务报 `TASK_NOT_FOUND`(CLI 会提示「须用同账号 key」)。
111
+ - **报告长期可取、产物约 60 天**:报告存于任务记录、长期可取;底层产物文件约 **60 天**后被 GC,届时产物下载 404、命令会提示「已过期」并**照常落盘 / 输出报告**(报告不随文件过期)。
112
+ - **输出契约同 `oralcut --json`**:单行 `{ok,outDir,files,jianyingDraftPath,rendered,report,errors,taskId,fileId}`,恢复场景 `fileId=null`。
113
+
114
+ ```bash
115
+ # 报告丢了、按 task_id 取回(不重跑云端)
116
+ gtrk oralcut-result 88269671080189958 --json
117
+ # 顺带本地重渲成片(原毛片需仍在 gtrk 内嵌路径)
118
+ gtrk oralcut-result 88269671080189958 --render --out "D:/回收/某条"
119
+ ```
120
+
121
+ ---
122
+
123
+ ## 2.2 视觉拆分派单器:`gtrk split`(成片 → 分镜派单)
124
+
125
+ `oralcut` 出的是「剪好的口播成片」;`split` 把它拆成 **beat 级视觉分镜**并派单给下游四车道(真人 A-roll / RRV_MG 动态图 / AI_DRAMA 再现 / FILM_BROLL 影视素材)。**纯本地、同步、无云端任务**。上游依赖 `transcript.json`(oralcut 家族恒出的句级词表,源时基)。
126
+
127
+ 编排顺序(脑=`gtrk-splitter` skill / 手=本命令):
128
+
129
+ ```
130
+ gtrk oralcut <毛片> # ① 出成片工程(gtrk + transcript)
131
+ (用户可在客户端手调切点后保存) # ② 时间线随时可改,所见即所得
132
+ gtrk split --project <产物目录> --json # ③ 导出「发起那一刻」的投影视图 split/view.json(skill 创作输入)
133
+ (skill 按视图句级 id 拆 beat、选 lane、写 handoff) # ④ 产机器 JSON 拆分稿(零时码、只引用 utterance id)
134
+ gtrk split <拆分稿.json> --project <目录> --md --json # ⑤ 校验落地:写回 struct_meta.split + 产 dispatch.json
135
+ ```
136
+
137
+ | 用法 | 作用 |
138
+ |---|---|
139
+ | `gtrk split --project <dir>` | **投影视图导出**:transcript × 当刻 `.gtrk` 的 clips → `split/view.json`(句级轨道时基视图,含 dropped 标注) |
140
+ | `gtrk split <拆分稿.json> --project <dir>` | **校验落地**:v1 门 → 结构/枚举/id/hash 校验 → 现场投影 → ① `.gtrk` 的 `struct_meta.split` 原子写回(只改这一个键、mtime 冲突拒写)② `split/dispatch.json` 派单清单(`composition_id`=`<工程slug>-<beatId>`)③ `--md` 人读稿 |
141
+ | `--gtrk` / `--transcript` | 非标准布局兜底:显式指定工程/词表路径(缺省从 `--project` 自动定位 `gtrk/project.gtrk` 与 `transcript/transcript.json`) |
142
+ | `--words` | 视图模式附字级明细(缺省只出句级) |
143
+
144
+ **关键行为(agent 需知):**
145
+ - **时码恒挂源时基、每次发起现场投影**:用户手调切点后重导视图即跟随;此前被剪、现落回 clip 的句子自动复活,无需重跑转写。「拖入已剪好成片」= 恒等投影,同一套逻辑。
146
+ - **拆分稿零时码、id 区间引用**:beat 的文稿范围 = `span:{from:"u0007",to:"u0011"}`(utterance id 区间),**绝不抄原句文字、绝不自造时码**(防 LLM 幻觉)。幻觉 id / 区间倒序 / 跨 beat 重叠 / `transcript_hash` 错版 → **硬拒、非 0 退出、零副作用**。
147
+ - **dropped 处理**:beat 的 span 内 utterance 全被剪 → 跳过该 beat 并入报告;部分被剪 → 按存活句包络收缩、标 `shrunk`。均不使命令失败。
148
+ - **transcript 缺失**(旧任务)→ 明确报错引导「用新版本重跑 oralcut(恒出 transcript)或 transcribe(规划中)」,不做降级猜测。
149
+ - **只动 `struct_meta.split`**:写回不碰 materials/tracks,配合客户端「保存 → 发起 → 写回 → 重载」闭环(opencut 联动)。
150
+ - **下游消费**:`dispatch.json` 的 `film_broll` 队列 → `gtrk matrix --project <dir>`(B-roll 双口检索 → `split/broll-plan.json` 候选清单;url 24h 过期,重跑即重签);`rrv_mg` 槽位表 → real-roam-viz 产颗粒;`ai_drama` 队列 → ai-drama-prompter。
151
+
152
+ > **skill 分工**:拆 beat / 选 lane / 写 handoff 是脑(`gtrk-splitter` skill)的活;投影 / 校验 / 落地 / 写时码是手(本命令)的活。skill 铁律:只引用视图存在的 utterance id、不抄原文定位、不碰时码。
153
+
154
+ ---
155
+
156
+ ## 3. 产物结构 + 三端打开
157
+
158
+ ```
159
+ <毛片名>-video-project-<YYMMDD-HHMMSS>/
160
+ ├── gtrk/project.gtrk → 客户端(OpenCut Gitruck Edition):「打开工程」选它
161
+ ├── jianying/ → 剪映:已自动拷进剪映草稿根,剪映里直接见草稿
162
+ │ ├── draft_content.json
163
+ │ └── draft_meta_info.json (仅当探到/指定了剪映草稿目录才有)
164
+ ├── xml/premiere.xml → Premiere Pro:文件 > 导入
165
+ ├── <毛片名>.mp4 → 成片(仅 --render;本地 ffmpeg 按 gtrk EDL 渲染,云端不产成片)
166
+ ├── result.json → 机读结果清单(含完整 report;恒写、不受 --json 约束;可 gtrk oralcut-result 复现)
167
+ └── task.json → 任务面包屑(taskId 等;submit 成功即写,供崩溃后按 task_id 恢复)
168
+ ```
169
+
170
+ **默认跑完自动打开产物目录文件夹**(`--no-open` 关)——用户常不知道文件落哪,直接帮他打开、自己挑工具。三端切点正确、同源一致(gtrk 是真超集)。
171
+
172
+ ---
173
+
174
+ ## 4. Agent 决策清单(自然语言 → 参数)
175
+
176
+ 把用户的话映射到一次调用,按这几条判断:
177
+
178
+ 1. **毛片路径**:用户给的视频文件绝对路径 → 位置参数。缺则先问。
179
+ 2. **有稿 / 无稿**:
180
+ - 用户给了文字稿/逐字稿文件 → `--script <该文件>`(按稿剪,最准)。
181
+ - 没稿 → 不传 `--script`,走云端无稿智能重建(CLI 默认)。
182
+ 3. **节奏**:用户说「快/紧凑/卡点狠」→ `--preset compact`;「稳一点/别删太多停顿」→ `steady`;
183
+ 没特别要求 → 默认 `concise`,不用传。
184
+ 4. **要不要自动打开**:默认就开(用户常不知道文件去哪了,别让他找)。只有明确「别打开 / 批处理」才加 `--no-open`。
185
+ 5. **剪映装在非标准位置 / 多版本**:若用户没跑过 `gtrk init` 或探测失败,问剪映草稿根目录、传 `--jianying-draft-dir`(或让他先 `gtrk init`)。
186
+ 6. **只要某一两端**:用户只要客户端 → `--formats gtrk`;只要剪映 → `--formats jianying`;默认三端全给。
187
+ 7. **有具体细节诉求**(剪不准 / 换语言 / 要成片 / 调某个停顿)→ 见上「细节微调」,按需自由取用(`--visual-assist` / `--lang` / `--render` / 散参数);没特别诉求跑默认即可。
188
+
189
+ **跑完读 `report`、验证、给用户交代**(`--json` 的 stdout 那行带 `files` / `errors` / **`report`**;别只信"成功"、别谎报三端都好):
190
+ - **读 `report`(因势象形的另一半)**:`duration_before`→`after`(剪了多少);`script_source`/`final_script`(无稿 `rebuilt` 时把 `final_script` 回给用户核对);`dropped[]`(剔了哪些、`reason` retake/misread);`coverage`(<0.6 附 `low_coverage` = 文稿与实拍严重不符);`uncovered_script[]`(**漏读**:文稿有、实拍没找到 → 如实说,疑似漏识别则建议 `--visual-assist` 重跑);`review_points[]`(建议复核处);开了 visual_assist 还有 `suspect_omissions` / `stt_recovered` / `visual_assist_degraded`。**据此因势象形**:覆盖率低 / 漏读多 → 开 `--visual-assist` 或核对文稿重跑;节奏不满意 → 调 `--preset` / 散参数重跑(同毛片可反复剪对比)。
191
+ - **报告也在盘上、丢了能取回**:同一份 `report` 恒写在 `<产物目录>/result.json`(不必依赖 stdout)。万一 stdout 没接住或进程崩了 → 直接读 `result.json`,或 `gtrk oralcut-result <taskId> --json` 按 task_id 重新取回,**不要重跑 `oralcut`**(见 §2.1)。
192
+ - 确认产物目录在、`gtrk/project.gtrk` 非空(>0 字节);要剪映就确认剪映草稿根里有**同名工程目录** + `draft_meta_info.json`。
193
+ - 云端 `errors` 非空 → 如实告知哪个格式失败、原因。
194
+ - 然后**回给用户**:产物目录路径 + 三端各自怎么打开(客户端选 `gtrk/project.gtrk`、剪映已在项目列表、PR 导入 `xml/premiere.xml`),并**据 `report` 给一句交代**(剪了多久 → 多久、去掉了什么、有无漏读需复核)。
195
+
196
+ ---
197
+
198
+ ## 5. 典型调用
199
+
200
+ > 下面示例为聚焦某个参数、**省略了 `--json`**;你(agent)实际调用**一律带 `--json`**(见 §4),stdout 才只剩结果 JSON、便于解析。
201
+
202
+ ```bash
203
+ # 有稿 + 剪完就看(最常见;剪完默认自动打开产物目录,无需额外 flag)
204
+ gtrk oralcut "D:/素材/某选题-原始口播.mp4" --script "D:/素材/某选题-文字稿.txt" --json
205
+
206
+ # 无稿、要最紧凑节奏
207
+ gtrk oralcut "D:/素材/某条.mp4" --preset compact
208
+
209
+ # 只要客户端工程,不碰剪映/PR
210
+ gtrk oralcut "D:/素材/某条.mp4" --formats gtrk
211
+
212
+ # 剪映装在非标准盘符,手动指目录
213
+ gtrk oralcut "D:/素材/某条.mp4" --jianying-draft-dir "F:/JianyingPro/User Data/Projects/com.lveditor.draft"
214
+
215
+ # 用户抱怨"剪掉了真内容 / 剪不准" → 开视觉兜底重跑
216
+ gtrk oralcut "D:/素材/某条.mp4" --visual-assist
217
+
218
+ # 细到某标点停顿 + 顺手渲一个成片
219
+ gtrk oralcut "D:/素材/某条.mp4" --params-json '{"punctuation_breaks":{"。":0.6}}' --render --crf 20
220
+ ```
221
+
222
+ ---
223
+
224
+ ## 6. 排错
225
+
226
+ | 现象 | 处置 |
227
+ |---|---|
228
+ | `缺 API Key —— 先跑 gtrk init` | 没配过 → 跑 `gtrk init`(或设环境变量 `GITRUCK_API_KEY`) |
229
+ | 剪映警告「没找到草稿目录」 | 剪映/CapCut 没装在标准位置 → 加 `--jianying-draft-dir <你的草稿根>` 重跑 |
230
+ | 云端 errors 含某格式 | 该格式单独失败、其余可用;把 errors 原文回给用户/反馈维护方 |
231
+ | 同毛片改了内容但产物像旧的 | 指纹意外没变 → 加 `--reupload` 强制重传 |
232
+ | 任务很久不动 | 轮询有 30min 墙钟上限;超时 CLI 会报,稍后重试或查云端任务 |
233
+ | 结果 JSON / 报告丢了(stdout 没接住、进程崩了) | 别重跑 → 读产物目录 `result.json`,或 `gtrk oralcut-result <taskId> --json` 按 task_id 取回 |
234
+ | 想换机器再拉产物 / 补渲成片 | `gtrk oralcut-result <taskId> [--out <目录>] [--render]`(须同账号 key;产物约 60 天有效,过期仍可取报告) |
235
+
236
+ ---
237
+
238
+ ## 7. 扩展(给改 CLI 的 agent)
239
+
240
+ 新增命令 = 写 `src/commands/<name>.ts` 的 `register<Name>(program)` + 在 `src/index.ts` 注册一行。
241
+ 云端调用走 `src/lib/cloud.ts`(`{code,msg,data}` 包装、鉴权 Header `Authorization:<裸key>`;单发取结果 `getTaskResult`、`pollTask` 复用之);上传一律走 `src/lib/upload-cache.ts` 的 `uploadCached`(白嫖指纹缓存;≥256MiB 自动分片断点续传,见 `src/lib/chunk-upload.ts`)。本地预处理(探几何 / 抽音频 / 压 720p)在 `src/lib/media.ts`;本地渲染(gtrk EDL → ffmpeg filter_complex)在 `src/lib/render.ts`;三方产物落地 + `result.json` 两段写在 `src/lib/materialize.ts`(`oralcut` 与 `oralcut-result` 共用)。已上线:`oralcut`(云剪)、`oralcut-result`(按 task_id 取回)、`render`(本地渲染 gtrk)、`split`(视觉拆分派单器:`src/lib/projection.ts` 投影纯函数 + `src/lib/splitdoc.ts` 拆分稿校验/落地 + `src/lib/gtrk-writeback.ts` 原子写回 `struct_meta.split`,随包分发 `skills/gtrk-splitter/`)。`matrix`(B-roll 检索:`src/lib/matrix.ts` 双口路由/派单翻译/plan 构建 + `src/commands/matrix.ts`;`matrix search "<词>"` ad-hoc)。规划中:`struct`(已有 gtrk → 三方工程)。
package/README.md CHANGED
@@ -18,12 +18,14 @@
18
18
  | | 命令 | 做什么 |
19
19
  |---|---|---|
20
20
  | 🎬 | `gtrk oralcut <毛片>` | 智能口播剪辑闭环:一次出 gtrk + 剪映 + PR 三方工程,自动打开 |
21
- | ✂️ | `gtrk split [拆分稿]` | 视觉拆分派单器:成片 × transcript 投影 → beat 分镜校验落地(`struct_meta.split` + `dispatch.json`),驱动四车道派单 |
21
+ | ✂️ | `gtrk split [拆分稿]` | 视觉拆分派单器:成片 × transcript 投影 → beat 分镜校验落地(`struct_meta.split` + `dispatch.json`),驱动四车道派单;`--column <id>` 按栏目词表校验 |
22
22
  | ⚙️ | `gtrk init` | 引导式一次性配置(API Key + 剪映草稿目录),之后免管 |
23
23
  | 🩺 | `gtrk doctor` | 体检:配置 / 云端连通 / 剪映目录 / 运行时一键自检 |
24
- | 🤖 | `gtrk skills install` | 把 `/gtrk-oralcut`、`/gtrk-splitter` skill 装进 Claude Code |
24
+ | 🤖 | `gtrk skills install` | 把 `/gtrk-oralcut`、`/gtrk-splitter`、`/gtrk-style-maker` skill 装进 Claude Code |
25
25
  | ⬆️ | `gtrk upgrade` | 升级 CLI 到最新版 + 刷新 skill(配置保留);`--check` 只查不装 |
26
- | 🚧 | `render` / `struct` / `matrix` | 本地渲染 gtrk 成片 /(规划中)已有 gtrk 转三方工程 / B-roll 检索 |
26
+ | 🎞️ | `gtrk render` | 本地渲染 gtrk 工程(EDL)→ 成片 mp4(需 ffmpeg) |
27
+ | 🔎 | `gtrk matrix` | B-roll 检索+**候选铺轨**:消费 FILM_BROLL 派单 → 产候选清单 + 下载 preview 代理铺 N 条候选轨(`--lay N` 默认 1,opencut 打开即可用轨道小眼睛对比;`--lay 0` 只出清单);`matrix search "<词>"` 单条 ad-hoc |
28
+ | 🚧 | `struct` | (规划中)已有 gtrk 转三方工程 |
27
29
 
28
30
  ---
29
31
 
@@ -84,18 +86,44 @@ irm https://api.ai-mcn.tv:9000/broadcast/exe/install.ps1 | iex
84
86
  | Skill | 触发 | 做什么 |
85
87
  |---|---|---|
86
88
  | `/gtrk-oralcut` | 斜杠,或「剪口播 / 智能剪辑 / 去掉废话停顿 / 出剪映草稿」 | 驱动 `oralcut` 闭环:云端剪辑 → 拉回三方工程 → 验证 → 回报三端打开方式 |
89
+ | `/gtrk-splitter` | 「文稿视觉化拆分 / 派分镜 / beat 时间线」 | 产视觉拆分稿,交给 `gtrk split` 校验落地(时码永远归 CLI) |
90
+ | `/gtrk-style-maker` | 「建我栏目的风格体系 / 把审美沉淀成 skill / 栏目配置怎么填」 | **能生产 skill 的 meta skill**:启发式访谈帮你把自己的视觉语法落成你自己的 skill 家族 + 栏目配置(见下节) |
91
+
92
+ ---
93
+
94
+ ## 栏目与风格:两层结构
95
+
96
+ > **栏目配置是装修厨房,成片是每天做菜。你不会每做一道菜先重新装修一遍厨房,但每道菜确实都在你装修好的厨房里做。**
97
+
98
+ 整个体系分两层,时间尺度完全不同:
99
+
100
+ **【栏目层 · 一次性/低频】= 建栏目(装修厨房)**
101
+ 跑 `/gtrk-style-maker`(meta skill),它通过启发式访谈帮你想清楚**你自己的**视觉语法——不预设任何维度:不假设你有叙事结构、有主题系统、视觉分动画/实拍,你的维度和取值全部由你自己定义。产出:
102
+
103
+ - 你自己的可执行 skill 家族(落 `~/.claude/skills`,黑盒、留本地)
104
+ - 栏目内共享词表(家族各 skill 引用,防多处定义漂移)
105
+ - 栏目配置 `~/.gitruck/columns/<id>.json`(词表 vocab + B-roll 检索偏好 + style 引用清单)
106
+
107
+ **【成片层 · 每片跑】= 做菜(流程形状不变)**
108
+ 剪口播 → 拆文稿 → 派单(B-roll 检索 / 动效 / 再现)→ 装配 → 渲染。每一步显式消费当前栏目配置:拆文稿按你的词表校验(`--column <id>` 或 config `defaultColumn`),B-roll 检索按你栏目的检索偏好(`broll.column_tag_ids` 栏目标签 / `material_class_policy` / facets),各车道走你自己的生产 skill。
109
+
110
+ **不建栏目?直接用默认"厨房"。** 零配置 = 内置默认栏目,端到端照常跑通,行为与配置化之前逐字节一致——栏目层是可选资产,不是必经关卡。
111
+
112
+ **管线契约**:框架对审美零预设、对管线接口全权威。产物要进渲染管线的 skill 须满足对应契约(见 [`contracts/`](./contracts/README.md),如 HTML 动画颗粒的 `gsap-emit v1`);契约只约束机器可判定的管线属性,画面长什么样永远归你。
87
113
 
88
114
  ---
89
115
 
90
116
  ## 配置
91
117
 
92
- `gtrk init` 把配置写到 `~/.gtrk-cli/config.json`。读取优先级:**环境变量 / `.env` > `init` 持久配置 > 默认根地址**。
118
+ `gtrk init` 把配置写到 `~/.gitruck/config.json`(用户级统一目录,config / 缓存 / ffmpeg / 栏目配置全在 `~/.gitruck/`)。读取优先级:**环境变量 / `.env` > `init` 持久配置 > 默认根地址**。
93
119
 
94
120
  | 项 | 来源 | 说明 |
95
121
  |---|---|---|
96
122
  | `GITRUCK_API_KEY` | env / init | 鉴权 Header `Authorization` 的**裸值**(非 Bearer) |
97
123
  | `GITRUCK_API_BASE` | env / init | API 根地址,默认 `https://api.ai-mcn.tv:10000` |
98
124
  | 剪映草稿目录 | init / 自动探测 / `--jianying-draft-dir` | 决定剪映草稿落哪、能否直接打开 |
125
+ | `defaultColumn` | config.json 手填 | 缺省栏目配置 id(`gtrk split` 未传 `--column` 时用它;再缺省 = 内置默认栏目) |
126
+ | 栏目配置 | `~/.gitruck/columns/<id>.json` | 一栏目一文件;由 `/gtrk-style-maker` 生成登记,也可手写 |
99
127
 
100
128
  非交互配置(脚本 / CI):
101
129
 
@@ -173,7 +201,7 @@ gtrk init --api-key <KEY> --jianying-draft-dir auto -y
173
201
  ## 注意
174
202
 
175
203
  - 剪映 / CapCut 草稿需 `draft_content.json` + `draft_meta_info.json` **成对**才被软件识别——要么 `gtrk init` 配好草稿目录、要么 `--jianying-draft-dir` 指定,否则只产 content、需手动导入。
176
- - 多台机器盘符不同时,配置走 `~/.gtrk-cli/`(用户级),产物默认落毛片同目录。
204
+ - 多台机器盘符不同时,配置走 `~/.gitruck/`(用户级;旧 `~/.gtrk-cli` 首次启动自动迁移),产物默认落毛片同目录。
177
205
  - 节奏预设强度以云端为准;`--preset` 只选预设、不改源裁剪。
178
206
 
179
207
  ---
@@ -183,9 +211,10 @@ gtrk init --api-key <KEY> --jianying-draft-dir auto -y
183
211
  ```
184
212
  gtrk-cli/
185
213
  ├── src/index.ts # commander 入口
186
- ├── src/commands/ # 子命令:install / init / oralcut / doctor / upgrade / skills
187
- ├── src/lib/ # cloud / config / user-config / jianying / open / upload-cache / log
188
- ├── skills/gtrk-oralcut/ # 打包的 agent skill(skills install 装它)
214
+ ├── src/commands/ # 子命令:install / init / oralcut / split / doctor / upgrade / skills
215
+ ├── src/lib/ # cloud / column-config / splitdoc / projection / user-config / jianying /
216
+ ├── skills/ # 打包的 agent skills:gtrk-oralcut / gtrk-splitter / gtrk-style-maker
217
+ ├── contracts/ # 框架契约库正本(gsap-emit v1 + handoff→契约映射表)
189
218
  ├── assets/ # 剪映草稿目录指引图
190
219
  └── AGENT.md # 可移植 agent playbook(skill 底座)
191
220
  ```
@@ -0,0 +1,14 @@
1
+ # 框架契约库(handoff contracts)
2
+
3
+ 同合云管线的 handoff 契约**正本**,随 `@gitruck/cli` npm 包分发。创作 skill 以「契约名 + 版本」引用(如 `gsap-emit v1`);`handoff-contracts.json` 是「handoff 类型 → 契约」映射表,消费方查表、不硬编码。
4
+
5
+ ## 收录双轴边界(handoff-contract-library spec,扩项须走 change 过审)
6
+
7
+ - **轴一(管线性,审美零预设)**:契约只约束**机器可判定的管线消费属性**(封装/注册/确定性/依赖可达/产物格式)。**不得**规定颜色、字体、构图、红点数量等任何视觉取值或栏目词表词条;凡涉视觉取值处一律参数化/中性占位。「全片最多一个红点」这类审美铁律属栏目 skill 侧,**不入库**。
8
+ - **轴二(脱敏)**:只收**自有管线**的合规契约——渲染引擎合规、`.gtrk` 契约、派单格式(封闭列举)。外部供应商/外部平台适配内容(AI 视频平台差异、文生图平台参数等)**永不收录**,那属于用户自己的 skill。
9
+
10
+ ## 现有契约
11
+
12
+ | 契约 | 版本 | 适用 handoff | 文档 |
13
+ |---|---|---|---|
14
+ | gsap-emit(HTML 动画颗粒逐帧 seek 合规) | v1 | RRV_MG | [gsap-emit-v1.md](gsap-emit-v1.md) |