@optima-chat/optima-agent 0.9.10 → 0.9.12

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 (94) hide show
  1. package/.claude/skills/.kb-skills-managed.json +9 -9
  2. package/.claude/skills/ads/SKILL.md +244 -244
  3. package/.claude/skills/ads/template/campaign/CREATIVES.md +18 -18
  4. package/.claude/skills/ads/template/campaign/NOTES.md +10 -10
  5. package/.claude/skills/ads/template/campaign/STRATEGY.md +29 -29
  6. package/.claude/skills/ads/template/user/ADS.md +29 -29
  7. package/.claude/skills/ads/template/user/LEARNINGS.md +15 -15
  8. package/.claude/skills/ads/template/user/PROGRESS.md +20 -20
  9. package/.claude/skills/ads/template/user/README.md +25 -25
  10. package/.claude/skills/ads/template/user/assets/.gitignore +2 -2
  11. package/.claude/skills/bi/SKILL.md +131 -131
  12. package/.claude/skills/browser/SKILL.md +201 -201
  13. package/.claude/skills/channels/SKILL.md +188 -188
  14. package/.claude/skills/collection/SKILL.md +88 -88
  15. package/.claude/skills/douyin/SKILL.md +408 -408
  16. package/.claude/skills/ffmpeg/SKILL.md +164 -164
  17. package/.claude/skills/gen/SKILL.md +279 -279
  18. package/.claude/skills/growth/SKILL.md +90 -90
  19. package/.claude/skills/growth/template/ACCOUNTS.md +14 -14
  20. package/.claude/skills/growth/template/CALENDAR.md +7 -7
  21. package/.claude/skills/growth/template/COMMENTS.md +7 -7
  22. package/.claude/skills/growth/template/GROWTH.md +37 -37
  23. package/.claude/skills/growth/template/PROGRESS.md +4 -4
  24. package/.claude/skills/growth/template/README.md +20 -20
  25. package/.claude/skills/growth/template/TOPICS.md +7 -7
  26. package/.claude/skills/homepage/SKILL.md +177 -177
  27. package/.claude/skills/i18n/SKILL.md +517 -517
  28. package/.claude/skills/ingesting-sources/SKILL.md +94 -94
  29. package/.claude/skills/initializing-kb/SKILL.md +117 -117
  30. package/.claude/skills/instagram/SKILL.md +321 -321
  31. package/.claude/skills/inventory/SKILL.md +328 -328
  32. package/.claude/skills/kol-outreach/SKILL.md +232 -232
  33. package/.claude/skills/kol-outreach/template/campaign/CONFIG.md +60 -60
  34. package/.claude/skills/kol-outreach/template/campaign/KOLS.md +6 -6
  35. package/.claude/skills/kol-outreach/template/campaign/PROGRESS.md +3 -3
  36. package/.claude/skills/kol-outreach/template/campaign/TEMPLATES.md +88 -88
  37. package/.claude/skills/kol-outreach/template/merchant/BRAND.md +36 -36
  38. package/.claude/skills/kol-outreach/template/merchant/CAMPAIGNS.md +6 -6
  39. package/.claude/skills/kol-outreach/template/merchant/MERCHANT_LIMITS.md +16 -16
  40. package/.claude/skills/kol-outreach/template/merchant/PROGRESS.md +4 -4
  41. package/.claude/skills/kol-outreach/template/merchant/README.md +20 -20
  42. package/.claude/skills/linting-the-wiki/SKILL.md +68 -68
  43. package/.claude/skills/logistics/SKILL.md +180 -180
  44. package/.claude/skills/markdown-pdf/SKILL.md +72 -72
  45. package/.claude/skills/merchant/SKILL.md +110 -110
  46. package/.claude/skills/multigrid-poster/SKILL.md +192 -192
  47. package/.claude/skills/multigrid-poster/layouts/2x2.json +34 -34
  48. package/.claude/skills/multigrid-poster/layouts/3x3.json +43 -43
  49. package/.claude/skills/multigrid-poster/scripts/compose.py +116 -116
  50. package/.claude/skills/order/SKILL.md +452 -452
  51. package/.claude/skills/product/SKILL.md +379 -379
  52. package/.claude/skills/product-page/SKILL.md +106 -106
  53. package/.claude/skills/querying-the-wiki/SKILL.md +59 -59
  54. package/.claude/skills/reddit/SKILL.md +277 -277
  55. package/.claude/skills/review/SKILL.md +321 -321
  56. package/.claude/skills/scout/SKILL.md +575 -575
  57. package/.claude/skills/sentinel/SKILL.md +281 -281
  58. package/.claude/skills/shein/SKILL.md +246 -246
  59. package/.claude/skills/shipping/SKILL.md +200 -200
  60. package/.claude/skills/shop-content/SKILL.md +101 -101
  61. package/.claude/skills/shopify/SKILL.md +282 -282
  62. package/.claude/skills/skillify/SKILL.md +114 -114
  63. package/.claude/skills/taobao/SKILL.md +238 -238
  64. package/.claude/skills/tiktok/SKILL.md +381 -381
  65. package/.claude/skills/twitter/SKILL.md +302 -302
  66. package/.claude/skills/updating-related-pages/SKILL.md +65 -65
  67. package/.claude/skills/video-edit/SKILL.md +138 -138
  68. package/.claude/skills/video-gen/SKILL.md +630 -548
  69. package/.claude/skills/video-gen/templates/INDEX.md +78 -78
  70. package/.claude/skills/video-gen/templates/before-after-beauty.md +183 -183
  71. package/.claude/skills/video-gen/templates/drama-fmcg.md +183 -183
  72. package/.claude/skills/video-gen/templates/kol-reaction-food.md +193 -193
  73. package/.claude/skills/video-gen/templates/multi-point-apparel.md +185 -185
  74. package/.claude/skills/video-gen/templates/pain-solution-home.md +184 -184
  75. package/.claude/skills/video-gen/templates/pdp-360-showcase.md +189 -189
  76. package/.claude/skills/video-gen/templates/pdp-feature-highlight.md +182 -182
  77. package/.claude/skills/video-gen/templates/scene-digital.md +183 -183
  78. package/.claude/skills/wechat/SKILL.md +174 -174
  79. package/.claude/skills/xhs/SKILL.md +170 -170
  80. package/README.md +276 -276
  81. package/dist/bin/optima.js +26 -26
  82. package/dist/bin/serve.js +23 -23
  83. package/dist/bin/video-edit.d.ts +3 -0
  84. package/dist/bin/video-edit.d.ts.map +1 -0
  85. package/dist/bin/video-edit.js +153 -0
  86. package/dist/bin/video-edit.js.map +1 -0
  87. package/dist/src/agent.d.ts +1 -1
  88. package/dist/src/agent.js +4 -4
  89. package/dist/src/system-prompt.d.ts.map +1 -1
  90. package/dist/src/system-prompt.js +175 -173
  91. package/dist/src/system-prompt.js.map +1 -1
  92. package/dist/src/tools/memory.js +10 -10
  93. package/dist/src/ui/headless.js +7 -7
  94. package/package.json +79 -79
@@ -1,232 +1,232 @@
1
- ---
2
- name: kol-outreach
3
- description: |
4
- KOL outreach automation: discover TikTok KOLs, extract emails, send personalized outreach, handle replies, negotiate deals.
5
- Trigger: user says '帮我找 KOL', 'KOL 建联', 'KOL 进展', or message contains [KOL_INBOUND:{campaignId}] / [KOL_INBOUND].
6
- ---
7
-
8
- # KOL 建联
9
-
10
- 端到端 TikTok KOL 建联自动化:发现、触达、谈判、成交。
11
-
12
- ## 核心:~/kol-outreach/ 工作目录
13
-
14
- 所有状态都在 `~/kol-outreach/`(单个 git repo)。每次会话只做一件事。
15
-
16
- **每次会话启动**:
17
-
18
- 1. 检查 `~/kol-outreach/BRAND.md` 是否存在且已完整填写 — 不存在或未完成则走初始化
19
- 2. 读 `CAMPAIGNS.md` — 了解所有 campaign 状态
20
- 3. `git -C ~/kol-outreach log --oneline -5` — 最近变更
21
- 4. 根据用户意图 + 文件状态决定本次操作
22
-
23
- | 文件 | 层级 | 用途 |
24
- |------|------|------|
25
- | `BRAND.md` | merchant | 品牌素材、兜底话术、升级关键词 |
26
- | `MERCHANT_LIMITS.md` | merchant | 日发信配额(跨 campaign 共享) |
27
- | `CAMPAIGNS.md` | merchant | campaign 索引 |
28
- | `PROGRESS.md` | merchant | 跨 campaign 关键事件 |
29
- | `campaigns/{id}/CONFIG.md` | campaign | 商品、预算、条款、运行参数 |
30
- | `campaigns/{id}/KOLS.md` | campaign | KOL 状态索引(status: `pending_outreach` / `awaiting_reply` / `in_progress` / `deal_reached` / `needs_merchant_followup` / `rejected` / `expired` / `send_error` / `no_contact`) |
31
- | `campaigns/{id}/TEMPLATES.md` | campaign | 邮件模板(LLM 只填变量) |
32
- | `campaigns/{id}/PROGRESS.md` | campaign | 本 campaign 事件日志 |
33
- | `campaigns/{id}/CONVERSATIONS/{username}.md` | campaign | 每个 KOL 的完整对话 |
34
-
35
- ## Session 路由
36
-
37
- 按优先级依次判断:
38
-
39
- | 条件 | 流程 |
40
- |------|------|
41
- | 消息含 `[KOL_INBOUND:{campaignId}]` 或 `[KOL_INBOUND]` | → 回信处理 |
42
- | `~/kol-outreach/BRAND.md` 不存在 | → 商家初始化 → 创建 Campaign |
43
- | 用户提到了新商品 + 该商品无对应 campaign | → 创建 Campaign |
44
- | 用户要求发送 outreach / 开始建联 | → 发现 + Outreach |
45
- | 用户问进展 / 状态 / 数据 | → 查询进度 |
46
-
47
- **Campaign 定位**:用户指定了 campaign 用指定值;未指定时读 `CAMPAIGNS.md`——只有一个 active 就用它,多个则列出让商家选。
48
-
49
- ## 商家初始化
50
-
51
- 只在 `~/kol-outreach/BRAND.md` 不存在或未完整填写时执行。
52
-
53
- 1. `cp -r $CLAUDE_SKILL_DIR/template/merchant/. ~/kol-outreach/` 并 `git init`
54
- 2. 对话式填写 `BRAND.md`:
55
- - `brand_name` → 生成 `brand_slug` 建议 → `scout outreach brand-slug check` 验证全局唯一 → 冲突则换 → `scout outreach brand-slug claim` 锁定
56
- - 填完品牌基础、兜底话术、升级关键词(中英双语必填)、禁用词
57
- 3. 填写 `MERCHANT_LIMITS.md`(默认 `max_daily_sends: 50`)
58
- 4. `git add -A && git commit -m "merchant onboarding complete"`
59
- 5. 继续创建第一个 campaign
60
-
61
- ## 创建 Campaign
62
-
63
- 1. 确定 `campaignId`:从商品标题生成 kebab-case slug,校验唯一且匹配 `^[a-z0-9][a-z0-9-]{0,29}$`
64
- 2. `cp -r $CLAUDE_SKILL_DIR/template/campaign/. ~/kol-outreach/campaigns/{campaignId}/`
65
- 3. 对话式填写 `CONFIG.md`,**逐段确认**:
66
- - 商品信息 → KOL 画像 → 预算报价 → 合作条款 → 运行参数
67
- - 预算校验:`max_price >= target_price >= first_offer`,`max_step <= max_price - first_offer`,`total_budget >= max_price`
68
- - 不通过则说明原因、给建议、重新问(不退出)
69
- 4. 更新 `CAMPAIGNS.md` 追加新行
70
- 5. `git add -A && git commit -m "[{campaignId}] campaign ready"`
71
- 6. 问商家是否立即开始发现 KOL
72
-
73
- ## 发现 KOL + 首发 Outreach
74
-
75
- **前置检查**(任一不过则告知商家并退出):
76
- - campaign 状态为 `active`
77
- - 本 campaign 在谈 KOL 数(`awaiting_reply` + `in_progress`)< `max_concurrent_kols`
78
- - merchant 今日发信数(`MERCHANT_LIMITS.md`)< `max_daily_sends`
79
- - UTC 跨天时先归档昨天计数、重置 `sent_today=0`
80
-
81
- **发现**:
82
-
83
- 1. `scout tiktok creators --follower-count <range> --country <region> --limit <N> --format json`
84
- 2. 过滤:`engagement < 2%` 丢弃、已在 `KOLS.md` 丢弃、粉丝量不在区间丢弃
85
- 3. 对每个候选:`scout tiktok creator-products @username --limit 5`,从 bio 提取 email
86
- 4. 写入 `KOLS.md`:有 email → `pending_outreach`,无 email → `no_contact`
87
- 5. `git commit -m "[{campaignId}] discovered N KOLs"`
88
-
89
- **Outreach**:
90
-
91
- 对每个 `pending_outreach` KOL(不超过本轮发送量):
92
-
93
- 1. 读 `TEMPLATES.md` 的 `first_outreach_v1`
94
- 2. 产出模板变量 JSON(`kol_first_name`, `opener_line`, `fit_reason`, `product_one_liner`)
95
- 3. 渲染模板 → 终检(见「护栏」Layer 4)→ `scout outreach send`,JSON 必须包含:
96
- `to`, `subject`, `body`, `from_merchant_id`, `from_campaign_id`, `from_brand_slug`, `from_brand_name`, `from_contact_name`
97
- 4. 发送成功(`ok: true`)→ 写 `CONVERSATIONS/{username}.md`(Round 1)+ 更新 `KOLS.md` → `awaiting_reply` + `MERCHANT_LIMITS.md` sent_today +1
98
- 5. 发送失败(`ok: false`)→ 标 `send_error`,不计入 sent_today,跳过该 KOL,不中断其他
99
-
100
- 全部完成后:`git commit -m "[{campaignId}] outreach sent to N KOLs"` + 更新 PROGRESS.md
101
-
102
- ## 处理 KOL 回信
103
-
104
- 触发:消息含 `[KOL_INBOUND:{campaignId}]` 或 `[KOL_INBOUND]`。
105
-
106
- 1. 从消息中提取 `From`, `Subject`, `Message-ID`, `In-Reply-To`, `Body`
107
- 2. 定位 KOL:
108
- - `campaignId` 已知 → 读该 campaign 的 `KOLS.md`,按 `from_email` 匹配
109
- - `campaignId` 未知 → 遍历所有 `campaigns/*/KOLS.md`,按 `from_email` 匹配,多个取 `last_update` 最新
110
- - 无匹配 → 写 PROGRESS.md + `sentinel report --condition-met false` + 退出
111
- 3. 读 `CONFIG.md` + `BRAND.md` + `CONVERSATIONS/{username}.md`
112
- 4. **预检**(见「护栏」Layer 2)→ 任一触发则发 `escalate_fallback_v1` 并退出
113
- 5. 按「谈判策略」产出结构化决策 JSON
114
- 6. **后验**(见「护栏」Layer 3)→ 不通过则降级为 escalate
115
- 7. 渲染模板 → **终检**(见「护栏」Layer 4)→ `scout outreach send`
116
- - 回信必须带 `in_reply_to`(KOL 的 `message_id`)和 `references`(`CONVERSATIONS` 里的完整 message-id chain)
117
- 8. 写回 `CONVERSATIONS/{username}.md` + `KOLS.md` + `MERCHANT_LIMITS.md`
118
- 9. 如果 `accept` → 发 `deal_confirmation_v1`,标 `deal_reached`
119
- 10. `git commit -m "[{campaignId}] round N {action} @{username}"`
120
- 11. `sentinel report --condition-met true --summary "..." --action-taken "..."`
121
-
122
- ## 查询进度
123
-
124
- - **多 campaign**:读每个 campaign 的 `KOLS.md`,按 status 分桶统计,输出 markdown 表格 + merchant 级 `sent_today` 信息
125
- - **单 campaign**:读 `KOLS.md` 全表 + `PROGRESS.md` 最近 5 条。对每个 `needs_merchant_followup`,读 `CONVERSATIONS/{username}.md` 最后一轮,总结 KOL 诉求
126
- - 只读不写,不 commit
127
-
128
- ## 谈判策略
129
-
130
- 处理 KOL 回信时,产出一个结构化决策 JSON:
131
-
132
- ```json
133
- {
134
- "action": "counter_offer | accept | decline | clarify | escalate",
135
- "new_price": null,
136
- "final_price": null,
137
- "concessions": [],
138
- "template_id": "...",
139
- "template_vars": {},
140
- "reasoning": "..."
141
- }
142
- ```
143
-
144
- **决策框架**:
145
-
146
- | KOL 回应 | 判断 | action |
147
- |----------|------|--------|
148
- | KOL 报价 ≤ `first_offer` | 低于预期,直接接受 | `accept` |
149
- | KOL 报价 ≤ `target_price` | 在目标范围内,可接受 | `accept` |
150
- | KOL 报价 ≤ `max_price` | 超出目标但可谈,渐进加价 | `counter_offer` |
151
- | KOL 报价 > `max_price` | 超预算,回一次低价试探 | `counter_offer`(报 `target_price`) |
152
- | KOL 连续 2 轮报价 > `max_price` | 已试探过,差距太大 | `decline` |
153
- | KOL 对之前的 counter 再次还价,且 ≤ `max_price` | 拉锯中,评估是否值得让步 | `counter_offer` 或 `accept` |
154
- | KOL 明确拒绝合作 | 尊重意愿 | `decline` |
155
- | KOL 问非价格问题(产品细节、时间线等) | 信息补充 | `clarify` |
156
- | KOL 提到超出授权范围的话题 | 不要硬答 | `escalate` |
157
-
158
- **出价规则**:
159
-
160
- - 首次 counter:从 `first_offer` 开始
161
- - 每轮加价不超过 `max_step`
162
- - 绝不超过 `max_price`
163
- - 加 concession 时优先用 `allowed_uses` 里的授权项(转发、二创等)作为附加价值,而非直接加钱
164
- - 本 campaign 已承诺预算(`deal_reached` 的 offer 总和)+ 本次报价不能超 `total_budget`
165
-
166
- **tone**:
167
-
168
- - 专业友好,不卑不亢
169
- - 不要用 "unfortunately" / "sadly" — 直接说 "our budget is..."
170
- - 每封回信开头用一句话承接 KOL 上一封的内容(`acknowledge_line`)
171
- - 永远不要透露 `max_price`、`total_budget`、或谈判策略
172
-
173
- ## 护栏
174
-
175
- 四层防线。任一层失败都**不问商家**——自动降级为发兜底话术 + 标记 `needs_merchant_followup`。
176
-
177
- ### Layer 1 — Onboarding 校验
178
-
179
- 写 `BRAND.md` / `CONFIG.md` 时执行:
180
- - 所有必填字段非空
181
- - `brand_slug` 全局唯一(通过 `scout outreach brand-slug check`)
182
- - `max_price >= target_price >= first_offer`
183
- - `max_step <= max_price - first_offer`
184
- - `total_budget >= max_price`
185
- - `escalation_keywords` 中英双语都有
186
- - 不通过 → 继续追问,不退出 onboarding
187
-
188
- ### Layer 2 — 回信预检(调 LLM 前)
189
-
190
- - `rounds >= max_rounds` → `needs_merchant_followup`
191
- - `now - started >= max_days` → 标 `expired`,**不发邮件**,直接退出
192
- - KOL 回信命中 `escalation_keywords`(中英双语匹配) → 发 `escalate_fallback_v1`
193
- - `in_reply_to` 与 conversation 最后一条 inbound 的 `message_id` 不一致 → 发 `escalate_fallback_v1`
194
-
195
- ### Layer 3 — 决策后验(产出 JSON 后)
196
-
197
- - `action` 必须在白名单内
198
- - `counter_offer`: `first_offer <= new_price <= max_price`,`new_price - previous_offer <= max_step`
199
- - `accept`: `first_offer <= final_price <= max_price`,`committed + final_price <= total_budget`
200
- - `concessions ⊆ allowed_terms`
201
- - `template_id` 存在于 `TEMPLATES.md`
202
- - 任一不通过 → 降级 `escalate`,不重试
203
-
204
- ### Layer 4 — 内容终检(发送前)
205
-
206
- - body 不含 `forbidden_phrases`
207
- - body 长度 ≤ 2000 字符
208
- - 不通过 → 不发送,降级 `escalate`
209
-
210
- ## 允许的命令
211
-
212
- - `scout tiktok creators` / `scout tiktok creator-products`
213
- - `scout outreach send` / `scout outreach brand-slug check|claim`
214
- - `sentinel report`
215
-
216
- ## 常见错误
217
-
218
- ❌ 自由撰写邮件正文 → ✅ 只产出模板变量 JSON,用 TEMPLATES.md 渲染
219
-
220
- ❌ 一次 session 混做多个流程 → ✅ 单会话单任务
221
-
222
- ❌ 每一小步都 git commit → ✅ 每个逻辑动作完成后 commit 一次(发现、outreach、单个回信处理)
223
-
224
- ❌ 护栏失败后重试 LLM → ✅ 直接降级为 escalate
225
-
226
- ❌ 透露 max_price / total_budget / 谈判策略 → ✅ 只透露当前报价
227
-
228
- ❌ expired 的 KOL 还发邮件 → ✅ 标 expired 直接退出,不发信
229
-
230
- ❌ 修改不属于当前任务的 campaign 状态 → ✅ 只操作当前 campaign
231
-
232
- ❌ scout outreach send 失败就中断全部 → ✅ 标 send_error 跳过该 KOL,继续其他
1
+ ---
2
+ name: kol-outreach
3
+ description: |
4
+ KOL outreach automation: discover TikTok KOLs, extract emails, send personalized outreach, handle replies, negotiate deals.
5
+ Trigger: user says '帮我找 KOL', 'KOL 建联', 'KOL 进展', or message contains [KOL_INBOUND:{campaignId}] / [KOL_INBOUND].
6
+ ---
7
+
8
+ # KOL 建联
9
+
10
+ 端到端 TikTok KOL 建联自动化:发现、触达、谈判、成交。
11
+
12
+ ## 核心:~/kol-outreach/ 工作目录
13
+
14
+ 所有状态都在 `~/kol-outreach/`(单个 git repo)。每次会话只做一件事。
15
+
16
+ **每次会话启动**:
17
+
18
+ 1. 检查 `~/kol-outreach/BRAND.md` 是否存在且已完整填写 — 不存在或未完成则走初始化
19
+ 2. 读 `CAMPAIGNS.md` — 了解所有 campaign 状态
20
+ 3. `git -C ~/kol-outreach log --oneline -5` — 最近变更
21
+ 4. 根据用户意图 + 文件状态决定本次操作
22
+
23
+ | 文件 | 层级 | 用途 |
24
+ |------|------|------|
25
+ | `BRAND.md` | merchant | 品牌素材、兜底话术、升级关键词 |
26
+ | `MERCHANT_LIMITS.md` | merchant | 日发信配额(跨 campaign 共享) |
27
+ | `CAMPAIGNS.md` | merchant | campaign 索引 |
28
+ | `PROGRESS.md` | merchant | 跨 campaign 关键事件 |
29
+ | `campaigns/{id}/CONFIG.md` | campaign | 商品、预算、条款、运行参数 |
30
+ | `campaigns/{id}/KOLS.md` | campaign | KOL 状态索引(status: `pending_outreach` / `awaiting_reply` / `in_progress` / `deal_reached` / `needs_merchant_followup` / `rejected` / `expired` / `send_error` / `no_contact`) |
31
+ | `campaigns/{id}/TEMPLATES.md` | campaign | 邮件模板(LLM 只填变量) |
32
+ | `campaigns/{id}/PROGRESS.md` | campaign | 本 campaign 事件日志 |
33
+ | `campaigns/{id}/CONVERSATIONS/{username}.md` | campaign | 每个 KOL 的完整对话 |
34
+
35
+ ## Session 路由
36
+
37
+ 按优先级依次判断:
38
+
39
+ | 条件 | 流程 |
40
+ |------|------|
41
+ | 消息含 `[KOL_INBOUND:{campaignId}]` 或 `[KOL_INBOUND]` | → 回信处理 |
42
+ | `~/kol-outreach/BRAND.md` 不存在 | → 商家初始化 → 创建 Campaign |
43
+ | 用户提到了新商品 + 该商品无对应 campaign | → 创建 Campaign |
44
+ | 用户要求发送 outreach / 开始建联 | → 发现 + Outreach |
45
+ | 用户问进展 / 状态 / 数据 | → 查询进度 |
46
+
47
+ **Campaign 定位**:用户指定了 campaign 用指定值;未指定时读 `CAMPAIGNS.md`——只有一个 active 就用它,多个则列出让商家选。
48
+
49
+ ## 商家初始化
50
+
51
+ 只在 `~/kol-outreach/BRAND.md` 不存在或未完整填写时执行。
52
+
53
+ 1. `cp -r $CLAUDE_SKILL_DIR/template/merchant/. ~/kol-outreach/` 并 `git init`
54
+ 2. 对话式填写 `BRAND.md`:
55
+ - `brand_name` → 生成 `brand_slug` 建议 → `scout outreach brand-slug check` 验证全局唯一 → 冲突则换 → `scout outreach brand-slug claim` 锁定
56
+ - 填完品牌基础、兜底话术、升级关键词(中英双语必填)、禁用词
57
+ 3. 填写 `MERCHANT_LIMITS.md`(默认 `max_daily_sends: 50`)
58
+ 4. `git add -A && git commit -m "merchant onboarding complete"`
59
+ 5. 继续创建第一个 campaign
60
+
61
+ ## 创建 Campaign
62
+
63
+ 1. 确定 `campaignId`:从商品标题生成 kebab-case slug,校验唯一且匹配 `^[a-z0-9][a-z0-9-]{0,29}$`
64
+ 2. `cp -r $CLAUDE_SKILL_DIR/template/campaign/. ~/kol-outreach/campaigns/{campaignId}/`
65
+ 3. 对话式填写 `CONFIG.md`,**逐段确认**:
66
+ - 商品信息 → KOL 画像 → 预算报价 → 合作条款 → 运行参数
67
+ - 预算校验:`max_price >= target_price >= first_offer`,`max_step <= max_price - first_offer`,`total_budget >= max_price`
68
+ - 不通过则说明原因、给建议、重新问(不退出)
69
+ 4. 更新 `CAMPAIGNS.md` 追加新行
70
+ 5. `git add -A && git commit -m "[{campaignId}] campaign ready"`
71
+ 6. 问商家是否立即开始发现 KOL
72
+
73
+ ## 发现 KOL + 首发 Outreach
74
+
75
+ **前置检查**(任一不过则告知商家并退出):
76
+ - campaign 状态为 `active`
77
+ - 本 campaign 在谈 KOL 数(`awaiting_reply` + `in_progress`)< `max_concurrent_kols`
78
+ - merchant 今日发信数(`MERCHANT_LIMITS.md`)< `max_daily_sends`
79
+ - UTC 跨天时先归档昨天计数、重置 `sent_today=0`
80
+
81
+ **发现**:
82
+
83
+ 1. `scout tiktok creators --follower-count <range> --country <region> --limit <N> --format json`
84
+ 2. 过滤:`engagement < 2%` 丢弃、已在 `KOLS.md` 丢弃、粉丝量不在区间丢弃
85
+ 3. 对每个候选:`scout tiktok creator-products @username --limit 5`,从 bio 提取 email
86
+ 4. 写入 `KOLS.md`:有 email → `pending_outreach`,无 email → `no_contact`
87
+ 5. `git commit -m "[{campaignId}] discovered N KOLs"`
88
+
89
+ **Outreach**:
90
+
91
+ 对每个 `pending_outreach` KOL(不超过本轮发送量):
92
+
93
+ 1. 读 `TEMPLATES.md` 的 `first_outreach_v1`
94
+ 2. 产出模板变量 JSON(`kol_first_name`, `opener_line`, `fit_reason`, `product_one_liner`)
95
+ 3. 渲染模板 → 终检(见「护栏」Layer 4)→ `scout outreach send`,JSON 必须包含:
96
+ `to`, `subject`, `body`, `from_merchant_id`, `from_campaign_id`, `from_brand_slug`, `from_brand_name`, `from_contact_name`
97
+ 4. 发送成功(`ok: true`)→ 写 `CONVERSATIONS/{username}.md`(Round 1)+ 更新 `KOLS.md` → `awaiting_reply` + `MERCHANT_LIMITS.md` sent_today +1
98
+ 5. 发送失败(`ok: false`)→ 标 `send_error`,不计入 sent_today,跳过该 KOL,不中断其他
99
+
100
+ 全部完成后:`git commit -m "[{campaignId}] outreach sent to N KOLs"` + 更新 PROGRESS.md
101
+
102
+ ## 处理 KOL 回信
103
+
104
+ 触发:消息含 `[KOL_INBOUND:{campaignId}]` 或 `[KOL_INBOUND]`。
105
+
106
+ 1. 从消息中提取 `From`, `Subject`, `Message-ID`, `In-Reply-To`, `Body`
107
+ 2. 定位 KOL:
108
+ - `campaignId` 已知 → 读该 campaign 的 `KOLS.md`,按 `from_email` 匹配
109
+ - `campaignId` 未知 → 遍历所有 `campaigns/*/KOLS.md`,按 `from_email` 匹配,多个取 `last_update` 最新
110
+ - 无匹配 → 写 PROGRESS.md + `sentinel report --condition-met false` + 退出
111
+ 3. 读 `CONFIG.md` + `BRAND.md` + `CONVERSATIONS/{username}.md`
112
+ 4. **预检**(见「护栏」Layer 2)→ 任一触发则发 `escalate_fallback_v1` 并退出
113
+ 5. 按「谈判策略」产出结构化决策 JSON
114
+ 6. **后验**(见「护栏」Layer 3)→ 不通过则降级为 escalate
115
+ 7. 渲染模板 → **终检**(见「护栏」Layer 4)→ `scout outreach send`
116
+ - 回信必须带 `in_reply_to`(KOL 的 `message_id`)和 `references`(`CONVERSATIONS` 里的完整 message-id chain)
117
+ 8. 写回 `CONVERSATIONS/{username}.md` + `KOLS.md` + `MERCHANT_LIMITS.md`
118
+ 9. 如果 `accept` → 发 `deal_confirmation_v1`,标 `deal_reached`
119
+ 10. `git commit -m "[{campaignId}] round N {action} @{username}"`
120
+ 11. `sentinel report --condition-met true --summary "..." --action-taken "..."`
121
+
122
+ ## 查询进度
123
+
124
+ - **多 campaign**:读每个 campaign 的 `KOLS.md`,按 status 分桶统计,输出 markdown 表格 + merchant 级 `sent_today` 信息
125
+ - **单 campaign**:读 `KOLS.md` 全表 + `PROGRESS.md` 最近 5 条。对每个 `needs_merchant_followup`,读 `CONVERSATIONS/{username}.md` 最后一轮,总结 KOL 诉求
126
+ - 只读不写,不 commit
127
+
128
+ ## 谈判策略
129
+
130
+ 处理 KOL 回信时,产出一个结构化决策 JSON:
131
+
132
+ ```json
133
+ {
134
+ "action": "counter_offer | accept | decline | clarify | escalate",
135
+ "new_price": null,
136
+ "final_price": null,
137
+ "concessions": [],
138
+ "template_id": "...",
139
+ "template_vars": {},
140
+ "reasoning": "..."
141
+ }
142
+ ```
143
+
144
+ **决策框架**:
145
+
146
+ | KOL 回应 | 判断 | action |
147
+ |----------|------|--------|
148
+ | KOL 报价 ≤ `first_offer` | 低于预期,直接接受 | `accept` |
149
+ | KOL 报价 ≤ `target_price` | 在目标范围内,可接受 | `accept` |
150
+ | KOL 报价 ≤ `max_price` | 超出目标但可谈,渐进加价 | `counter_offer` |
151
+ | KOL 报价 > `max_price` | 超预算,回一次低价试探 | `counter_offer`(报 `target_price`) |
152
+ | KOL 连续 2 轮报价 > `max_price` | 已试探过,差距太大 | `decline` |
153
+ | KOL 对之前的 counter 再次还价,且 ≤ `max_price` | 拉锯中,评估是否值得让步 | `counter_offer` 或 `accept` |
154
+ | KOL 明确拒绝合作 | 尊重意愿 | `decline` |
155
+ | KOL 问非价格问题(产品细节、时间线等) | 信息补充 | `clarify` |
156
+ | KOL 提到超出授权范围的话题 | 不要硬答 | `escalate` |
157
+
158
+ **出价规则**:
159
+
160
+ - 首次 counter:从 `first_offer` 开始
161
+ - 每轮加价不超过 `max_step`
162
+ - 绝不超过 `max_price`
163
+ - 加 concession 时优先用 `allowed_uses` 里的授权项(转发、二创等)作为附加价值,而非直接加钱
164
+ - 本 campaign 已承诺预算(`deal_reached` 的 offer 总和)+ 本次报价不能超 `total_budget`
165
+
166
+ **tone**:
167
+
168
+ - 专业友好,不卑不亢
169
+ - 不要用 "unfortunately" / "sadly" — 直接说 "our budget is..."
170
+ - 每封回信开头用一句话承接 KOL 上一封的内容(`acknowledge_line`)
171
+ - 永远不要透露 `max_price`、`total_budget`、或谈判策略
172
+
173
+ ## 护栏
174
+
175
+ 四层防线。任一层失败都**不问商家**——自动降级为发兜底话术 + 标记 `needs_merchant_followup`。
176
+
177
+ ### Layer 1 — Onboarding 校验
178
+
179
+ 写 `BRAND.md` / `CONFIG.md` 时执行:
180
+ - 所有必填字段非空
181
+ - `brand_slug` 全局唯一(通过 `scout outreach brand-slug check`)
182
+ - `max_price >= target_price >= first_offer`
183
+ - `max_step <= max_price - first_offer`
184
+ - `total_budget >= max_price`
185
+ - `escalation_keywords` 中英双语都有
186
+ - 不通过 → 继续追问,不退出 onboarding
187
+
188
+ ### Layer 2 — 回信预检(调 LLM 前)
189
+
190
+ - `rounds >= max_rounds` → `needs_merchant_followup`
191
+ - `now - started >= max_days` → 标 `expired`,**不发邮件**,直接退出
192
+ - KOL 回信命中 `escalation_keywords`(中英双语匹配) → 发 `escalate_fallback_v1`
193
+ - `in_reply_to` 与 conversation 最后一条 inbound 的 `message_id` 不一致 → 发 `escalate_fallback_v1`
194
+
195
+ ### Layer 3 — 决策后验(产出 JSON 后)
196
+
197
+ - `action` 必须在白名单内
198
+ - `counter_offer`: `first_offer <= new_price <= max_price`,`new_price - previous_offer <= max_step`
199
+ - `accept`: `first_offer <= final_price <= max_price`,`committed + final_price <= total_budget`
200
+ - `concessions ⊆ allowed_terms`
201
+ - `template_id` 存在于 `TEMPLATES.md`
202
+ - 任一不通过 → 降级 `escalate`,不重试
203
+
204
+ ### Layer 4 — 内容终检(发送前)
205
+
206
+ - body 不含 `forbidden_phrases`
207
+ - body 长度 ≤ 2000 字符
208
+ - 不通过 → 不发送,降级 `escalate`
209
+
210
+ ## 允许的命令
211
+
212
+ - `scout tiktok creators` / `scout tiktok creator-products`
213
+ - `scout outreach send` / `scout outreach brand-slug check|claim`
214
+ - `sentinel report`
215
+
216
+ ## 常见错误
217
+
218
+ ❌ 自由撰写邮件正文 → ✅ 只产出模板变量 JSON,用 TEMPLATES.md 渲染
219
+
220
+ ❌ 一次 session 混做多个流程 → ✅ 单会话单任务
221
+
222
+ ❌ 每一小步都 git commit → ✅ 每个逻辑动作完成后 commit 一次(发现、outreach、单个回信处理)
223
+
224
+ ❌ 护栏失败后重试 LLM → ✅ 直接降级为 escalate
225
+
226
+ ❌ 透露 max_price / total_budget / 谈判策略 → ✅ 只透露当前报价
227
+
228
+ ❌ expired 的 KOL 还发邮件 → ✅ 标 expired 直接退出,不发信
229
+
230
+ ❌ 修改不属于当前任务的 campaign 状态 → ✅ 只操作当前 campaign
231
+
232
+ ❌ scout outreach send 失败就中断全部 → ✅ 标 send_error 跳过该 KOL,继续其他
@@ -1,60 +1,60 @@
1
- # Campaign: {campaignId}
2
-
3
- <!-- 首次 campaign onboarding 时由 skill 对话式填入,之后可手动编辑 -->
4
- <!-- 品牌素材继承自 ../../BRAND.md,本文件只有覆写时才会重复 -->
5
-
6
- ## Campaign 元信息
7
- - campaignId:
8
- - 创建时间:
9
- - 状态: active <!-- active | paused | completed | archived -->
10
-
11
- ## 商品
12
- - 商品 ID 或 URL:
13
- - 商品标题:
14
- - 核心卖点(3-5 条):
15
- - 目标受众(年龄/性别/兴趣/地区):
16
- - 样品可寄送地区:
17
-
18
- ## 目标 KOL 画像
19
- - 地区(scout --country):
20
- - 粉丝量区间(scout --follower-count):
21
- - 品类关键词:
22
- - 本 campaign 目标合作 KOL 数量:
23
-
24
- ## 预算与报价(per-campaign 独立)
25
- - max_price:
26
- - target_price:
27
- - first_offer:
28
- - max_step:
29
- - total_budget:
30
-
31
- ## 合作条款边界
32
- - min_retention_days:
33
- - allowed_uses:
34
- - [ ] 商家官方账号转发
35
- - [ ] 二创
36
- - [ ] 付费广告投放
37
- - payment_schedule:
38
- - 样品政策:
39
-
40
- ## 兜底话术覆写(可选,留空则继承 BRAND.md)
41
- - commission_request:
42
- - contract_request:
43
- - invoice_request:
44
- - negative_tone:
45
-
46
- ## 品牌素材覆写(可选,留空则继承 BRAND.md)
47
- - contact_name:
48
- - brand_pitch:
49
-
50
- ## 运行参数(per-campaign 独立)
51
- - max_rounds: 5
52
- - max_days: 14
53
- - max_concurrent_kols: 30
54
- - escalation_keywords 覆写 (可选):
55
- - English:
56
- - 中文:
57
- - forbidden_phrases 覆写 (可选):
58
- - follow_up_enabled: false <!-- v1.1 -->
59
-
60
- <!-- 注意: max_daily_sends 在 ../../MERCHANT_LIMITS.md,是 merchant 级配额 -->
1
+ # Campaign: {campaignId}
2
+
3
+ <!-- 首次 campaign onboarding 时由 skill 对话式填入,之后可手动编辑 -->
4
+ <!-- 品牌素材继承自 ../../BRAND.md,本文件只有覆写时才会重复 -->
5
+
6
+ ## Campaign 元信息
7
+ - campaignId:
8
+ - 创建时间:
9
+ - 状态: active <!-- active | paused | completed | archived -->
10
+
11
+ ## 商品
12
+ - 商品 ID 或 URL:
13
+ - 商品标题:
14
+ - 核心卖点(3-5 条):
15
+ - 目标受众(年龄/性别/兴趣/地区):
16
+ - 样品可寄送地区:
17
+
18
+ ## 目标 KOL 画像
19
+ - 地区(scout --country):
20
+ - 粉丝量区间(scout --follower-count):
21
+ - 品类关键词:
22
+ - 本 campaign 目标合作 KOL 数量:
23
+
24
+ ## 预算与报价(per-campaign 独立)
25
+ - max_price:
26
+ - target_price:
27
+ - first_offer:
28
+ - max_step:
29
+ - total_budget:
30
+
31
+ ## 合作条款边界
32
+ - min_retention_days:
33
+ - allowed_uses:
34
+ - [ ] 商家官方账号转发
35
+ - [ ] 二创
36
+ - [ ] 付费广告投放
37
+ - payment_schedule:
38
+ - 样品政策:
39
+
40
+ ## 兜底话术覆写(可选,留空则继承 BRAND.md)
41
+ - commission_request:
42
+ - contract_request:
43
+ - invoice_request:
44
+ - negative_tone:
45
+
46
+ ## 品牌素材覆写(可选,留空则继承 BRAND.md)
47
+ - contact_name:
48
+ - brand_pitch:
49
+
50
+ ## 运行参数(per-campaign 独立)
51
+ - max_rounds: 5
52
+ - max_days: 14
53
+ - max_concurrent_kols: 30
54
+ - escalation_keywords 覆写 (可选):
55
+ - English:
56
+ - 中文:
57
+ - forbidden_phrases 覆写 (可选):
58
+ - follow_up_enabled: false <!-- v1.1 -->
59
+
60
+ <!-- 注意: max_daily_sends 在 ../../MERCHANT_LIMITS.md,是 merchant 级配额 -->
@@ -1,6 +1,6 @@
1
- # KOL 索引
2
-
3
- <!-- 本 campaign 下所有被 skill 接触过的 KOL -->
4
-
5
- | username | followers | engagement | email | status | offer | rounds | last_update | conversation |
6
- |---|---|---|---|---|---|---|---|---|
1
+ # KOL 索引
2
+
3
+ <!-- 本 campaign 下所有被 skill 接触过的 KOL -->
4
+
5
+ | username | followers | engagement | email | status | offer | rounds | last_update | conversation |
6
+ |---|---|---|---|---|---|---|---|---|
@@ -1,3 +1,3 @@
1
- # KOL Outreach Progress Log — {campaignId}
2
-
3
- <!-- 每次 skill session 末尾追加一条,最新的在最上面 -->
1
+ # KOL Outreach Progress Log — {campaignId}
2
+
3
+ <!-- 每次 skill session 末尾追加一条,最新的在最上面 -->