@optima-chat/optima-agent 0.8.99 → 0.8.100

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.
@@ -1,42 +1,37 @@
1
1
  ---
2
2
  name: ingesting-sources
3
- description: Use when new source material needs to be incorporated into a maintained knowledge base.
3
+ description: "将新素材收录到知识库。当用户说'收录这篇文章'、'把这个加到知识库'时使用。"
4
4
  ---
5
5
 
6
6
  # Ingesting Sources
7
7
 
8
- 这个 skill 负责把原始材料做第一次落库,进入持续维护的 wiki 结构。它的产物不只是摘要,而是一页来源页,以及一份清晰的“还有哪些页面需要随之更新”的映射。
8
+ 把原始材料做第一次落库,进入持续维护的 wiki 结构。产物不只是摘要,而是一页来源页,以及一份"还有哪些页面需要随之更新"的映射。
9
9
 
10
- ## 职责
10
+ ## 启动 SOP
11
11
 
12
- - `raw/` 读取新来源
13
- - `wiki/sources/` 中创建或更新对应页面
14
- - 抽取关键事实、实体和主题
15
- - 标出 wiki 其他位置中受影响的页面
12
+ 1. `ls ~/kb/REGISTRY.md`
13
+ - 不存在 告诉用户"还没有知识库,需要先创建一个",引导使用 initializing-kb
14
+ 2. 读 `~/kb/REGISTRY.md` — 获取所有 active 的 KB 列表
15
+ 3. 确定目标 KB:
16
+ - 用户明确指定了 KB slug 或主题 → 直接用
17
+ - 只有一个 active KB → 用它
18
+ - 多个 active → 根据用户问题匹配 `主题` + `说明` 字段;无法判断时列出让用户选
19
+ 4. 读 `~/kb/<slug>/AGENTS.md` 了解该 KB 的契约
16
20
 
17
- ## 不负责
21
+ ## Ingest 流程
18
22
 
19
- - 全量维护性清理
20
- - 泛化问答
21
-
22
- ## 工作规则
23
-
24
- 来源页不仅要说明来源说了什么,还要说明它会如何影响 wiki 的其他部分。
25
-
26
- ## 流程
27
-
28
- 使用这个 skill 时,按以下顺序进行:
29
-
30
- 1. 在 `raw/` 中定位来源文件
23
+ 1. 在 `~/kb/<slug>/raw/` 中定位来源文件
31
24
  2. 仔细阅读来源,提取主要论点、证据、实体和开放问题
32
- 3. 在 `wiki/sources/` 中创建或更新对应页面
25
+ 3. 在 `~/kb/<slug>/wiki/sources/` 中创建或更新对应页面
33
26
  4. 列出哪些 entity、overview 和 analysis 页面受到影响
34
- 5. 如果任务范围包含来源页之外的更新,就交给 `updating-related-pages` 的行为处理,或执行一次有边界的相关页更新
35
- 6. 如果这个来源是首次进入 wiki,则更新 `index.md` 和 `log.md`
27
+ 5. 如果任务范围包含来源页之外的更新,交给 updating-related-pages 处理,或执行一次有边界的相关页更新
28
+ 6. 如果这个来源是首次进入 wiki,更新 `~/kb/<slug>/index.md` 和 `~/kb/<slug>/log.md`
29
+ 7. 追加 `~/kb/PROGRESS.md`
30
+ 8. `cd ~/kb && git add -A && git commit -m "[<slug>] ingest: <来源名>"`
36
31
 
37
32
  ## 来源页内容
38
33
 
39
- 除非仓库已经有更强的既有格式,否则来源页应至少包含:
34
+ 来源页应至少包含:
40
35
 
41
36
  - 来源标题
42
37
  - 简短摘要
@@ -48,9 +43,7 @@ description: Use when new source material needs to be incorporated into a mainta
48
43
 
49
44
  ## 抽取规则
50
45
 
51
- ingest 过程中:
52
-
53
- - 将来源明确表达的内容与你自己的综合推断区分开
46
+ - 将来源明确表达的内容与综合推断区分开
54
47
  - 不要把大段原文直接复制进 wiki
55
48
  - 优先写成简洁、可链接、之后可更新的陈述
56
49
  - 当来源含混或不完整时,显式记录不确定性
@@ -58,7 +51,7 @@ description: Use when new source material needs to be incorporated into a mainta
58
51
 
59
52
  ## 何时创建相关页面
60
53
 
61
- 在 ingest 过程中,出现下列情况时应建议新建页面:
54
+ 出现下列情况时应建议新建页面:
62
55
 
63
56
  - 某个人、组织、产品或概念很重要,但还没有稳定页面
64
57
  - 来源引入了一个新的 recurring topic
@@ -72,5 +65,3 @@ description: Use when new source material needs to be incorporated into a mainta
72
65
  - 一页可用的 `wiki/sources/` 页面
73
66
  - 一份清晰的受影响页面列表
74
67
  - 足够明确的结构,使下一步 update 很自然
75
-
76
- 如果 ingest 最终只留下了一段模糊摘要,而没有连到 wiki 的其他部分,那它就是不完整的。
@@ -1,80 +1,79 @@
1
1
  ---
2
2
  name: initializing-kb
3
- description: Use when creating a new markdown-based knowledge base, or when an existing repository needs to be turned into a structured knowledge base with clear page types and maintenance rules.
3
+ description: "创建新知识库或初始化 ~/kb/ 工作空间。当用户说'建个知识库'、'我想整理XX的知识'时使用。"
4
4
  ---
5
5
 
6
6
  # Initializing KB
7
7
 
8
- 这个 skill 用来定义一个基于 Markdown 的知识库的运行契约。它的主要产物是一份可用的 `AGENTS.md`,以及少量与之匹配的模板调整,使仓库真正可维护。
8
+ 创建一个基于 Markdown 的知识库。主要产物是 `~/kb/<slug>/` 目录和其中的 `AGENTS.md`。
9
9
 
10
- ## 职责
10
+ ## 核心:~/kb/ 工作目录
11
11
 
12
- - 定义页面类型
13
- - 定义命名约定
14
- - 定义 ingest、query 和 lint 工作流
15
- - 创建或更新 `AGENTS.md`
12
+ 所有知识库都在 `~/kb/` 下,每个知识库一个子目录。
16
13
 
17
- ## 不负责
18
-
19
- - ingest 具体来源
20
- - 大范围 wiki 维护
14
+ ```text
15
+ ~/kb/
16
+ ├── REGISTRY.md
17
+ ├── PROGRESS.md
18
+ ├── <slug>/
19
+ │ ├── AGENTS.md
20
+ │ ├── index.md
21
+ │ ├── log.md
22
+ │ ├── raw/
23
+ │ └── wiki/
24
+ │ ├── overview/
25
+ │ ├── entities/
26
+ │ ├── sources/
27
+ │ └── analyses/
28
+ └── .git/
29
+ ```
21
30
 
22
- ## 工作规则
31
+ ## 启动 SOP
23
32
 
24
- 优先使用少量、边界清晰的页面类型,而不是难以维护的深层目录体系。
33
+ 1. `ls ~/kb/REGISTRY.md`
34
+ - 不存在 → 初始化根目录(见下方"首次初始化")
35
+ - 存在 → 读 `REGISTRY.md`,了解已有的知识库
36
+ 2. 询问用户要创建什么主题的知识库
25
37
 
26
- ## 流程
38
+ ## 首次初始化
27
39
 
28
- 使用这个 skill 时,按以下顺序进行:
40
+ 如果 `~/kb/` 不存在:
29
41
 
30
- 1. 检查当前仓库布局
31
- 2. 确认 `raw/`、`wiki/`、`index.md`、`log.md` 和 `AGENTS.md` 是否已经存在
32
- 3. 判断现有结构是可小修复用,还是需要更强约束的重整
33
- 4. 定义这个仓库所需的最小页面类型集合
34
- 5. 编写或更新 `AGENTS.md`
35
- 6. 做少量与规则匹配的模板调整,保证仓库布局和规则一致
42
+ 1. `mkdir -p ~/kb`
43
+ 2. 创建 `~/kb/REGISTRY.md`:
36
44
 
37
- 除非知识库规模和内容已经明确需要,否则不要发明庞大的分类体系。
45
+ ```markdown
46
+ # 知识库注册表
38
47
 
39
- ## 默认结构
48
+ | slug | 主题 | 状态 | 创建日期 | 说明 |
49
+ |------|------|------|----------|------|
50
+ ```
40
51
 
41
- 除非仓库已经有更成熟的既有结构,否则优先采用这个默认形态:
52
+ 3. 创建 `~/kb/PROGRESS.md`:
42
53
 
43
- ```text
44
- raw/
45
- wiki/
46
- overview/
47
- entities/
48
- sources/
49
- analyses/
50
- index.md
51
- log.md
52
- AGENTS.md
53
- ```
54
+ ```markdown
55
+ # 知识库工作日志
56
+ ```
54
57
 
55
- ## 页面模型
58
+ 4. `cd ~/kb && git init && git add -A && git commit -m "init kb workspace"`
56
59
 
57
- 默认页面职责如下:
60
+ ## 创建知识库
58
61
 
59
- - `wiki/sources/`:每个来源一页
60
- - `wiki/entities/`:每个跨多个来源反复出现的稳定实体或概念一页
61
- - `wiki/overview/`:每个主题或认知领域一页
62
- - `wiki/analyses/`:长期有效的答案、比较、综合或决策记录
63
-
64
- 避免混淆这些角色。来源页不应同时承担某个概念的长期实体页职责,分析页也不应取代主题综述页。
65
-
66
- ## 命名规则
67
-
68
- 优先使用可预测的命名:
69
-
70
- - 来源页:`YYYY-MM-DD-short-source-name.md`
71
- - 分析页:`YYYY-MM-DD-short-analysis-name.md`
72
- - 实体页:`kebab-case-entity-name.md`
73
- - 综述页:`kebab-case-topic-name.md`
62
+ 1. 询问用户知识库主题
63
+ 2. 从主题生成 kebab-case slug 建议(不带 `-kb` 后缀)
64
+ 3. 校验 slug:
65
+ - 匹配 `^[a-z0-9][a-z0-9-]{0,29}$`
66
+ - 不与 `REGISTRY.md` 已有 slug 重复
67
+ - 让用户确认或修改
68
+ 4. `mkdir -p ~/kb/<slug>`
69
+ 5. 检查当前素材(如果用户指定了已有目录或文件)
70
+ 6. 确定所需的最小页面类型集合
71
+ 7. 创建 `AGENTS.md`(见下方"AGENTS.md 内容")
72
+ 8. 创建 `index.md`、`log.md`、`raw/`、`wiki/overview/`、`wiki/entities/`、`wiki/sources/`、`wiki/analyses/`
73
+ 9. 追加 `~/kb/REGISTRY.md` 新行
74
+ 10. `cd ~/kb && git add -A && git commit -m "[<slug>] init: <主题>"`
74
75
 
75
- 统一优先使用 ISO 日期和 kebab-case。
76
-
77
- ## `AGENTS.md` 必须定义什么
76
+ ## AGENTS.md 内容
78
77
 
79
78
  至少应包含:
80
79
 
@@ -89,6 +88,24 @@ AGENTS.md
89
88
  - 何时应新建页面,而不是继续扩写旧页
90
89
  - agent 修改后的输出要求
91
90
 
91
+ ## 页面模型
92
+
93
+ 默认页面职责:
94
+
95
+ - `wiki/sources/`:每个来源一页
96
+ - `wiki/entities/`:每个跨多个来源反复出现的稳定实体或概念一页
97
+ - `wiki/overview/`:每个主题或认知领域一页
98
+ - `wiki/analyses/`:长期有效的答案、比较、综合或决策记录
99
+
100
+ 避免混淆这些角色。
101
+
102
+ ## 命名规则
103
+
104
+ - 来源页:`YYYY-MM-DD-short-source-name.md`
105
+ - 分析页:`YYYY-MM-DD-short-analysis-name.md`
106
+ - 实体页:`kebab-case-entity-name.md`
107
+ - 综述页:`kebab-case-topic-name.md`
108
+
92
109
  ## 好的结果
93
110
 
94
111
  一个好的 schema 应该让这些决策变得容易:
@@ -98,5 +115,3 @@ AGENTS.md
98
115
  - 一个高价值答案应该写回哪里
99
116
  - 冲突信息应如何呈现
100
117
  - 之后如何再次找到这些页面
101
-
102
- 如果更新完 `AGENTS.md` 之后这些决策仍然模糊,说明 schema 还没有完成。
@@ -1,450 +1,232 @@
1
1
  ---
2
2
  name: kol-outreach
3
- description: "KOL 建联全自动化:从 TikTok 发现潜在 KOL、提取 bio email、发送个性化 outreach、自动处理 KOL 回信并维护本地状态。当用户说'帮我找 KOL'、'{产品} KOL 建联'、'KOL 进展如何',或消息中出现 [KOL_INBOUND:{campaignId}] / [KOL_INBOUND] 时,使用此 skill。"
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].
4
6
  ---
5
7
 
6
8
  # KOL 建联
7
9
 
8
- ## 概述
10
+ 端到端 TikTok KOL 建联自动化:发现、触达、谈判、成交。
9
11
 
10
- skill 用于在 TikTok 上完成 KOL 建联的完整操作流程:发现、触达、回信处理、进度维护。
12
+ ## 核心:~/kol-outreach/ 工作目录
11
13
 
12
- - 所有业务状态都保存在 `~/kol-outreach/`
13
- - 运行时默认零打扰,优先按已固化配置执行
14
- - 本 skill 只负责操作,不解释系统实现
14
+ 所有状态都在 `~/kol-outreach/`(单个 git repo)。每次会话只做一件事。
15
15
 
16
- ## 工作规则
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 的完整对话 |
17
34
 
18
- - outbound 只用 `scout outreach send`
19
- - onboarding 时只用 `scout outreach brand-slug check|claim`
20
- - 所有业务状态只从 `~/kol-outreach/` 读取和写回
21
- - 单会话单任务:每次 session 只做一种动作
22
- - 每次关键状态变更后都要 `git add` + `git commit`
23
- - 所有对外邮件都必须走模板渲染;LLM 只能产出结构化变量或结构化决策
24
-
25
- ## 工作目录文件
26
-
27
- 优先关注这些文件:
28
-
29
- - merchant 级
30
- - `~/kol-outreach/BRAND.md`
31
- - `~/kol-outreach/MERCHANT_LIMITS.md`
32
- - `~/kol-outreach/CAMPAIGNS.md`
33
- - `~/kol-outreach/PROGRESS.md`
34
- - campaign 级
35
- - `~/kol-outreach/campaigns/{campaignId}/CONFIG.md`
36
- - `~/kol-outreach/campaigns/{campaignId}/KOLS.md`
37
- - `~/kol-outreach/campaigns/{campaignId}/TEMPLATES.md`
38
- - `~/kol-outreach/campaigns/{campaignId}/PROGRESS.md`
39
- - `~/kol-outreach/campaigns/{campaignId}/CONVERSATIONS/{username}.md`
40
-
41
- ## Session 分流
42
-
43
- 每次 session 开始时,按这个顺序判断要走哪条流程:
44
-
45
- 1. 如果用户消息包含 `[KOL_INBOUND:{campaignId}]` 或 `[KOL_INBOUND]`,走「流程 D:KOL 回信处理」
46
- 2. 否则,检查 `~/kol-outreach/BRAND.md` 是否存在
47
- - 不存在:先走「流程 A:Merchant onboarding」,再走「流程 B:Campaign onboarding」
48
- 3. 如果 merchant 已存在,则按用户意图分流
49
- - 用户要为新产品建联:走「流程 B:Campaign onboarding」
50
- - 用户要开始建联或发送 outreach:走「流程 C:发现 KOL + 首发 Outreach」
51
- - 用户要查看状态或进展:走「流程 E:查询进度」
52
-
53
- ## Inbound 前置条件
54
-
55
- 进入流程 D 前,先检查:
56
-
57
- 1. `BRAND.md`
58
- 2. 对应 campaign 目录
59
- 3. 可匹配的 `KOLS.md` / `CONVERSATIONS/*.md`
60
-
61
- 缺任何一项,都不要继续正常谈判;直接转状态恢复或人工跟进。
62
-
63
- ---
64
-
65
- ## 流程 A:商家初始化
66
-
67
- 1. 初始化工作目录:
68
-
69
- ```bash
70
- mkdir -p ~/kol-outreach/campaigns
71
- cp -r $CLAUDE_SKILL_DIR/template/merchant/. ~/kol-outreach/
72
- cd ~/kol-outreach && git init && git add -A && git commit -m "init merchant workspace"
73
- ```
74
-
75
- 2. 填 `BRAND.md`
76
- - 询问:`brand_name`
77
- - `brand_name` 生成 kebab-case 的 `brand_slug` 建议
78
- - `scout outreach brand-slug check {slug}`
79
- - 如果可用,让商家确认;如果被占用,让商家从建议里选或自己改
80
- - 成功后调 `scout outreach brand-slug claim`
81
- - 继续询问:`brand_website`、`brand_social`、`default_contact_name`、`default_brand_pitch`
82
- - 提供默认兜底话术和默认双语 `escalation_keywords`,让商家确认或修改
83
- - 写回 `BRAND.md`
84
- - `git add BRAND.md && git commit -m "setup BRAND.md"`
85
-
86
- 3. 填 `MERCHANT_LIMITS.md`
87
- - 默认 `max_daily_sends: 50`
88
- - 初始化 `sent_today: 0`
89
- - 初始化 `date_utc: $(date -u +%Y-%m-%d)`
90
- - 写回并 commit
91
-
92
- 4. 告诉商家:merchant 级配置已完成,继续创建第一个 campaign。
93
-
94
- ---
95
-
96
- ## 流程 B:创建 Campaign
97
-
98
- 1. 确定 `campaignId`
99
- - 询问商家要为哪个商品建联
100
- - 从商品标题生成 kebab-case slug 建议
101
- - 校验:
102
- - `CAMPAIGNS.md` 现有 campaign 不重复
103
- - 匹配 `^[a-z0-9][a-z0-9-]{0,29}$`
104
- - 让商家确认或修改
105
-
106
- 2. 创建 campaign 目录
107
-
108
- ```bash
109
- mkdir -p ~/kol-outreach/campaigns/{campaignId}
110
- cp -r $CLAUDE_SKILL_DIR/template/campaign/. ~/kol-outreach/campaigns/{campaignId}/
111
- cd ~/kol-outreach && git add -A && git commit -m "init campaign {campaignId}"
112
- ```
113
-
114
- 3. 分段填写 `CONFIG.md`
115
- - 依次填写:
116
- - campaign 元信息
117
- - 商品
118
- - 目标 KOL 画像
119
- - 预算与报价
120
- - 合作条款边界
121
- - 兜底话术覆写
122
- - 运行参数
123
- - 严格校验:
124
- - `max_price >= target_price >= first_offer`
125
- - `max_step <= max_price - first_offer`
126
- - `total_budget >= max_price`
127
- - 任一不满足:说明原因,给出调整建议,重新问
128
- - 每个大段写完后都要写文件并 commit
129
-
130
- 4. 更新 `CAMPAIGNS.md`
131
- - 追加一行新 campaign,`status=active`
132
-
133
- 5. `git commit -m "[{campaignId}] campaign ready"`
134
-
135
- 6. 告诉商家 campaign 已就绪,并询问是否立即开始发现 KOL。
136
-
137
- ---
138
-
139
- ## 流程 C:发现 KOL 与首发 Outreach
140
-
141
- 先按这个顺序执行:
142
-
143
- - 先定 campaign
144
- - 再检查并行上限和 merchant 日配额
145
- - 先发现 KOL,再补拉 bio / email
146
- - LLM 只产出模板变量,不直接写邮件正文
147
- - 每发出一封邮件,都要立刻写回并 commit
148
-
149
- 1. 确定 campaign
150
- - 如果用户指定 campaign,用指定值
151
- - 如果用户未指定,读 `CAMPAIGNS.md`
152
- - 只有一个 active:用它
153
- - 多个 active:列出让商家选
154
-
155
- 2. 读取所需文件
156
- - `CONFIG.md`
157
- - `KOLS.md`
158
- - `BRAND.md`
159
- - `MERCHANT_LIMITS.md`
160
- - `TEMPLATES.md`
161
-
162
- 3. 检查并行上限
163
- - `in_flight = KOLS.md 中 status ∈ {awaiting_reply, in_progress} 的行数`
164
- - `available_slots = max_concurrent_kols - in_flight`
165
- - `available_slots <= 0`:告诉商家当前已达并行上限,退出
166
- - `target_new = min(CONFIG.target_kols_this_round, available_slots)`
167
-
168
- 4. 检查 merchant 日发信配额
169
- - 读取 `MERCHANT_LIMITS.md`
170
- - 如果 UTC 日期变了,先归档昨天计数,再把 `sent_today` 重置为 0
171
- - `daily_budget = max_daily_sends - sent_today`
172
- - `daily_budget <= 0`:告诉商家今日配额已用完,退出
173
- - `本轮发送量 = min(target_new, daily_budget)`
174
-
175
- 5. `scout tiktok creators`
176
-
177
- ```bash
178
- scout tiktok creators \
179
- --follower-count "<CONFIG.follower_count_range>" \
180
- --country "<CONFIG.region>" \
181
- --limit <本轮发送量 * 3> \
182
- --format json
183
- ```
184
-
185
- 6. 过滤候选人
186
- - `engagement_rate < 2%` 丢弃
187
- - 已在 `KOLS.md` `username` 丢弃
188
- - 粉丝量不在目标区间的丢弃
189
-
190
- 7. 补拉 bio / email 并写 `KOLS.md`
191
- - 对每个候选 KOL `scout tiktok creator-products @username --limit 5`
192
- - 如果 creators 结果没带 bio,就从这里补拉
193
- - 用正则从 bio 提取 email
194
- - 有 email:
195
- - 追加到 `KOLS.md`
196
- - `status=pending_outreach`
197
- - email:
198
- - 追加到 `KOLS.md`
199
- - `status=no_contact`
200
- - `git commit -m "[{campaignId}] discovered N KOLs"`
201
-
202
- 8. 发送首发 outreach
203
- - 只处理 `status=pending_outreach`,并限制在本轮发送量内
204
- - 读取 `TEMPLATES.md` 中的 `first_outreach_v1`
205
- - 让 LLM 只输出模板变量 JSON,例如:
206
-
207
- ```json
208
- {
209
- "kol_first_name": "...",
210
- "opener_line": "...",
211
- "fit_reason": "...",
212
- "product_one_liner": "..."
213
- }
214
- ```
215
-
216
- - 用模板渲染正文,不要直接自由写 body
217
- - 终检:
218
- - body 不含 `forbidden_phrases`
219
- - body 长度 `<= 2000`
220
- - 任一不过:
221
- - 写 `KOLS.md` 为 `send_error`
222
- - 记 `PROGRESS.md`
223
- - 跳过该 KOL
224
-
225
- 9. 调 `scout outreach send`
226
-
227
- ```bash
228
- echo '{
229
- "to": "kol_email",
230
- "subject": "Collaboration opportunity with <brand_name>",
231
- "body": "<rendered body>",
232
- "from_merchant_id": "<merchantId>",
233
- "from_campaign_id": "<campaignId>",
234
- "from_brand_slug": "<BRAND.brand_slug>",
235
- "from_brand_name": "<BRAND.brand_name>",
236
- "from_contact_name": "<effective contact_name>"
237
- }' | scout outreach send
238
- ```
239
-
240
- 10. 写回状态
241
- - 在 `CONVERSATIONS/{username}.md` 追加 Round 1
242
- - 把返回的 `message_id` 写入 conversation
243
- - 更新 `KOLS.md`
244
- - `pending_outreach -> awaiting_reply`
245
- - `offer = first_offer`
246
- - 更新 `MERCHANT_LIMITS.md`
247
- - `sent_today += 1`
248
- - 追加本 campaign 的 `PROGRESS.md`
249
- - 重要事件同步追加 merchant `PROGRESS.md`
250
- - `git commit -m "[{campaignId}] outreach sent to @{username}"`
251
-
252
- 11. 告诉商家本次发送结果。
253
-
254
- ---
255
-
256
- ## 流程 D:处理 KOL 回信
257
-
258
- 先按这个顺序执行:
259
-
260
- - 先确定 campaign 和 KOL
261
- - 先做预检,再决定是否调用 LLM
262
- - LLM 只输出结构化决策,不直接写邮件正文
263
- - 任何校验不过都降级为 `escalate`
264
- - 每轮处理完都要写回文件、commit,并调用 `sentinel report`
265
-
266
- 1. 读取本次 inbound 的消息内容
267
- - 从当前消息中读取:
268
- - `From`
269
- - `Subject`
270
- - `Message-ID`
271
- - `In-Reply-To`
272
- - `References`
273
- - `Body`
274
-
275
- 2. 确定 campaign
276
- - 如果消息包含 `[KOL_INBOUND:{campaignId}]`:只处理该 campaign
277
- - 如果消息包含 `[KOL_INBOUND]`:稍后在步骤 3 通过 `from_email` 匹配 campaign
278
-
279
- 3. 按 `from_email` 匹配 KOL
280
- - `campaignId` 已知:只读该 campaign 的 `KOLS.md`
281
- - `campaignId` 未知:遍历 `~/kol-outreach/campaigns/*/KOLS.md`
282
- - 匹配结果:
283
- - 唯一匹配:继续
284
- - 多个匹配:选 `last_update` 最新的 campaign
285
- - 无匹配:按 orphan inbound 处理并退出
286
- - 同一 campaign 内同一 email 有多条记录时,取 `status` 非终态的活跃记录
287
-
288
- 4. 读取所需文件
289
- - `CONFIG.md`
290
- - `BRAND.md`
291
- - `CONVERSATIONS/{username}.md`
292
-
293
- 5. 先做预检
294
- - `rounds >= CONFIG.max_rounds`:`escalate`
295
- - 对话时长 `>= CONFIG.max_days`:`expired`
296
- - 最新回信 body 命中 `escalation_keywords`:`escalate`
297
- - 最后一条 inbound round 的 `message_id` 与本次 `in_reply_to` 不一致:按幂等性异常处理
298
-
299
- 6. 如果预检触发异常
300
- - 用 `escalate_fallback_v1` 模板渲染兜底回复
301
- - 调 `scout outreach send` 发出回复
302
- - 更新 `KOLS.md` 为 `needs_merchant_followup`
303
- - 写 `PROGRESS.md`
304
- - `git commit`
305
- - `sentinel report --condition-met true --summary "layer2 escalate" --action-taken "..."`
306
- - 退出
307
-
308
- 7. 调用 LLM 生成结构化决策
309
- - 输入:`CONFIG.md`、`BRAND.md`、`CONVERSATIONS/{username}.md`、最新回信、模板变量列表
310
- - 输出 JSON,例如:
311
-
312
- ```json
313
- {
314
- "action": "counter_offer | accept | decline | clarify | escalate",
315
- "new_price": 200,
316
- "final_price": 250,
317
- "concessions": ["video_retention_90d"],
318
- "template_id": "counter_offer_v1",
319
- "template_vars": {},
320
- "reasoning": "..."
321
- }
322
- ```
323
-
324
- 8. 校验 LLM 输出
325
- - `action ∈ {counter_offer, accept, decline, clarify, escalate}`
326
- - 如果 `counter_offer`
327
- - `CONFIG.first_offer <= new_price <= CONFIG.max_price`
328
- - `new_price - previous_offer <= CONFIG.max_step`
329
- - 如果 `accept`
330
- - `CONFIG.first_offer <= final_price <= CONFIG.max_price`
331
- - `committed_so_far + final_price <= CONFIG.total_budget`
332
- - `concessions` 只能来自允许集合
333
- - `template_id` 必须存在于本 campaign 的 `TEMPLATES.md`
334
- - 任一不通过:降级为 `escalate`
335
-
336
- 9. 渲染模板并终检
337
- - 用 `template_id + template_vars` 渲染最终 body
338
- - 终检:
339
- - body 不含 `forbidden_phrases`
340
- - body 长度 `<= 2000`
341
- - 不通过:降级为 `escalate`
342
-
343
- 10. 发送回复
344
- - 调 `scout outreach send`
345
- - 带上:
346
- - `in_reply_to = KOL 的 message_id`
347
- - `references = 原 references + KOL 的 message_id`
348
- - 拿到新 `message_id`
349
-
350
- 11. 写回状态
351
- - 在 `CONVERSATIONS/{username}.md` 追加新一轮,保留完整 LLM decision JSON
352
- - 更新 `KOLS.md`
353
- - 更新 `rounds`
354
- - 更新 `current_offer`
355
- - 更新 `last_update`
356
- - `accept -> deal_reached`
357
- - 其他正常回复 -> `awaiting_reply`
358
- - 更新 `MERCHANT_LIMITS.md`
359
- - `sent_today += 1`
360
- - 如果 `action == accept`
361
- - 给商家注册邮箱发送 `deal_confirmation_v1`
362
- - 在 merchant `PROGRESS.md` 记录达成合作
363
- - 追加 campaign `PROGRESS.md`
364
- - `git commit -m "[{campaignId}] round N {action} with @{username}"`
365
-
366
- 12. 调 `sentinel report`
367
-
368
- ```bash
369
- sentinel report --condition-met true --summary "..." --action-taken "..."
370
- ```
371
-
372
- ---
373
-
374
- ## 流程 E:查询进展
375
-
376
- 1. 读 `CAMPAIGNS.md`
377
-
378
- 2. 确定范围
379
- - 用户指定 campaign:只汇报该 campaign
380
- - 未指定且只有一个 active:只汇报该 campaign
381
- - 未指定且有多个 active:先给跨 campaign 摘要,再提示用户可继续查看单个 campaign
382
-
383
- 3. 跨 campaign 摘要
384
- - 对每个 campaign 读 `KOLS.md`
385
- - 统计:
386
- - `in_flight`
387
- - `deal_reached`
388
- - `needs_merchant_followup`
389
- - 读 `CONFIG.md` 的 `total_budget`,计算已承诺预算
390
- - 读 `MERCHANT_LIMITS.md` 的今日 `sent_today`
391
- - 以 markdown 表格汇报
392
-
393
- 4. 单 campaign 详情
394
- - 读 `KOLS.md` 按 `status` 分桶
395
- - 对每个 `needs_merchant_followup`,读对应 `CONVERSATIONS/{username}.md`,总结 KOL 诉求
396
- - 读 campaign `PROGRESS.md` 最近 5 条
397
- - 输出:
398
- - 关键统计
399
- - 需要人工处理的事项
400
- - 最近进展
401
-
402
- ---
403
-
404
- ## 异常处理
405
-
406
- - `scout outreach send` 返回 `ok: false`
407
- - 更新 `KOLS.md` 为 `send_error`
408
- - 记 `PROGRESS.md`
409
- - 不要中断其他 KOL 的处理
410
-
411
- - LLM 结构化输出格式错误
412
- - 重试 1 次
413
- - 仍失败:降级为 `escalate`
414
-
415
- - unknown campaign
416
- - 写 merchant `PROGRESS.md`
417
- - `sentinel report --condition-met false --summary "unknown campaign"`
418
- - 退出
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`
419
215
 
420
- - orphan inbound / unknown KOL
421
- - 写对应 `PROGRESS.md`
422
- - `sentinel report --condition-met false`
423
- - 退出
216
+ ## 常见错误
424
217
 
425
- - git commit 失败
426
- - 说明冲突原因
427
- - 修复后重试
428
- - 不要擅自 reset
218
+ 自由撰写邮件正文 ✅ 只产出模板变量 JSON,用 TEMPLATES.md 渲染
429
219
 
430
- - UTC 日期跨天
431
- - 读 `MERCHANT_LIMITS.md` 时先归档昨天计数,再继续
220
+ 一次 session 混做多个流程 → ✅ 单会话单任务
432
221
 
433
- ---
222
+ ❌ 每一小步都 git commit → ✅ 每个逻辑动作完成后 commit 一次(发现、outreach、单个回信处理)
434
223
 
435
- ## 允许使用的命令
224
+ 护栏失败后重试 LLM → ✅ 直接降级为 escalate
436
225
 
437
- 只使用这些命令:
226
+ ❌ 透露 max_price / total_budget / 谈判策略 → ✅ 只透露当前报价
438
227
 
439
- - `scout tiktok creators`
440
- - `scout tiktok creator-products`
441
- - `scout outreach send`
442
- - `scout outreach brand-slug check|claim`
443
- - `sentinel report`
228
+ expired KOL 还发邮件 → ✅ 标 expired 直接退出,不发信
444
229
 
445
- 不要这样做:
230
+ ❌ 修改不属于当前任务的 campaign 状态 → ✅ 只操作当前 campaign
446
231
 
447
- - 不要绕过模板直接自由写外发邮件
448
- - 不要跳过本地 workspace 状态检查
449
- - 不要一次 session 混做多个流程
450
- - 不要修改不属于本次任务的 campaign 状态
232
+ scout outreach send 失败就中断全部 → ✅ 标 send_error 跳过该 KOL,继续其他
@@ -1,45 +1,36 @@
1
1
  ---
2
2
  name: linting-the-wiki
3
- description: Use when a maintained knowledge base needs a health check for gaps, stale claims, contradictions, missing links, or indexing issues.
3
+ description: "检查知识库健康度。当用户说'检查知识库'、'知识库有什么问题'时使用。"
4
4
  ---
5
5
 
6
6
  # Linting The Wiki
7
7
 
8
- 这个 skill 用来检查 wiki 随时间推移后的完整性和可维护性。
8
+ 检查 wiki 随时间推移后的完整性和可维护性。
9
9
 
10
- ## 职责
10
+ ## 启动 SOP
11
11
 
12
- - 识别 orphan pages
13
- - 识别断链或缺失链接
14
- - 识别过时或已被覆盖的结论
15
- - 识别矛盾
16
- - 识别索引覆盖不足
17
- - 识别值得通过 web search 或补充来源来填补的数据空白
18
- - 提出或执行有边界的修复
12
+ 1. `ls ~/kb/REGISTRY.md`
13
+ - 不存在 → 告诉用户"还没有知识库,需要先创建一个",引导使用 initializing-kb
14
+ 2. 读 `~/kb/REGISTRY.md` — 获取所有 active 的 KB 列表
15
+ 3. 确定目标 KB:
16
+ - 用户明确指定了 KB slug 或主题 → 直接用
17
+ - 用户说"全部 lint" 遍历所有 active KB
18
+ - 只有一个 active KB → 用它
19
+ - 多个 active → 列出让用户选
20
+ 4. 读 `~/kb/<slug>/AGENTS.md` 了解该 KB 的契约
19
21
 
20
- ## 不负责
22
+ ## Lint 流程
21
23
 
22
- - 初始 schema 设计
23
- - 无边界 wiki 重写
24
-
25
- ## 工作规则
26
-
27
- lint 的目标是让维护债务变得可见。如果某条结论已经过时或被冲突信息挑战,这件事应该很容易被发现。
28
-
29
- ## 流程
30
-
31
- 使用这个 skill 时,按以下顺序进行:
32
-
33
- 1. 检查 `index.md`、关键 wiki 目录和一组有代表性的页面
24
+ 1. 检查 `~/kb/<slug>/index.md`、关键 wiki 目录和一组有代表性的页面
34
25
  2. 先识别结构性问题,再决定是否动手修改
35
26
  3. 按类型归类问题:链接、覆盖度、过时、矛盾、重复、页面规模或索引问题
36
27
  4. 除非用户要求更大范围修复,否则只应用小而明确的修补
37
28
  5. 清楚报告仍未解决的问题
29
+ 6. 追加 `~/kb/PROGRESS.md`
30
+ 7. `cd ~/kb && git add -A && git commit -m "[<slug>] lint: <发现N个问题,修复M个>"`
38
31
 
39
32
  ## 要检查什么
40
33
 
41
- 应检查:
42
-
43
34
  - 没有入链或出链的页面
44
35
  - 被反复提及但没有独立页面的实体或概念
45
36
  - 本应并入 overview 的 analysis 页面,或反过来的情况
@@ -57,7 +48,7 @@ lint 的目标是让维护债务变得可见。如果某条结论已经过时或
57
48
  - 澄清过时标签
58
49
  - 就地标出矛盾
59
50
 
60
- 不要把 lint 变成无边界重写。如果需要更深层次的结构调整,要明确说出来,并在边界处停下,除非用户明确要求继续。
51
+ 不要把 lint 变成无边界重写。需要更深层次调整时,明确说出来并停下,除非用户明确要求继续。
61
52
 
62
53
  ## 最小交付标准
63
54
 
@@ -1,38 +1,33 @@
1
1
  ---
2
2
  name: querying-the-wiki
3
- description: Use when answering questions against an existing wiki-like knowledge base and deciding whether the result should be preserved.
3
+ description: "从已有知识库中查询和回答问题。当用户提到的话题可能在 ~/kb/ 的某个知识库中有覆盖时使用。"
4
4
  ---
5
5
 
6
6
  # Querying The Wiki
7
7
 
8
- 这个 skill 通过把“维护后的 wiki”视为主要知识层来回答问题。
8
+ 通过把维护后的 wiki 视为主要知识层来回答问题。
9
9
 
10
- ## 职责
10
+ ## 启动 SOP
11
11
 
12
- - `index.md` 开始
13
- - 阅读相关 wiki 页面
14
- - 优先基于维护后的 wiki 回答
15
- - 在适当时把长期有效的结果回写到 `wiki/analyses/` 或 overview 页面
12
+ 1. `ls ~/kb/REGISTRY.md`
13
+ - 不存在 告诉用户"还没有知识库,需要先创建一个",引导使用 initializing-kb
14
+ 2. `~/kb/REGISTRY.md` — 获取所有 active 的 KB 列表
15
+ 3. 确定目标 KB:
16
+ - 用户明确指定了 KB slug 或主题 → 直接用
17
+ - 只有一个 active KB → 用它
18
+ - 多个 active → 根据用户问题匹配 `主题` + `说明` 字段;无法判断时列出让用户选
19
+ 4. 读 `~/kb/<slug>/AGENTS.md` 了解该 KB 的契约
16
20
 
17
- ## 不负责
21
+ ## 查询流程
18
22
 
19
- - 把每个问题都转成新的 ingest
20
- - 大规模维护性重构
21
-
22
- ## 工作规则
23
-
24
- 如果一个答案之后大概率还会有用,就应把它保存在 wiki 中,而不是只留在聊天里。
25
-
26
- ## 流程
27
-
28
- 使用这个 skill 时,按以下顺序进行:
29
-
30
- 1. 阅读 `index.md`
23
+ 1. `~/kb/<slug>/index.md`
31
24
  2. 找到最相关的 wiki 页面
32
- 3. 优先基于这些维护后的页面回答
25
+ 3. 优先基于维护后的页面回答
33
26
  4. 只有在 wiki 不完整或含混时才回到 raw sources
34
27
  5. 判断这个答案是否应该被保留
35
- 6. 如果应该,就把它写进 `wiki/analyses/` 或对应 overview 页面
28
+ 6. 如果应该,写进 `~/kb/<slug>/wiki/analyses/` 或对应 overview 页面
29
+ 7. 追加 `~/kb/PROGRESS.md`
30
+ 8. `cd ~/kb && git add -A && git commit -m "[<slug>] query: <一句话>"`
36
31
 
37
32
  ## Query 规则
38
33
 
@@ -42,7 +37,7 @@ description: Use when answering questions against an existing wiki-like knowledg
42
37
  - 当答案依赖不完整或过时的 wiki 覆盖时,要说清楚
43
38
  - 把 source-backed 内容与综合推断区分开
44
39
  - 标出这个问题是否暴露了 wiki 的结构性空缺
45
- - 尽量在答案中显式引用所使用的 wiki 页面;如果回看了 raw sources,也要说明
40
+ - 在答案中显式引用所使用的 wiki 页面;如果回看了 raw sources,也要说明
46
41
 
47
42
  ## 何时保留结果
48
43
 
@@ -53,14 +48,12 @@ description: Use when answering questions against an existing wiki-like knowledg
53
48
  - 这个答案形成了可长期复用的综合
54
49
  - 这个答案解决了当前 wiki 尚未解释清楚的混乱点
55
50
 
56
- 独立的长期输出应进入 `wiki/analyses/`。如果这个答案主要是在改进某个主题的现有综述,则应写入对应 overview 页面。
51
+ 独立的长期输出应进入 `wiki/analyses/`。如果主要是改进某个主题的现有综述,则写入对应 overview 页面。
57
52
 
58
53
  ## 最小交付标准
59
54
 
60
55
  一次成功的 query 至少应产出:
61
56
 
62
57
  - 一个直接回答用户问题的结果
63
- - 在答案中或答案后明确引用使用了哪些 wiki 页面
58
+ - 在答案中明确引用使用了哪些 wiki 页面
64
59
  - 清楚说明这个结果是否值得被保留
65
-
66
- 如果答案暴露了长期缺口,却没有说明 wiki 该在哪里补强,这次 query 就是不完整的。
@@ -1,40 +1,33 @@
1
1
  ---
2
2
  name: updating-related-pages
3
- description: Use when newly ingested source material affects existing entity pages, overview pages, or cross-references in the wiki.
3
+ description: "在 ingest 后同步更新知识库的关联页面。通常由 ingesting-sources 触发,不单独使用。"
4
4
  ---
5
5
 
6
6
  # Updating Related Pages
7
7
 
8
- 这个 skill 用来在来源 ingest 之后,同步 wiki 的其他部分。
8
+ 在来源 ingest 之后,同步 wiki 的其他部分。
9
9
 
10
- ## 职责
10
+ ## 启动 SOP
11
11
 
12
- - 更新相关 entity 页面
13
- - 更新相关 overview 页面
14
- - 增加或修复交叉链接
15
- - 显式记录冲突
16
- - 更新 `index.md`
17
- - 追加 `log.md`
12
+ 1. `ls ~/kb/REGISTRY.md`
13
+ - 不存在 告诉用户"还没有知识库,需要先创建一个",引导使用 initializing-kb
14
+ 2. 读 `~/kb/REGISTRY.md` — 获取所有 active 的 KB 列表
15
+ 3. 确定目标 KB:
16
+ - 用户明确指定了 KB slug 或主题 → 直接用
17
+ - 只有一个 active KB → 用它
18
+ - 多个 active → 根据用户问题匹配 `主题` + `说明` 字段;无法判断时列出让用户选
19
+ 4. 读 `~/kb/<slug>/AGENTS.md` 了解该 KB 的契约
18
20
 
19
- ## 不负责
20
-
21
- - 独自承担完整 ingest 流程
22
- - 替代 query 行为
23
-
24
- ## 工作规则
25
-
26
- 当新证据改变已有认知时,不要静默覆盖旧结论。应把修正过程明确写出来。
27
-
28
- ## 流程
29
-
30
- 使用这个 skill 时,按以下顺序进行:
21
+ ## 更新流程
31
22
 
32
23
  1. 从来源页或 ingest 产出的 affected-page 列表开始
33
24
  2. 确认哪些 entity、overview 和 analysis 页面需要更新
34
25
  3. 优先更新现有页面,而不是先新建页面
35
- 4. 为这些变更后的页面补齐或修复交叉链接
36
- 5. 如果创建了新的长期页面,则更新 `index.md`
37
- 6. 如果这次变更实质性影响了 wiki,则在 `log.md` 中追加记录
26
+ 4. 为变更后的页面补齐或修复交叉链接
27
+ 5. 如果创建了新的长期页面,更新 `~/kb/<slug>/index.md`
28
+ 6. 如果这次变更实质性影响了 wiki,在 `~/kb/<slug>/log.md` 中追加记录
29
+ 7. 追加 `~/kb/PROGRESS.md`
30
+ 8. `cd ~/kb && git add -A && git commit -m "[<slug>] update: <更新了哪些页面>"`
38
31
 
39
32
  ## 更新规则
40
33
 
@@ -55,8 +48,6 @@ description: Use when newly ingested source material affects existing entity pag
55
48
  - 更新当前理解
56
49
  - 让之后的读者仍然看得出分歧在哪里
57
50
 
58
- 页面要体现“理解是如何变化的”,而不只是“它发生了变化”。
59
-
60
51
  ## 何时创建新页面
61
52
 
62
53
  只有在下列情况下才应新建页面:
@@ -65,12 +56,10 @@ description: Use when newly ingested source material affects existing entity pag
65
56
  - 某个 analysis 或 comparison 已经有独立长期价值
66
57
  - 现有页面已经过宽,无法干净吸收这次更新
67
58
 
68
- 如果对现有页面做一次聚焦更新会让 wiki 更清楚,那就不要新建页面。
69
-
70
59
  ## 最小交付标准
71
60
 
72
61
  一次成功的 related-page update 至少应留下:
73
62
 
74
- - 被同步更新过的相关页面,而不是只有一张孤立来源页
63
+ - 被同步更新过的相关页面
75
64
  - source、entity、overview 和 analysis 页面之间清晰的交叉链接
76
- - 在适用时,对“理解发生变化”这件事有可见处理
65
+ - 在适用时,对"理解发生变化"有可见处理
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/optima-agent",
3
- "version": "0.8.99",
3
+ "version": "0.8.100",
4
4
  "description": "基于 Claude Agent SDK 的电商运营 AI 助手",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",