@gitruck/cli 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +2 -2
- package/README.md +17 -12
- package/dist/index.js +132 -7
- package/package.json +66 -66
- package/skills/gtrk-ai-drama/SKILL.md +221 -214
- package/skills/gtrk-matrix/SKILL.md +17 -10
- package/skills/gtrk-mg/SKILL.md +174 -165
- package/skills/gtrk-splitter/SKILL.md +16 -7
- package/skills/gtrk-tools/SKILL.md +9 -1
package/README.en.md
CHANGED
|
@@ -403,7 +403,7 @@ Standalone single-request capabilities, kept separate from the pipeline's lane c
|
|
|
403
403
|
|
|
404
404
|
| Tool | Input | Output | Billing | Status |
|
|
405
405
|
|---|---|---|---|---|
|
|
406
|
-
| `image_move` | One image | Camera-move video (geometry derived from the source orientation: landscape 1920×1080 / portrait 1080×1920) | Queried live before the run | Live |
|
|
406
|
+
| `image_move` | One image; optional `--motion` picks one of 26 camera moves | Camera-move video (geometry derived from the source orientation: landscape 1920×1080 / portrait 1080×1920) | Queried live before the run | Live |
|
|
407
407
|
| `image_matting` | One image | Transparent-background png (`--param` can request a backing plate) | Queried live before the run | Live |
|
|
408
408
|
| `image_blackborder_remove` | One local image | Image with black borders removed | Queried live before the run | Live |
|
|
409
409
|
| `image_canvas_adapt` | One local image; optional target width/height and `normal` / `rectangle` / `square` | Aspect-adapted image | Queried live before the run | Live |
|
|
@@ -444,7 +444,7 @@ Standalone single-request capabilities, kept separate from the pipeline's lane c
|
|
|
444
444
|
The seven shared video tools — black-border removal, aspect adaptation, stabilization, vaporwave, cleanup, upscaling and interpolation — accept only the server's current `video_ext`: `.mp4`, `.avi`, `.mpg`, `.mov`, `.flv`, `.mxf`, `.mpeg`, `.ogg`, `.3gp`, `.wmv`, `.h264`, `.m4v`, `.ts`; `.mkv` and `.webm` are rejected locally. Inputs must be local file paths — the CLI does not download remote videos.
|
|
445
445
|
|
|
446
446
|
- `gtrk tool list [--json]` — list every tool (name/description/input/output/live price/status); `--json` emits a single-line machine-readable array (including dynamic `billingHint`/`pricing`). **Works without an API key**; prices are queried anonymously through a public endpoint, and on failure the full list is still shown with an unavailable marker.
|
|
447
|
-
- `gtrk tool image_move ./photo.jpg [--json]` — image to camera move; artifacts land in `photo-image_move/`. `--param width=1080 --param height=1920` overrides the derived geometry.
|
|
447
|
+
- `gtrk tool image_move ./photo.jpg [--motion zoom_in_center] [--json]` — image to camera move; artifacts land in `photo-image_move/`. `--motion` picks the camera move explicitly (26 values: 8 pans `up_to_down`/`down_to_up`/`left_to_right`/`right_to_left` plus four diagonals, 9 zoom-in anchors `zoom_in_{up,down,left,right,left_up,right_up,left_down,right_down,center}`, 9 zoom-out anchors `zoom_out_` at the same positions); when omitted the server picks one automatically. `--param width=1080 --param height=1920` overrides the derived geometry.
|
|
448
448
|
- `gtrk tool image_matting ./portrait.jpg` / `gtrk tool video_matting ./clip.mp4` — image/video matting.
|
|
449
449
|
- `gtrk tool image_blackborder_remove ./photo.jpg [--json]` — automatically crops black borders from one image.
|
|
450
450
|
- `gtrk tool image_canvas_adapt ./photo.jpg --canvas-width 1080 --canvas-height 1920 --canvas-type rectangle [--json]` — image aspect conversion; omitting the canvas parameters uses the server defaults. Per the actual runtime contract the canvas mode accepts only `normal`, `rectangle` and `square`, not the `fit` from older docs.
|
package/README.md
CHANGED
|
@@ -88,18 +88,22 @@ gtrk transcript "D:/素材/采访视频.mp4"
|
|
|
88
88
|
|
|
89
89
|
**每片一条龙(有先后的 SOP,对 agent 说话、每步你可介入——不是一次性并行铺完)**
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
各车道**按次序铺、每步留检查点**:先把 B-roll 底轨三源铺齐(影视素材 / 本地素材 / AI 情景片段)→ 你调好 → 抽帧核一遍画面构图 → 最后才把 MG(含 ov)叠上去。你对话推进每一步,agent 替你跑对应命令。
|
|
92
92
|
|
|
93
93
|
| 步 | 你对 agent 说 | agent 替你做 | 你可以介入 |
|
|
94
94
|
|:--:|---|---|---|
|
|
95
95
|
| ① | 「帮我把这条口播**剪一版**」 | `/gtrk-oralcut` → `gtrk oralcut` → 三方工程 + transcript | — |
|
|
96
96
|
| ② | 「接着**拆分镜派单**」 | `/gtrk-splitter` → `gtrk split` → `dispatch.json` 四车道 | 核对派单结果 |
|
|
97
|
-
| ③ |
|
|
98
|
-
| ④ | 「B-roll
|
|
99
|
-
| ⑤ |
|
|
97
|
+
| ③ | 「**铺 B-roll 底轨**」(两条腿同一阶段) | `/gtrk-matrix` → `gtrk matrix` → 影视/本地素材候选轨铺入;`/gtrk-ai-drama`(skill,无命令)→ 四段描述稿(中英分块) | **opencut 里挑选/调整 B-roll**(小眼睛切换对比);AI 片段去外部平台出片、**手动回铺** |
|
|
98
|
+
| ④ | 「B-roll 齐了,**抽帧看看构图**」 | 对**三源合并后的最终底轨**抽帧(agent 纪律,无专属命令) | **确认构图**(主体位置 / 安全区 / 朝向 / 明暗) |
|
|
99
|
+
| ⑤ | 「构图没问题,**铺 MG**」 | `/gtrk-mg` → `gtrk mg` → MG(含 ov)叠在已定稿的底轨之上 | 精修颗粒(opencut 手调) |
|
|
100
100
|
| ⑥ | 「**出成片**」 | 客户端出片链(多车道合成 + 颗粒云渲 / 导剪映);`gtrk render` 只出**主轨快照预览** | 客户端里精修定稿 |
|
|
101
101
|
|
|
102
|
-
>
|
|
102
|
+
> **次序有理由**:**AI 情景片段属于底轨 B-roll 画面家族,不是叠加层**——整条管线里唯一的叠加层是 MG(含 ov)。MG 的排版是「因势象形避主体」、**依赖底轨的最终画面构图**,所以三源(影视 / 本地 / AI)必须全落齐、构图核过,才轮到 MG。用不到的车道跳过(`dispatch` 里该队列为空就不铺)。
|
|
103
|
+
>
|
|
104
|
+
> ⚠️ **旧版文档曾写「④ 铺 MG → ⑤ 最后上 AI 再现」,理由是「越往后叠得越上层」——那是把「工序次序」误当成了「图层次序」,已于 2026-08-17 纠正。** 若你装的是旧版 skill,`gtrk upgrade` 刷新后才是新序。
|
|
105
|
+
>
|
|
106
|
+
> **AI 出片是异步的**:外部平台抽卡可能数天,严格串行会把 ④⑤ 无限期卡住。故进 ⑤ 的门是「**AI 片段已回铺 ∨ 你明示先跳过**」;走跳过时 agent 会把与 AI 区间相邻/重叠的 MG 颗粒标记为「AI 回铺后待复查构图」并在收口时复述给你。
|
|
103
107
|
>
|
|
104
108
|
> ③④⑤⑥ 都要**回到客户端**挑选 / 精修 / 回铺 / 出片——CLI 把料铺进 `.gtrk`,客户端把 `.gtrk` 出成片。详见下文「**CLI × 客户端**」小节。
|
|
105
109
|
|
|
@@ -137,7 +141,7 @@ CLI 写 .gtrk ─▶ 客户端打开(自动感知外部改动、先存脏改再
|
|
|
137
141
|
| **B-roll 候选挑选** | `gtrk matrix` 铺 N 条候选轨,用轨道**小眼睛**逐条切换对比、选定、删多余——审美取舍只能人在客户端做 |
|
|
138
142
|
| **MG / 颗粒精修** | 客户端里 html-particle **活颗粒透明预览** + Transform/Blending/Effects 参数逐帧微调 |
|
|
139
143
|
| **口播精剪** | 磁性主轨 ripple、手动微调切点 / 停顿 / 分屏 |
|
|
140
|
-
| **AI 再现回铺** | 外部平台出的 AI 片段**手动拖进 AI_DRAMA 车道**对齐区间(`/gtrk-ai-drama` 只吐描述稿,片在外部平台出,见 SOP
|
|
144
|
+
| **AI 再现回铺** | 外部平台出的 AI 片段**手动拖进 AI_DRAMA 车道**对齐区间(`/gtrk-ai-drama` 只吐描述稿,片在外部平台出,见 SOP ③——它属底轨阶段,MG 要等它落位后才铺) |
|
|
141
145
|
| **最终出片** | 多车道合成(overlay / MG / particle 云渲叠起来)+ 剪映草稿导出,都在客户端出片链 |
|
|
142
146
|
|
|
143
147
|
> **`gtrk render` ≠ 最终成片。** `gtrk render` 是本地 ffmpeg 出**主轨(口播粗剪)的快照预览**——只合主视频轨 + 音轨,**不合成 overlay(B-roll 候选)/ MG 颗粒 / AI 再现**。要出**真正的多车道成片**(各车道叠起来、颗粒云渲、导剪映草稿),走**客户端出片链**。一句话:**CLI 管「把料铺进工程」,客户端管「把工程出成片」。**
|
|
@@ -202,9 +206,10 @@ gtrk skills install --copy
|
|
|
202
206
|
|:--:|---|---|---|
|
|
203
207
|
| ① | `/gtrk-oralcut` | `gtrk oralcut` | 智能剪口播 → 客户端/剪映/PR 三方工程 + transcript |
|
|
204
208
|
| ② | `/gtrk-splitter` | `gtrk split` | 拆分派单 → `dispatch.json`(A_ROLL/MG/AI_DRAMA/FILM_BROLL 四车道) |
|
|
205
|
-
| ③ | `/gtrk-matrix` | `gtrk matrix` |
|
|
206
|
-
|
|
|
207
|
-
|
|
|
209
|
+
| ③ | `/gtrk-matrix` | `gtrk matrix` | **B-roll 底轨·影视/本地素材腿**:铺候选轨 → **用户调整/挑选**(opencut 小眼睛切换) |
|
|
210
|
+
| ③ | `/gtrk-ai-drama` | (无命令,纯创作) | **B-roll 底轨·AI 情景片段腿(与 matrix 同阶段,不是最后)**:产四段描述稿(故事背景/角色/分镜/原文,中英分块)→ 任意外部平台出片、手动回铺(产物即描述文本、无机械尾巴,同 `/gtrk-style-maker` 只 skill 无命令) |
|
|
211
|
+
| ④ | (无 skill) | (无命令) | **全局抽帧检查画面构图**:对三源合并后的最终底轨抽帧,用户确认构图——这是 agent 纪律硬门,供 ⑤ 的排版避让决策使用 |
|
|
212
|
+
| ⑤ | `/gtrk-mg` | `gtrk mg` | **MG(含 ov)最后叠上**(叠在已定稿、构图已核的底轨之上) |
|
|
208
213
|
| — | `/gtrk-style-maker` | (无命令,建栏目) | 一次性访谈式建你栏目的风格体系(skill 家族 + 栏目配置,见下节) |
|
|
209
214
|
| — | (收口) | `gtrk render` | 本地渲染 gtrk 工程 → 成片 mp4 |
|
|
210
215
|
| 📝 | `/gtrk-transcript` | `gtrk transcript` | 本地视频 → 一个含 Agent 总结、时码记录和纯文本的 Markdown,**不在成片 SOP 序列内** |
|
|
@@ -212,7 +217,7 @@ gtrk skills install --copy
|
|
|
212
217
|
| 🎵 | `/gtrk-music-visualizer` | `gtrk music-visualizer` | 一首歌 → 频谱可视化成片(模板 + 可选背景/封面 + 配色样式),**不在成片 SOP 序列内**、独立引流用 |
|
|
213
218
|
| 🖼️ | `/gtrk-cover` | (无命令,纯创作) | 封面工作台两阶段:设计诊断 + 三尺寸中英双版文生图 Prompt → 用户外部平台抽图 → H5 排字工作台(拖拽/滚轮微调、一键导出多尺寸 PNG)。栏目封面审美经栏目配置 `style.skills`(`produces:"cover"`)注入;**不在成片 SOP 序列内**(投放配套的「第 0 阶段」) |
|
|
214
219
|
|
|
215
|
-
> **skill 与命令的区别**:`/gtrk-mg` 是**脑**——懂它在 SOP 第
|
|
220
|
+
> **skill 与命令的区别**:`/gtrk-mg` 是**脑**——懂它在 SOP 第 ⑤ 步(B-roll 三源全齐、构图核过才铺 MG)、带用户确认、按栏目配置解析该产哪种颗粒;`gtrk mg` 是**手**——纯确定性 lint + 铺轨。你对话触发 skill,skill 替你跑命令。
|
|
216
221
|
> 上面 10 个 `/gtrk-X` 都是 **CLI 自带框架 skill**(`gtrk skills install` 装)——`/gtrk-transcript` 独立驱动视频转文字稿,`/gtrk-tools` 只负责单点工具族,`/gtrk-cover` 管封面,三者都不属成片 SOP 序列;`/gtrk-ai-drama`·`/gtrk-style-maker`·`/gtrk-cover` 是纯创作 skill(无命令)。栏目专属的**视觉风格/生产内容**另由你栏目的生产 skill(`/gtrk-style-maker` 产、经栏目配置 `style.skills` 绑定)供,不写死在这些框架 skill 里。
|
|
217
222
|
|
|
218
223
|
**各车道的具体视觉/内容怎么产**——MG 动态图长什么样、AI 再现什么调性——不写死在 CLI 里,而由**你自己栏目的生产 skill** 提供(用 `/gtrk-style-maker` 访谈式产出、留本地)。它们经**栏目配置 `style.skills[].produces`**(值 = 车道名)绑定,`gtrk mg` / `gtrk matrix` 等**通用驱动器**据此消费。**驱动方向 = CLI 驱动栏目 skill**:栏目 skill 只供风格/内容、不含任何「跑哪条命令」的编排职责;框架只认车道与管线接口,画面风格永远归你的栏目。不建栏目就用内置默认,端到端照常跑。
|
|
@@ -403,7 +408,7 @@ gtrk transcript "D:/素材/采访视频.mp4" --lang zh-CN --out "D:/文字稿/
|
|
|
403
408
|
|
|
404
409
|
| 工具 | 输入 | 产物 | 计费 | 状态 |
|
|
405
410
|
|---|---|---|---|---|
|
|
406
|
-
| `image_move` |
|
|
411
|
+
| `image_move` | 单张图片;可选 `--motion` 指定 26 种运镜之一 | 运镜视频(几何按原图朝向推导:横 1920×1080 / 竖 1080×1920) | 运行前实时查询 | 已上线 |
|
|
407
412
|
| `image_matting` | 单张图片 | 透明背景 png(可 `--param` 请求背景底板) | 运行前实时查询 | 已上线 |
|
|
408
413
|
| `image_blackborder_remove` | 单张本地图片 | 去黑边图片 | 运行前实时查询 | 已上线 |
|
|
409
414
|
| `image_canvas_adapt` | 单张本地图片;可选目标宽高与 `normal` / `rectangle` / `square` | 比例适配图片 | 运行前实时查询 | 已上线 |
|
|
@@ -444,7 +449,7 @@ gtrk transcript "D:/素材/采访视频.mp4" --lang zh-CN --out "D:/文字稿/
|
|
|
444
449
|
去黑边、比例转换、防抖、蒸汽波、净化、超分、插帧七个公共视频工具只接受服务端当前 `video_ext`:`.mp4`、`.avi`、`.mpg`、`.mov`、`.flv`、`.mxf`、`.mpeg`、`.ogg`、`.3gp`、`.wmv`、`.h264`、`.m4v`、`.ts`;`.mkv` 与 `.webm` 会在本地拒绝。输入必须是本地文件路径,CLI 不负责下载远端视频。
|
|
445
450
|
|
|
446
451
|
- `gtrk tool list [--json]` — 列全部工具(名称/说明/输入/产物/实时价格/状态);`--json` 出单行机读数组(含动态 `billingHint`/`pricing`)。**无 API Key 也能跑**;价格通过公开接口匿名查询,失败仍列完整清单并标记暂不可用。
|
|
447
|
-
- `gtrk tool image_move ./photo.jpg [--json]` — 图转运镜;产物落 `photo-image_move/`。`--param width=1080 --param height=1920` 覆盖推导几何。
|
|
452
|
+
- `gtrk tool image_move ./photo.jpg [--motion zoom_in_center] [--json]` — 图转运镜;产物落 `photo-image_move/`。`--motion` 显式指定运镜方式(26 值:平移 8 `up_to_down`/`down_to_up`/`left_to_right`/`right_to_left` 及四对角线、放大锚点 9 `zoom_in_{up,down,left,right,left_up,right_up,left_down,right_down,center}`、缩小锚点 9 `zoom_out_` 同九方位),未传由云端自动选择;`--param width=1080 --param height=1920` 覆盖推导几何。
|
|
448
453
|
- `gtrk tool image_matting ./portrait.jpg` / `gtrk tool video_matting ./clip.mp4` — 图片/视频抠像。
|
|
449
454
|
- `gtrk tool image_blackborder_remove ./photo.jpg [--json]` — 自动裁去单张图片四周黑边。
|
|
450
455
|
- `gtrk tool image_canvas_adapt ./photo.jpg --canvas-width 1080 --canvas-height 1920 --canvas-type rectangle [--json]` — 图片比例转换;省略画布参数时沿用服务端默认。画布模式按实际运行时契约只接受 `normal`、`rectangle`、`square`,不接受旧文档中的 `fit`。
|
package/dist/index.js
CHANGED
|
@@ -4604,6 +4604,67 @@ function noticeOnce(deps = {}) {
|
|
|
4604
4604
|
return true;
|
|
4605
4605
|
}
|
|
4606
4606
|
|
|
4607
|
+
// src/lib/first-run-tutorial.ts
|
|
4608
|
+
var TUTORIAL_URL = "https://hocassian.feishu.cn/wiki/HCFpwoF7SivIFbkKosgcFMcEnxk";
|
|
4609
|
+
var QUICK_START_URL = "https://cloud.ai-mcn.tv/zh-CN/docs/quick-start";
|
|
4610
|
+
var FIRST_RUN_USAGE_LINES = [
|
|
4611
|
+
'① 命令行直接剪:gtrk oralcut "<毛片.mp4>" --script "<文字稿.txt>"(无稿就别加 --script)',
|
|
4612
|
+
"② 刷新你常用的 AI Agent,在它的 Skills 入口选择或点名 gtrk-oralcut;不同客户端也都可以直接描述剪辑需求触发。"
|
|
4613
|
+
];
|
|
4614
|
+
var FIRST_RUN_TUTORIAL_LINES = [
|
|
4615
|
+
"\uD83D\uDC4B 第一次用 gtrk?三步跑通第一条口播:",
|
|
4616
|
+
" 1) gtrk install —— 装依赖与运行时资产",
|
|
4617
|
+
" 2) gtrk init —— 填 API Key、认剪映草稿目录(跑完会自动体检)",
|
|
4618
|
+
` 3) ${FIRST_RUN_USAGE_LINES[0]}`,
|
|
4619
|
+
` 使用教程 ${TUTORIAL_URL}`,
|
|
4620
|
+
` 快速开始 ${QUICK_START_URL}`
|
|
4621
|
+
];
|
|
4622
|
+
function traceFailedLine2() {
|
|
4623
|
+
return ` 首跑留痕未能写入 ${configPath()}:不影响本次执行,下次运行会再提示一次`;
|
|
4624
|
+
}
|
|
4625
|
+
var printedInThisProcess2 = false;
|
|
4626
|
+
function looksOnboarded(cfg) {
|
|
4627
|
+
return typeof cfg.apiKey === "string" && cfg.apiKey.trim().length > 0;
|
|
4628
|
+
}
|
|
4629
|
+
function firstRunTutorialOnce(deps = {}) {
|
|
4630
|
+
const write = deps.write ?? ((chunk) => void process.stderr.write(chunk));
|
|
4631
|
+
let cfg;
|
|
4632
|
+
try {
|
|
4633
|
+
cfg = (deps.readConfig ?? readUserConfig)();
|
|
4634
|
+
} catch {
|
|
4635
|
+
cfg = {};
|
|
4636
|
+
}
|
|
4637
|
+
const stamp = () => {
|
|
4638
|
+
try {
|
|
4639
|
+
(deps.writeConfig ?? writeUserConfig)({
|
|
4640
|
+
firstRunNoticeAt: (deps.now ?? (() => new Date))().toISOString()
|
|
4641
|
+
});
|
|
4642
|
+
return true;
|
|
4643
|
+
} catch {
|
|
4644
|
+
return false;
|
|
4645
|
+
}
|
|
4646
|
+
};
|
|
4647
|
+
if (typeof cfg.firstRunNoticeAt === "string" && cfg.firstRunNoticeAt.length > 0)
|
|
4648
|
+
return false;
|
|
4649
|
+
if (looksOnboarded(cfg)) {
|
|
4650
|
+
stamp();
|
|
4651
|
+
return false;
|
|
4652
|
+
}
|
|
4653
|
+
if (printedInThisProcess2)
|
|
4654
|
+
return false;
|
|
4655
|
+
const [head, ...rest] = FIRST_RUN_TUTORIAL_LINES;
|
|
4656
|
+
write(`\x1B[36m${head}\x1B[0m
|
|
4657
|
+
\x1B[2m${rest.join(`
|
|
4658
|
+
`)}\x1B[0m
|
|
4659
|
+
`);
|
|
4660
|
+
printedInThisProcess2 = true;
|
|
4661
|
+
if (!stamp()) {
|
|
4662
|
+
write(`\x1B[2m${traceFailedLine2()}\x1B[0m
|
|
4663
|
+
`);
|
|
4664
|
+
}
|
|
4665
|
+
return true;
|
|
4666
|
+
}
|
|
4667
|
+
|
|
4607
4668
|
// src/lib/jianying.ts
|
|
4608
4669
|
import { join as join4, resolve as resolve2 } from "node:path";
|
|
4609
4670
|
import { existsSync as existsSync4 } from "node:fs";
|
|
@@ -6201,8 +6262,8 @@ async function afterConfigDoctor() {
|
|
|
6201
6262
|
const healthy = await runDoctor();
|
|
6202
6263
|
if (healthy) {
|
|
6203
6264
|
log.step("装好了!两种用法任选:");
|
|
6204
|
-
|
|
6205
|
-
|
|
6265
|
+
for (const line2 of FIRST_RUN_USAGE_LINES)
|
|
6266
|
+
log.info(line2);
|
|
6206
6267
|
log.info("想有自己栏目的风格体系?在 agent 里跑 /gtrk-style-maker 建一次「你的厨房」(skill 家族 + 栏目配置);不建就直接用默认,照常开剪。");
|
|
6207
6268
|
} else {
|
|
6208
6269
|
log.warn("上面体检有项没通,按提示处理好再开剪(多半是 API Key 或剪映目录)。");
|
|
@@ -7234,9 +7295,10 @@ function layBrollTracks(opts) {
|
|
|
7234
7295
|
}
|
|
7235
7296
|
}
|
|
7236
7297
|
}
|
|
7298
|
+
const hasSelfProducedContentInPlace = createdTracks.length > 0 || rebasedBandTracks.length > 0 || transitionKeptIndices.length > 0;
|
|
7237
7299
|
let blackTrack = null;
|
|
7238
7300
|
let blackTrackObj = null;
|
|
7239
|
-
if (blackBedOn &&
|
|
7301
|
+
if (blackBedOn && hasSelfProducedContentInPlace) {
|
|
7240
7302
|
if (!isLayoutableCanvas([canvas[0], canvas[1]])) {
|
|
7241
7303
|
warnings.push(`画布尺寸非法(${canvas[0]}x${canvas[1]}),跳过铺纯黑底轨(候选轨照常铺)。`);
|
|
7242
7304
|
} else {
|
|
@@ -7269,6 +7331,9 @@ function layBrollTracks(opts) {
|
|
|
7269
7331
|
}
|
|
7270
7332
|
}
|
|
7271
7333
|
}
|
|
7334
|
+
if (blackBedOn && hasSelfProducedContentInPlace && blackTrack === null) {
|
|
7335
|
+
warnings.push(`异常:本轮有 B-roll 内容轨在场、也没有 --no-black-bed,却没能铺出纯黑底垫轨 —— ` + `这些 B-roll 段落底下会直接露出口播 A-roll。请回报此告警(含本轮命令行)以便定位。`);
|
|
7336
|
+
}
|
|
7272
7337
|
let blackBedHoles = [];
|
|
7273
7338
|
let blackBedHoleSec = 0;
|
|
7274
7339
|
if (blackTrack !== null) {
|
|
@@ -9164,6 +9229,34 @@ function probeImageDims(inputAbs, ffmpegPath) {
|
|
|
9164
9229
|
} catch {}
|
|
9165
9230
|
return;
|
|
9166
9231
|
}
|
|
9232
|
+
var IMAGE_MOVE_MOTIONS = new Set([
|
|
9233
|
+
"up_to_down",
|
|
9234
|
+
"down_to_up",
|
|
9235
|
+
"left_to_right",
|
|
9236
|
+
"right_to_left",
|
|
9237
|
+
"right_up_to_left_down",
|
|
9238
|
+
"left_up_to_right_down",
|
|
9239
|
+
"right_down_to_left_up",
|
|
9240
|
+
"left_down_to_right_up",
|
|
9241
|
+
"zoom_in_up",
|
|
9242
|
+
"zoom_in_down",
|
|
9243
|
+
"zoom_in_left",
|
|
9244
|
+
"zoom_in_right",
|
|
9245
|
+
"zoom_in_left_up",
|
|
9246
|
+
"zoom_in_right_up",
|
|
9247
|
+
"zoom_in_left_down",
|
|
9248
|
+
"zoom_in_right_down",
|
|
9249
|
+
"zoom_in_center",
|
|
9250
|
+
"zoom_out_up",
|
|
9251
|
+
"zoom_out_down",
|
|
9252
|
+
"zoom_out_left",
|
|
9253
|
+
"zoom_out_right",
|
|
9254
|
+
"zoom_out_left_up",
|
|
9255
|
+
"zoom_out_right_up",
|
|
9256
|
+
"zoom_out_left_down",
|
|
9257
|
+
"zoom_out_right_down",
|
|
9258
|
+
"zoom_out_center"
|
|
9259
|
+
]);
|
|
9167
9260
|
var imageMove = {
|
|
9168
9261
|
name: "image_move",
|
|
9169
9262
|
title: "图转运镜",
|
|
@@ -9174,8 +9267,21 @@ var imageMove = {
|
|
|
9174
9267
|
outputHint: "运镜视频",
|
|
9175
9268
|
enabled: true,
|
|
9176
9269
|
taskType: "image_move",
|
|
9270
|
+
options: [
|
|
9271
|
+
{
|
|
9272
|
+
flag: "--motion <value>",
|
|
9273
|
+
desc: "运镜方式(未传则云端自动选择;显式指定后同图同参重跑结果一致)。" + "平移 8:up_to_down/down_to_up/left_to_right/right_to_left 及四条对角线;" + "放大锚点 9:zoom_in_{up,down,left,right,left_up,right_up,left_down,right_down,center};" + "缩小锚点 9:zoom_out_ 同九方位"
|
|
9274
|
+
}
|
|
9275
|
+
],
|
|
9177
9276
|
buildPayload(fileId, ctx) {
|
|
9178
9277
|
const p = { file_id: fileId };
|
|
9278
|
+
if (ctx.opts.motion != null) {
|
|
9279
|
+
const value = String(ctx.opts.motion);
|
|
9280
|
+
if (!IMAGE_MOVE_MOTIONS.has(value)) {
|
|
9281
|
+
throw new Error(`--motion 不支持「${value}」。合法值:平移 8(up_to_down/down_to_up/left_to_right/right_to_left/` + "right_up_to_left_down/left_up_to_right_down/right_down_to_left_up/left_down_to_right_up)、" + "放大锚点 9(zoom_in_{up,down,left,right,left_up,right_up,left_down,right_down,center})、" + "缩小锚点 9(zoom_out_ 同九方位)");
|
|
9282
|
+
}
|
|
9283
|
+
p.motion = value;
|
|
9284
|
+
}
|
|
9179
9285
|
const explicit = ctx.extraParams.width != null || ctx.extraParams.height != null;
|
|
9180
9286
|
if (!explicit && ctx.inputAbs) {
|
|
9181
9287
|
const dims = probeImageDims(ctx.inputAbs, ctx.ffmpegPath);
|
|
@@ -11247,7 +11353,23 @@ async function runOralCutResult(taskId, opts) {
|
|
|
11247
11353
|
|
|
11248
11354
|
// src/commands/upgrade.ts
|
|
11249
11355
|
import { spawnSync as spawnSync5 } from "node:child_process";
|
|
11250
|
-
|
|
11356
|
+
|
|
11357
|
+
// src/lib/desktop-client-hint.ts
|
|
11358
|
+
var CLIENT_UPGRADE_CMD = "irm https://api.ai-mcn.tv:9000/broadcast/exe/install.ps1 | iex";
|
|
11359
|
+
var CLIENT_PLATFORMS = ["win32"];
|
|
11360
|
+
function hasDesktopClient(platform = process.platform) {
|
|
11361
|
+
return CLIENT_PLATFORMS.includes(platform);
|
|
11362
|
+
}
|
|
11363
|
+
function desktopClientUpgradeHint(prefix, platform = process.platform) {
|
|
11364
|
+
return hasDesktopClient(platform) ? `${prefix}:${CLIENT_UPGRADE_CMD}` : null;
|
|
11365
|
+
}
|
|
11366
|
+
|
|
11367
|
+
// src/commands/upgrade.ts
|
|
11368
|
+
function noteClientUpgrade(prefix) {
|
|
11369
|
+
const hint = desktopClientUpgradeHint(prefix);
|
|
11370
|
+
if (hint)
|
|
11371
|
+
log.info(hint);
|
|
11372
|
+
}
|
|
11251
11373
|
function run(cmd) {
|
|
11252
11374
|
const r = spawnSync5(cmd, { stdio: "inherit", shell: true });
|
|
11253
11375
|
return r.status ?? 1;
|
|
@@ -11259,12 +11381,12 @@ function registerUpgrade(program2) {
|
|
|
11259
11381
|
const latest = await latestVersion();
|
|
11260
11382
|
if (!latest) {
|
|
11261
11383
|
log.warn("查不到最新版本(网络问题?)。手动升级:npm i -g @gitruck/cli@latest");
|
|
11262
|
-
|
|
11384
|
+
noteClientUpgrade("客户端(桌面端)升级");
|
|
11263
11385
|
return;
|
|
11264
11386
|
}
|
|
11265
11387
|
if (cmpSemver(latest, cur) <= 0) {
|
|
11266
11388
|
log.ok(`已是最新版 v${cur}。`);
|
|
11267
|
-
|
|
11389
|
+
noteClientUpgrade("客户端(桌面端)如需升级");
|
|
11268
11390
|
return;
|
|
11269
11391
|
}
|
|
11270
11392
|
log.info(`发现新版本 v${latest}(当前 v${cur})。`);
|
|
@@ -11283,7 +11405,7 @@ function registerUpgrade(program2) {
|
|
|
11283
11405
|
log.warn("skill 没刷成,手动跑一次:gtrk skills install");
|
|
11284
11406
|
}
|
|
11285
11407
|
log.ok(`已升级到 v${latest}。配置原样保留,直接接着用即可(gtrk doctor 可自检)。`);
|
|
11286
|
-
|
|
11408
|
+
noteClientUpgrade("客户端(桌面端)如需一起升级");
|
|
11287
11409
|
});
|
|
11288
11410
|
}
|
|
11289
11411
|
|
|
@@ -18622,6 +18744,9 @@ migrateLegacyHome();
|
|
|
18622
18744
|
var { version } = JSON.parse(readFileSync8(join35(packageRoot(), "package.json"), "utf8"));
|
|
18623
18745
|
var program2 = new Command;
|
|
18624
18746
|
program2.name("gtrk").description("同合云成片流水线 CLI —— agent 驱动云端任务、产物拉回本地、三方工程文件(客户端/剪映/PR)互通").version(version);
|
|
18747
|
+
program2.hook("preAction", () => {
|
|
18748
|
+
firstRunTutorialOnce();
|
|
18749
|
+
});
|
|
18625
18750
|
registerInstall(program2);
|
|
18626
18751
|
registerInit(program2);
|
|
18627
18752
|
registerOralCut(program2);
|
package/package.json
CHANGED
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@gitruck/cli",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "同合云成片流水线 CLI —— agent 驱动云端任务、产物拉回本地、三方工程文件(客户端/剪映/PR)互通。",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"author": "Gitruck (同合云)",
|
|
7
|
-
"repository": {
|
|
8
|
-
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/Gitruck/cli.git"
|
|
10
|
-
},
|
|
11
|
-
"homepage": "https://github.com/Gitruck/cli#readme",
|
|
12
|
-
"bugs": {
|
|
13
|
-
"url": "https://github.com/Gitruck/cli/issues"
|
|
14
|
-
},
|
|
15
|
-
"type": "module",
|
|
16
|
-
"bin": {
|
|
17
|
-
"gtrk": "dist/index.js"
|
|
18
|
-
},
|
|
19
|
-
"files": [
|
|
20
|
-
"dist",
|
|
21
|
-
"assets",
|
|
22
|
-
"skills",
|
|
23
|
-
"contracts",
|
|
24
|
-
"AGENT.md",
|
|
25
|
-
"README.md",
|
|
26
|
-
"README.en.md",
|
|
27
|
-
"LICENSE"
|
|
28
|
-
],
|
|
29
|
-
"engines": {
|
|
30
|
-
"node": ">=20.6"
|
|
31
|
-
},
|
|
32
|
-
"publishConfig": {
|
|
33
|
-
"access": "public",
|
|
34
|
-
"registry": "https://registry.npmjs.org/"
|
|
35
|
-
},
|
|
36
|
-
"keywords": [
|
|
37
|
-
"gitruck",
|
|
38
|
-
"同合云",
|
|
39
|
-
"video",
|
|
40
|
-
"oral-cut",
|
|
41
|
-
"口播剪辑",
|
|
42
|
-
"cli",
|
|
43
|
-
"jianying",
|
|
44
|
-
"剪映",
|
|
45
|
-
"agent"
|
|
46
|
-
],
|
|
47
|
-
"scripts": {
|
|
48
|
-
"gtrk": "bun run src/index.ts",
|
|
49
|
-
"build": "bun build ./src/index.ts --target=node --outfile dist/index.js",
|
|
50
|
-
"typecheck": "tsc --noEmit",
|
|
51
|
-
"prepublishOnly": "npm run typecheck && npm test && bun run build",
|
|
52
|
-
"test": "esbuild src/lib/compliance-notice.ts src/lib/chunk-upload.ts src/lib/upload-cache.ts src/lib/upload-submit.ts src/lib/render.ts src/lib/cloud.ts src/lib/materialize.ts src/lib/jianying.ts src/lib/clip-brief.ts src/lib/media.ts src/lib/projection.ts src/lib/reproject.ts src/lib/splitdoc.ts src/lib/gtrk-writeback.ts src/lib/column-config.ts src/lib/matrix.ts src/lib/matrix-lay.ts src/lib/embed-client.ts src/lib/describe.ts src/lib/local-index.ts src/lib/local-search.ts src/lib/image-move.ts src/lib/cloud-render-guard.ts src/lib/material-integrity.ts src/lib/solid-png.ts src/lib/mg-lint.ts src/lib/mg-lay.ts src/lib/tool-descriptors.ts src/lib/tool-runner.ts src/lib/tool-pricing.ts src/lib/transcript.ts src/lib/runtime-assets.ts --bundle --platform=node --format=esm --external:bun:sqlite --outdir=.test-build --out-extension:.js=.mjs && esbuild src/commands/split.ts --bundle --platform=node --format=esm --outdir=.test-build --out-extension:.js=.mjs && esbuild src/commands/matrix.ts --bundle --platform=node --format=esm --external:bun:sqlite --outfile=.test-build/matrix-cmd.mjs && esbuild src/commands/mg.ts --bundle --platform=node --format=esm --outfile=.test-build/mg-cmd.mjs && esbuild src/commands/tool.ts --bundle --platform=node --format=esm --outfile=.test-build/tool-cmd.mjs && esbuild src/commands/transcript.ts --bundle --platform=node --format=esm --outfile=.test-build/transcript-cmd.mjs && esbuild src/commands/music-visualizer.ts --bundle --platform=node --format=esm --external:commander --outfile=.test-build/music-visualizer-cmd.mjs && esbuild src/commands/long2short.ts --bundle --platform=node --format=esm --external:commander --outfile=.test-build/long2short-cmd.mjs && esbuild src/commands/skills.ts --bundle --platform=node --format=esm --outfile=.test-build/skills-cmd.mjs && esbuild src/lib/convert/ir_to_jsx.ts src/lib/convert/ir_to_am.ts src/lib/convert/ir_to_nv.ts src/lib/convert/am_parse.ts src/lib/convert/nv_parse.ts src/lib/convert/parse.ts src/lib/convert/download.ts src/lib/convert/bake_ops.ts --bundle --platform=node --format=esm --outdir=.test-build/convert --out-extension:.js=.mjs && esbuild src/lib/mad/selector.ts src/lib/mad/beat.ts src/lib/mad/scan.ts src/lib/mad/data.ts src/lib/mad/pool.ts src/lib/mad/cloud-beat.ts src/lib/mad/mad.ts --bundle --platform=node --format=esm --outdir=.test-build/mad --out-extension:.js=.mjs && node --import ./test/helpers/test-home.mjs --test \"test/*.test.mjs\"",
|
|
53
|
-
"openspec:gate": "node openspec/gate.mjs"
|
|
54
|
-
},
|
|
55
|
-
"devDependencies": {
|
|
56
|
-
"@xmldom/xmldom": "^0.9.6",
|
|
57
|
-
"bun-types": "^1.1.0",
|
|
58
|
-
"commander": "^12.1.0",
|
|
59
|
-
"esbuild": "^0.28.1",
|
|
60
|
-
"typescript": "^5.6.0"
|
|
61
|
-
},
|
|
62
|
-
"dependencies": {
|
|
63
|
-
"hash-wasm": "^4.12.0",
|
|
64
|
-
"jszip": "^3.10.1"
|
|
65
|
-
}
|
|
66
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@gitruck/cli",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "同合云成片流水线 CLI —— agent 驱动云端任务、产物拉回本地、三方工程文件(客户端/剪映/PR)互通。",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Gitruck (同合云)",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Gitruck/cli.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/Gitruck/cli#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/Gitruck/cli/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"bin": {
|
|
17
|
+
"gtrk": "dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"assets",
|
|
22
|
+
"skills",
|
|
23
|
+
"contracts",
|
|
24
|
+
"AGENT.md",
|
|
25
|
+
"README.md",
|
|
26
|
+
"README.en.md",
|
|
27
|
+
"LICENSE"
|
|
28
|
+
],
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20.6"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public",
|
|
34
|
+
"registry": "https://registry.npmjs.org/"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"gitruck",
|
|
38
|
+
"同合云",
|
|
39
|
+
"video",
|
|
40
|
+
"oral-cut",
|
|
41
|
+
"口播剪辑",
|
|
42
|
+
"cli",
|
|
43
|
+
"jianying",
|
|
44
|
+
"剪映",
|
|
45
|
+
"agent"
|
|
46
|
+
],
|
|
47
|
+
"scripts": {
|
|
48
|
+
"gtrk": "bun run src/index.ts",
|
|
49
|
+
"build": "bun build ./src/index.ts --target=node --outfile dist/index.js",
|
|
50
|
+
"typecheck": "tsc --noEmit",
|
|
51
|
+
"prepublishOnly": "npm run typecheck && npm test && bun run build",
|
|
52
|
+
"test": "esbuild src/lib/compliance-notice.ts src/lib/first-run-tutorial.ts src/lib/desktop-client-hint.ts src/lib/chunk-upload.ts src/lib/upload-cache.ts src/lib/upload-submit.ts src/lib/render.ts src/lib/cloud.ts src/lib/materialize.ts src/lib/jianying.ts src/lib/clip-brief.ts src/lib/media.ts src/lib/projection.ts src/lib/reproject.ts src/lib/splitdoc.ts src/lib/gtrk-writeback.ts src/lib/column-config.ts src/lib/matrix.ts src/lib/matrix-lay.ts src/lib/embed-client.ts src/lib/describe.ts src/lib/local-index.ts src/lib/local-search.ts src/lib/image-move.ts src/lib/cloud-render-guard.ts src/lib/material-integrity.ts src/lib/solid-png.ts src/lib/mg-lint.ts src/lib/mg-lay.ts src/lib/tool-descriptors.ts src/lib/tool-runner.ts src/lib/tool-pricing.ts src/lib/transcript.ts src/lib/runtime-assets.ts --bundle --platform=node --format=esm --external:bun:sqlite --outdir=.test-build --out-extension:.js=.mjs && esbuild src/commands/split.ts --bundle --platform=node --format=esm --outdir=.test-build --out-extension:.js=.mjs && esbuild src/commands/matrix.ts --bundle --platform=node --format=esm --external:bun:sqlite --outfile=.test-build/matrix-cmd.mjs && esbuild src/commands/mg.ts --bundle --platform=node --format=esm --outfile=.test-build/mg-cmd.mjs && esbuild src/commands/tool.ts --bundle --platform=node --format=esm --outfile=.test-build/tool-cmd.mjs && esbuild src/commands/transcript.ts --bundle --platform=node --format=esm --outfile=.test-build/transcript-cmd.mjs && esbuild src/commands/music-visualizer.ts --bundle --platform=node --format=esm --external:commander --outfile=.test-build/music-visualizer-cmd.mjs && esbuild src/commands/long2short.ts --bundle --platform=node --format=esm --external:commander --outfile=.test-build/long2short-cmd.mjs && esbuild src/commands/skills.ts --bundle --platform=node --format=esm --outfile=.test-build/skills-cmd.mjs && esbuild src/lib/convert/ir_to_jsx.ts src/lib/convert/ir_to_am.ts src/lib/convert/ir_to_nv.ts src/lib/convert/am_parse.ts src/lib/convert/nv_parse.ts src/lib/convert/parse.ts src/lib/convert/download.ts src/lib/convert/bake_ops.ts --bundle --platform=node --format=esm --outdir=.test-build/convert --out-extension:.js=.mjs && esbuild src/lib/mad/selector.ts src/lib/mad/beat.ts src/lib/mad/scan.ts src/lib/mad/data.ts src/lib/mad/pool.ts src/lib/mad/cloud-beat.ts src/lib/mad/mad.ts --bundle --platform=node --format=esm --outdir=.test-build/mad --out-extension:.js=.mjs && node --import ./test/helpers/test-home.mjs --test \"test/*.test.mjs\"",
|
|
53
|
+
"openspec:gate": "node openspec/gate.mjs"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@xmldom/xmldom": "^0.9.6",
|
|
57
|
+
"bun-types": "^1.1.0",
|
|
58
|
+
"commander": "^12.1.0",
|
|
59
|
+
"esbuild": "^0.28.1",
|
|
60
|
+
"typescript": "^5.6.0"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"hash-wasm": "^4.12.0",
|
|
64
|
+
"jszip": "^3.10.1"
|
|
65
|
+
}
|
|
66
|
+
}
|