@scorehub/creator-outreach 1.0.3 → 1.0.5
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.
- package/README.md +13 -11
- package/agents/tiktok-creator-outreach.md +10 -5
- package/install.js +70 -12
- package/package.json +1 -1
- package/skills/tiktok-creator-search/SKILL.md +12 -5
package/README.md
CHANGED
|
@@ -6,30 +6,32 @@ TikTok 达人建联 WorkBuddy 智能体。支持按 GMV/类目/粉丝画像搜
|
|
|
6
6
|
|
|
7
7
|
## 安装
|
|
8
8
|
|
|
9
|
-
### Claude Code
|
|
9
|
+
### 一键安装(Claude Code + WorkBuddy)
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
npx @scorehub/creator-outreach
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
自动检测并安装到已安装的 AI 客户端:
|
|
16
|
+
|
|
17
|
+
**Claude Code / Claude Desktop:**
|
|
16
18
|
- 将 Tiky Agent 定义复制到 `~/.claude/agents/`
|
|
17
19
|
- 将 ScoreHub MCP Server 配置写入 `~/.claude.json`
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
**WorkBuddy 桌面版(检测到 `~/.workbuddy/` 时自动安装):**
|
|
22
|
+
- 将插件文件复制到 `~/.workbuddy/plugins/.../`
|
|
23
|
+
- 将 ScoreHub MCP Server 配置写入 `~/.workbuddy/mcp.json`
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
重启客户端后使用 Tiky:
|
|
26
|
+
- Claude Code:`@tiktok-creator-outreach`
|
|
27
|
+
- WorkBuddy:在 Agent 列表中选择 "Tiky — TikTok Creator Outreach"
|
|
22
28
|
|
|
23
|
-
|
|
29
|
+
### WorkBuddy 插件市场(备选)
|
|
24
30
|
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
@scorehub/creator-outreach
|
|
28
|
-
```
|
|
31
|
+
在插件安装入口输入地址:
|
|
29
32
|
|
|
30
|
-
**GitHub**
|
|
31
33
|
```
|
|
32
|
-
|
|
34
|
+
@scorehub/creator-outreach
|
|
33
35
|
```
|
|
34
36
|
|
|
35
37
|
## 前提条件
|
|
@@ -31,12 +31,17 @@ skills:
|
|
|
31
31
|
|
|
32
32
|
### 1. 达人搜索与发现
|
|
33
33
|
在多维筛选条件下,从 TikTok Creator Marketplace 精准搜索达人。
|
|
34
|
-
-
|
|
34
|
+
- **类目筛选(父类目优先,务必遵守)**:
|
|
35
35
|
1. 当用户提到品类/类目关键词(如"美妆"/"3C"/"beauty"/"electronics")时,**先调用 `get_categories`** 解析为类目 ID。传入 `keyword`(品类名),并根据语言设置 `locale`(中文用 `"zh-CN"`,英文用 `"en-US"`),建议同时传 `category_version: "v2"`。
|
|
36
|
-
2.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
2. **优先匹配父类目(`is_leaf=false`)**:从返回结果中筛选 `is_leaf=false` 的非叶子类目(即品类大类/父类目)。如果匹配到父类目:
|
|
37
|
+
- 构造 `category` 参数:`[{parent_category_id: "父类目ID"}]` —— **不要传 `child_category_id_list`**。API 会搜索该父类目下所有子类目的达人,覆盖面最广。
|
|
38
|
+
- 如果匹配到多个父类目,用表格展示让用户确认想要筛选哪些(或全部)。
|
|
39
|
+
3. **兜底匹配子类目**:仅当返回结果中**没有任何 `is_leaf=false` 的父类目**时,才降级使用叶子类目:
|
|
40
|
+
- 筛选 `is_leaf=true` 的叶子类目,按 `parent_id` 分组。
|
|
41
|
+
- 构造 `category` 参数:`[{parent_category_id: "父类目ID", child_category_id_list: ["叶子ID1", "叶子ID2"]}]`。
|
|
42
|
+
- 如果匹配到多个子类目,同样用表格展示让用户确认。
|
|
43
|
+
- **核心原则**:父类目覆盖 > 子类目精确。宁愿多搜到一些达人(由后续 GMV/粉丝画像等条件进一步筛选),也不要因为子类目划分过细而漏掉潜在合适的达人。
|
|
44
|
+
- **注意**:绝不要凭空猜测类目 ID。
|
|
40
45
|
- GMV 区间筛选(0-100 / 100-1K / 1K-10K / 10K+)
|
|
41
46
|
- 销量区间筛选
|
|
42
47
|
- 关键词搜索(用户名/昵称匹配)
|
package/install.js
CHANGED
|
@@ -4,6 +4,7 @@ const fs = require('fs');
|
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const os = require('os');
|
|
6
6
|
|
|
7
|
+
// === Claude Code 路径 ===
|
|
7
8
|
const CLAUDE_DIR = path.join(os.homedir(), '.claude');
|
|
8
9
|
const AGENTS_DIR = path.join(CLAUDE_DIR, 'agents');
|
|
9
10
|
const CLAUDE_JSON = path.join(os.homedir(), '.claude.json');
|
|
@@ -11,6 +12,14 @@ const CLAUDE_JSON = path.join(os.homedir(), '.claude.json');
|
|
|
11
12
|
const AGENT_SRC = path.join(__dirname, 'agents', 'tiktok-creator-outreach.md');
|
|
12
13
|
const AGENT_DEST = path.join(AGENTS_DIR, 'tiktok-creator-outreach.md');
|
|
13
14
|
|
|
15
|
+
// === WorkBuddy 路径 ===
|
|
16
|
+
const WORKBUDDY_DIR = path.join(os.homedir(), '.workbuddy');
|
|
17
|
+
const WORKBUDDY_PLUGIN_DIR = path.join(
|
|
18
|
+
WORKBUDDY_DIR, 'plugins', 'marketplaces', 'my-experts', 'plugins', 'tiktok-creator-outreach',
|
|
19
|
+
);
|
|
20
|
+
const WORKBUDDY_MCP_JSON = path.join(WORKBUDDY_DIR, 'mcp.json');
|
|
21
|
+
|
|
22
|
+
// === 共享 MCP 配置 ===
|
|
14
23
|
const MCP_CONFIG = {
|
|
15
24
|
type: 'stdio',
|
|
16
25
|
command: 'npx',
|
|
@@ -20,26 +29,75 @@ const MCP_CONFIG = {
|
|
|
20
29
|
},
|
|
21
30
|
};
|
|
22
31
|
|
|
32
|
+
// 工具函数:合并 MCP Server 配置到 JSON 文件
|
|
33
|
+
function mergeMcpConfig(configPath, serverName, serverConfig, extraFields) {
|
|
34
|
+
let config = {};
|
|
35
|
+
if (fs.existsSync(configPath)) {
|
|
36
|
+
try {
|
|
37
|
+
config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
38
|
+
} catch {
|
|
39
|
+
console.warn(`警告:${configPath} 解析失败,将重新写入`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
config.mcpServers = config.mcpServers || {};
|
|
44
|
+
config.mcpServers[serverName] = Object.assign({}, serverConfig, extraFields);
|
|
45
|
+
|
|
46
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ========== Claude Code ==========
|
|
50
|
+
|
|
23
51
|
// 1. 复制 Agent 定义文件
|
|
24
52
|
fs.mkdirSync(AGENTS_DIR, { recursive: true });
|
|
25
53
|
fs.copyFileSync(AGENT_SRC, AGENT_DEST);
|
|
26
|
-
console.log(`✓ Agent
|
|
54
|
+
console.log(`✓ Claude Code: Agent 已安装 → ${AGENT_DEST}`);
|
|
27
55
|
|
|
28
56
|
// 2. 合并 MCP Server 配置到 ~/.claude.json
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
57
|
+
mergeMcpConfig(CLAUDE_JSON, 'scorehub', MCP_CONFIG, {});
|
|
58
|
+
console.log(`✓ Claude Code: MCP Server 已配置 → ${CLAUDE_JSON}`);
|
|
59
|
+
|
|
60
|
+
// ========== WorkBuddy ==========
|
|
61
|
+
|
|
62
|
+
const hasWorkBuddy = fs.existsSync(WORKBUDDY_DIR);
|
|
63
|
+
|
|
64
|
+
if (hasWorkBuddy) {
|
|
65
|
+
// 3. 复制插件文件到 WorkBuddy 插件目录
|
|
66
|
+
const pluginDirs = ['.codebuddy-plugin', 'agents', 'skills', 'avatars'];
|
|
67
|
+
const pluginFiles = ['package.json', 'README.md'];
|
|
68
|
+
|
|
69
|
+
fs.mkdirSync(WORKBUDDY_PLUGIN_DIR, { recursive: true });
|
|
70
|
+
|
|
71
|
+
for (const dir of pluginDirs) {
|
|
72
|
+
const src = path.join(__dirname, dir);
|
|
73
|
+
const dest = path.join(WORKBUDDY_PLUGIN_DIR, dir);
|
|
74
|
+
if (fs.existsSync(src)) {
|
|
75
|
+
fs.cpSync(src, dest, { recursive: true });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
for (const file of pluginFiles) {
|
|
80
|
+
const src = path.join(__dirname, file);
|
|
81
|
+
const dest = path.join(WORKBUDDY_PLUGIN_DIR, file);
|
|
82
|
+
if (fs.existsSync(src)) {
|
|
83
|
+
fs.copyFileSync(src, dest);
|
|
84
|
+
}
|
|
35
85
|
}
|
|
86
|
+
|
|
87
|
+
console.log(`✓ WorkBuddy: 插件文件已安装 → ${WORKBUDDY_PLUGIN_DIR}`);
|
|
88
|
+
|
|
89
|
+
// 4. 合并 MCP Server 配置到 ~/.workbuddy/mcp.json
|
|
90
|
+
mergeMcpConfig(WORKBUDDY_MCP_JSON, 'scorehub', MCP_CONFIG, { disabled: false });
|
|
91
|
+
console.log(`✓ WorkBuddy: MCP Server 已配置 → ${WORKBUDDY_MCP_JSON}`);
|
|
36
92
|
}
|
|
37
93
|
|
|
38
|
-
|
|
39
|
-
claudeConfig.mcpServers.scorehub = MCP_CONFIG;
|
|
94
|
+
// ========== 完成 ==========
|
|
40
95
|
|
|
41
|
-
|
|
42
|
-
|
|
96
|
+
const platforms = ['Claude Code'];
|
|
97
|
+
if (hasWorkBuddy) platforms.push('WorkBuddy');
|
|
43
98
|
|
|
44
|
-
console.log(
|
|
99
|
+
console.log(`\n安装完成!重启 ${platforms.join(' / ')} 后使用 Tiky。`);
|
|
100
|
+
if (!hasWorkBuddy) {
|
|
101
|
+
console.log('提示:未检测到 WorkBuddy,仅安装了 Claude Code。如需 WorkBuddy 支持请先安装 WorkBuddy 后重新运行本命令。');
|
|
102
|
+
}
|
|
45
103
|
|
package/package.json
CHANGED
|
@@ -18,10 +18,17 @@
|
|
|
18
18
|
如果用户提到了品类/类目关键词(如"美妆"、"3C"、"beauty"、"electronics"),**必须**先调用 `get_categories` 获取类目 ID,再调用 `search_creators`:
|
|
19
19
|
|
|
20
20
|
1. **`get_categories`** — 传入 `keyword`(品类名关键词),建议同时传 `category_version: "v2"` 和合适的 `locale`(中文用 `"zh-CN"`,英文用 `"en-US"`)
|
|
21
|
-
2. 从返回的 `categories`
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
2. **优先匹配父类目(`is_leaf=false`)** — 从返回的 `categories` 数组中筛选 `is_leaf=false` 的非叶子节点(即品类大类/父类目)。如果匹配到父类目,直接使用父类目 ID:
|
|
22
|
+
- 构造 `category` 参数时 **只传 `parent_category_id`,不传 `child_category_id_list`**:`[{parent_category_id: "父ID"}]`
|
|
23
|
+
- 这样 API 会搜索该父类目下**所有**子类目的达人,覆盖面最广
|
|
24
|
+
- 如果匹配到多个父类目,用**表格展示**让用户确认要筛选哪些
|
|
25
|
+
3. **兜底匹配子类目** — 仅当返回结果中**没有任何 `is_leaf=false` 的父类目**时,才降级使用子类目匹配:
|
|
26
|
+
- 筛选 `is_leaf=true` 的叶子节点,按 `parent_id` 分组
|
|
27
|
+
- 构造 `category` 参数:`[{parent_category_id: "父ID", child_category_id_list: ["叶子ID1", "叶子ID2"]}]`
|
|
28
|
+
- 如果匹配到多个子类目,同样用**表格展示**让用户确认
|
|
29
|
+
4. 将构造好的 `category` 参数传给 `search_creators`
|
|
30
|
+
|
|
31
|
+
> **核心原则**:父类目覆盖 > 子类目精确。宁愿多搜到一些达人(由后续 GMV/粉丝画像等条件进一步筛选),也不要因为子类目划分过细而漏掉潜在合适的达人。
|
|
25
32
|
|
|
26
33
|
调用 MCP 工具 **`search_creators`**,不要写脚本。若已授权可直接调用;未授权时先走 `authorize`。
|
|
27
34
|
|
|
@@ -30,7 +37,7 @@
|
|
|
30
37
|
| 参数 | 说明 |
|
|
31
38
|
|------|------|
|
|
32
39
|
| `keyword` | 用户名/昵称搜索(可选) |
|
|
33
|
-
| `category` |
|
|
40
|
+
| `category` | 品类筛选数组(可选)。支持两种格式:① **父类目模式(推荐优先使用)**:`[{parent_category_id: "父ID"}]`,不传 `child_category_id_list`,搜索该父类目下所有子类目;② **子类目模式(仅兜底使用)**:`[{parent_category_id: "父ID", child_category_id_list: ["叶子ID1"]}]`。多个对象 OR 关系,单个对象内 child_category_id_list AND 关系。类目 ID **必须先通过 `get_categories` 获取**,不要硬编码或猜测。 |
|
|
34
41
|
| `gmv_ranges` | GMV 区间数组,取值见下表(可选) |
|
|
35
42
|
| `page_size` | 每页条数,默认/上限 20 |
|
|
36
43
|
| `page_token` | 翻页令牌,首次不传,用上一页返回的 `next_page_token` 续拉 |
|