@optima-chat/optima-agent 0.9.3 → 0.9.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.
Files changed (103) hide show
  1. package/.claude/skills/channels/SKILL.md +7 -14
  2. package/.claude/skills/video-edit/SKILL.md +255 -0
  3. package/.claude/skills/video-gen/SKILL.md +188 -66
  4. package/.claude/skills/video-gen/templates/INDEX.md +78 -0
  5. package/.claude/skills/video-gen/templates/before-after-beauty.md +183 -0
  6. package/.claude/skills/video-gen/templates/drama-fmcg.md +183 -0
  7. package/.claude/skills/video-gen/templates/kol-reaction-food.md +193 -0
  8. package/.claude/skills/video-gen/templates/multi-point-apparel.md +185 -0
  9. package/.claude/skills/video-gen/templates/pain-solution-home.md +184 -0
  10. package/.claude/skills/video-gen/templates/pdp-360-showcase.md +189 -17
  11. package/.claude/skills/video-gen/templates/pdp-feature-highlight.md +182 -18
  12. package/.claude/skills/video-gen/templates/scene-digital.md +183 -0
  13. package/dist/bin/bi-cli.js +0 -0
  14. package/dist/bin/browser-cli.js +0 -0
  15. package/dist/bin/commerce.js +0 -0
  16. package/dist/bin/gen.js +0 -0
  17. package/dist/bin/google-ads.js +0 -0
  18. package/dist/bin/logistics.js +0 -0
  19. package/dist/bin/optima.js +0 -0
  20. package/dist/bin/scout.js +0 -0
  21. package/dist/bin/sentinel.js +0 -0
  22. package/dist/bin/shopify.js +0 -0
  23. package/dist/src/system-prompt.d.ts.map +1 -1
  24. package/dist/src/system-prompt.js +0 -4
  25. package/dist/src/system-prompt.js.map +1 -1
  26. package/package.json +1 -1
  27. package/.claude/settings.local.json +0 -166
  28. package/.claude/skills/video-gen/templates/lifestyle-scene.md +0 -18
  29. package/.claude/skills/video-gen/templates/tiktok-before-after.md +0 -17
  30. package/.claude/skills/video-gen/templates/tiktok-product-reveal.md +0 -17
  31. package/.claude/skills/video-gen/templates/tiktok-unboxing.md +0 -18
  32. package/dist/bin/comfy.d.ts +0 -3
  33. package/dist/bin/comfy.d.ts.map +0 -1
  34. package/dist/bin/comfy.js +0 -3
  35. package/dist/bin/comfy.js.map +0 -1
  36. package/dist/bin/growth.d.ts +0 -3
  37. package/dist/bin/growth.d.ts.map +0 -1
  38. package/dist/bin/growth.js +0 -3
  39. package/dist/bin/growth.js.map +0 -1
  40. package/dist/src/hooks-loader.d.ts +0 -6
  41. package/dist/src/hooks-loader.d.ts.map +0 -1
  42. package/dist/src/hooks-loader.js +0 -215
  43. package/dist/src/hooks-loader.js.map +0 -1
  44. package/dist/src/ui/App.d.ts +0 -6
  45. package/dist/src/ui/App.d.ts.map +0 -1
  46. package/dist/src/ui/App.js +0 -164
  47. package/dist/src/ui/App.js.map +0 -1
  48. package/dist/src/ui/components/Composer.d.ts +0 -10
  49. package/dist/src/ui/components/Composer.d.ts.map +0 -1
  50. package/dist/src/ui/components/Composer.js +0 -13
  51. package/dist/src/ui/components/Composer.js.map +0 -1
  52. package/dist/src/ui/components/Header.d.ts +0 -7
  53. package/dist/src/ui/components/Header.d.ts.map +0 -1
  54. package/dist/src/ui/components/Header.js +0 -7
  55. package/dist/src/ui/components/Header.js.map +0 -1
  56. package/dist/src/ui/components/Message.d.ts +0 -12
  57. package/dist/src/ui/components/Message.d.ts.map +0 -1
  58. package/dist/src/ui/components/Message.js +0 -21
  59. package/dist/src/ui/components/Message.js.map +0 -1
  60. package/dist/src/ui/components/MessageList.d.ts +0 -9
  61. package/dist/src/ui/components/MessageList.d.ts.map +0 -1
  62. package/dist/src/ui/components/MessageList.js +0 -18
  63. package/dist/src/ui/components/MessageList.js.map +0 -1
  64. package/dist/src/ui/components/Spinner.d.ts +0 -6
  65. package/dist/src/ui/components/Spinner.d.ts.map +0 -1
  66. package/dist/src/ui/components/Spinner.js +0 -7
  67. package/dist/src/ui/components/Spinner.js.map +0 -1
  68. package/dist/src/ui/components/StatusBar.d.ts +0 -11
  69. package/dist/src/ui/components/StatusBar.d.ts.map +0 -1
  70. package/dist/src/ui/components/StatusBar.js +0 -7
  71. package/dist/src/ui/components/StatusBar.js.map +0 -1
  72. package/dist/src/ui/components/index.d.ts +0 -7
  73. package/dist/src/ui/components/index.d.ts.map +0 -1
  74. package/dist/src/ui/components/index.js +0 -7
  75. package/dist/src/ui/components/index.js.map +0 -1
  76. package/dist/src/validation/error-formatter.d.ts +0 -21
  77. package/dist/src/validation/error-formatter.d.ts.map +0 -1
  78. package/dist/src/validation/error-formatter.js +0 -98
  79. package/dist/src/validation/error-formatter.js.map +0 -1
  80. package/dist/src/validation/index.d.ts +0 -10
  81. package/dist/src/validation/index.d.ts.map +0 -1
  82. package/dist/src/validation/index.js +0 -10
  83. package/dist/src/validation/index.js.map +0 -1
  84. package/dist/src/validation/json-validator.d.ts +0 -25
  85. package/dist/src/validation/json-validator.d.ts.map +0 -1
  86. package/dist/src/validation/json-validator.js +0 -173
  87. package/dist/src/validation/json-validator.js.map +0 -1
  88. package/dist/src/validation/schema.d.ts +0 -353
  89. package/dist/src/validation/schema.d.ts.map +0 -1
  90. package/dist/src/validation/schema.js +0 -57
  91. package/dist/src/validation/schema.js.map +0 -1
  92. package/dist/src/validation/suggestions.d.ts +0 -25
  93. package/dist/src/validation/suggestions.d.ts.map +0 -1
  94. package/dist/src/validation/suggestions.js +0 -144
  95. package/dist/src/validation/suggestions.js.map +0 -1
  96. package/dist/src/validation/types.d.ts +0 -40
  97. package/dist/src/validation/types.d.ts.map +0 -1
  98. package/dist/src/validation/types.js +0 -5
  99. package/dist/src/validation/types.js.map +0 -1
  100. package/dist/src/validation/yaml-validator.d.ts +0 -25
  101. package/dist/src/validation/yaml-validator.d.ts.map +0 -1
  102. package/dist/src/validation/yaml-validator.js +0 -177
  103. package/dist/src/validation/yaml-validator.js.map +0 -1
@@ -31,7 +31,6 @@ description: "社交渠道管理。接入/管理 Telegram、WhatsApp、Discord
31
31
  - "关掉 Telegram" → `channels accounts disable telegram store`
32
32
  - "重新开启 Telegram" → `channels accounts enable telegram store`
33
33
  - "删除 Telegram 渠道" → `channels accounts remove telegram store`
34
- - "帮我绑定 Telegram" → `channels bind generate`
35
34
  - "查看我的绑定" → `channels bind list`
36
35
  - "解绑 Telegram" → `channels bind remove --platform telegram --account-id store --platform-uid 123456`
37
36
  - "给用户发通知" → `channels send --user-id <id> --text "消息内容"`
@@ -46,7 +45,6 @@ description: "社交渠道管理。接入/管理 Telegram、WhatsApp、Discord
46
45
  | 查看渠道列表 | `channels accounts list` | 显示所有账号及状态 |
47
46
  | 启用/禁用渠道 | `channels accounts enable/disable` | 不删除配置,只是暂停 |
48
47
  | 删除渠道 | `channels accounts remove` | 永久删除,需重新配置 |
49
- | 绑定社交账号 | `channels bind generate` | 生成绑定码,用户在社交 App 发给 bot |
50
48
  | 查看绑定 | `channels bind list` | 显示当前用户绑定的社交账号 |
51
49
  | 解绑 | `channels bind remove` | 需要指定 platform、account-id、platform-uid |
52
50
  | 发送通知 | `channels send` | 发到用户所有已绑定渠道 |
@@ -130,21 +128,17 @@ channels accounts add line --account-id store \
130
128
  channels status
131
129
  ```
132
130
 
133
- ## 场景6:绑定社交账号
131
+ ## 场景6:社交账号自动绑定
134
132
 
135
- **流程**: 生成绑定码 用户在社交 App 发给 bot
133
+ **无需 CLI 操作**。商家只需给 bot 发送任意消息,bot 会:
136
134
 
137
- ```bash
138
- # 1. 生成绑定码(默认当前登录用户)
139
- channels bind generate
140
- # 输出: { "code": "BIND-A3X7K9", "expiresIn": 300 }
135
+ 1. 自动回复一条授权链接(形如 `https://auth.optima.onl/api/v1/oauth/device?user_code=XXX-YYY`)
136
+ 2. 商家点开链接在手机浏览器登录并授权
137
+ 3. bot 发送 "✅ 授权成功" 消息,之后商家可以直接问任何业务问题
141
138
 
142
- # 2. 告诉用户:
143
- # "请在 Telegram 给 @YourBot 发送: BIND-A3X7K9(5分钟内有效)"
139
+ 链接 10 分钟内有效。超过 14 天未活跃,bot 会要求重新授权。
144
140
 
145
- # 3. 确认绑定
146
- channels bind list
147
- ```
141
+ **开发者运维**:如需强制解绑某条绑定,用 `channels bind remove`(现有命令不变)。
148
142
 
149
143
  ## 场景7:发送通知
150
144
 
@@ -185,7 +179,6 @@ channels accounts enable <platform> <accountId>
185
179
  channels accounts disable <platform> <accountId>
186
180
 
187
181
  # 绑定管理
188
- channels bind generate [--user-id <id>]
189
182
  channels bind list [--user-id <id>]
190
183
  channels bind remove --platform <p> --account-id <a> --platform-uid <uid>
191
184
 
@@ -0,0 +1,255 @@
1
+ ---
2
+ name: video-edit
3
+ description: "文本驱动的口播视频剪辑(带 AI 二次审片)。用于:剪口播 / 剪 talking head / 删卡顿停顿 / 删 NG 重复 / 给视频加中文字幕 / 视频质量审核。触发:用户上传一段口播视频说'帮我剪一下'/'去掉卡顿'/'剪成短视频'/'加字幕',或要求'剪辑'/'剪片'/'cut'/'review'/'字幕'/'subtitle'。"
4
+ ---
5
+
6
+ # Video-Edit Skill — 文本驱动的口播视频剪辑
7
+
8
+ 帮商家把原始口播视频(讲产品、讲品牌故事、TikTok / 小红书内容)剪成可发布的短视频。**核心理念:转写只是线索,业务语境决定取舍**。
9
+
10
+ ## Global Rules(违反会出脏片)
11
+
12
+ 1. **业务语境优先于声学检测**
13
+ 开剪前必问 / 必确认:(a) 视频用在哪个平台(TikTok/小红书/IG/详情页),(b) 钩子(hook)是什么,(c) 目标时长。**不知道这三件事就不要开始剪**——`video-edit` 只删卡顿不删废话;废话要靠 AI 在 cut_proposal.md 里自己判断。
14
+
15
+ 2. **Claude 必须自己做语义审片,两关都过才交付**
16
+ `video-edit cut` 出片只是声学层;交付前 **Claude 自己**还要做一关:
17
+ - 把成片转写一遍(再调 `video-edit subtitle` 拿 subs.ass 或单独转写)
18
+ - 抓"预期落空 / 语法断裂 / 重复 NG / 不完整句"等声学检测**永远抓不到的**问题
19
+ - 抓到 → 改 cut_proposal.md → 重新 cut → 重新审,直到通过
20
+
21
+ 3. **模型名 / 服务名不出现在用户回复里**
22
+ 状态、进度、错误统一用"剪辑中 / 转写中 / 审片中 / 字幕生成中"。`faster-whisper`、`ffmpeg`、`Microsoft YaHei` 这些字眼**不要回显给用户**。
23
+
24
+ 4. **Anti-fabrication**
25
+ `video-edit` 只有 5 个命令:`analyze` / `cut` / `review` / `subtitle` / `both`。其他 flag 不要凭印象拼。每个命令只接 1 个位置参数:视频文件路径。
26
+
27
+ ## 工作目录约定
28
+
29
+ 不需要全局 git 仓库。每个视频自己带 `<video_stem>.work/` 目录存中间产物:
30
+
31
+ ```
32
+ /home/aiuser/<workspace>/
33
+ ├── input.mp4 # 用户上传的源视频
34
+ ├── input.work/ # video-edit 自动创建
35
+ │ ├── audio.wav
36
+ │ ├── transcript.json # word-level 转写
37
+ │ ├── silences.json # 静音检测
38
+ │ ├── cut_proposal.md # ⭐ Claude 在这里编辑
39
+ │ ├── review_report.md # review 命令产出
40
+ │ └── subs.ass # subtitle 命令产出(可手改)
41
+ ├── input_edited.mp4 # cut 输出
42
+ └── input_edited_subbed.mp4 # subtitle 输出
43
+ ```
44
+
45
+ ## 五命令工作流
46
+
47
+ ```mermaid
48
+ flowchart LR
49
+ A[1. analyze] --> B[2. 编辑 proposal]
50
+ B --> C[3. cut]
51
+ C --> D[4. review]
52
+ D -->|有 HARD issues| B
53
+ D -->|通过| E[5. subtitle]
54
+ ```
55
+
56
+ ### Step 1:先问业务语境
57
+
58
+ **Anti-pattern**:用户说"剪一下" → AI 直接跑 `analyze` → 出片不对路。
59
+
60
+ **正确做法**:先 ask user(用 AskUserQuestion 或自然语言):
61
+
62
+ ```
63
+ 我帮你剪。开始前确认几件事:
64
+ 1. 视频投在哪?(TikTok / 小红书 / IG / 商品详情页)
65
+ 2. 钩子是什么?(前 3 秒要让用户停下来的那句话)
66
+ 3. 目标时长?(15s / 30s / 60s)
67
+ ```
68
+
69
+ 如果用户说"你看着办" → 用平台默认(TikTok 30s + 强钩子在前 3s)+ 立刻执行,**不要再回问**。
70
+
71
+ ### Step 2:analyze(声学预处理)
72
+
73
+ ```bash
74
+ video-edit analyze "/home/aiuser/<workspace>/input.mp4"
75
+ ```
76
+
77
+ 输出:
78
+ - `<workspace>/input.work/cut_proposal.md` ← Claude 编辑这个
79
+ - `<workspace>/input.work/transcript.json`、`silences.json`、`audio.wav`
80
+
81
+ ⚠️ 如果 `cut_proposal.md` 已存在,命令**不会覆盖**(保留你之前的编辑)。重新生成要先 `rm cut_proposal.md`。
82
+
83
+ ### Step 3:编辑 cut_proposal.md(这步是 Claude 干的活)
84
+
85
+ 读 proposal,每行是一个"短语单元"(300ms 静音分组),格式:
86
+
87
+ ```
88
+ 00:01.234 - 00:03.456 (2.22s) [0.50s!] 这个保留单元的原文
89
+ ```
90
+
91
+ **在要删的行首加 `#`**(保存即可)。判定标准:
92
+
93
+ | 该删 | 该留 |
94
+ |---|---|
95
+ | NG / 重复 take("我说一下啊...呃我说一下...")| 完整业务点 |
96
+ | 跑题闲聊("对...那个...")| 钩子句、卖点句 |
97
+ | 嗯啊呃等填充词独占的短语 | 转折句、call-to-action |
98
+ | 与平台/钩子/时长目标冲突的内容 | 与目标对齐的内容 |
99
+
100
+ **业务原则**:宁可短不可冗。30 秒目标 → 优先压到 25-28 秒留呼吸空间。
101
+
102
+ ### Step 4:cut(出片)
103
+
104
+ ```bash
105
+ video-edit cut "/home/aiuser/<workspace>/input.mp4"
106
+ ```
107
+
108
+ 输出 `<workspace>/input_edited.mp4`。
109
+
110
+ ### Step 5:review(声学层质量检查)
111
+
112
+ ```bash
113
+ video-edit review "/home/aiuser/<workspace>/input.mp4"
114
+ ```
115
+
116
+ 输出 `<workspace>/input.work/review_report.md`,分两类问题:
117
+
118
+ | 类别 | 含义 | 处理 |
119
+ |---|---|---|
120
+ | **HARD** | 残留静音 / 切到字中间 / 输出有重复内容 | **必须修**,回到 Step 3 改 proposal 重剪 |
121
+ | **WARN** | 能量突变 / 语速异常 / 语音占比低 | 评估后决定 |
122
+
123
+ 报告底部三种判定:
124
+ - `[OK] ALL CLEAR` → 进入 Step 5(字幕)
125
+ - `[OK] NO HARD ISSUES` → 看 WARN,决定是否要修
126
+ - `[FAIL] HARD ISSUES` → 必须回 Step 3
127
+
128
+ ### Step 5.5:⭐ Claude 自己做语义审片(声学检测抓不到的)
129
+
130
+ `review` 是声学层。**Claude 在交付前必须自己做语义层**:
131
+
132
+ 1. 让转写跑一遍成片,或用 subtitle 命令产出 `subs.ass` 后读它
133
+ 2. 把 `cut_proposal.md` 里**保留的短语序列**和**成片转写**对比
134
+ 3. 检查这些**声学检测查不出**的问题:
135
+ - **预期落空**:"我跟你讲三个特点。第一是..." 但成片只剩两个特点
136
+ - **语法断裂**:句子被砍到主语没了 / 宾语没了
137
+ - **逻辑跳跃**:Step A 直接跳 Step C,Step B 被剪掉
138
+ - **指代失效**:"这个" / "那种" 的指代物被剪掉
139
+ - **重复语义**:同一意思用不同词说了两遍都被保留
140
+
141
+ 抓到任何一条 → 回 Step 3 改 proposal → 重剪 → 重审。**两关都过才交付**。
142
+
143
+ ### Step 6:subtitle(烧字幕)
144
+
145
+ ```bash
146
+ video-edit subtitle "/home/aiuser/<workspace>/input.mp4"
147
+ ```
148
+
149
+ 行为:
150
+ - 自动转写成片 → 智能分段(标点 / 词间 gap / 14 字 / 3s 多策略)→ 写 `subs.ass`
151
+ - **如果 `subs.ass` 已存在则跳过生成**(保留 Claude 或用户的文字修正),直接重烧
152
+ - 输出 `<workspace>/input_edited_subbed.mp4`(如果传的是 `_edited.mp4` 则去掉 `_edited` 后缀)
153
+
154
+ 修字幕:直接编辑 `subs.ass` 然后重跑 `subtitle` 命令即可。
155
+
156
+ ## 典型场景
157
+
158
+ ### 场景 1:TikTok 30s 短视频(最常见)
159
+
160
+ ```
161
+ 用户:"帮我剪成 TikTok 30 秒"
162
+
163
+ Claude 流程:
164
+ 1. 上传视频到 /home/aiuser/work/raw.mp4
165
+ 2. video-edit analyze → 读 cut_proposal.md
166
+ 3. 找钩子(最有冲击力的开场)放最前,删跑题、删 NG,目标 25-28s
167
+ 4. video-edit cut → 看产出
168
+ 5. video-edit review → 处理 HARD issues
169
+ 6. 自己审一遍语义 → 确认逻辑通顺
170
+ 7. video-edit subtitle → 烧字幕
171
+ 8. 给用户:raw_edited_subbed.mp4
172
+ ```
173
+
174
+ ### 场景 2:详情页 PDP 视频(节奏稍慢)
175
+
176
+ ```
177
+ 用户:"剪个商品详情页用的视频,1 分钟内"
178
+
179
+ Claude 流程:
180
+ - 钩子可以稍弱(用户已有购买意向才会看 PDP)
181
+ - 重点保留产品参数 / 使用场景 / 信任背书
182
+ - review WARN: pace-slow 可以容忍(PDP 容许喘息)
183
+ - 字幕字体可以大一点(修改 subs.ass 里 Fontsize)
184
+ ```
185
+
186
+ ### 场景 3:纯字幕需求(不剪)
187
+
188
+ ```
189
+ 用户:"这个视频不用剪,帮我加个字幕"
190
+
191
+ 直接 video-edit subtitle "/path/to/video.mp4"
192
+ 跳过 analyze / cut / review。
193
+ ```
194
+
195
+ ### 场景 4:剪完用户要再调(迭代)
196
+
197
+ ```
198
+ 用户:"开头那段还是不要了"
199
+
200
+ 不要重跑 analyze(会丢之前的 proposal 编辑)。
201
+ 做法:
202
+ 1. 直接编辑现有的 cut_proposal.md,把开头几行加上 #
203
+ 2. video-edit cut
204
+ 3. video-edit review
205
+ 4. video-edit subtitle(subs.ass 已存在会复用,可能要 rm 重生成)
206
+ ```
207
+
208
+ ## 决策表:什么时候用什么命令
209
+
210
+ | 用户场景 | 命令序列 |
211
+ |---|---|
212
+ | 完整剪一支带字幕成片 | analyze → 编辑 proposal → cut → review → 自己审 → subtitle |
213
+ | 只剪不要字幕 | analyze → 编辑 proposal → cut → review → 自己审 |
214
+ | 只加字幕 | subtitle |
215
+ | 用户说"你帮我直接剪好" | both(autocut,不编辑 proposal) → review → 自己审 → subtitle |
216
+ | 二次调整(已剪过一次) | 改 cut_proposal.md → cut → review → 自己审 → 重 subtitle(可能要 rm subs.ass) |
217
+
218
+ `both` 用法是 `analyze + cut` 一把跑(不给 Claude 编辑 proposal 的机会),**不推荐**——业务语境会丢。仅当用户明确说"你直接剪不用问"时用。
219
+
220
+ ## 卓越标准(这是好成片的判定)
221
+
222
+ - **开场 3 秒内出钩子** —— TikTok / 小红书第一关
223
+ - **节奏密度 ≥ 80%** —— review 的 speech_ratio 不应低于 80%
224
+ - **逻辑闭环** —— 所有"我说三个" / "首先...其次...最后"的承诺都要兑现
225
+ - **句子完整** —— 主谓宾不缺,不出现切到字中间
226
+ - **重复 take 删干净** —— review 的 `repeated-content` 必为 0
227
+ - **字幕断行自然** —— 标点处断,不在词中间断
228
+
229
+ ## 常见错误(不要犯)
230
+
231
+ ### ❌ 错误 1:不问业务语境直接剪
232
+ **症状**:剪完用户说"这不是我要的感觉"
233
+ **正确**:开剪前 3 个问题(平台/钩子/时长)至少要问到,或从用户已有信息推断+告知
234
+
235
+ ### ❌ 错误 2:跳过自己的语义审片
236
+ **症状**:交付的成片有逻辑断裂、指代失效但 review 显示通过
237
+ **正确**:声学 review 通过 ≠ 可以交付。Claude 必须自己再读转写
238
+
239
+ ### ❌ 错误 3:重剪时重跑 analyze
240
+ **症状**:用户的 cut_proposal.md 编辑全丢
241
+ **正确**:迭代时直接改 `cut_proposal.md`,不要碰 analyze
242
+
243
+ ### ❌ 错误 4:subs.ass 修改后没保留
244
+ **症状**:用户说"字幕里那个字打错了我改了",下次 subtitle 又被覆盖
245
+ **正确**:subs.ass 已存在时命令会跳过生成。如果要全重新生成,先 `rm`
246
+
247
+ ### ❌ 错误 5:把 ffmpeg / faster-whisper 写进给用户的回复
248
+ **症状**:用户:"为什么这么慢?" Claude:"faster-whisper 转写 small 模型..."
249
+ **正确**:"正在分析音频和转写文字,大约需要 X 秒"
250
+
251
+ ## 相关工具
252
+
253
+ - **ffmpeg skill** — 如果用户要的是非剪辑类音视频处理(合成 BGM、压缩、缩略图、格式转换),转 ffmpeg skill
254
+ - **video-gen skill** — 如果用户要 AI 生成视频(不是已有素材剪辑),转 video-gen skill
255
+ - **markdown-pdf skill** — 如果用户要把 review_report.md 导出 PDF