@optima-chat/optima-agent 0.9.7 → 0.9.9

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 (96) hide show
  1. package/.claude/settings.local.json +166 -0
  2. package/.claude/skills/gen/SKILL.md +5 -1
  3. package/.claude/skills/multigrid-poster/SKILL.md +192 -0
  4. package/.claude/skills/multigrid-poster/layouts/2x2.json +34 -0
  5. package/.claude/skills/multigrid-poster/layouts/3x3.json +43 -0
  6. package/.claude/skills/multigrid-poster/scripts/compose.py +116 -0
  7. package/.claude/skills/multigrid-poster/scripts/placeholder.png +0 -0
  8. package/.claude/skills/multigrid-poster/shared/fonts/MaShanZheng-Regular.ttf +0 -0
  9. package/.claude/skills/scout/SKILL.md +136 -23
  10. package/.claude/skills/video-gen/SKILL.md +56 -79
  11. package/dist/bin/bi-cli.js +0 -0
  12. package/dist/bin/browser-cli.js +0 -0
  13. package/dist/bin/comfy.d.ts +3 -0
  14. package/dist/bin/comfy.d.ts.map +1 -0
  15. package/dist/bin/comfy.js +3 -0
  16. package/dist/bin/comfy.js.map +1 -0
  17. package/dist/bin/commerce.js +0 -0
  18. package/dist/bin/gen.js +0 -0
  19. package/dist/bin/google-ads.js +0 -0
  20. package/dist/bin/growth.d.ts +3 -0
  21. package/dist/bin/growth.d.ts.map +1 -0
  22. package/dist/bin/growth.js +3 -0
  23. package/dist/bin/growth.js.map +1 -0
  24. package/dist/bin/logistics.js +0 -0
  25. package/dist/bin/optima.js +0 -0
  26. package/dist/bin/scout.js +0 -0
  27. package/dist/bin/sentinel.js +0 -0
  28. package/dist/bin/shopify.js +0 -0
  29. package/dist/src/hooks-loader.d.ts +6 -0
  30. package/dist/src/hooks-loader.d.ts.map +1 -0
  31. package/dist/src/hooks-loader.js +215 -0
  32. package/dist/src/hooks-loader.js.map +1 -0
  33. package/dist/src/system-prompt.d.ts.map +1 -1
  34. package/dist/src/system-prompt.js +4 -0
  35. package/dist/src/system-prompt.js.map +1 -1
  36. package/dist/src/ui/App.d.ts +6 -0
  37. package/dist/src/ui/App.d.ts.map +1 -0
  38. package/dist/src/ui/App.js +164 -0
  39. package/dist/src/ui/App.js.map +1 -0
  40. package/dist/src/ui/components/Composer.d.ts +10 -0
  41. package/dist/src/ui/components/Composer.d.ts.map +1 -0
  42. package/dist/src/ui/components/Composer.js +13 -0
  43. package/dist/src/ui/components/Composer.js.map +1 -0
  44. package/dist/src/ui/components/Header.d.ts +7 -0
  45. package/dist/src/ui/components/Header.d.ts.map +1 -0
  46. package/dist/src/ui/components/Header.js +7 -0
  47. package/dist/src/ui/components/Header.js.map +1 -0
  48. package/dist/src/ui/components/Message.d.ts +12 -0
  49. package/dist/src/ui/components/Message.d.ts.map +1 -0
  50. package/dist/src/ui/components/Message.js +21 -0
  51. package/dist/src/ui/components/Message.js.map +1 -0
  52. package/dist/src/ui/components/MessageList.d.ts +9 -0
  53. package/dist/src/ui/components/MessageList.d.ts.map +1 -0
  54. package/dist/src/ui/components/MessageList.js +18 -0
  55. package/dist/src/ui/components/MessageList.js.map +1 -0
  56. package/dist/src/ui/components/Spinner.d.ts +6 -0
  57. package/dist/src/ui/components/Spinner.d.ts.map +1 -0
  58. package/dist/src/ui/components/Spinner.js +7 -0
  59. package/dist/src/ui/components/Spinner.js.map +1 -0
  60. package/dist/src/ui/components/StatusBar.d.ts +11 -0
  61. package/dist/src/ui/components/StatusBar.d.ts.map +1 -0
  62. package/dist/src/ui/components/StatusBar.js +7 -0
  63. package/dist/src/ui/components/StatusBar.js.map +1 -0
  64. package/dist/src/ui/components/index.d.ts +7 -0
  65. package/dist/src/ui/components/index.d.ts.map +1 -0
  66. package/dist/src/ui/components/index.js +7 -0
  67. package/dist/src/ui/components/index.js.map +1 -0
  68. package/dist/src/validation/error-formatter.d.ts +21 -0
  69. package/dist/src/validation/error-formatter.d.ts.map +1 -0
  70. package/dist/src/validation/error-formatter.js +98 -0
  71. package/dist/src/validation/error-formatter.js.map +1 -0
  72. package/dist/src/validation/index.d.ts +10 -0
  73. package/dist/src/validation/index.d.ts.map +1 -0
  74. package/dist/src/validation/index.js +10 -0
  75. package/dist/src/validation/index.js.map +1 -0
  76. package/dist/src/validation/json-validator.d.ts +25 -0
  77. package/dist/src/validation/json-validator.d.ts.map +1 -0
  78. package/dist/src/validation/json-validator.js +173 -0
  79. package/dist/src/validation/json-validator.js.map +1 -0
  80. package/dist/src/validation/schema.d.ts +353 -0
  81. package/dist/src/validation/schema.d.ts.map +1 -0
  82. package/dist/src/validation/schema.js +57 -0
  83. package/dist/src/validation/schema.js.map +1 -0
  84. package/dist/src/validation/suggestions.d.ts +25 -0
  85. package/dist/src/validation/suggestions.d.ts.map +1 -0
  86. package/dist/src/validation/suggestions.js +144 -0
  87. package/dist/src/validation/suggestions.js.map +1 -0
  88. package/dist/src/validation/types.d.ts +40 -0
  89. package/dist/src/validation/types.d.ts.map +1 -0
  90. package/dist/src/validation/types.js +5 -0
  91. package/dist/src/validation/types.js.map +1 -0
  92. package/dist/src/validation/yaml-validator.d.ts +25 -0
  93. package/dist/src/validation/yaml-validator.d.ts.map +1 -0
  94. package/dist/src/validation/yaml-validator.js +177 -0
  95. package/dist/src/validation/yaml-validator.js.map +1 -0
  96. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: scout
3
- description: "Interactive Amazon product research consultant with 1688 supplier sourcing. Search products, analyze markets, find suppliers (by keyword or image), and generate professional reports. ALWAYS use when user asks about: selling products (卖/开店), product ideas (产品/商品), market research (市场/竞品), suppliers (供应商/厂家), sourcing (采购/进货/货源), image search (图片找货/以图搜货/找同款), evaluating business opportunities (生意/创业). Start with conversational exploration, then suggest comprehensive report generation. Uses 'scout search', 'scout product', 'scout supplier-search', and 'scout supplier-search-image' commands."
3
+ description: "Interactive Amazon product research consultant with 1688 supplier sourcing and Keepa historical data. Search products, analyze markets, find suppliers (by keyword or image), track price/BSR history, and generate professional reports. ALWAYS use when user asks about: selling products (卖/开店), product ideas (产品/商品), market research (市场/竞品), suppliers (供应商/厂家), sourcing (采购/进货/货源), image search (图片找货/以图搜货/找同款), evaluating business opportunities (生意/创业), product trends (趋势/走势), price history (价格历史/价格变化), BSR ranking (排名/销量排名), product lifecycle (生命周期/增长期/衰退期). Uses 'scout search', 'scout product', 'scout keepa *', 'scout supplier-search', and 'scout supplier-search-image' commands."
4
4
  ---
5
5
 
6
6
  # Optima Scout - AI Product Research
@@ -193,6 +193,95 @@ scout supplier-search-image "IMAGE_URL" --limit NUMBER
193
193
  - If image is inaccessible (404, expired, auth-required), will return helpful error message
194
194
  - **Best practice**: Try both image and keyword search for comprehensive results
195
195
 
196
+ ### 历史数据(Keepa API)
197
+
198
+ #### `scout keepa product` — 产品历史数据(核心命令)
199
+
200
+ ```bash
201
+ scout keepa product B09V3KXJPB # 默认 90 天统计
202
+ scout keepa product B09V3KXJPB --stats 180 # 180 天统计
203
+ scout keepa product B09V3KXJPB --buybox --rating # 含 BuyBox 和评分历史
204
+ scout keepa product B09V3KXJPB,B0D4J2QLCR # 批量查询(逗号分隔,最多100)
205
+ scout keepa product B09V3KXJPB --domain amazon.de # 指定站点
206
+ ```
207
+
208
+ 返回(关键字段):
209
+ - **stats.current[3]** — 当前 BSR
210
+ - **stats.salesRankDrops30/90** — 30/90 天 BSR 下降次数 ≈ 出单次数
211
+ - **stats.outOfStockPercentage30** — 30 天断货率
212
+ - **csv[0]** — Amazon 自营价格历史
213
+ - **csv[1]** — 第三方新品价格历史
214
+ - **csv[3]** — BSR 排名历史
215
+ - **csv[11]** — 在售卖家数量历史(COUNT_NEW)
216
+ - **csv[16]** — 评分历史
217
+ - **csv[17]** — 评论数历史
218
+
219
+ 价格单位:美分(÷100 得美元)。评分:×10(45 = 4.5 星)。
220
+
221
+ **When to use:** 在 `scout product` 获取实时数据后,用 `scout keepa product` 拉历史数据判断趋势和生命周期。
222
+
223
+ #### `scout keepa search` — Product Finder(按条件筛选全库)
224
+
225
+ ```bash
226
+ # 找 BSR < 1万、评论 < 500、价格 $20-50 的新机会
227
+ # 注意:currentRange 单位是美分,$20-50 = [2000,5000]
228
+ scout keepa search '{"salesRankRange":[1,10000],"avg90_COUNT_REVIEWS_lte":500,"currentRange":[2000,5000]}'
229
+
230
+ # 找特定品牌
231
+ scout keepa search '{"brand":"Apple","salesRankRange":[1,50000]}' --per-page 10
232
+ ```
233
+
234
+ 返回:符合条件的 ASIN 列表。selection 支持几百个筛选条件。
235
+
236
+ #### `scout keepa bestsellers` — 品类热卖榜
237
+
238
+ ```bash
239
+ scout keepa bestsellers 172282 # Electronics 品类
240
+ scout keepa bestsellers 172282 --range 90 # 90 天平均排名
241
+ ```
242
+
243
+ 返回:品类 top ASIN 列表(根类目最多 10 万个)。先用 `scout keepa category 0` 获取品类 ID。
244
+
245
+ #### `scout keepa category` — 品类树
246
+
247
+ ```bash
248
+ scout keepa category 0 # 所有根类目(拿品类 ID)
249
+ scout keepa category 172282 # Electronics 子类目
250
+ ```
251
+
252
+ #### `scout keepa seller` — 卖家画像
253
+
254
+ ```bash
255
+ scout keepa seller ATVPDKIKX0DER # Amazon.com 自己
256
+ scout keepa seller A2R2RITDJNW1Q6 --storefront # 含店铺全部 ASIN
257
+ ```
258
+
259
+ 返回:卖家名称、评分、店铺 ASIN 总数。
260
+
261
+ #### `scout keepa deals` — 降价商品监控
262
+
263
+ ```bash
264
+ scout keepa deals # 默认 BuyBox 降价
265
+ scout keepa deals --category 172282 # Electronics 品类降价
266
+ scout keepa deals --title "wireless earbuds" # 按标题搜索
267
+ ```
268
+
269
+ 返回:最近降价的商品列表(ASIN、标题、当前价、降幅)。
270
+
271
+ #### `scout keepa graph` — 价格走势图
272
+
273
+ ```bash
274
+ scout keepa graph B09V3KXJPB -o price-chart.png
275
+ ```
276
+
277
+ 返回:Keepa 价格走势 PNG 图片。
278
+
279
+ #### `scout keepa tokens` — API 余额
280
+
281
+ ```bash
282
+ scout keepa tokens
283
+ ```
284
+
196
285
  ## Research Workflow
197
286
 
198
287
  ### Interactive Research Flow (Recommended):
@@ -204,32 +293,37 @@ scout supplier-search-image "IMAGE_URL" --limit NUMBER
204
293
 
205
294
  **Phase 2: Deep Dive & Refinement**
206
295
  4. **Targeted Analysis** → Based on user feedback, run `scout product` on relevant ASINs
207
- 5. **Extract Insights** → Share key findings (BSR, reviews, pain points)
208
- 6. **Iterate & Explore** → User may request different keywords, specific competitor analysis, or alternative product categories
296
+ 5. **Historical Trend Analysis** → Run `scout keepa product ASIN1,ASIN2,ASIN3 --stats 180` to get historical data
297
+ 6. **Extract Insights** → Combine realtime + historical data:
298
+ - BSR trend → 增长期/成熟期/衰退期?
299
+ - `salesRankDrops30/90` → 估算月销量
300
+ - 价格历史 → 利润空间稳定吗?有价格战吗?
301
+ - 卖家数量变化 → 竞争在加剧吗?
302
+ 7. **Iterate & Explore** → User may request different keywords, specific competitor analysis, or alternative product categories
209
303
 
210
304
  **Phase 2.5: Supplier Sourcing (Optional but Recommended)**
211
- 7. **Trigger**: User shows interest in costs/sourcing, or after market validation
305
+ 8. **Trigger**: User shows interest in costs/sourcing, or after market validation
212
306
  - "成本大概多少?" "批发价怎么样?" "利润空间大吗?"
213
307
  - "哪里进货?" "供应商怎么找?"
214
308
  - "这个图片能找到货源吗?" "Amazon这个能在1688找到吗?"
215
309
 
216
- 8. **Choose search method**:
310
+ 9. **Choose search method**:
217
311
  - **With image**: `scout supplier-search-image "https://..."` ← More accurate for visual products
218
312
  - **With keyword**: `scout supplier-search "产品关键词"`
219
313
  - **Best practice**: Try both and compare results
220
314
 
221
- 9. **Share Findings**:
222
- - Wholesale price range (e.g., ¥429-599)
223
- - MOQ (minimum order quantity)
224
- - Profit margin calculation: Amazon price ($60-80) - 1688 cost (¥429 ≈ $60) - shipping ($10-15)
225
- - Supplier quality indicators (years in business, certifications)
315
+ 10. **Share Findings**:
316
+ - Wholesale price range (e.g., ¥429-599)
317
+ - MOQ (minimum order quantity)
318
+ - Profit margin calculation: Amazon price ($60-80) - 1688 cost (¥429 ≈ $60) - shipping ($10-15)
319
+ - Supplier quality indicators (years in business, certifications)
226
320
 
227
- 10. **Ask**: "要不要我详细分析几个供应商?" or proceed to report
321
+ 11. **Ask**: "要不要我详细分析几个供应商?" or proceed to report
228
322
 
229
323
  **Phase 3: Report Generation (Proactive Suggestion)**
230
- 11. **Gauge Completion** → After sufficient data, suggest: "要不要我整理成一份完整的市场分析报告?"
231
- 12. **Generate Report** → Create comprehensive markdown report with all findings
232
- 13. **Save & Iterate** → Offer to save report and refine based on feedback
324
+ 12. **Gauge Completion** → After sufficient data, suggest: "要不要我整理成一份完整的市场分析报告?"
325
+ 13. **Generate Report** → Create comprehensive markdown report with all findings
326
+ 14. **Save & Iterate** → Offer to save report and refine based on feedback
233
327
 
234
328
  ---
235
329
 
@@ -238,8 +332,9 @@ scout supplier-search-image "IMAGE_URL" --limit NUMBER
238
332
  When user explicitly requests a report upfront:
239
333
  1. Run 3-4 diverse keyword searches
240
334
  2. Analyze top 3-5 products with `scout product`
241
- 3. Search 1688 suppliers (image + keyword)
242
- 4. Generate comprehensive report directly
335
+ 3. Pull historical trends with `scout keepa product` (batch ASINs)
336
+ 4. Search 1688 suppliers (image + keyword)
337
+ 5. Generate comprehensive report directly
243
338
 
244
339
  ### Multi-Keyword Research Strategy
245
340
 
@@ -268,12 +363,14 @@ scout search "titanium tumbler" --limit 10
268
363
  3. User: "中高端的,质量好的"
269
364
  4. Run `scout product` on 3 representative ASINs (B0CTKWJDXX, B0DNCMN3NX, B083NLR6BF)
270
365
  5. Share: "TOAKS中端爆款BSR#530,月销250件,87%五星。用户最爱:超轻、品质好、无金属味。主要抱怨:散热快(无保温)。KOYASU高端保温$89.99,评论少但4.8分。保温款市场几乎空白!"
271
- 6. User: "好的,你看看"
272
- 7. Run `scout search "titanium tumbler"`
273
- 8. Share: "titanium tumbler竞品只5-6个,$60-110。现在查供应商成本?"
274
- 9. Run `scout supplier-search "钛合金保温杯"`
275
- 10. Share: "批发价区间:¥180-450(约$25-65),起订量多数50-100个。头部供应商:8年工厂,¥280批发价。**利润分析**:Amazon售价$70-90,1688成本¥280(约$40),运费+关税约$15,总成本约$55,**毛利率25-40%**。"
276
- 11. Suggest report generation
366
+ 6. Run `scout keepa product B0CTKWJDXX,B0DNCMN3NX,B083NLR6BF --stats 180` 拉历史数据
367
+ 7. Share: "Keepa 历史数据显示:TOAKS BSR 过去 6 个月持续走低(从#2000 降到#530),说明市场在增长。卖家数量从 3 个增到 8 个,竞争在加剧。价格近 6 个月稳定在 $25-28,没有价格战。保温款 KOYASU 的 BSR 波动大但整体下降趋势,说明刚起步有潜力。"
368
+ 8. User: "好的,你看看"
369
+ 9. Run `scout search "titanium tumbler"`
370
+ 10. Share: "titanium tumbler竞品只5-6个,$60-110。现在查供应商成本?"
371
+ 11. Run `scout supplier-search "钛合金保温杯"`
372
+ 12. Share: "批发价区间:¥180-450(约$25-65),起订量多数50-100个。头部供应商:8年工厂,¥280批发价。**利润分析**:Amazon售价$70-90,1688成本¥280(约$40),运费+关税约$15,总成本约$55,**毛利率25-40%**。"
373
+ 13. Suggest report generation
277
374
 
278
375
  ### Example 2: Image-Based Supplier Search
279
376
 
@@ -345,6 +442,21 @@ scout product B0788F3R8X
345
442
  | BSR范围 | 1K-10K | 10K-50K | >50K |
346
443
  | 进入难度 | 适中 | 需差异化 | 很难或需求不明 |
347
444
 
445
+ ### 选品五要素(Keepa 历史数据驱动)
446
+
447
+ | 要素 | 数据来源 | 怎么判断 |
448
+ |------|---------|---------|
449
+ | **市场体量** | `salesRankDrops30/90` + BSR | drops 多 = 出单多 |
450
+ | **垄断程度** | `csv[11]` 卖家数量 + BuyBox | 卖家少且稳定 = 垄断 |
451
+ | **历史趋势** | `csv[3]` BSR 曲线 | 持续走低 = 增长期 |
452
+ | **所处阶段** | BSR 曲线形态 + 评论增速 | 增长/成熟/衰退 |
453
+ | **新品方向** | Product Finder 筛选低竞争品 | 评论少 + BSR 好 = 机会 |
454
+
455
+ **产品生命周期判断:**
456
+ - **增长期**:BSR 持续走低,评论数快速增长,卖家数量开始增加
457
+ - **成熟期**:BSR 平稳波动,评论数增速放缓,卖家数量稳定
458
+ - **衰退期**:BSR 持续走高,新评论减少,卖家数量下降或价格战
459
+
348
460
  ### Key Metrics
349
461
 
350
462
  **BSR (Best Seller Rank):**
@@ -412,8 +524,9 @@ Low Demand:
412
524
  **Report must include:**
413
525
  - Executive Summary(核心结论前置:适合进入?风险是什么?)
414
526
  - Market Analysis(基于搜索数据的市场概况)
527
+ - Historical Trend Analysis(基于 Keepa 数据的趋势分析:BSR 走势、价格稳定性、卖家数量变化、生命周期阶段判断)
415
528
  - Competitor Deep-Dive(基于product details的竞品分析:BSR, rating breakdown, top reviews insights)
416
- - Opportunity Assessment(SWOT 或机会/挑战分析)
529
+ - Opportunity Assessment(SWOT 或机会/挑战分析,结合五要素框架)
417
530
  - Entry Strategy(产品定位、定价、差异化策略)
418
531
  - Supplier Analysis (if Phase 2.5 completed)(1688供应商、成本、利润空间)
419
532
 
@@ -12,7 +12,7 @@ description: "帮商家用 AI 生成产品视频(社媒投放 / 产品详情
12
12
  优先级高于任何 pipeline 步骤。违反会导致泄漏、超支或数据丢失。
13
13
 
14
14
  1. **User-facing 不出现模型名或服务名**
15
- status / 成本 / 进度 / 错误 / 总结 统一用"标准模式 / 高保真模式 / 视频生成中"。模型名仅用于 skill 内部路由,**代码注释里的也不能抄给用户**。`--provider piapi` 作为 CLI flag 的字面值可存在,但不要把整条命令回显给用户。
15
+ status / 成本 / 进度 / 错误 / 总结 统一用"视频生成中"。模型名仅用于 skill 内部路由,**代码注释里的也不能抄给用户**。
16
16
 
17
17
  2. **花钱前必走 COST-GATE**
18
18
  任何 `gen video` / `gen image` 调用之前必走一次成本确认(§执行生成)。**Fast-path、迭代、重试均无例外**。成本按秒估算:`Σ(seg.duration_s) × per_second_rate_usd[mode]`,rate 从所选模板的 `production_cost.per_second_rate_usd` 读取。rate 为 TBD 时成本前缀"~"明示粗估。
@@ -305,7 +305,7 @@ ffmpeg -i assets/reference.mp4 -vf "select='eq(n\,<FRAME_NUM>)'" -vsync 0 assets
305
305
  | 1 | 0-1.5s | <内容> | <运镜> | <替换或"原创"> |
306
306
  | ... |
307
307
 
308
- > **段时长约束**:推荐 2-10s。<2s >10s 需在展示时警告用户(不阻断)。单段 >15s 必须拆段,不允许进入 Production Plan。段时长精度到 0.5s(3.73s 四舍五入到 3.5s)。
308
+ > **段时长约束**:Storyboard 按叙事节奏自由分段(推荐 2-15s),不受 Sora2 时长限制。Production Plan 阶段会将多个短段合并为 10/15s gen video 调用,再用 ffmpeg trim 切回各段时长。单段 >15s 必须拆段。段时长精度到 0.5s(3.73s 四舍五入到 3.5s)。
309
309
 
310
310
  ## Hook
311
311
  <第 1 秒如何抓注意力>
@@ -329,63 +329,52 @@ ffmpeg -i assets/reference.mp4 -vf "select='eq(n\,<FRAME_NUM>)'" -vsync 0 assets
329
329
 
330
330
  Storyboard 确认后自动推导。用户通常不改。
331
331
 
332
- ### 0. 音频决策(先于策略选择)
332
+ ### 0. 选策略
333
333
 
334
- **两种模式都默认有音频**(`gen video --audio` 默认开启),**真正差异在"对口型精度"**:
334
+ 所有视频生成统一使用 Sora2(GrsAI),支持文生视频和图生视频。**Sora2 生成静音视频,音频需后期处理**(ffmpeg 叠 BGM / `gen tts` 配旁白)。
335
335
 
336
- - **标准模式**(wan2.6,no `--provider`):自动配音,对口型精度低。适合无人物讲话 / 不叠原音频的场景
337
- - **高保真模式**(`--provider piapi`,Kling 3.0):对口型精度高,适合讲话镜头 / 叠原音频场景
338
- - **彻底无音频**:任一模式加 `--no-audio`
339
-
340
- **复刻 + 原音频叠加**的真实风险:用标准模式生成的视频,嘴型节奏和原音频不匹配(wan2.6 对口型弱)→ 叠原音听起来"嘴型错位"。所以模式选择必须先过这道决策:
341
-
342
- | 场景 | 决策 | 模式 | CLI flag |
343
- |---|---|---|---|
344
- | 复刻 + 参考带音频,用户想保留原音频 | 强制高保真(标准模式对口型太差,叠原音会明显错位)| 高保真 | `--provider piapi` |
345
- | 复刻 + 参考带音频,愿意重生音频 | 高保真(默认)| 高保真 | `--provider piapi` |
346
- | 纯生成,未指定音频需求 | **问**:"需要音频吗?(人声 / 旁白 / 音效)" | ↓ | ↓ |
347
- | &nbsp;&nbsp;→ 需要人声 / 旁白 | 高保真 | 高保真 | `--provider piapi` |
348
- | &nbsp;&nbsp;→ 只要环境配音,不讲话 | 标准(便宜 ~10×,自动配音够用)| 标准 | *(默认)* |
349
- | &nbsp;&nbsp;→ 不要音频(后期自配 BGM)| 标准 + 无音频 | 标准 | `--no-audio` |
350
- | 高度还原 / 严格对口型 / premium | 强制高保真(忽略音频决策)| 高保真 | `--provider piapi` |
351
- | 用户明确说"便宜版" / "省 credits" | 标准 + 警告"对口型精度低"| 标准 | *(默认)* 或 `--no-audio` |
352
-
353
- **Fast-path 集成**:Fast-path 不单独问音频,在 COST-GATE 里追加"含同步音频(对口型精度依模式而定),不需要可说'静音版'"。用户喊"静音版" → 回退标准模式 + `--no-audio`,重走 COST-GATE。
354
-
355
- **冲突检测**:复刻场景 + 用户说"便宜版" → 不直接降级,先问:
356
-
357
- > 复刻场景用标准模式对口型精度低,叠原音频会听起来错位。确认要降级吗?
336
+ | 特征 | 策略 |
337
+ |---|---|
338
+ | 1 镜头,无参考 | single-shot |
339
+ | 多镜头,无参考 | multi-shot-concat |
340
+ | 有参考,大致复刻 | clone-loose |
341
+ | 有参考,高度还原 | clone-strict |
342
+ | PDP 多卖点 | pdp-feature-concat |
343
+ | 人物讲话 | talking-head |
358
344
 
359
- ### 1. 选策略
345
+ > **DashScope 回退**:如需 DashScope 特有功能(自动配音、负向提示词),可用 `--provider dashscope`,但仅支持图生视频,时长 5|10s。
360
346
 
361
- | 特征 | 策略 | 模式(见 §0) |
362
- |---|---|---|
363
- | 1 镜头,无参考 | single-shot | 依 §0 |
364
- | 多镜头,无参考 | multi-shot-concat | 依 §0 |
365
- | 有参考,大致复刻 | clone-loose | 依 §0(含参考音频时强制高保真)|
366
- | **有参考,高度还原** | **clone-strict** | **高保真(强制)** |
367
- | PDP 多卖点 | pdp-feature-concat | 依 §0 |
368
- | **人物讲话 + 严格对口型** | **talking-head** | **高保真(强制)** |
369
- | 用户明确要 premium 质量 | 任一 + premium | 高保真(强制)|
347
+ ### 1. `videos/{id}/production-plan.md`
370
348
 
371
- **高保真模式 CLI flag**:`--provider piapi`。标准模式不加 flag。
349
+ Sora2 仅支持 10 15 秒整段生成。Storyboard 的细粒度段需要在 Production Plan 中**合并为 gen video 调用单元**:
372
350
 
373
- ### 2. `videos/{id}/production-plan.md`
351
+ - 相邻短段(叙事连贯、同一场景)合并成一个 10s 或 15s 的 gen video 调用
352
+ - 每个调用的 prompt 合并覆盖所有子段的内容描述
353
+ - 生成后用 ffmpeg trim 切回各子段时长
354
+ - 单独一个 10s+ 的 storyboard 段直接映射为一个 gen video 调用
374
355
 
375
356
  ```markdown
376
357
  # Production Plan
377
358
 
378
359
  ## 策略
379
360
  <策略名>
380
- 模式: <标准 / 高保真>(依 §0 决策)
381
361
  原因: <选择理由>
382
362
 
383
- ## 步骤
384
- | Step | 工具 | 输入 | 输出 | 依赖 | duration_s | seed | negative | audio | Prompt 摘要 |
385
- |---|---|---|---|---|---|---|---|---|---|
386
- | 1 | <工具> | <输入> | <输出> | | <storyboard 段时长> | <seed 或 `-`> | <NEGATIVE 短摘要 `-`> | <`default` / `--no-audio`> | <prompt 或 N/A> |
363
+ ## 生成调用
364
+ | Call | 合并段 | gen_duration | seed | aspect_ratio | Prompt 摘要 |
365
+ |---|---|---|---|---|---|
366
+ | 1 | seg 1-3 (共 8s) | 10 | <seed 或 `-`> | <16:9 \| 9:16 \| 1:1> | <合并 prompt> |
367
+ | 2 | seg 4 (12s) | 15 | $PRODUCT_SEED | <同上> | <prompt> |
387
368
  | ... |
388
369
 
370
+ ## Trim 映射
371
+ | seg | 来源 Call | trim 区间 | 输出 |
372
+ |---|---|---|---|
373
+ | 1 | Call 1 | 0:00-2.5s | clips/seg-1.mp4 |
374
+ | 2 | Call 1 | 2.5-5.5s | clips/seg-2.mp4 |
375
+ | 3 | Call 1 | 5.5-8.0s | clips/seg-3.mp4 |
376
+ | 4 | Call 2 | 0:00-12.0s | clips/seg-4.mp4 |
377
+
389
378
  **seed 规则**:同一产品的镜头(如 template PRODUCT_LOCK 指定的 #4/#5/#6/#9)**共用一个 seed**(任选一个固定整数记录下来)。PAIN / 场景段(如 #1/#2/#3)无产品时可填 `-`。
390
379
 
391
380
  ## 验收标准
@@ -395,11 +384,9 @@ Storyboard 确认后自动推导。用户通常不改。
395
384
  - CTA: <从 Storyboard>
396
385
  ```
397
386
 
398
- `duration_s` 字段直接 = storyboard 该段时长(精度 0.5s)。不允许四舍五入到 5 或 10。
387
+ ### 2. 为每个需 prompt 的步骤生成 `prompts/call-N.txt`
399
388
 
400
- ### 3. 为每个需 prompt 的步骤生成 `prompts/seg-N.txt`
401
-
402
- ### 4. `git commit -m "video: plan $VIDEO_ID — <strategy>"`
389
+ ### 3. `git commit -m "video: plan $VIDEO_ID — <strategy>"`
403
390
 
404
391
  ## 执行生成
405
392
 
@@ -408,20 +395,16 @@ Storyboard 确认后自动推导。用户通常不改。
408
395
  <COST-GATE>
409
396
  **生成前成本确认(必做,包括 Fast-path)**:在执行任何 `gen video` / `gen image` 调用之前,必须向用户展示一次成本摘要:
410
397
 
411
- > 即将生成 N 段视频(策略: <策略名>,模式: <标准 / 高保真>),预计:
398
+ > 即将生成 N 段视频(策略: <策略名>),预计:
412
399
  > - 调用次数: N 次 gen video + M 次 gen image(首帧编辑)
413
400
  > - 总时长: <Σ seg.duration_s>s
414
401
  > - 预估耗时: ~X 分钟
415
402
  > - 预估成本: ~$Y(扣 Optima credits)
416
- > - 音频: <含同步音频 / 无音频>
417
- >
418
- > <若高保真模式>不需要音频可说"静音版"降级到标准模式。</若高保真模式>
419
403
  >
420
404
  > 继续?
421
405
 
422
406
  用户说"继续"/"好"/"OK" → 开始执行。
423
407
  用户说"太贵"/"换个便宜的" → 回到 Production Plan,换策略(如 strict → loose)。
424
- 用户说"静音版" → 若当前高保真且非强制(clone-strict / talking-head / premium)则回退标准模式,重走 COST-GATE;否则告知冲突。
425
408
  用户不回应超过合理时间 → 不执行,等用户。
426
409
 
427
410
  **即使是 Fast-path 也必须走这一步。** 这是花钱步骤的唯一确认点。**迭代、重试同样无例外。**
@@ -443,30 +426,27 @@ Storyboard 确认后自动推导。用户通常不改。
443
426
  **工具调用**:
444
427
 
445
428
  ```bash
446
- # 标准模式(自动配音对口型弱,适合纯生成 / 环境音 / 无讲话)
429
+ # 图生视频(--duration 只能是 10 15)
447
430
  gen video <input_image> \
448
- --prompt "$(cat prompts/seg-N.txt)" \
449
- --negative "$NEGATIVE" \
450
- --duration <seg_duration_s> \
451
- --resolution <720P|1080P> \
431
+ --prompt "$(cat prompts/call-N.txt)" \
432
+ --duration <10|15> \
433
+ --aspect-ratio <16:9|9:16|1:1> \
452
434
  --seed $PRODUCT_SEED \
453
- $AUDIO_FLAG \
454
- -o clips/seg-<N>.mp4
435
+ -o clips/call-<N>.mp4
455
436
 
456
- # 高保真模式(对口型精度高,复刻带原音频 / 讲话 / premium)
457
- gen video <input_image> \
458
- --prompt "$(cat prompts/seg-N.txt)" \
459
- --negative "$NEGATIVE" \
460
- --duration <seg_duration_s> \
461
- --provider piapi \
462
- --seed $PRODUCT_SEED \
463
- $AUDIO_FLAG \
464
- -o clips/seg-<N>.mp4
437
+ # 纯文生视频(无输入图像)
438
+ gen video \
439
+ --prompt "$(cat prompts/call-N.txt)" \
440
+ --duration <10|15> \
441
+ --aspect-ratio <16:9|9:16|1:1> \
442
+ -o clips/call-<N>.mp4
465
443
 
466
- # 变量约定(production-plan.md 每个 step 提供):
467
- # $NEGATIVE = 该镜的 negative prompt(从 storyboard template NEGATIVE 字段)
468
- # $PRODUCT_SEED = 锁定产品一致性的 seed(同一产品的所有镜头共用一个值,如 #4/#5/#6/#9)
469
- # $AUDIO_FLAG = 空字符串(默认有音频)/ "--no-audio"(用户说静音版)
444
+ # ffmpeg trim 按 Trim 映射表切回 storyboard 各段
445
+ ffmpeg -i clips/call-1.mp4 -ss 0 -t 2.5 -c copy clips/seg-1.mp4
446
+ ffmpeg -i clips/call-1.mp4 -ss 2.5 -t 3.0 -c copy clips/seg-2.mp4
447
+
448
+ # 变量约定(production-plan.md 每个 call 提供):
449
+ # $PRODUCT_SEED = 锁定产品一致性的 seed(同一产品的所有镜头共用一个值)
470
450
 
471
451
  # 注意 --seed 必须 wire:否则每段 gen 产品外观随机变,templates 的 PRODUCT_LOCK
472
452
  # 规范(same seed across shots)会失效,电商视频产品一致性崩塌。
@@ -474,7 +454,7 @@ gen video <input_image> \
474
454
  # 首帧编辑(产品替换)— 双图模式
475
455
  gen image "<编辑指令>" -i <原始首帧> -i <产品图> -o assets/keyframes/seg-<N>-edited.jpg
476
456
 
477
- # 拼接
457
+ # 拼接所有 seg 为最终视频
478
458
  printf "file '%s'\n" clips/seg-*.mp4 > concat_list.txt
479
459
  ffmpeg -f concat -safe 0 -i concat_list.txt -c copy final.mp4
480
460
 
@@ -484,13 +464,11 @@ gen task cancel <task_id>
484
464
  gen task retry <task_id>
485
465
  ```
486
466
 
487
- **模式选择**:按 §产出 Production Plan §0 音频决策 + §1 策略表决定。命令层面差异仅是否加 `--provider piapi`:高保真加,标准不加。
488
-
489
- **Duration**:`--duration` 直接传 production-plan.md 里该步的 `duration_s`(= storyboard 段时长,精度 0.5s)。**不允许**四舍五入到 5 或 10。多段视频仍用多次 `gen video` + `ffmpeg concat` 拼接(按段拆是 storyboard 层的决定,不是 duration 层的)。
467
+ **Duration**:`--duration` 只接受 10 或 15。Production Plan Trim 映射表负责将生成的完整视频切回 Storyboard 各段时长。
490
468
 
491
469
  **每步完成后**:
492
470
  - 删 `seg-N.pending.json`
493
- - 写 `seg-N.meta.json`(duration_s / resolution / mode / has_audio / status)
471
+ - 写 `seg-N.meta.json`(duration_s / aspect_ratio / status)
494
472
  - `git commit -m "video: receive $VIDEO_ID seg-N"`
495
473
 
496
474
  **全部完成**:`git commit -m "video: done $VIDEO_ID"`
@@ -550,8 +528,7 @@ gen task retry <task_id>
550
528
  | 故障 | 处理 |
551
529
  |---|---|
552
530
  | gen 返回 failed | 重试 1 次 → 仍失败告知用户 |
553
- | gen video 返回 "duration out of range" | **不**自动重试/裁剪,告知用户并建议调整该段 storyboard 时长后重新 Production Plan |
554
- | 复刻场景用户选标准模式(便宜版) | 告知"标准模式无音频,与原音频叠加会嘴型错位",问是否确认降级;确认后在 COST-GATE 明示"无音频" |
531
+ | gen video 返回 "duration out of range" | **不**自动重试/裁剪,告知用户并建议调整该段 storyboard 时长(Sora2 支持 10\|15 秒)后重新 Production Plan |
555
532
  | ffmpeg 失败 | 检查输入完整性,告知用户 |
556
533
  | 源视频无法下载 | 建议手动下载后重试 |
557
534
  | scout 无结果 | 告知,转模板构建 |
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/comfy-cli";
3
+ //# sourceMappingURL=comfy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comfy.d.ts","sourceRoot":"","sources":["../../bin/comfy.ts"],"names":[],"mappings":";AACA,OAAO,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/comfy-cli";
3
+ //# sourceMappingURL=comfy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comfy.js","sourceRoot":"","sources":["../../bin/comfy.ts"],"names":[],"mappings":";AACA,OAAO,wBAAwB,CAAC"}
File without changes
package/dist/bin/gen.js CHANGED
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/growth-cli";
3
+ //# sourceMappingURL=growth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"growth.d.ts","sourceRoot":"","sources":["../../bin/growth.ts"],"names":[],"mappings":";AACA,OAAO,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/growth-cli";
3
+ //# sourceMappingURL=growth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"growth.js","sourceRoot":"","sources":["../../bin/growth.ts"],"names":[],"mappings":";AACA,OAAO,yBAAyB,CAAC"}
File without changes
File without changes
package/dist/bin/scout.js CHANGED
File without changes
File without changes
File without changes
@@ -0,0 +1,6 @@
1
+ import type { HooksConfig } from "./types.js";
2
+ /**
3
+ * 从 skills 目录加载所有 skill 的 hooks
4
+ */
5
+ export declare function loadSkillHooks(skillsDir: string, cwd: string, getSessionId: () => string | undefined): HooksConfig;
6
+ //# sourceMappingURL=hooks-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-loader.d.ts","sourceRoot":"","sources":["../../src/hooks-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AAwL5D;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,MAAM,GAAG,SAAS,GACrC,WAAW,CAiFb"}