@vocmarket/voc-skill 0.3.23 → 0.3.25
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/.claude-plugin/plugin.json +1 -1
- package/README.md +21 -10
- package/bin/claude-voc.js +57 -116
- package/docs/capability-map.md +1 -1
- package/mcp/catalog/params/douyin.json +664 -0
- package/mcp/catalog/params/xiaohongshu.json +468 -1
- package/mcp/catalog/voc-social-endpoints.json +1420 -20
- package/mcp/src/core/payment-links.js +4 -3
- package/mcp/src/providers/ecommerce-gateway.js +53 -0
- package/mcp/src/server.js +7 -7
- package/mcp/src/tools/douyin-trend-run.js +13 -27
- package/mcp/src/tools/voc-api-catalog-run.js +21 -9
- package/mcp/src/tools/xiaohongshu-trend-run.js +13 -27
- package/package.json +1 -1
- package/scripts/smoke-package.js +26 -8
- package/skill-package-manifest.json +1 -1
- package/skills/douyin-trend-intelligence/SKILL.md +14 -11
- package/skills/douyin-trend-intelligence/references/live-mode.md +2 -3
- package/skills/douyin-trend-intelligence/references/user-workflow.md +2 -2
- package/skills/fmode-image-analysis/SKILL.md +6 -4
- package/skills/voc-api-catalog/SKILL.md +32 -1
- package/skills/voc-business-workflow/SKILL.md +1 -1
- package/skills/voc-competitor-map/SKILL.md +3 -3
- package/skills/voc-content-plan/SKILL.md +2 -2
- package/skills/voc-issue-pool/SKILL.md +3 -3
- package/skills/voc-problem-deep-dive/SKILL.md +3 -3
- package/skills/voc-speaking-script/SKILL.md +1 -1
- package/skills/xiaohongshu-trend-intelligence/SKILL.md +14 -11
- package/skills/xiaohongshu-trend-intelligence/references/live-mode.md +7 -11
- package/skills/xiaohongshu-trend-intelligence/references/user-workflow.md +5 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "voc-intelligence",
|
|
3
3
|
"description": "VOC intelligence skills for Claude Code: end-to-end VOC business workflows, Xiaohongshu and Douyin trend reports, live social VOC collection, Fmode Doubao image analysis, token/recharge checks, evidence-card outputs, prioritized issue pools, single-problem deep dives, competitor maps, 7-day content plans, VOC-backed speaking script co-creation, boss/operator action plans, and multi-turn memory.",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.25",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "nkkj-BrainHack"
|
|
7
7
|
}
|
package/README.md
CHANGED
|
@@ -266,22 +266,33 @@ voc_business_workflow_run
|
|
|
266
266
|
|
|
267
267
|
## token 和充值口径
|
|
268
268
|
|
|
269
|
-
sample 模式不需要 token。live
|
|
269
|
+
sample 模式不需要 token。live 模式需要一把可用的 token——**两条链任一可用即可采集**:
|
|
270
270
|
|
|
271
|
-
|
|
271
|
+
1. **NewAPI(fmode-api)计费 SK**(`sk-` 开头,优先):就是 Claude Code 的 `ANTHROPIC_AUTH_TOKEN`,装好技能包后通常**已经具备**,不必手动再配。读取来源:
|
|
272
|
+
- 本次请求参数 `newapiToken` / `fmodeApiKey`
|
|
273
|
+
- `.env.local` / 环境变量 `FMODE_API_KEY`、`NEWAPI_TOKEN`
|
|
274
|
+
- `~/.claude/voc-credentials.json` 的 `fmodeApiKey`
|
|
275
|
+
- `~/.fmode/config.json`(FmodeStudio 保存路径)的 `newapiToken` / `fmodeApiKey`
|
|
276
|
+
- `~/.claude/settings.json` 的 `env.ANTHROPIC_AUTH_TOKEN`(`sk-` 开头、且 `ANTHROPIC_BASE_URL` 指向 fmode)
|
|
277
|
+
2. **VOC-AI 数据服务会话 token**(`r:` 开头,回退):读取来源——本次请求参数、`.env.local` / 环境变量 `VOC_TOKEN`·`VOC_SOCIAL_TOKEN`、`~/.claude/voc-credentials.json` 的 `vocToken`·`token`
|
|
272
278
|
|
|
273
|
-
-
|
|
274
|
-
- 当前工作区 `.env.local`
|
|
275
|
-
- 系统环境变量
|
|
276
|
-
- `~/.claude/voc-credentials.json`
|
|
279
|
+
同一网关 `server.fmode.cn/api/voc-social` 对上述任一有效 token 都接受 `Bearer`,**`sk-` 不是「类型错误」**。`voc_*_token_check` 与实际采集(`voc_api_call` / `voc_*_trend_run`)口径一致,会识别以上**全部**来源;不必在采集前强制先跑检测。
|
|
277
280
|
|
|
278
281
|
Claude Code 技能包不读取 `~/.openclaw/voc-credentials.json`。
|
|
279
282
|
|
|
280
|
-
|
|
283
|
+
缺 token 多数是**配置/读取**问题,不是余额不足:应先引导自救(从上述来源读 SK、用 `FMODE_API_KEY` 重试),**只有确认确实是 402 余额不足时**才给充值/开通链接,且不要暴露底层接口 403、权限堆栈或上游响应体。两条链对应**两个不同的充值入口**,不要搭错:
|
|
281
284
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
```
|
|
285
|
+
- **NewAPI(fmode-api)计费 SK**(`sk-` 开头,多数缺 token 场景走这条)→ fmode-api 余额充值:
|
|
286
|
+
|
|
287
|
+
```text
|
|
288
|
+
https://app.fmode.cn/dev/studio/?balance=fmodeapi
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
- **VOC-AI 数据服务会话 token**(`r:` 开头)→ apig-pay 充值:
|
|
292
|
+
|
|
293
|
+
```text
|
|
294
|
+
https://app.fmode.cn/dev/apig-pay/?apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF
|
|
295
|
+
```
|
|
285
296
|
|
|
286
297
|
## 记忆能力
|
|
287
298
|
|
package/bin/claude-voc.js
CHANGED
|
@@ -124,6 +124,40 @@ function ensureDir(dirPath) {
|
|
|
124
124
|
fs.mkdirSync(dirPath, { recursive: true });
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
+
// Remove an existing install dir, resilient to Windows locks.
|
|
128
|
+
// A normal recursive remove fails with EPERM/EBUSY when the directory is held
|
|
129
|
+
// by a running process — most commonly a Claude Code session / VSCode terminal
|
|
130
|
+
// whose current working directory is inside the plugin dir. Such a directory
|
|
131
|
+
// can still be *renamed* even though it cannot be deleted, so on failure we move
|
|
132
|
+
// it aside and install fresh, then best-effort delete the moved-aside copy.
|
|
133
|
+
function removeDirResilient(targetDir) {
|
|
134
|
+
try {
|
|
135
|
+
fs.rmSync(targetDir, { recursive: true, force: true, maxRetries: 10, retryDelay: 200 });
|
|
136
|
+
return;
|
|
137
|
+
} catch (err) {
|
|
138
|
+
if (!['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY'].includes(err.code)) throw err;
|
|
139
|
+
const asidePath = `${targetDir}.held-${Date.now()}`;
|
|
140
|
+
try {
|
|
141
|
+
fs.renameSync(targetDir, asidePath);
|
|
142
|
+
} catch (renameErr) {
|
|
143
|
+
const e = new Error(
|
|
144
|
+
`无法更新技能目录(被占用):${targetDir}\n` +
|
|
145
|
+
`原因:该目录正被一个运行中的进程占用(常见是该工作区里仍开着的 Claude Code 会话或 VSCode 终端,其当前目录在该插件目录内)。\n` +
|
|
146
|
+
`请关闭占用该目录的 Claude Code 会话/终端后重试安装。\n` +
|
|
147
|
+
`(${err.code}: ${err.message}; rename fallback failed: ${renameErr.code || renameErr.message})`
|
|
148
|
+
);
|
|
149
|
+
e.code = err.code;
|
|
150
|
+
throw e;
|
|
151
|
+
}
|
|
152
|
+
console.log(`Existing skill directory was in use; moved aside to: ${asidePath}`);
|
|
153
|
+
try {
|
|
154
|
+
fs.rmSync(asidePath, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
|
|
155
|
+
} catch (cleanupErr) {
|
|
156
|
+
console.log(`Note: moved-aside copy is still in use and was not deleted. Remove it later: ${asidePath}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
127
161
|
function isInside(parentDir, childDir) {
|
|
128
162
|
const relative = path.relative(path.resolve(parentDir), path.resolve(childDir));
|
|
129
163
|
return relative === '' || (!!relative && !relative.startsWith('..') && !path.isAbsolute(relative));
|
|
@@ -264,8 +298,8 @@ function workspaceTrendSkillText(options) {
|
|
|
264
298
|
'',
|
|
265
299
|
`- 用户要求${options.platform}趋势情报、内容趋势、评论分析、真实采集、live采集或社媒 VOC 时,必须运行本技能包的工具或 MCP,不要只凭经验回答。`,
|
|
266
300
|
'- 用户说“live / 真实采集 / 进入 live / 实时采集 / 抓真实数据”时,必须运行 live 模式工具。不要回复“我不能实时抓取外部数据”。本技能包已经提供本地 VOC 采集入口。',
|
|
267
|
-
'- live 模式返回 `needs_token`、`needs_recharge` 或 `needs_valid_token` 时,必须把工具输出里的 `assistantMessage`
|
|
268
|
-
'- 如果工具输出里有 `nextActions
|
|
301
|
+
'- live 模式返回 `needs_token`、`needs_recharge` 或 `needs_valid_token` 时,必须把工具输出里的 `assistantMessage` 原样转述给用户。`needs_token` 是缺 token、不是没钱:先引导自救(读 `~/.claude/settings.json` 的 `sk-` token),不要劝充值。',
|
|
302
|
+
'- 如果工具输出里有 `nextActions`,转述其中的自救/充值链接(以工具实际返回为准,不要写死某个链接)。',
|
|
269
303
|
'- 第一轮只说“初步判断 / 机会假设 / 待校准”,不要说成最终结论。',
|
|
270
304
|
'- 后续用户说“保留、不要、更偏、这个不准”等反馈时,运行偏好更新命令沉淀记忆。',
|
|
271
305
|
'',
|
|
@@ -273,8 +307,8 @@ function workspaceTrendSkillText(options) {
|
|
|
273
307
|
'',
|
|
274
308
|
'- If the user asks for live collection, real collection, or entering live mode, run the local VOC tool in live mode.',
|
|
275
309
|
'- Do not answer that you cannot fetch external data. The local VOC tool is the approved collection entry.',
|
|
276
|
-
'- If the tool returns `needs_token`, `needs_recharge`, or `needs_valid_token`, paste its `assistantMessage` to the user
|
|
277
|
-
'-
|
|
310
|
+
'- If the tool returns `needs_token`, `needs_recharge`, or `needs_valid_token`, paste its `assistantMessage` to the user verbatim.',
|
|
311
|
+
'- `needs_token` is recoverable: an `sk-` fmode key (Claude Code `ANTHROPIC_AUTH_TOKEN`) lets collection run — guide self-rescue first, do not push recharge. Only on a real `402` show the fmode-api recharge link `https://app.fmode.cn/dev/studio/?balance=fmodeapi`.',
|
|
278
312
|
'',
|
|
279
313
|
'## sample 命令',
|
|
280
314
|
'',
|
|
@@ -296,18 +330,19 @@ function workspaceTrendSkillText(options) {
|
|
|
296
330
|
`node ${quotedPath(preferenceUpdater)} --message "<用户反馈原文>" --memory ${quotedPath(defaultMemoryPath)} --result-prefix ${options.resultPrefix}`,
|
|
297
331
|
'```',
|
|
298
332
|
'',
|
|
299
|
-
'##
|
|
333
|
+
'## 充值 / 计费口径',
|
|
300
334
|
'',
|
|
301
|
-
'
|
|
335
|
+
'- **缺 token(`needs_token`)不是没钱,不要直接给充值链接**:先自救——读 `~/.claude/settings.json` 的 `env.ANTHROPIC_AUTH_TOKEN`(`sk-` 开头的 fmode key),或 `~/.fmode/config.json` / `~/.claude/voc-credentials.json`。',
|
|
336
|
+
'- **只有真正 `402 余额不足` 才引导充值**;本技能走 NewAPI(fmode-api)计费,充值入口用 fmode-api:',
|
|
302
337
|
'',
|
|
303
338
|
'```text',
|
|
304
|
-
'https://app.fmode.cn/dev/
|
|
339
|
+
'https://app.fmode.cn/dev/studio/?balance=fmodeapi',
|
|
305
340
|
'```',
|
|
306
341
|
'',
|
|
307
|
-
'
|
|
342
|
+
'- `apig-pay` 仅用于「VOC 数据服务会话 token(`r:` 开头)余额」这一特定场景的补充,不是缺 token / 默认充值入口:',
|
|
308
343
|
'',
|
|
309
344
|
'```text',
|
|
310
|
-
'https://app.fmode.cn/dev/apig-pay
|
|
345
|
+
'https://app.fmode.cn/dev/apig-pay/?apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF',
|
|
311
346
|
'```',
|
|
312
347
|
''
|
|
313
348
|
].join('\n');
|
|
@@ -328,53 +363,6 @@ function workspaceSkillText(targetDir) {
|
|
|
328
363
|
liveOutput: 'outputs/claude-code-xhs-live',
|
|
329
364
|
resultPrefix: 'XHS_PREF_RESULT'
|
|
330
365
|
});
|
|
331
|
-
const trendRunner = path.join(targetDir, 'mcp', 'src', 'tools', 'xiaohongshu-trend-run.js');
|
|
332
|
-
const preferenceUpdater = path.join(targetDir, 'mcp', 'src', 'tools', 'xiaohongshu-preference-update.js');
|
|
333
|
-
const profilePath = path.join(targetDir, 'memory-templates', 'xiaohongshu-trend-profile.json');
|
|
334
|
-
const defaultMemoryPath = path.join(WORKSPACE_ROOT, 'outputs', 'claude-code-xhs-memory', 'xiaohongshu-trend-memory.json');
|
|
335
|
-
|
|
336
|
-
return [
|
|
337
|
-
'---',
|
|
338
|
-
'name: xiaohongshu-trend-intelligence',
|
|
339
|
-
'description: Build Xiaohongshu trend intelligence reports from industry direction, audience, keywords, notes, and comments. Use when the user asks for 小红书趋势情报、行业趋势、女性客户消费决策、设计元素洞察、家装全屋定制趋势、内容选题 or social VOC analysis.',
|
|
340
|
-
'allowed-tools: Read Write Bash(node *)',
|
|
341
|
-
'---',
|
|
342
|
-
'',
|
|
343
|
-
'# 小红书趋势情报官',
|
|
344
|
-
'',
|
|
345
|
-
'你是面向业务用户的“小红书趋势情报官”。用户要的是第一轮样本观察、机会假设和待确认问题,不是技术日志。',
|
|
346
|
-
'',
|
|
347
|
-
'## 必须执行',
|
|
348
|
-
'',
|
|
349
|
-
'- 当用户要求做小红书趋势情报、行业趋势、女性客户消费决策、家装全屋定制趋势、设计元素洞察或内容选题时,优先运行下面的 sample 工具命令。',
|
|
350
|
-
'- 不要只凭经验回答,也不要只返回文件路径。',
|
|
351
|
-
'- 工具输出里会有 `assistantMessage`,请把它的正文直接发给用户。',
|
|
352
|
-
'- 第一轮只能说“初步判断 / 机会假设 / 待校准”,不要说成最终结论。',
|
|
353
|
-
'- 后续用户说“保留、不要、更偏、这个不准”等反馈时,运行偏好更新命令沉淀记忆。',
|
|
354
|
-
'',
|
|
355
|
-
'## sample 趋势情报命令',
|
|
356
|
-
'',
|
|
357
|
-
'```bash',
|
|
358
|
-
`node ${quotedPath(trendRunner)} --collection-mode sample --profile ${quotedPath(profilePath)} --output "outputs/claude-code-xhs-sample" --assistant-message-only`,
|
|
359
|
-
'```',
|
|
360
|
-
'',
|
|
361
|
-
'运行后把命令输出正文直接发给用户。不要展示 JSON、summary、data、files 或调试日志。',
|
|
362
|
-
'',
|
|
363
|
-
'## 偏好更新命令',
|
|
364
|
-
'',
|
|
365
|
-
'```bash',
|
|
366
|
-
`node ${quotedPath(preferenceUpdater)} --message "<用户反馈原文>" --memory ${quotedPath(defaultMemoryPath)} --result-prefix XHS_PREF_RESULT`,
|
|
367
|
-
'```',
|
|
368
|
-
'',
|
|
369
|
-
'## 推荐用户启动话术',
|
|
370
|
-
'',
|
|
371
|
-
'```text',
|
|
372
|
-
'帮我做一份家装全屋定制行业的小红书趋势情报。',
|
|
373
|
-
'先用演示样例跑通流程,不要真实采集。',
|
|
374
|
-
'在聊天里给我第一轮样本观察和待确认问题。',
|
|
375
|
-
'```',
|
|
376
|
-
''
|
|
377
|
-
].join('\n');
|
|
378
366
|
}
|
|
379
367
|
|
|
380
368
|
function workspaceDouyinSkillText(targetDir) {
|
|
@@ -392,53 +380,6 @@ function workspaceDouyinSkillText(targetDir) {
|
|
|
392
380
|
liveOutput: 'outputs/claude-code-douyin-live',
|
|
393
381
|
resultPrefix: 'DOUYIN_PREF_RESULT'
|
|
394
382
|
});
|
|
395
|
-
const trendRunner = path.join(targetDir, 'mcp', 'src', 'tools', 'douyin-trend-run.js');
|
|
396
|
-
const preferenceUpdater = path.join(targetDir, 'mcp', 'src', 'tools', 'douyin-preference-update.js');
|
|
397
|
-
const profilePath = path.join(targetDir, 'memory-templates', 'douyin-trend-profile.json');
|
|
398
|
-
const defaultMemoryPath = path.join(WORKSPACE_ROOT, 'outputs', 'claude-code-douyin-memory', 'douyin-trend-memory.json');
|
|
399
|
-
|
|
400
|
-
return [
|
|
401
|
-
'---',
|
|
402
|
-
'name: douyin-trend-intelligence',
|
|
403
|
-
'description: Build Douyin trend intelligence reports from industry direction, audience, keywords, videos, and comments. Use when the user asks for 抖音趋势情报、视频评论、口播选题、短视频开头、内容趋势 or social VOC analysis.',
|
|
404
|
-
'allowed-tools: Read Write Bash(node *)',
|
|
405
|
-
'---',
|
|
406
|
-
'',
|
|
407
|
-
'# 抖音趋势情报官',
|
|
408
|
-
'',
|
|
409
|
-
'你是面向业务用户的“抖音趋势情报官”。用户要的是第一轮样本观察、机会假设和待确认问题,不是技术日志。',
|
|
410
|
-
'',
|
|
411
|
-
'## 必须执行',
|
|
412
|
-
'',
|
|
413
|
-
'- 当用户要求做抖音趋势情报、视频评论、口播选题、短视频开头或内容趋势时,优先运行下面的 sample 工具命令。',
|
|
414
|
-
'- 不要只凭经验回答,也不要只返回文件路径。',
|
|
415
|
-
'- 工具输出里会有 `assistantMessage`,请把它的正文直接发给用户。',
|
|
416
|
-
'- 第一轮只能说“初步判断 / 机会假设 / 待校准”,不要说成最终结论。',
|
|
417
|
-
'- 后续用户说“保留、不要、更偏、这个不准”等反馈时,运行偏好更新命令沉淀记忆。',
|
|
418
|
-
'',
|
|
419
|
-
'## sample 趋势情报命令',
|
|
420
|
-
'',
|
|
421
|
-
'```bash',
|
|
422
|
-
`node ${quotedPath(trendRunner)} --collection-mode sample --profile ${quotedPath(profilePath)} --output "outputs/claude-code-douyin-sample" --assistant-message-only`,
|
|
423
|
-
'```',
|
|
424
|
-
'',
|
|
425
|
-
'运行后把命令输出正文直接发给用户。不要展示 JSON、summary、data、files 或调试日志。',
|
|
426
|
-
'',
|
|
427
|
-
'## 偏好更新命令',
|
|
428
|
-
'',
|
|
429
|
-
'```bash',
|
|
430
|
-
`node ${quotedPath(preferenceUpdater)} --message "<用户反馈原文>" --memory ${quotedPath(defaultMemoryPath)} --result-prefix DOUYIN_PREF_RESULT`,
|
|
431
|
-
'```',
|
|
432
|
-
'',
|
|
433
|
-
'## 推荐用户启动话术',
|
|
434
|
-
'',
|
|
435
|
-
'```text',
|
|
436
|
-
'帮我做一份家装全屋定制行业的抖音趋势情报。',
|
|
437
|
-
'先用演示样例跑通流程,不要真实采集。',
|
|
438
|
-
'在聊天里给我第一轮样本观察和待确认问题。',
|
|
439
|
-
'```',
|
|
440
|
-
''
|
|
441
|
-
].join('\n');
|
|
442
383
|
}
|
|
443
384
|
|
|
444
385
|
function workspaceProblemDeepDiveSkillText(targetDir) {
|
|
@@ -468,19 +409,19 @@ function workspaceProblemDeepDiveSkillText(targetDir) {
|
|
|
468
409
|
'## 命令',
|
|
469
410
|
'',
|
|
470
411
|
'```bash',
|
|
471
|
-
`node ${quotedPath(deepDiveRunner)} --issue "怎么选" --industry "
|
|
412
|
+
`node ${quotedPath(deepDiveRunner)} --issue "怎么选" --industry "<你的行业>" --scenario "线上获客" --audience "意向用户" --assistant-message-only`,
|
|
472
413
|
'```',
|
|
473
414
|
'',
|
|
474
415
|
'## 带记忆的多轮迭代',
|
|
475
416
|
'',
|
|
476
417
|
'```bash',
|
|
477
|
-
`node ${quotedPath(deepDiveRunner)} --issue "怎么选" --industry "
|
|
418
|
+
`node ${quotedPath(deepDiveRunner)} --issue "怎么选" --industry "<你的行业>" --scenario "线上获客" --audience "意向用户" --memory "outputs/voc-problem-memory.json" --feedback "老板不想做直播带看,更想先改评论区回复和方案说明" --blocked-actions "直播带看" --preferred-actions "评论区回复,方案说明" --assistant-message-only`,
|
|
478
419
|
'```',
|
|
479
420
|
'',
|
|
480
421
|
'自然语言反馈也可以直接传入 `feedback`,工具会尝试自动提取偏好和屏蔽动作:',
|
|
481
422
|
'',
|
|
482
423
|
'```bash',
|
|
483
|
-
`node ${quotedPath(deepDiveRunner)} --issue "怎么选" --project "示例品牌A" --industry "
|
|
424
|
+
`node ${quotedPath(deepDiveRunner)} --issue "怎么选" --project "示例品牌A" --industry "<你的行业>" --scenario "线上获客" --audience "意向用户" --feedback "这个品牌不想做直播带看,更想先改评论区回复和方案说明" --assistant-message-only`,
|
|
484
425
|
'```',
|
|
485
426
|
'',
|
|
486
427
|
'运行后把命令输出正文直接发给用户。不要展示 JSON、summary、data、files 或调试日志。',
|
|
@@ -513,13 +454,13 @@ function workspaceIssuePoolSkillText(targetDir) {
|
|
|
513
454
|
'## 命令',
|
|
514
455
|
'',
|
|
515
456
|
'```bash',
|
|
516
|
-
`node ${quotedPath(issuePoolRunner)} --project "示例品牌A" --industry "
|
|
457
|
+
`node ${quotedPath(issuePoolRunner)} --project "示例品牌A" --industry "<你的行业>" --scenario "线上获客" --audience "意向用户" --evidence "第一次买不知道怎么选,怕踩雷。,价格有点高,不确定值不值。,咨询的时候没人理。" --assistant-message-only`,
|
|
517
458
|
'```',
|
|
518
459
|
'',
|
|
519
460
|
'带报告文件:',
|
|
520
461
|
'',
|
|
521
462
|
'```bash',
|
|
522
|
-
`node ${quotedPath(issuePoolRunner)} --project "示例品牌A" --industry "
|
|
463
|
+
`node ${quotedPath(issuePoolRunner)} --project "示例品牌A" --industry "<你的行业>" --report "outputs/douyin-trend-report.md" --assistant-message-only`,
|
|
523
464
|
'```',
|
|
524
465
|
'',
|
|
525
466
|
'运行后把命令输出正文直接发给用户。不要展示 JSON、summary、data、files 或调试日志。',
|
|
@@ -545,7 +486,7 @@ function workspaceContentPlanSkillText(targetDir) {
|
|
|
545
486
|
'## 命令',
|
|
546
487
|
'',
|
|
547
488
|
'```bash',
|
|
548
|
-
`node ${quotedPath(runner)} --brand "示例品牌A" --industry "
|
|
489
|
+
`node ${quotedPath(runner)} --brand "示例品牌A" --industry "<你的行业>" --issues "第一次买怕踩雷;觉得价格贵;怕质量不稳定" --assistant-message-only`,
|
|
549
490
|
'```',
|
|
550
491
|
'',
|
|
551
492
|
'运行后把正文直接发给用户,不要展示 JSON。',
|
|
@@ -571,7 +512,7 @@ function workspaceSpeakingScriptSkillText(targetDir) {
|
|
|
571
512
|
'## 命令',
|
|
572
513
|
'',
|
|
573
514
|
'```bash',
|
|
574
|
-
`node ${quotedPath(runner)} --brand "示例品牌A" --industry "
|
|
515
|
+
`node ${quotedPath(runner)} --brand "示例品牌A" --industry "<你的行业>" --topic "第一次买怎么选不踩雷" --user-issue "第一次买怕选错" --evidence "第一次买不知道怎么选,怕踩雷" --assistant-message-only`,
|
|
575
516
|
'```',
|
|
576
517
|
'',
|
|
577
518
|
'改稿:',
|
|
@@ -603,7 +544,7 @@ function workspaceCompetitorMapSkillText(targetDir) {
|
|
|
603
544
|
'## 命令',
|
|
604
545
|
'',
|
|
605
546
|
'```bash',
|
|
606
|
-
`node ${quotedPath(runner)} --brand "示例品牌A" --city "本地" --category "
|
|
547
|
+
`node ${quotedPath(runner)} --brand "示例品牌A" --city "本地" --category "<你的品类>" --assistant-message-only`,
|
|
607
548
|
'```',
|
|
608
549
|
'',
|
|
609
550
|
'运行后把正文直接发给用户,不要展示 JSON。',
|
|
@@ -627,7 +568,7 @@ function workspaceBusinessWorkflowSkillText(targetDir) {
|
|
|
627
568
|
'## 命令',
|
|
628
569
|
'',
|
|
629
570
|
'```bash',
|
|
630
|
-
`node ${quotedPath(runner)} --brand "示例品牌A" --industry "
|
|
571
|
+
`node ${quotedPath(runner)} --brand "示例品牌A" --industry "<你的行业>" --platform douyin --collection-mode sample --keywords "<你的品类>怎么选,第一次买怎么对比,售后" --assistant-message-only`,
|
|
631
572
|
'```',
|
|
632
573
|
'',
|
|
633
574
|
'真实采集时把 `--collection-mode sample` 换成 `--collection-mode live`。如果工具提示没有 token、余额不足或没有样本,直接把工具正文发给用户,并保留充值/降级建议。',
|
|
@@ -717,15 +658,15 @@ function printNextSteps(targetDir) {
|
|
|
717
658
|
}
|
|
718
659
|
console.log('');
|
|
719
660
|
console.log('Try this prompt in Claude Code:');
|
|
720
|
-
console.log('
|
|
661
|
+
console.log(' 帮我看一下 {你的行业/品类} 最近用户在关心什么,并告诉我先改哪里、下周发什么。');
|
|
721
662
|
console.log('');
|
|
722
663
|
console.log('Or try:');
|
|
723
|
-
console.log('
|
|
664
|
+
console.log(' 帮我做一份 {你的行业/品类} 的小红书趋势情报。');
|
|
724
665
|
console.log(' 先用演示样例跑通流程,不要真实采集。');
|
|
725
666
|
console.log(' 在聊天里给我第一轮样本观察和待确认问题。');
|
|
726
667
|
console.log('');
|
|
727
668
|
console.log('Or try:');
|
|
728
|
-
console.log('
|
|
669
|
+
console.log(' 帮我做一份 {你的行业/品类} 的抖音趋势情报。');
|
|
729
670
|
console.log(' 先用演示样例跑通流程,不要真实采集。');
|
|
730
671
|
console.log(' 在聊天里给我第一轮样本观察和待确认问题。');
|
|
731
672
|
console.log('');
|
|
@@ -739,7 +680,7 @@ function install(opts) {
|
|
|
739
680
|
if (!canOverwriteTarget(opts.target, opts)) {
|
|
740
681
|
throw new Error(`Target already exists. Use --force to overwrite custom target: ${opts.target}`);
|
|
741
682
|
}
|
|
742
|
-
|
|
683
|
+
removeDirResilient(opts.target);
|
|
743
684
|
}
|
|
744
685
|
ensureDir(opts.target);
|
|
745
686
|
const copied = copyDirRecursive(SOURCE_ROOT, opts.target);
|
package/docs/capability-map.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
| 一次跑完整经营闭环 | `voc-business-workflow` | `voc_business_workflow_run` | 市场声音、问题池、Top 问题动作、7 天内容计划、第一条口播稿 |
|
|
14
14
|
| 先演示流程,不真实采集 | 小红书/抖音趋势 skill | `voc_xiaohongshu_trend_run` / `voc_douyin_trend_run`,`collectionMode=sample` | 第一轮样本观察、机会假设、待确认问题 |
|
|
15
15
|
| 真实采集行业趋势 | 小红书/抖音趋势 skill | `voc_xiaohongshu_trend_run` / `voc_douyin_trend_run`,`collectionMode=live` | 真实笔记/视频、评论证据、趋势假设 |
|
|
16
|
-
| 检查 token 是否可用 | 平台趋势 skill | `voc_xiaohongshu_token_check` / `voc_douyin_token_check` |
|
|
16
|
+
| 检查 token 是否可用 | 平台趋势 skill | `voc_xiaohongshu_token_check` / `voc_douyin_token_check` | 是否已配置(识别 SK/会话 token 全部来源);缺 token 多是配置/读取问题,先按来源自救读 SK,确认 402 余额不足才给充值 |
|
|
17
17
|
| 用户回答校准问题 | 平台趋势 skill | `voc_xiaohongshu_preference_update` / `voc_douyin_preference_update` | 保存偏好、屏蔽方向、下一轮聚焦 |
|
|
18
18
|
| 把评论整理成问题池 | `voc-issue-pool` | `voc_issue_pool_run` | 问题优先级、状态、证据、影响环节、建议动作 |
|
|
19
19
|
| 判断哪些问题最影响生意 | `voc-issue-pool` | `voc_issue_pool_run` | 本周优先推进的问题和下一步深挖入口 |
|