@optima-chat/optima-agent 0.9.7 → 0.9.8

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 (89) 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 -275
  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 -0
  47. package/.claude/skills/multigrid-poster/layouts/2x2.json +34 -0
  48. package/.claude/skills/multigrid-poster/layouts/3x3.json +43 -0
  49. package/.claude/skills/multigrid-poster/scripts/compose.py +116 -0
  50. package/.claude/skills/multigrid-poster/scripts/placeholder.png +0 -0
  51. package/.claude/skills/multigrid-poster/shared/fonts/MaShanZheng-Regular.ttf +0 -0
  52. package/.claude/skills/order/SKILL.md +452 -452
  53. package/.claude/skills/product/SKILL.md +379 -379
  54. package/.claude/skills/product-page/SKILL.md +106 -106
  55. package/.claude/skills/querying-the-wiki/SKILL.md +59 -59
  56. package/.claude/skills/reddit/SKILL.md +277 -277
  57. package/.claude/skills/review/SKILL.md +321 -321
  58. package/.claude/skills/scout/SKILL.md +462 -462
  59. package/.claude/skills/sentinel/SKILL.md +281 -281
  60. package/.claude/skills/shein/SKILL.md +246 -246
  61. package/.claude/skills/shipping/SKILL.md +200 -200
  62. package/.claude/skills/shop-content/SKILL.md +101 -101
  63. package/.claude/skills/shopify/SKILL.md +282 -282
  64. package/.claude/skills/skillify/SKILL.md +114 -114
  65. package/.claude/skills/taobao/SKILL.md +238 -238
  66. package/.claude/skills/tiktok/SKILL.md +381 -381
  67. package/.claude/skills/twitter/SKILL.md +302 -302
  68. package/.claude/skills/updating-related-pages/SKILL.md +65 -65
  69. package/.claude/skills/video-edit/SKILL.md +143 -143
  70. package/.claude/skills/video-gen/SKILL.md +548 -571
  71. package/.claude/skills/video-gen/templates/INDEX.md +78 -78
  72. package/.claude/skills/video-gen/templates/before-after-beauty.md +183 -183
  73. package/.claude/skills/video-gen/templates/drama-fmcg.md +183 -183
  74. package/.claude/skills/video-gen/templates/kol-reaction-food.md +193 -193
  75. package/.claude/skills/video-gen/templates/multi-point-apparel.md +185 -185
  76. package/.claude/skills/video-gen/templates/pain-solution-home.md +184 -184
  77. package/.claude/skills/video-gen/templates/pdp-360-showcase.md +189 -189
  78. package/.claude/skills/video-gen/templates/pdp-feature-highlight.md +182 -182
  79. package/.claude/skills/video-gen/templates/scene-digital.md +183 -183
  80. package/.claude/skills/wechat/SKILL.md +174 -174
  81. package/.claude/skills/xhs/SKILL.md +170 -170
  82. package/README.md +276 -276
  83. package/dist/bin/optima.js +26 -26
  84. package/dist/bin/serve.js +23 -23
  85. package/dist/src/agent.js +4 -4
  86. package/dist/src/system-prompt.js +169 -169
  87. package/dist/src/tools/memory.js +10 -10
  88. package/dist/src/ui/headless.js +7 -7
  89. package/package.json +79 -79
@@ -1,9 +1,9 @@
1
- {
2
- "skills": [
3
- "ingesting-sources",
4
- "initializing-kb",
5
- "linting-the-wiki",
6
- "querying-the-wiki",
7
- "updating-related-pages"
8
- ]
9
- }
1
+ {
2
+ "skills": [
3
+ "ingesting-sources",
4
+ "initializing-kb",
5
+ "linting-the-wiki",
6
+ "querying-the-wiki",
7
+ "updating-related-pages"
8
+ ]
9
+ }
@@ -1,244 +1,244 @@
1
- ---
2
- name: ads
3
- description: |
4
- Managed multi-channel ads. Only load when user explicitly asks to run paid ads
5
- (e.g. "帮我投广告", "launch a campaign", "推广这款商品", "加广告预算", "查看广告效果",
6
- "ads launch", "优化广告", "生成广告报告"). Do NOT load for general marketing
7
- questions or organic growth — those go to the `growth` skill.
8
- ---
9
-
10
- # Ads 托管广告投放
11
-
12
- AI 广告官:通过 `~/ads/` 工作目录持续运营用户的付费广告投放。
13
-
14
- ## 核心:`~/ads/` 工作目录
15
-
16
- 所有操作基于用户 workspace 的 `~/ads/`,两层结构:
17
-
18
- - **用户级根目录**: 跨 campaign 的整体策略和经验
19
- - **`campaigns/<slug>/` 子目录**: 每个 campaign 的专属文件
20
-
21
- ```
22
- ~/ads/
23
- ├── ADS.md 用户级整体策略
24
- ├── LEARNINGS.md 跨 campaign 经验沉淀
25
- ├── PROGRESS.md 全局工作日志 (每段标 campaign tag)
26
- ├── REPORTS/ 用户级周报/月报
27
- ├── assets/ 跨 campaign 共享素材 (.gitignore)
28
- ├── campaigns/
29
- │ └── <slug>/
30
- │ ├── STRATEGY.md campaign 专属策略
31
- │ ├── CREATIVES.md campaign 变体表
32
- │ └── NOTES.md campaign 运行观察
33
- └── .git/
34
- ```
35
-
36
- ## 启动 SOP(每次会话)
37
-
38
- 1. `ls ~/ads/ADS.md` — 不存在 → 进入"初始化流程"(见下方)
39
- 2. `cat ~/ads/PROGRESS.md | head -30` — 上次做了什么、异常、下次待办
40
- 3. `git -C ~/ads log --oneline -5` — 最近变更
41
- 4. `ls ~/ads/campaigns/` — 列出本地登记的 campaign
42
- 5. `ads status` — 从后端拉事实(默认 JSON 输出,加 `--pretty` 可读格式): 在跑的 campaign 列表 + 7 天花费 + 钱包 + 月度 cap
43
- - 钱包分为付费余额(`balanceUsd`)和赠送余额(`grantedBalanceUsd`),**赠送余额不能用于广告投放**
44
- - 如果付费余额 < 阈值,第一时间告诉用户
45
- - 如果月度 cap 使用率 > 80%,同样提示
46
- - 如果后端 campaign 和本地目录对不齐,视为需要修复
47
- 6. → 决定本次要做的**一个**动作
48
- - 聚焦单 campaign 的 session 优先 `cat ~/ads/campaigns/<name>/*.md` 载入专属上下文
49
-
50
- ## 初始化流程(第一次会话)
51
-
52
- 1. Copy the template from this skill's directory: `cp -r $(dirname "$SKILL_PATH")/template/user/ ~/ads/`
53
- (The template directory is at the same path as this SKILL.md file, under `template/user/`.)
54
- 2. `cd ~/ads && git init && git add -A && git commit -m "init workspace"`
55
- 3. **对话式引导填 ADS.md**(一次问一个,不要塞 10 个表单):
56
- - "我们要推广什么?"(商品、店铺、网站、活动等均可。如果是商品,加载 `product` skill 查询商品信息)
57
- - "默认目标受众是谁?(地域 / 年龄 / 设备 / 时段)"
58
- - "月度总预算上限多少美元?"
59
- - "有什么品牌禁忌或必须避开的词吗?"
60
- 每问完一段就写进 ADS.md,`git commit -m "fill ADS.md: <段落>"`
61
- 4. `ads init --total-monthly-budget <X>` — 后端创建 user_ads 记录 + 确保 Google Ads label 存在 + 查 USD wallet
62
- 5. 把后端返回的 ID 自动填进 ADS.md 的"后端登记"段,`git commit -m "register backend"`
63
- 6. 提示用户:
64
- - 注意区分 `wallet_balance_usd`(付费余额)和 `wallet_granted_usd`(赠送余额)。**赠送余额不能用于广告投放**,只有付费余额可以。
65
- - 付费余额为 0 → "需要先充值. 说 'ads budget topup --amount 100' 可充 $100"
66
- - 有付费余额 → "可以现在 launch 第一个 campaign,或者下次会话再开始"
67
-
68
- **不会自动 launch 任何 campaign.** 第一次 launch 必须由用户明确要求。
69
-
70
- ## 单会话单任务
71
-
72
- 每次会话只执行一种动作(launch / optimize / collect / report / budget / pause / diagnose / creative 的其中一个),完成后 commit 并更新 `PROGRESS.md`。出错时可以精准 `git revert`。
73
-
74
- **例外**: `collect` 在每个其它动作开头隐式跑(让 LLM 基于新鲜数据推理),不算独立 session 动作。
75
-
76
- ## 8 个动作
77
-
78
- ### 1. launch — 启动新 campaign
79
-
80
- **触发**: 用户说"推广 XX"、或 PROGRESS 里标记了下次 launch。
81
-
82
- **流程**:
83
- 1. 读 ADS.md 拿整体策略,确认推什么产品、受众、预算
84
- 2. 加载 `gen` skill 生成多个素材变体到 `~/ads/assets/`
85
- 3. 构造 CampaignSpec JSON(参考下方"CampaignSpec 结构"),写到 `/tmp/spec.json`
86
- 4. `ads launch create --spec /tmp/spec.json --reason "..."` — 默认 PAUSED
87
- 5. **必做**: 创建 `~/ads/campaigns/<slug>/` 子目录:
88
- ```bash
89
- slug=<campaign-slug>
90
- mkdir -p ~/ads/campaigns/$slug
91
- cp -r $(dirname "$SKILL_PATH")/template/campaign/. ~/ads/campaigns/$slug/
92
- ```
93
- 6. 填 `campaigns/<slug>/STRATEGY.md`(从 spec.json 拷贝产品、受众、关键词、日预算、差异化角度,加后端关联 ID)
94
- 7. 填 `campaigns/<slug>/CREATIVES.md`(5 个变体的表格,CTR/CVR 留空)
95
- 8. 检查 compliance_check 通过后 → `ads launch enable <id> --reason "compliance passed"`
96
- 9. 追加到 `PROGRESS.md`(tag: `launch, campaign=<slug>`)
97
- 10. `git -C ~/ads add -A && git -C ~/ads commit -m "launch: <slug>"`
98
-
99
- ### 2. optimize — 优化一个 campaign
100
-
101
- **触发**: sentinel 定时或用户说"优化一下"。
102
-
103
- **流程**:
104
- 1. `ads collect` 先拉最新数据(SOP 前置)
105
- 2. 读 `~/ads/campaigns/<slug>/CREATIVES.md` 看变体表现
106
- 3. 读 `~/ads/LEARNINGS.md` 看历史经验
107
- 4. 决定要改什么(一个或多个):
108
- - 淘汰低 CTR 素材: `ads optimize pause-variant --campaign <id> --variant <id> --reason "..."`
109
- - 恢复素材: `ads optimize resume-variant --campaign <id> --variant <id> --reason "..."`
110
- - 加新关键词: `ads optimize add-keywords --campaign <id> --keywords "word1" "word2" --reason "..."`
111
- - 移除关键词: `ads optimize remove-keywords --campaign <id> --keywords "word1" --reason "..."`
112
- - 加否定词: `ads optimize add-negatives --campaign <id> --keywords "word1" "word2" --reason "..."`
113
- - 调出价修正: `ads optimize change-bid-mod --campaign <id> --modifier 1.2 --reason "..."`
114
- - 替换素材: `ads optimize replace-variant --campaign <id> --old-variant <id> --spec /tmp/v.json --reason "..."`
115
- - 调预算: `ads budget set --campaign <id> --daily <micros> --reason "..."`
116
- 5. 更新 `campaigns/<slug>/CREATIVES.md`(把被淘汰的变体移到"已淘汰"段)
117
- 6. 追加一段到 `campaigns/<slug>/NOTES.md`(观察 + 推理 + 下次验证点)
118
- 7. 如果这个洞察是可泛化的,也追加到 `~/ads/LEARNINGS.md`
119
- 8. 追加到 `PROGRESS.md`
120
- 9. commit
121
-
122
- ### 3. collect — 拉最新数据
123
-
124
- **触发**: 定时(每天)或作为其它动作的前置。
125
-
126
- **流程**:
127
- 1. `ads collect --days 7` → 后端从 Google Ads 拉 per-campaign 和 per-variant 的最新数据,返回 JSON
128
- 2. 对返回的每个 snapshot 中的 `variantPerf` 项,找到对应 `campaigns/<slug>/CREATIVES.md`(通过 `campaign_id` 匹配——每个 `campaigns/<slug>/STRATEGY.md` 的"后端关联"段记录了 `campaign_id`),用新 CTR/CVR/花费重写"在投变体"表
129
- 3. 如果是纯 collect session(不是被其它动作调用),追加一段到 PROGRESS.md 和 commit。
130
- 如果是嵌入在其它动作里,则跟那个动作的 commit 合并。
131
-
132
- ### 4. report — 生成周/月报告
133
-
134
- **触发**: sentinel 定时或用户问"最近怎么样"。
135
-
136
- **流程**:
137
- 1. `ads report --period week`(或 `--period month`)→ 后端返回结构化数据
138
- 2. LLM 结合 `LEARNINGS.md` 和 `ADS.md` 的业务目标,组合出人话 markdown 报告
139
- 3. 写到 `~/ads/REPORTS/2026-W14.md`(周报)或 `~/ads/REPORTS/2026-04.md`(月报)
140
- 4. PROGRESS.md tag 一段 "generated report"
141
- 5. commit
142
-
143
- ### 5. budget — 调预算 / 钱包
144
-
145
- **触发**: 用户说"加预算"、"充钱"。
146
-
147
- **场景**:
148
- - "加到 $20/天" → `ads budget set --campaign <id> --daily 20000000 --reason "..."`
149
- - "月度上限改 $500" → `ads budget set --total-monthly 500000000 --reason "..."`
150
- - "充 $100" → `ads budget topup --amount 100` → 把返回的 `checkout_url` 作为 markdown 链接输出给用户(topup 用 USD)
151
- - "看下预算" → `ads budget show`(注意区分付费余额和赠送余额,赠送余额不可用于广告)
152
-
153
- 改完之后相应更新 `ADS.md`(月度 cap 变化)或 `campaigns/<slug>/STRATEGY.md`(campaign 日预算变化),commit。
154
-
155
- ### 6. pause — 紧急停投
156
-
157
- **触发**: 用户说"停掉"、"全停"。
158
-
159
- **流程**:
160
- - "停掉 XX campaign" → `ads pause campaign <id> --reason "..."`
161
- - "全停" → `ads pause all --reason "..."`
162
- - "停某个素材" → `ads pause variant <variant_id> --reason "..."`
163
- - "恢复" → `ads resume ...`(但钱包低余额或月度 cap 超出时会被后端拒)
164
-
165
- 停掉之后在对应 `campaigns/<slug>/NOTES.md` 记一笔,commit。
166
-
167
- ### 7. diagnose — 问题排查
168
-
169
- **触发**: 用户说"为啥没展示"、"怎么烧钱没单"。
170
-
171
- **流程**:
172
- 1. `ads diagnose --scope all`(或 `--campaign <id>` 聚焦某个)
173
- 2. 后端返回 issues 列表,每个带 `cli_hint`
174
- 3. LLM 把问题翻译成人话解释给用户,并建议下一步
175
- 4. 如果用户同意某个建议,执行对应的 `cli_hint`(这变成一个新的 optimize / pause / budget session,原则上 diagnose session 本身不改任何东西)
176
- 5. 更新 `campaigns/<slug>/NOTES.md` 或 `PROGRESS.md`(记录诊断发现和建议,不改其它状态文件)
177
- 6. commit(仅包含文档更新)
178
-
179
- ### 8. creative — 素材迭代
180
-
181
- **触发**: 独立会话,聚焦素材质量。
182
-
183
- **流程**:
184
- 1. `ads status --include-variants` 看现状
185
- 2. 读 `~/ads/campaigns/<slug>/CREATIVES.md` 和 `~/ads/LEARNINGS.md`
186
- 3. 决定要生成什么新变体(几个 prompt、什么风格)
187
- 4. 加载 `gen` skill 生成素材到 `~/ads/assets/`
188
- 5. 写进对应 `campaigns/<slug>/CREATIVES.md`
189
- 6. 如果要把新变体上线到现有 campaign: `ads optimize replace-variant --campaign <campaign_id> --old-variant <id> --spec /tmp/v.json --reason "..."`
190
- 7. 如果只是建素材库待用,不上线,也 OK
191
- 8. commit
192
-
193
- ## CampaignSpec 结构(构造 spec.json 用)
194
-
195
- ```json
196
- {
197
- "userId": "<CLI 自动从 ~/.optima/token.json 的 JWT 提取, 不需要手动填>",
198
- "name": "<slug-name-without-u-prefix>",
199
- "objective": "conversions",
200
- "productIds": ["12345"],
201
- "audience": {
202
- "geos": ["US", "CA"],
203
- "ageRanges": ["AGE_RANGE_25_34", "AGE_RANGE_35_44"],
204
- "genders": ["FEMALE"],
205
- "devices": ["MOBILE", "DESKTOP"],
206
- "intentSignals": ["夏季连衣裙", "summer dress"],
207
- "excludeSignals": ["免费", "free"]
208
- },
209
- "budget": { "dailyLimitMicros": 10000000, "totalLimitMicros": 300000000 },
210
- "variants": [
211
- {
212
- "variantId": "v_abc123",
213
- "headlines": ["标题1 最多 30 字", "标题2", "标题3", "标题4", "标题5"],
214
- "descriptions": ["描述1 最多 90 字", "描述2"],
215
- "imageAssets": ["/home/user/ads/assets/image_abc.png"],
216
- "finalUrl": "https://shop.example.com/p/12345"
217
- }
218
- ]
219
- }
220
- ```
221
-
222
- **Google Ads RSA 要求**: 至少 3 个 headlines(各 ≤30 字符),至少 2 个 descriptions(各 ≤90 字符)。后端会强制校验,违规会 fail compliance 预审。
223
-
224
- ## 提交约定
225
-
226
- - 每次会话结束必有**一个** commit
227
- - message: `<action>: <一句话>` 例: `launch: summer-promo`、`optimize: drop low-CTR creative`、`budget: topup $100`
228
- - PROGRESS.md 更新和动作产物**合并在同一个 commit**
229
- - 失败时,只更新 PROGRESS.md 记失败原因(其它状态文件不动)
230
- - `~/ads/.git/` 是本地 only,不推远程
231
-
232
- ## 归档
233
-
234
- 某 campaign 被删除或生命周期结束时:`mv ~/ads/campaigns/<slug> ~/ads/archive/<slug>`,不要直接删(保留历史给 LEARNINGS 参考)。`ls ~/ads/campaigns/` 永远只反映当前活跃/暂停的 campaign。
235
-
236
- ## Skill 之间的协作
237
-
238
- 按需加载其它 skill:
239
- - **`gen`** — image 生成
240
- - **`video-gen`** — video 生成
241
- - **`scout`** / **`shein`** / **`tiktok`** 等 — 竞品研究、关键词发现(在 launch 或 optimize 的策略阶段)
242
- - **`sentinel`** — 定时调度 collect / optimize / report
243
- - **`browser`** — API 不支持时的兜底
244
-
1
+ ---
2
+ name: ads
3
+ description: |
4
+ Managed multi-channel ads. Only load when user explicitly asks to run paid ads
5
+ (e.g. "帮我投广告", "launch a campaign", "推广这款商品", "加广告预算", "查看广告效果",
6
+ "ads launch", "优化广告", "生成广告报告"). Do NOT load for general marketing
7
+ questions or organic growth — those go to the `growth` skill.
8
+ ---
9
+
10
+ # Ads 托管广告投放
11
+
12
+ AI 广告官:通过 `~/ads/` 工作目录持续运营用户的付费广告投放。
13
+
14
+ ## 核心:`~/ads/` 工作目录
15
+
16
+ 所有操作基于用户 workspace 的 `~/ads/`,两层结构:
17
+
18
+ - **用户级根目录**: 跨 campaign 的整体策略和经验
19
+ - **`campaigns/<slug>/` 子目录**: 每个 campaign 的专属文件
20
+
21
+ ```
22
+ ~/ads/
23
+ ├── ADS.md 用户级整体策略
24
+ ├── LEARNINGS.md 跨 campaign 经验沉淀
25
+ ├── PROGRESS.md 全局工作日志 (每段标 campaign tag)
26
+ ├── REPORTS/ 用户级周报/月报
27
+ ├── assets/ 跨 campaign 共享素材 (.gitignore)
28
+ ├── campaigns/
29
+ │ └── <slug>/
30
+ │ ├── STRATEGY.md campaign 专属策略
31
+ │ ├── CREATIVES.md campaign 变体表
32
+ │ └── NOTES.md campaign 运行观察
33
+ └── .git/
34
+ ```
35
+
36
+ ## 启动 SOP(每次会话)
37
+
38
+ 1. `ls ~/ads/ADS.md` — 不存在 → 进入"初始化流程"(见下方)
39
+ 2. `cat ~/ads/PROGRESS.md | head -30` — 上次做了什么、异常、下次待办
40
+ 3. `git -C ~/ads log --oneline -5` — 最近变更
41
+ 4. `ls ~/ads/campaigns/` — 列出本地登记的 campaign
42
+ 5. `ads status` — 从后端拉事实(默认 JSON 输出,加 `--pretty` 可读格式): 在跑的 campaign 列表 + 7 天花费 + 钱包 + 月度 cap
43
+ - 钱包分为付费余额(`balanceUsd`)和赠送余额(`grantedBalanceUsd`),**赠送余额不能用于广告投放**
44
+ - 如果付费余额 < 阈值,第一时间告诉用户
45
+ - 如果月度 cap 使用率 > 80%,同样提示
46
+ - 如果后端 campaign 和本地目录对不齐,视为需要修复
47
+ 6. → 决定本次要做的**一个**动作
48
+ - 聚焦单 campaign 的 session 优先 `cat ~/ads/campaigns/<name>/*.md` 载入专属上下文
49
+
50
+ ## 初始化流程(第一次会话)
51
+
52
+ 1. Copy the template from this skill's directory: `cp -r $(dirname "$SKILL_PATH")/template/user/ ~/ads/`
53
+ (The template directory is at the same path as this SKILL.md file, under `template/user/`.)
54
+ 2. `cd ~/ads && git init && git add -A && git commit -m "init workspace"`
55
+ 3. **对话式引导填 ADS.md**(一次问一个,不要塞 10 个表单):
56
+ - "我们要推广什么?"(商品、店铺、网站、活动等均可。如果是商品,加载 `product` skill 查询商品信息)
57
+ - "默认目标受众是谁?(地域 / 年龄 / 设备 / 时段)"
58
+ - "月度总预算上限多少美元?"
59
+ - "有什么品牌禁忌或必须避开的词吗?"
60
+ 每问完一段就写进 ADS.md,`git commit -m "fill ADS.md: <段落>"`
61
+ 4. `ads init --total-monthly-budget <X>` — 后端创建 user_ads 记录 + 确保 Google Ads label 存在 + 查 USD wallet
62
+ 5. 把后端返回的 ID 自动填进 ADS.md 的"后端登记"段,`git commit -m "register backend"`
63
+ 6. 提示用户:
64
+ - 注意区分 `wallet_balance_usd`(付费余额)和 `wallet_granted_usd`(赠送余额)。**赠送余额不能用于广告投放**,只有付费余额可以。
65
+ - 付费余额为 0 → "需要先充值. 说 'ads budget topup --amount 100' 可充 $100"
66
+ - 有付费余额 → "可以现在 launch 第一个 campaign,或者下次会话再开始"
67
+
68
+ **不会自动 launch 任何 campaign.** 第一次 launch 必须由用户明确要求。
69
+
70
+ ## 单会话单任务
71
+
72
+ 每次会话只执行一种动作(launch / optimize / collect / report / budget / pause / diagnose / creative 的其中一个),完成后 commit 并更新 `PROGRESS.md`。出错时可以精准 `git revert`。
73
+
74
+ **例外**: `collect` 在每个其它动作开头隐式跑(让 LLM 基于新鲜数据推理),不算独立 session 动作。
75
+
76
+ ## 8 个动作
77
+
78
+ ### 1. launch — 启动新 campaign
79
+
80
+ **触发**: 用户说"推广 XX"、或 PROGRESS 里标记了下次 launch。
81
+
82
+ **流程**:
83
+ 1. 读 ADS.md 拿整体策略,确认推什么产品、受众、预算
84
+ 2. 加载 `gen` skill 生成多个素材变体到 `~/ads/assets/`
85
+ 3. 构造 CampaignSpec JSON(参考下方"CampaignSpec 结构"),写到 `/tmp/spec.json`
86
+ 4. `ads launch create --spec /tmp/spec.json --reason "..."` — 默认 PAUSED
87
+ 5. **必做**: 创建 `~/ads/campaigns/<slug>/` 子目录:
88
+ ```bash
89
+ slug=<campaign-slug>
90
+ mkdir -p ~/ads/campaigns/$slug
91
+ cp -r $(dirname "$SKILL_PATH")/template/campaign/. ~/ads/campaigns/$slug/
92
+ ```
93
+ 6. 填 `campaigns/<slug>/STRATEGY.md`(从 spec.json 拷贝产品、受众、关键词、日预算、差异化角度,加后端关联 ID)
94
+ 7. 填 `campaigns/<slug>/CREATIVES.md`(5 个变体的表格,CTR/CVR 留空)
95
+ 8. 检查 compliance_check 通过后 → `ads launch enable <id> --reason "compliance passed"`
96
+ 9. 追加到 `PROGRESS.md`(tag: `launch, campaign=<slug>`)
97
+ 10. `git -C ~/ads add -A && git -C ~/ads commit -m "launch: <slug>"`
98
+
99
+ ### 2. optimize — 优化一个 campaign
100
+
101
+ **触发**: sentinel 定时或用户说"优化一下"。
102
+
103
+ **流程**:
104
+ 1. `ads collect` 先拉最新数据(SOP 前置)
105
+ 2. 读 `~/ads/campaigns/<slug>/CREATIVES.md` 看变体表现
106
+ 3. 读 `~/ads/LEARNINGS.md` 看历史经验
107
+ 4. 决定要改什么(一个或多个):
108
+ - 淘汰低 CTR 素材: `ads optimize pause-variant --campaign <id> --variant <id> --reason "..."`
109
+ - 恢复素材: `ads optimize resume-variant --campaign <id> --variant <id> --reason "..."`
110
+ - 加新关键词: `ads optimize add-keywords --campaign <id> --keywords "word1" "word2" --reason "..."`
111
+ - 移除关键词: `ads optimize remove-keywords --campaign <id> --keywords "word1" --reason "..."`
112
+ - 加否定词: `ads optimize add-negatives --campaign <id> --keywords "word1" "word2" --reason "..."`
113
+ - 调出价修正: `ads optimize change-bid-mod --campaign <id> --modifier 1.2 --reason "..."`
114
+ - 替换素材: `ads optimize replace-variant --campaign <id> --old-variant <id> --spec /tmp/v.json --reason "..."`
115
+ - 调预算: `ads budget set --campaign <id> --daily <micros> --reason "..."`
116
+ 5. 更新 `campaigns/<slug>/CREATIVES.md`(把被淘汰的变体移到"已淘汰"段)
117
+ 6. 追加一段到 `campaigns/<slug>/NOTES.md`(观察 + 推理 + 下次验证点)
118
+ 7. 如果这个洞察是可泛化的,也追加到 `~/ads/LEARNINGS.md`
119
+ 8. 追加到 `PROGRESS.md`
120
+ 9. commit
121
+
122
+ ### 3. collect — 拉最新数据
123
+
124
+ **触发**: 定时(每天)或作为其它动作的前置。
125
+
126
+ **流程**:
127
+ 1. `ads collect --days 7` → 后端从 Google Ads 拉 per-campaign 和 per-variant 的最新数据,返回 JSON
128
+ 2. 对返回的每个 snapshot 中的 `variantPerf` 项,找到对应 `campaigns/<slug>/CREATIVES.md`(通过 `campaign_id` 匹配——每个 `campaigns/<slug>/STRATEGY.md` 的"后端关联"段记录了 `campaign_id`),用新 CTR/CVR/花费重写"在投变体"表
129
+ 3. 如果是纯 collect session(不是被其它动作调用),追加一段到 PROGRESS.md 和 commit。
130
+ 如果是嵌入在其它动作里,则跟那个动作的 commit 合并。
131
+
132
+ ### 4. report — 生成周/月报告
133
+
134
+ **触发**: sentinel 定时或用户问"最近怎么样"。
135
+
136
+ **流程**:
137
+ 1. `ads report --period week`(或 `--period month`)→ 后端返回结构化数据
138
+ 2. LLM 结合 `LEARNINGS.md` 和 `ADS.md` 的业务目标,组合出人话 markdown 报告
139
+ 3. 写到 `~/ads/REPORTS/2026-W14.md`(周报)或 `~/ads/REPORTS/2026-04.md`(月报)
140
+ 4. PROGRESS.md tag 一段 "generated report"
141
+ 5. commit
142
+
143
+ ### 5. budget — 调预算 / 钱包
144
+
145
+ **触发**: 用户说"加预算"、"充钱"。
146
+
147
+ **场景**:
148
+ - "加到 $20/天" → `ads budget set --campaign <id> --daily 20000000 --reason "..."`
149
+ - "月度上限改 $500" → `ads budget set --total-monthly 500000000 --reason "..."`
150
+ - "充 $100" → `ads budget topup --amount 100` → 把返回的 `checkout_url` 作为 markdown 链接输出给用户(topup 用 USD)
151
+ - "看下预算" → `ads budget show`(注意区分付费余额和赠送余额,赠送余额不可用于广告)
152
+
153
+ 改完之后相应更新 `ADS.md`(月度 cap 变化)或 `campaigns/<slug>/STRATEGY.md`(campaign 日预算变化),commit。
154
+
155
+ ### 6. pause — 紧急停投
156
+
157
+ **触发**: 用户说"停掉"、"全停"。
158
+
159
+ **流程**:
160
+ - "停掉 XX campaign" → `ads pause campaign <id> --reason "..."`
161
+ - "全停" → `ads pause all --reason "..."`
162
+ - "停某个素材" → `ads pause variant <variant_id> --reason "..."`
163
+ - "恢复" → `ads resume ...`(但钱包低余额或月度 cap 超出时会被后端拒)
164
+
165
+ 停掉之后在对应 `campaigns/<slug>/NOTES.md` 记一笔,commit。
166
+
167
+ ### 7. diagnose — 问题排查
168
+
169
+ **触发**: 用户说"为啥没展示"、"怎么烧钱没单"。
170
+
171
+ **流程**:
172
+ 1. `ads diagnose --scope all`(或 `--campaign <id>` 聚焦某个)
173
+ 2. 后端返回 issues 列表,每个带 `cli_hint`
174
+ 3. LLM 把问题翻译成人话解释给用户,并建议下一步
175
+ 4. 如果用户同意某个建议,执行对应的 `cli_hint`(这变成一个新的 optimize / pause / budget session,原则上 diagnose session 本身不改任何东西)
176
+ 5. 更新 `campaigns/<slug>/NOTES.md` 或 `PROGRESS.md`(记录诊断发现和建议,不改其它状态文件)
177
+ 6. commit(仅包含文档更新)
178
+
179
+ ### 8. creative — 素材迭代
180
+
181
+ **触发**: 独立会话,聚焦素材质量。
182
+
183
+ **流程**:
184
+ 1. `ads status --include-variants` 看现状
185
+ 2. 读 `~/ads/campaigns/<slug>/CREATIVES.md` 和 `~/ads/LEARNINGS.md`
186
+ 3. 决定要生成什么新变体(几个 prompt、什么风格)
187
+ 4. 加载 `gen` skill 生成素材到 `~/ads/assets/`
188
+ 5. 写进对应 `campaigns/<slug>/CREATIVES.md`
189
+ 6. 如果要把新变体上线到现有 campaign: `ads optimize replace-variant --campaign <campaign_id> --old-variant <id> --spec /tmp/v.json --reason "..."`
190
+ 7. 如果只是建素材库待用,不上线,也 OK
191
+ 8. commit
192
+
193
+ ## CampaignSpec 结构(构造 spec.json 用)
194
+
195
+ ```json
196
+ {
197
+ "userId": "<CLI 自动从 ~/.optima/token.json 的 JWT 提取, 不需要手动填>",
198
+ "name": "<slug-name-without-u-prefix>",
199
+ "objective": "conversions",
200
+ "productIds": ["12345"],
201
+ "audience": {
202
+ "geos": ["US", "CA"],
203
+ "ageRanges": ["AGE_RANGE_25_34", "AGE_RANGE_35_44"],
204
+ "genders": ["FEMALE"],
205
+ "devices": ["MOBILE", "DESKTOP"],
206
+ "intentSignals": ["夏季连衣裙", "summer dress"],
207
+ "excludeSignals": ["免费", "free"]
208
+ },
209
+ "budget": { "dailyLimitMicros": 10000000, "totalLimitMicros": 300000000 },
210
+ "variants": [
211
+ {
212
+ "variantId": "v_abc123",
213
+ "headlines": ["标题1 最多 30 字", "标题2", "标题3", "标题4", "标题5"],
214
+ "descriptions": ["描述1 最多 90 字", "描述2"],
215
+ "imageAssets": ["/home/user/ads/assets/image_abc.png"],
216
+ "finalUrl": "https://shop.example.com/p/12345"
217
+ }
218
+ ]
219
+ }
220
+ ```
221
+
222
+ **Google Ads RSA 要求**: 至少 3 个 headlines(各 ≤30 字符),至少 2 个 descriptions(各 ≤90 字符)。后端会强制校验,违规会 fail compliance 预审。
223
+
224
+ ## 提交约定
225
+
226
+ - 每次会话结束必有**一个** commit
227
+ - message: `<action>: <一句话>` 例: `launch: summer-promo`、`optimize: drop low-CTR creative`、`budget: topup $100`
228
+ - PROGRESS.md 更新和动作产物**合并在同一个 commit**
229
+ - 失败时,只更新 PROGRESS.md 记失败原因(其它状态文件不动)
230
+ - `~/ads/.git/` 是本地 only,不推远程
231
+
232
+ ## 归档
233
+
234
+ 某 campaign 被删除或生命周期结束时:`mv ~/ads/campaigns/<slug> ~/ads/archive/<slug>`,不要直接删(保留历史给 LEARNINGS 参考)。`ls ~/ads/campaigns/` 永远只反映当前活跃/暂停的 campaign。
235
+
236
+ ## Skill 之间的协作
237
+
238
+ 按需加载其它 skill:
239
+ - **`gen`** — image 生成
240
+ - **`video-gen`** — video 生成
241
+ - **`scout`** / **`shein`** / **`tiktok`** 等 — 竞品研究、关键词发现(在 launch 或 optimize 的策略阶段)
242
+ - **`sentinel`** — 定时调度 collect / optimize / report
243
+ - **`browser`** — API 不支持时的兜底
244
+
@@ -1,18 +1,18 @@
1
- # Creatives: <name>
2
-
3
- ## 在投变体
4
- | 变体ID | 类型 | 标题/描述 | CTR | CVR | 花费 | 状态 |
5
- |---|---|---|---|---|---|---|
6
- <!-- ads collect 后由 LLM 回填 CTR/CVR/花费 -->
7
-
8
- ## 已淘汰变体
9
- <!-- optimize 淘汰的变体迁到这里, 保留作为反例 -->
10
-
11
- ## Prompt 记录
12
- <!-- gen image 用过的 prompt, 方便复现和迭代
13
-
14
- 示例:
15
- - v_abc (2026-04-11): "minimalist summer fashion banner, product 12345, 7折促销"
16
- → ~/ads/assets/image_abc.png
17
-
18
- -->
1
+ # Creatives: <name>
2
+
3
+ ## 在投变体
4
+ | 变体ID | 类型 | 标题/描述 | CTR | CVR | 花费 | 状态 |
5
+ |---|---|---|---|---|---|---|
6
+ <!-- ads collect 后由 LLM 回填 CTR/CVR/花费 -->
7
+
8
+ ## 已淘汰变体
9
+ <!-- optimize 淘汰的变体迁到这里, 保留作为反例 -->
10
+
11
+ ## Prompt 记录
12
+ <!-- gen image 用过的 prompt, 方便复现和迭代
13
+
14
+ 示例:
15
+ - v_abc (2026-04-11): "minimalist summer fashion banner, product 12345, 7折促销"
16
+ → ~/ads/assets/image_abc.png
17
+
18
+ -->
@@ -1,10 +1,10 @@
1
- # Notes: <name>
2
- > 这个 campaign 的运行观察、临时发现、踩过的坑.
3
- > 泛化到跨 campaign 的经验, 整理到 ~/ads/LEARNINGS.md.
4
-
5
- <!-- 示例:
6
- ## 2026-04-15 14:30 (optimize session)
7
- - 观察: 周末 CTR 比工作日高 40%, 但 CVR 低 20%, 推测周末逛店多但下单少
8
- - 临时调整: 周六日 bid modifier -15%, 省钱给工作日
9
- - 下次验证: 7 天后看 CPA 是否改善
10
- -->
1
+ # Notes: <name>
2
+ > 这个 campaign 的运行观察、临时发现、踩过的坑.
3
+ > 泛化到跨 campaign 的经验, 整理到 ~/ads/LEARNINGS.md.
4
+
5
+ <!-- 示例:
6
+ ## 2026-04-15 14:30 (optimize session)
7
+ - 观察: 周末 CTR 比工作日高 40%, 但 CVR 低 20%, 推测周末逛店多但下单少
8
+ - 临时调整: 周六日 bid modifier -15%, 省钱给工作日
9
+ - 下次验证: 7 天后看 CPA 是否改善
10
+ -->
@@ -1,29 +1,29 @@
1
- # Campaign: <name>
2
- > 这个 campaign 的专属策略. 用户级整体策略见 ~/ads/ADS.md.
3
- > 由 `ads launch` 之后 LLM 根据 ADS.md + 用户请求生成草稿, 后续可编辑.
4
-
5
- ## 目标
6
- <!-- 这个 campaign 要达成什么? 例: "推新上的夏季系列裙装, 主打 25-35 女性" -->
7
-
8
- ## 推广产品
9
- <!-- 具体 product_id 列表 -->
10
-
11
- ## 目标受众 (campaign-specific)
12
- <!-- 相对 ADS.md 默认受众的调整. 没有调整就写 "same as ADS.md" -->
13
-
14
- ## 关键词意图 (Google Ads)
15
- - 核心词:
16
- - 长尾词:
17
- - 否定词:
18
-
19
- ## 日预算
20
- - 日预算: $___
21
- - 持续时长: ___天 / 无限期
22
-
23
- ## 差异化角度
24
- <!-- 这个 campaign 跟其它 campaign 的区别, 为什么单独开? -->
25
-
26
- ## 后端关联 (由 `ads launch` 自动填)
27
- - campaign_id:
28
- - platform_campaign_id:
29
- - platform_budget_id:
1
+ # Campaign: <name>
2
+ > 这个 campaign 的专属策略. 用户级整体策略见 ~/ads/ADS.md.
3
+ > 由 `ads launch` 之后 LLM 根据 ADS.md + 用户请求生成草稿, 后续可编辑.
4
+
5
+ ## 目标
6
+ <!-- 这个 campaign 要达成什么? 例: "推新上的夏季系列裙装, 主打 25-35 女性" -->
7
+
8
+ ## 推广产品
9
+ <!-- 具体 product_id 列表 -->
10
+
11
+ ## 目标受众 (campaign-specific)
12
+ <!-- 相对 ADS.md 默认受众的调整. 没有调整就写 "same as ADS.md" -->
13
+
14
+ ## 关键词意图 (Google Ads)
15
+ - 核心词:
16
+ - 长尾词:
17
+ - 否定词:
18
+
19
+ ## 日预算
20
+ - 日预算: $___
21
+ - 持续时长: ___天 / 无限期
22
+
23
+ ## 差异化角度
24
+ <!-- 这个 campaign 跟其它 campaign 的区别, 为什么单独开? -->
25
+
26
+ ## 后端关联 (由 `ads launch` 自动填)
27
+ - campaign_id:
28
+ - platform_campaign_id:
29
+ - platform_budget_id: