@vocmarket/voc-skill 0.3.33 → 0.3.34

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 (70) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +26 -13
  3. package/SKILL.md +6 -3
  4. package/bin/claude-voc.js +43 -57
  5. package/docs/capability-map.md +38 -1
  6. package/docs/live-manual-acceptance-checklist.md +3 -2
  7. package/docs/npm-packaging-notes.md +2 -2
  8. package/docs/payment-package-links.md +4 -4
  9. package/docs/reports/three-account-platform-cost-2026-09-01.md +96 -0
  10. package/docs/reports/three-account-user-billing-2026-09-01.html +328 -0
  11. package/docs/reports/three-account-voc-usage-2026-09-01.md +10 -0
  12. package/docs/voc-cost-metering-and-balance-implementation-spec.md +969 -111
  13. package/install.js +13 -12
  14. package/mcp/src/core/activation.js +7 -34
  15. package/mcp/src/core/api-catalog.js +5 -0
  16. package/mcp/src/core/batch-budget-guard.js +104 -0
  17. package/mcp/src/core/billing-client.js +180 -0
  18. package/mcp/src/core/budget-guard.js +115 -0
  19. package/mcp/src/core/credentials.js +92 -7
  20. package/mcp/src/core/payment-links.js +74 -140
  21. package/mcp/src/core/recharge-client.js +139 -0
  22. package/mcp/src/core/result-envelope.js +11 -4
  23. package/mcp/src/core/usage-context.js +98 -0
  24. package/mcp/src/features/douyin-trend/live-collector.js +35 -6
  25. package/mcp/src/features/fmode-image-analysis/image-analysis.js +32 -34
  26. package/mcp/src/features/media/media-discovery.js +48 -0
  27. package/mcp/src/features/media/media-manifest.js +52 -0
  28. package/mcp/src/features/media/media-pipeline.js +109 -0
  29. package/mcp/src/features/voc-business-workflow/business-workflow.js +90 -3
  30. package/mcp/src/features/voc-cost/estimate-report.js +76 -0
  31. package/mcp/src/features/voc-cost/workflow-planner.js +144 -0
  32. package/mcp/src/features/xiaohongshu-trend/assets.js +22 -133
  33. package/mcp/src/features/xiaohongshu-trend/live-collector.js +37 -7
  34. package/mcp/src/providers/douyin-api.js +27 -150
  35. package/mcp/src/providers/ecommerce-gateway.js +8 -4
  36. package/mcp/src/providers/overseas-gateway.js +7 -4
  37. package/mcp/src/providers/voc-gateway.js +22 -11
  38. package/mcp/src/providers/xiaohongshu-api.js +22 -98
  39. package/mcp/src/server.js +263 -27
  40. package/mcp/src/tools/douyin-trend-run.js +277 -60
  41. package/mcp/src/tools/voc-api-catalog-run.js +64 -33
  42. package/mcp/src/tools/voc-billing-query-run.js +9 -0
  43. package/mcp/src/tools/voc-cost-estimate-run.js +89 -0
  44. package/mcp/src/tools/voc-usage-report-run.js +91 -0
  45. package/mcp/src/tools/xiaohongshu-trend-run.js +278 -59
  46. package/package.json +11 -2
  47. package/scripts/acceptance.js +6 -11
  48. package/scripts/audit-index.js +153 -0
  49. package/scripts/billing-client-smoke.js +103 -0
  50. package/scripts/fmode-image-analysis-smoke.js +2 -1
  51. package/scripts/smoke-budget-guard.js +57 -0
  52. package/scripts/smoke-cost-estimate.js +54 -0
  53. package/scripts/smoke-mcp.js +12 -3
  54. package/scripts/smoke-media-pipeline.js +69 -0
  55. package/scripts/smoke-package.js +24 -8
  56. package/scripts/smoke-trend-budget.js +133 -0
  57. package/scripts/smoke-voc-request-shaping.js +26 -0
  58. package/skill-package-manifest.json +16 -6
  59. package/skills/douyin-trend-intelligence/SKILL.md +7 -1
  60. package/skills/douyin-trend-intelligence/references/live-mode.md +2 -2
  61. package/skills/fmode-image-analysis/SKILL.md +1 -1
  62. package/skills/voc-api-catalog/SKILL.md +9 -3
  63. package/skills/voc-api-catalog/references/error-codes.md +6 -9
  64. package/skills/voc-business-workflow/SKILL.md +4 -0
  65. package/skills/voc-cost-controller/SKILL.md +16 -0
  66. package/skills/voc-cost-controller/references/workflow-cost-models.md +19 -0
  67. package/skills/xiaohongshu-trend-intelligence/SKILL.md +7 -1
  68. package/skills/xiaohongshu-trend-intelligence/references/live-mode.md +5 -3
  69. package/mcp/catalog/voc-social-endpoints.json.bak-justone +0 -22338
  70. package/mcp/catalog/voc-social-endpoints.json.bak-preindex +0 -32644
@@ -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.33",
4
+ "version": "0.3.34",
5
5
  "author": {
6
6
  "name": "nkkj-BrainHack"
7
7
  }
package/README.md CHANGED
@@ -12,6 +12,8 @@
12
12
  - 单点 VOC 深挖:适合把一个具体问题转成老板能执行的经营动作、内容选题和 7 天验证计划。
13
13
  - VOC 内容选题:适合把用户问题转成 7 天短视频选题、口播脚本、镜头建议和验证指标。
14
14
  - VOC 口播脚本共创:适合把一条 VOC 选题继续打磨成 60 秒稿、30 秒稿、提词器版,并支持多轮改稿和定稿记忆。
15
+ - VOC 接口目录:适合按平台、关键词和通道查找 1,344 个已登记接口,并读取参数后完成通用调用。
16
+ - VOC 成本控制:适合执行前比较经济版/标准版/完整版,检查余额与预算,执行后查看接口频次和额度消耗。
15
17
 
16
18
  这套技能包不覆盖创始人故事、品牌自传或老板个人 IP 长文。口播脚本要做,但必须来自 VOC 用户问题、竞品评论差异、问题池 Top 问题或单点深挖动作。
17
19
 
@@ -36,6 +38,9 @@
36
38
  - “这个有效,后面优先按这个方向来”
37
39
  - “帮我看看顾客关心什么,告诉我先改哪里、下周发什么”
38
40
  - “跑一遍完整 VOC 经营闭环”
41
+ - “这个复杂任务预计要花多少钱,经济版和完整版差多少”
42
+ - “查一下这份报告每个接口调用了多少次、消耗了多少额度”
43
+ - “查商品详情或评论,先从接口清单里找合适的接口”
39
44
 
40
45
  ## 能交付什么
41
46
 
@@ -111,6 +116,8 @@ npx --yes @vocmarket/voc-skill@latest workspace --smoke
111
116
  .claude/skills/voc-competitor-map/SKILL.md
112
117
  .claude/skills/voc-business-workflow/SKILL.md
113
118
  .claude/skills/fmode-image-analysis/SKILL.md
119
+ .claude/skills/voc-api-catalog/SKILL.md
120
+ .claude/skills/voc-cost-controller/SKILL.md
114
121
  .claude/plugins/voc-intelligence
115
122
  ```
116
123
 
@@ -188,6 +195,8 @@ npx --yes @vocmarket/voc-skill@latest install --smoke
188
195
  - `voc-competitor-map`
189
196
  - `voc-business-workflow`
190
197
  - `fmode-image-analysis`
198
+ - `voc-api-catalog`
199
+ - `voc-cost-controller`
191
200
 
192
201
  MCP 工具:
193
202
 
@@ -204,6 +213,12 @@ MCP 工具:
204
213
  - `voc_content_plan_run`
205
214
  - `voc_competitor_map_run`
206
215
  - `voc_speaking_script_run`
216
+ - `voc_api_search`
217
+ - `voc_api_doc`
218
+ - `voc_api_call`
219
+ - `voc_billing_query`
220
+ - `voc_cost_estimate`
221
+ - `voc_usage_report`
207
222
 
208
223
  命令行入口:
209
224
 
@@ -215,6 +230,7 @@ claude-voc image --image-path E:\workspace\example\screenshot.png --prompt "识
215
230
  npm --prefix claude-code-voc-intelligence run voc:issue-pool
216
231
  npm --prefix claude-code-voc-intelligence run voc:deep-dive
217
232
  npm --prefix claude-code-voc-intelligence run voc:business-workflow
233
+ npm --prefix claude-code-voc-intelligence run audit:index
218
234
  npm --prefix claude-code-voc-intelligence run mcp:smoke
219
235
  npm --prefix claude-code-voc-intelligence run smoke:package
220
236
  ```
@@ -231,6 +247,9 @@ npm --prefix claude-code-voc-intelligence run smoke:package
231
247
  - `docs/live-manual-acceptance-checklist.md`
232
248
  - `docs/payment-package-links.md`
233
249
  - `docs/context-budget-implementation-plan.md`
250
+ - `docs/voc-cost-metering-and-balance-implementation-spec.md`
251
+ - `skills/voc-api-catalog/references/error-codes.md`
252
+ - `skills/voc-cost-controller/references/workflow-cost-models.md`
234
253
  - `skills/voc-content-plan/references/content-framework.md`
235
254
  - `skills/voc-content-plan/references/speaking-script-patterns.md`
236
255
  - `skills/voc-competitor-map/references/competitor-framework.md`
@@ -271,28 +290,22 @@ sample 模式不需要 token。live 模式需要一把可用的 token——**两
271
290
  1. **NewAPI(fmode-api)计费 SK**(`sk-` 开头,优先):就是 Claude Code 的 `ANTHROPIC_AUTH_TOKEN`,装好技能包后通常**已经具备**,不必手动再配。读取来源:
272
291
  - 本次请求参数 `newapiToken` / `fmodeApiKey`
273
292
  - `.env.local` / 环境变量 `FMODE_API_KEY`、`NEWAPI_TOKEN`
293
+ - `~/.fmode/config.json`(FmodeStudio 保存路径)的 `newapiToken` / `fmodeApiToken` / `fmodeApiKey`
274
294
  - `~/.claude/voc-credentials.json` 的 `fmodeApiKey`
275
- - `~/.fmode/config.json`(FmodeStudio 保存路径)的 `newapiToken` / `fmodeApiKey`
276
295
  - `~/.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`
296
+ 2. **VOC-AI 数据服务会话 token**(`r:` 开头,回退):读取来源——本次请求参数、显式 `FMODE_SESSION_TOKEN` / `TIHAO_SESSION_TOKEN`、`~/.fmode/config.json` 的 `sessionToken`、`~/.claude/voc-credentials.json` 的 `sessionToken`·`vocToken`·`token`,最后回退 `.env.local` / 环境变量 `VOC_TOKEN`·`VOC_SOCIAL_TOKEN`
278
297
 
279
298
  同一网关 `server.fmode.cn/api/voc-social` 对上述任一有效 token 都接受 `Bearer`,**`sk-` 不是「类型错误」**。`voc_*_token_check` 与实际采集(`voc_api_call` / `voc_*_trend_run`)口径一致,会识别以上**全部**来源;不必在采集前强制先跑检测。
280
299
 
281
300
  Claude Code 技能包不读取 `~/.openclaw/voc-credentials.json`。
282
301
 
283
- 缺 token 多数是**配置/读取**问题,不是余额不足:应先引导自救(从上述来源读 SK、用 `FMODE_API_KEY` 重试),**只有确认确实是 402 余额不足时**才给充值/开通链接,且不要暴露底层接口 403、权限堆栈或上游响应体。两条链对应**两个不同的充值入口**,不要搭错:
302
+ 缺 token 多数是**配置/读取**问题,应先恢复凭证;只有确认确实是 402 余额不足时才进入充值流程。充值入口统一使用运行时生成的 Tokenized Balance 链接:
284
303
 
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 充值:
304
+ ```text
305
+ https://app.fmode.cn/dev/studio/balance/?token=USER_SESSION_TOKEN
306
+ ```
292
307
 
293
- ```text
294
- https://app.fmode.cn/dev/apig-pay/?apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF
295
- ```
308
+ 链接由工具按当前用户会话生成,不在文档中固定账号、金额或旧 APIG 参数。用户也可以让 Agent 按报价结果调用现有支付码链路直接生成二维码。
296
309
 
297
310
  ## 记忆能力
298
311
 
package/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: voc-intelligence
3
- description: 面向经营者的 VOC 用户经营洞察工作台。从社交媒体、电商和海外选品数据中提取用户声音,形成趋势情报、问题池、竞品图谱、单点深挖、7 天内容计划和口播脚本。用户要看顾客关心什么、先改哪里、下周发什么、查商品价格评论或进行样例与真实采集时使用。
3
+ description: 面向经营者的 VOC 用户经营洞察工作台。从社交媒体、电商和海外选品数据中提取用户声音,形成趋势情报、问题池、竞品图谱、单点深挖、7 天内容计划、口播脚本、成本预估和用量账单。用户要看顾客关心什么、先改哪里、下周发什么、查商品价格评论、测算任务成本、查询接口用量或进行样例与真实采集时使用。
4
4
  ---
5
5
 
6
6
  # VOC 用户经营洞察
@@ -13,7 +13,10 @@ description: 面向经营者的 VOC 用户经营洞察工作台。从社交媒
13
13
  - 用户没有明确要求真实采集时,先使用演示样例;用户明确说真实采集或 live 时,再检查凭证和余额。
14
14
  - 首轮输出采用“初步判断、机会假设、待校准”口径,并给出证据和下一步动作。
15
15
  - 用户要完整经营闭环时,调用 `voc_business_workflow_run`;要单项任务时,调用对应的趋势、问题池、深挖、竞品、内容或脚本工具。
16
- - 用户要查商品、价格、评论、销量或其他平台接口时,先用 `voc_api_search` 查清单,再用 `voc_api_doc` 读取参数,最后用 `voc_api_call` 调用。
16
+ - 用户要查商品、价格、评论、销量或其他平台接口时,先用 `voc_api_search` 查清单,再用 `voc_api_doc` 读取参数,最后用 `voc_api_call` 调用;需要跨平台或未登记接口时,按返回的 `channel` 选择通道。
17
+ - 用户要预估复杂任务成本、比较经济版/标准版/完整版或判断余额是否足够时,先调用 `voc_cost_estimate`;需要读取当前余额和服务端价目时使用 `voc_billing_query`。
18
+ - 用户要查询已完成任务的实际调用频次、额度消耗、接口拆分或报告成本时,调用 `voc_usage_report`,并区分用户扣费与平台成本。
19
+ - 采集响应中的多媒体统一下载到任务本地 `assets/` 并写入 `media-manifest.json`;报告只引用本地路径,技能包不向线上 Storage 上传。
17
20
 
18
21
  ## 主要能力
19
22
 
@@ -21,5 +24,5 @@ description: 面向经营者的 VOC 用户经营洞察工作台。从社交媒
21
24
  - VOC 问题池、单点问题深挖、竞品图谱和 7 天内容计划。
22
25
  - 基于用户声音的口播脚本共创、修改和定稿。
23
26
  - 淘宝/天猫、京东、1688、抖音电商等电商数据,以及亚马逊海外选品数据。
27
+ - 通用 VOC 接口目录、跨通道接口调用、执行前成本测算、余额预检和执行后用量报告。
24
28
  - 图片、截图、海报、图表和商品图片分析。
25
-
package/bin/claude-voc.js CHANGED
@@ -249,7 +249,6 @@ function shouldCopyEntry(entry) {
249
249
  }
250
250
 
251
251
  function copyDirRecursive(srcDir, destDir) {
252
- ensureDir(destDir);
253
252
  let count = 0;
254
253
  for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
255
254
  if (!shouldCopyEntry(entry)) continue;
@@ -258,6 +257,7 @@ function copyDirRecursive(srcDir, destDir) {
258
257
  if (entry.isDirectory()) {
259
258
  count += copyDirRecursive(src, dest);
260
259
  } else if (entry.isFile()) {
260
+ ensureDir(destDir);
261
261
  ensureDir(path.dirname(dest));
262
262
  fs.copyFileSync(src, dest);
263
263
  count++;
@@ -272,21 +272,15 @@ function assertInstalled(targetDir) {
272
272
  'install.js',
273
273
  '.claude-plugin/plugin.json',
274
274
  '.mcp.json',
275
- 'skills/xiaohongshu-trend-intelligence/SKILL.md',
276
- 'skills/douyin-trend-intelligence/SKILL.md',
277
- 'skills/voc-issue-pool/SKILL.md',
278
- 'skills/voc-problem-deep-dive/SKILL.md',
279
- 'skills/voc-content-plan/SKILL.md',
280
- 'skills/voc-speaking-script/SKILL.md',
281
- 'skills/voc-competitor-map/SKILL.md',
282
- 'skills/voc-business-workflow/SKILL.md',
283
- 'skills/fmode-image-analysis/SKILL.md',
284
- 'skills/voc-api-catalog/SKILL.md',
285
275
  'mcp/src/tools/fmode-image-analysis.js',
286
276
  'mcp/src/tools/voc-api-catalog-run.js',
287
277
  'mcp/catalog/voc-social-endpoints.json',
288
278
  'mcp/src/server.js'
289
279
  ];
280
+ const manifest = readJsonIfExists(path.join(targetDir, 'skill-package-manifest.json'));
281
+ for (const skillName of manifest.skills || []) {
282
+ required.push(`skills/${skillName}/SKILL.md`);
283
+ }
290
284
  const missing = required.filter(rel => !fs.existsSync(path.join(targetDir, rel)));
291
285
  if (missing.length) {
292
286
  throw new Error(`Missing required files in install target: ${missing.join(', ')}`);
@@ -394,13 +388,19 @@ function registerCodexGlobalMcp(targetDir) {
394
388
 
395
389
  function copyPackagedSkills(targetDir, destinationRoot) {
396
390
  const sourceRoot = path.join(targetDir, 'skills');
391
+ const manifest = readJsonIfExists(path.join(targetDir, 'skill-package-manifest.json'));
392
+ const skillNames = Array.isArray(manifest.skills) ? manifest.skills : [];
393
+ if (!skillNames.length) throw new Error('skill-package-manifest.json has no skills to install');
397
394
  ensureDir(destinationRoot);
398
395
  let copied = 0;
399
- for (const entry of fs.readdirSync(sourceRoot, { withFileTypes: true })) {
400
- if (!entry.isDirectory()) continue;
401
- const destination = path.join(destinationRoot, entry.name);
396
+ for (const skillName of skillNames) {
397
+ const source = path.join(sourceRoot, skillName);
398
+ if (!fs.existsSync(source) || !fs.statSync(source).isDirectory()) {
399
+ throw new Error(`Manifest skill directory is missing: ${skillName}`);
400
+ }
401
+ const destination = path.join(destinationRoot, skillName);
402
402
  removeDirResilient(destination);
403
- copied += copyDirRecursive(path.join(sourceRoot, entry.name), destination);
403
+ copied += copyDirRecursive(source, destination);
404
404
  }
405
405
  return copied;
406
406
  }
@@ -487,7 +487,7 @@ function workspaceTrendSkillText(options) {
487
487
  '## 充值 / 计费口径(简版;完整对照见 voc-api-catalog 技能的「错误码速查」references/error-codes.md)',
488
488
  '',
489
489
  '- 缺 token(`needs_token`)= 可恢复、不是没钱:先自救读 `~/.claude/settings.json` 的 `sk-` fmode key(或 `~/.fmode/config.json` / `~/.claude/voc-credentials.json`),用 `FMODE_API_KEY=sk-…` 重试,不要劝充值。',
490
- '- 只有真 `402 余额不足` 才充值,入口 `https://app.fmode.cn/dev/studio/?balance=fmodeapi`(NewAPI/fmode-api 计费);`401`=token、`403`=权限,都不充值。`apig-pay/?apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF` 仅限 `r:` 会话 token 余额补充。',
490
+ '- 只有真 `402 余额不足` 才充值;充值入口以工具返回的 Tokenized Balance 链接或二维码支付结果为准。链接格式为 `https://app.fmode.cn/dev/studio/balance/?token=USER_SESSION_TOKEN`,不要在话术中写死账号或旧 APIG 参数。',
491
491
  '- 实际充值/自救链接以工具返回的 `assistantMessage` / `nextActions` 为准,不要写死。',
492
492
  ''
493
493
  ].join('\n');
@@ -726,52 +726,38 @@ function workspaceBusinessWorkflowSkillText(targetDir) {
726
726
  }
727
727
 
728
728
  function writeWorkspaceSkillEntries(targetDir) {
729
- const xhsSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'xiaohongshu-trend-intelligence');
730
- const douyinSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'douyin-trend-intelligence');
731
- const issuePoolSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'voc-issue-pool');
732
- const deepDiveSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'voc-problem-deep-dive');
733
- const contentPlanSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'voc-content-plan');
734
- const speakingScriptSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'voc-speaking-script');
735
- const competitorMapSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'voc-competitor-map');
736
- const businessWorkflowSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'voc-business-workflow');
737
- const fmodeImageSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'fmode-image-analysis');
738
- const apiCatalogSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'voc-api-catalog');
739
- ensureDir(xhsSkillDir);
740
- ensureDir(douyinSkillDir);
741
- ensureDir(issuePoolSkillDir);
742
- ensureDir(deepDiveSkillDir);
743
- ensureDir(contentPlanSkillDir);
744
- ensureDir(speakingScriptSkillDir);
745
- ensureDir(competitorMapSkillDir);
746
- ensureDir(businessWorkflowSkillDir);
747
- ensureDir(fmodeImageSkillDir);
748
- ensureDir(apiCatalogSkillDir);
749
- fs.writeFileSync(path.join(xhsSkillDir, 'SKILL.md'), workspaceSkillText(targetDir), 'utf8');
750
- fs.writeFileSync(path.join(douyinSkillDir, 'SKILL.md'), workspaceDouyinSkillText(targetDir), 'utf8');
751
- fs.writeFileSync(path.join(issuePoolSkillDir, 'SKILL.md'), workspaceIssuePoolSkillText(targetDir), 'utf8');
752
- fs.writeFileSync(path.join(deepDiveSkillDir, 'SKILL.md'), workspaceProblemDeepDiveSkillText(targetDir), 'utf8');
753
- fs.writeFileSync(path.join(contentPlanSkillDir, 'SKILL.md'), workspaceContentPlanSkillText(targetDir), 'utf8');
754
- fs.writeFileSync(path.join(speakingScriptSkillDir, 'SKILL.md'), workspaceSpeakingScriptSkillText(targetDir), 'utf8');
755
- fs.writeFileSync(path.join(competitorMapSkillDir, 'SKILL.md'), workspaceCompetitorMapSkillText(targetDir), 'utf8');
756
- fs.writeFileSync(path.join(businessWorkflowSkillDir, 'SKILL.md'), workspaceBusinessWorkflowSkillText(targetDir), 'utf8');
757
- fs.copyFileSync(path.join(targetDir, 'skills', 'fmode-image-analysis', 'SKILL.md'), path.join(fmodeImageSkillDir, 'SKILL.md'));
758
- fs.copyFileSync(path.join(targetDir, 'skills', 'voc-api-catalog', 'SKILL.md'), path.join(apiCatalogSkillDir, 'SKILL.md'));
729
+ const manifest = readJsonIfExists(path.join(targetDir, 'skill-package-manifest.json'));
730
+ const skillNames = Array.isArray(manifest.skills) ? manifest.skills : [];
731
+ if (!skillNames.length) throw new Error('skill-package-manifest.json has no skills to expose in workspace');
732
+ const sourceRoot = path.join(targetDir, 'skills');
733
+ const writers = {
734
+ 'xiaohongshu-trend-intelligence': () => workspaceSkillText(targetDir),
735
+ 'douyin-trend-intelligence': () => workspaceDouyinSkillText(targetDir),
736
+ 'voc-issue-pool': () => workspaceIssuePoolSkillText(targetDir),
737
+ 'voc-problem-deep-dive': () => workspaceProblemDeepDiveSkillText(targetDir),
738
+ 'voc-content-plan': () => workspaceContentPlanSkillText(targetDir),
739
+ 'voc-speaking-script': () => workspaceSpeakingScriptSkillText(targetDir),
740
+ 'voc-competitor-map': () => workspaceCompetitorMapSkillText(targetDir),
741
+ 'voc-business-workflow': () => workspaceBusinessWorkflowSkillText(targetDir)
742
+ };
743
+ for (const skillName of skillNames) {
744
+ const sourceSkill = path.join(sourceRoot, skillName, 'SKILL.md');
745
+ if (!fs.existsSync(sourceSkill)) throw new Error(`Manifest skill entry is missing: ${skillName}`);
746
+ const skillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', skillName);
747
+ ensureDir(skillDir);
748
+ const content = writers[skillName] ? writers[skillName]() : fs.readFileSync(sourceSkill, 'utf8');
749
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'), content, 'utf8');
750
+ }
751
+ return skillNames;
759
752
  }
760
753
 
761
754
  function writeClaudeWorkspaceActivation(targetDir) {
762
755
  writeWorkspaceMcpConfig(targetDir);
763
- writeWorkspaceSkillEntries(targetDir);
756
+ const skillNames = writeWorkspaceSkillEntries(targetDir);
764
757
  console.log('Wrote Claude/Fmode workspace MCP config: .\\.mcp.json');
765
- console.log('Wrote workspace skill entry: .\\.claude\\skills\\xiaohongshu-trend-intelligence\\SKILL.md');
766
- console.log('Wrote workspace skill entry: .\\.claude\\skills\\douyin-trend-intelligence\\SKILL.md');
767
- console.log('Wrote workspace skill entry: .\\.claude\\skills\\voc-issue-pool\\SKILL.md');
768
- console.log('Wrote workspace skill entry: .\\.claude\\skills\\voc-problem-deep-dive\\SKILL.md');
769
- console.log('Wrote workspace skill entry: .\\.claude\\skills\\voc-content-plan\\SKILL.md');
770
- console.log('Wrote workspace skill entry: .\\.claude\\skills\\voc-speaking-script\\SKILL.md');
771
- console.log('Wrote workspace skill entry: .\\.claude\\skills\\voc-competitor-map\\SKILL.md');
772
- console.log('Wrote workspace skill entry: .\\.claude\\skills\\voc-business-workflow\\SKILL.md');
773
- console.log('Wrote workspace skill entry: .\\.claude\\skills\\fmode-image-analysis\\SKILL.md');
774
- console.log('Wrote workspace skill entry: .\\.claude\\skills\\voc-api-catalog\\SKILL.md');
758
+ for (const skillName of skillNames) {
759
+ console.log(`Wrote workspace skill entry: .\\.claude\\skills\\${skillName}\\SKILL.md`);
760
+ }
775
761
  }
776
762
 
777
763
  function writeWorkspaceActivation(targetDir, opts) {
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## 一句话定位
6
6
 
7
- 把小红书、抖音等平台的用户真实声音,转成企业能用的趋势情报、问题优先级、经营动作、内容选题和多轮验证记忆。
7
+ 把社媒、国内电商/创作者和海外选品接口中的用户与市场数据,转成企业能用的趋势情报、问题优先级、经营动作、内容选题、成本测算和多轮验证记忆。
8
8
 
9
9
  ## 用户任务到入口映射
10
10
 
@@ -21,6 +21,9 @@
21
21
  | 用户说某动作不适合 | `voc-problem-deep-dive` | `voc_problem_deep_dive_run`,传 `feedback` | 自动解析为屏蔽动作或偏好动作 |
22
22
  | 选中一条内容继续改口播 | `voc-speaking-script` | `voc_speaking_script_run` | 60 秒稿、30 秒稿、提词器版、改稿反馈、定稿记忆 |
23
23
  | 下轮继续优化 | 同一 skill | 带同一 `memory`,或带 project/industry/scenario/audience 让工具自动分桶 | 应用历史记忆,避免从零开始 |
24
+ | 查找商品、评论、创作者或选品接口 | `voc-api-catalog` | `voc_api_search` → `voc_api_doc` → `voc_api_call` | 接口、通道、参数、返回数据和本地媒体证据 |
25
+ | 复杂任务执行前做成本和余额测算 | `voc-cost-controller` | `voc_cost_estimate` / `voc_billing_query` | 经济版/标准版/完整版、调用计划、预计额度、差额和建议充值 |
26
+ | 查询已完成任务的真实消耗 | `voc-cost-controller` | `voc_usage_report` | 报告/模块/接口维度的频次、quota、用户扣费和成本拆分 |
24
27
 
25
28
  ## Fmode Image Analysis Add-on
26
29
 
@@ -107,6 +110,31 @@
107
110
  把这些评论整理成问题池,告诉我哪些问题最影响生意,先改哪个。
108
111
  ```
109
112
 
113
+ ### `voc-api-catalog`
114
+
115
+ 适合:
116
+
117
+ - 查找社媒、电商、创作者和海外选品接口。
118
+ - 读取接口参数、通道和版本建议。
119
+ - 调用清单内接口或用 `rawPath` 调用未登记接口。
120
+
121
+ 标准链路:
122
+
123
+ ```text
124
+ voc_api_search -> voc_api_doc -> voc_api_call
125
+ ```
126
+
127
+ ### `voc-cost-controller`
128
+
129
+ 适合:
130
+
131
+ - 大规模账号、商品、关键词任务的执行前报价。
132
+ - 经济版、标准版、完整版的采集范围比较。
133
+ - 当前余额、预算上限和余额不足后的充值入口。
134
+ - 执行完成后的报告、模块、步骤和接口用量账单。
135
+
136
+ 成本价格以服务端 billing query 返回的当前价目为准;接口目录中的 `billing` 只表示调用单位,不作为人民币价格。
137
+
110
138
  ## 关键产品原则
111
139
 
112
140
  - 首轮报告是“初步判断”,不是最终结论。
@@ -115,6 +143,8 @@
115
143
  - live 失败时给可执行下一步,不暴露原始接口错误。
116
144
  - 多轮反馈要进入记忆,让建议越用越贴近客户。
117
145
  - 不同行业、不同客户的记忆要隔离。
146
+ - 成本预估是执行前计划,实际扣费以 NewAPI 每次成功调用的计费日志为准。
147
+ - 充值只复用现有 Tokenized Balance 链接或支付二维码;充值完成后重新查询余额并从检查点继续。
118
148
 
119
149
  ## 记忆规则
120
150
 
@@ -138,8 +168,13 @@
138
168
  | `mcp/src/server.js` | MCP 工具注册、schema、工具说明 |
139
169
  | `mcp/src/tools/*` | CLI/MCP 可调用工具入口 |
140
170
  | `mcp/src/features/*` | 趋势报告、单点深挖、记忆、信号提取 |
171
+ | `mcp/catalog/voc-social-endpoints.json` | 1,344 个接口的稳定 ID、通道、参数索引和版本建议 |
172
+ | `mcp/catalog/params/*.json` | 按平台懒加载的详细参数文档 |
141
173
  | `mcp/src/core/credentials.js` | token 读取口径 |
142
174
  | `mcp/src/core/payment-links.js` | 充值/开通提示 |
175
+ | `mcp/src/core/billing-client.js` / `mcp/src/tools/voc-billing-query-run.js` | 按 Agent 操作计划读取服务端价目、余额、quota 差额和建议充值金额 |
176
+ | `mcp/src/tools/voc-cost-estimate-run.js` | 生成执行前的多档采集计划和成本区间 |
177
+ | `mcp/src/tools/voc-usage-report-run.js` | 查询实际计费日志并按报告、模块、接口拆分 |
143
178
  | `mcp/src/core/evidence-quality.js` | 证据质量门槛、无样本降级建议 |
144
179
  | `docs/live-manual-acceptance-checklist.md` | live 采集人工验收 |
145
180
  | `docs/claude-code-troubleshooting-playbook.md` | Claude Code 故障定位、误报修复、关键词修复和发散排查 |
@@ -153,6 +188,7 @@
153
188
  | `docs/deliverables/seven-day-content-plan.md` | 7 天内容选题与口播脚本模板 |
154
189
  | `scripts/smoke-package.js` | 包级 smoke,覆盖 sample、记忆、token、MCP |
155
190
  | `scripts/smoke-mcp.js` | MCP 工具发现和基本调用 smoke |
191
+ | `scripts/audit-index.js` | 对比 manifest、技能目录、MCP 注册、版本和文档引用 |
156
192
 
157
193
  ## 工作坊输出口径
158
194
 
@@ -173,6 +209,7 @@
173
209
  - `package.json`、`package-lock.json`、`skill-package-manifest.json`、`.claude-plugin/plugin.json`、`mcp/src/server.js` 版本一致。
174
210
  - `npm --prefix claude-code-voc-intelligence run mcp:smoke` 通过。
175
211
  - `npm --prefix claude-code-voc-intelligence run smoke:package` 通过。
212
+ - `npm --prefix claude-code-voc-intelligence run audit:index` 通过。
176
213
  - `npm run claude-voc:build` 通过。
177
214
  - npm 发布后 `npm view @vocmarket/voc-skill version` 返回新版本。
178
215
  - 测试工作区 `npx --yes @vocmarket/voc-skill@latest workspace --smoke` 通过。
@@ -8,7 +8,7 @@
8
8
  - 不依赖 `~/.openclaw/voc-credentials.json`。
9
9
  - 如果使用全局配置,只允许使用 `~/.claude/voc-credentials.json`。
10
10
  - 上游余额充足,且充值入口可打开:
11
- `https://app.fmode.cn/dev/apig-pay/?apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF`
11
+ `https://app.fmode.cn/dev/studio/balance/?token=USER_SESSION_TOKEN`
12
12
 
13
13
  ## 小红书 live 最小验收
14
14
 
@@ -21,7 +21,7 @@ node ".claude/plugins/voc-intelligence/mcp/src/tools/xiaohongshu-trend-run.js" -
21
21
  - `status` 为 `ok`,或在无 token/余额不足时返回友好充值提示。
22
22
  - 不出现原始 `403`、权限栈、接口响应体。
23
23
  - 报告里有证据样本、原帖链接、评论证据。
24
- - `files` 中包含 Markdown、JSON,若有图片则包含本地 `assets`。
24
+ - `files` 中包含 Markdown、JSON 和 `assets/media-manifest.json`;报告媒体引用均为本地 `assets` 路径,manifest 中 `cloudUrl` 必须为 `null`。
25
25
 
26
26
  ## 抖音 live 最小验收
27
27
 
@@ -35,6 +35,7 @@ node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --coll
35
35
  - 不出现原始 `403`、权限栈、接口响应体。
36
36
  - 报告里有视频证据、原视频链接、评论证据。
37
37
  - 输出内容仍是“第一轮初步判断 / 机会假设 / 待确认问题”,不能把首轮样本写成最终结论。
38
+ - 即使传入 `--cache-assets false`,仍必须生成本地 `assets/media-manifest.json`,并出现兼容参数弃用提示。
38
39
 
39
40
  ## 抖音搜索错误快速验收
40
41
 
@@ -117,7 +117,7 @@ npm run claude-voc:npm-pack
117
117
  `npm run claude-voc:acceptance` 是更完整的发布前验收,会额外断言 workspace 安装后的:
118
118
 
119
119
  - `.mcp.json` 已生成
120
- - 8 个 `.claude/skills/*/SKILL.md` 入口已生成
120
+ - manifest 中列出的全部 `.claude/skills/*/SKILL.md` 入口已生成(当前 11 个)
121
121
  - MCP server 路径是安装后插件目录里的绝对路径
122
122
  - `npm pack --dry-run` 能看到关键文件
123
123
 
@@ -203,7 +203,7 @@ npm view @vocmarket/voc-skill@0.3.15 version --registry=https://registry.npmjs.o
203
203
  - 线上 `npm exec --yes --package @vocmarket/voc-skill@latest -- claude-voc workspace --smoke` 已通过。
204
204
  - 旧包 `@gangvy/claude-code-voc-intelligence@*` 已标记为 deprecated,安装旧包时会提示改用 `@vocmarket/voc-skill`。
205
205
  - 已新增 `npm run claude-voc:acceptance` 一键发布前验收,覆盖包级 smoke、MCP smoke、npm pack dry-run 和 workspace 安装断言。
206
- - 包内包含 8 个 skill、12 个 MCP tools。
206
+ - 当前包内包含 11 个 skill、19 个 MCP tools;数量以 `skill-package-manifest.json` 和 `npm run audit:index` 为准。
207
207
  - smoke 覆盖 sample report、证据卡、图片缓存、xsec URL 规范化、偏好记忆、no-token 充值提示、祖先 `.env.local` token 读取、抖音搜索入参错误保护、跨行业样例和 MCP tool discovery。
208
208
 
209
209
  ## 后续版本同步
@@ -31,15 +31,15 @@ https://app.fmode.cn/dev/apig-pay/#/workshop
31
31
  | 情报官实战包 | https://app.fmode.cn/dev/apig-pay/#/workshop/499 | 隐藏直达,适合企业实训 |
32
32
  | 情报官团队包 | https://app.fmode.cn/dev/apig-pay/#/workshop/699 | 公开入口,适合团队共用和复盘 |
33
33
 
34
- ## 单 APIG 补额度入口
34
+ ## 数据余额入口
35
35
 
36
- 当前小红书 live 采集走 VOC 社媒数据中台:
36
+ 当前小红书 live 采集统一从当前用户 NewAPI 余额扣费。用户自助充值使用带 Session Token 的余额页:
37
37
 
38
38
  ```text
39
- https://app.fmode.cn/dev/apig-pay/?apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF
39
+ https://app.fmode.cn/dev/studio/balance/?token=USER_SESSION_TOKEN
40
40
  ```
41
41
 
42
- 如果用户只是社媒数据中台余额不足,可以使用这个入口补额度。课程和工作坊场景优先引导用户买技能套餐,因为技能套餐会同时给社媒数据中台和电商数据中台分配额度。
42
+ 如果 Agent 已经完成成本测算,也可以直接复用现有 `pay_code2` 链路返回支付二维码。课程和工作坊套餐链接仍只用于套餐购买,不作为数据余额不足时的默认入口。
43
43
 
44
44
  ## 技能包安装入口
45
45
 
@@ -0,0 +1,96 @@
1
+ # 三账号平台成本分析
2
+
3
+ 统计时间:2026-08-31 00:00:00 至 2026-09-01 17:53:20(北京时间)
4
+
5
+ 本文件只展示平台侧成本估算,不包含用户扣费、毛利或账户充值金额。用户实际扣费见独立 HTML 报告。
6
+
7
+ ## 1. 成本总览
8
+
9
+ - 两个计费账户的平台估算成本合计:¥256.06。
10
+ - 林总分身估算成本:¥120.73。
11
+ - 林煌分身与运营 Agent 共享池估算成本:¥135.33。
12
+ - VOC 数据上游成本:约 ¥57.10。
13
+ - 大模型牌价成本:约 ¥198.96。
14
+
15
+ ## 2. 成本口径
16
+
17
+ | 成本类型 | 计算方式 | 数据质量 |
18
+ | --- | --- | --- |
19
+ | 小红书 / 社媒 | 按实际转发到上游的端点调用和官方端点价目计算 | 较高 |
20
+ | 淘宝 / 天猫 | 官方日账单暂不可用,按当前端点价目估算 | 估算 |
21
+ | 大模型 | 按 NewAPI 日志中的 `group_ratio` 反推牌价成本 | 估算 |
22
+
23
+ 大模型牌价成本不等同于渠道包月、阶梯折扣或最终结算成本。国内电商成本也需要以后续官方账单校准。
24
+
25
+ ## 3. 成本构成
26
+
27
+ | 成本模块 | 估算成本 | 占总成本 |
28
+ | --- | ---: | ---: |
29
+ | 林煌分身 + 运营共享池大模型 | ¥135.33 | 52.8% |
30
+ | 林总分身大模型 | ¥63.63 | 24.8% |
31
+ | 小红书 / 社媒数据 | ¥50.90 | 19.9% |
32
+ | 淘宝 / 天猫数据 | 约 ¥6.20 | 2.4% |
33
+ | 合计 | ¥256.06 | 100% |
34
+
35
+ ## 4. VOC 上游成本
36
+
37
+ ### 4.1 小红书
38
+
39
+ | 接口 | 上游调用 | 估算成本 |
40
+ | --- | ---: | ---: |
41
+ | 获取账号已发布笔记 | 343 | ¥24.70 |
42
+ | 搜索账号 | 102 | ¥7.34 |
43
+ | 获取笔记评论 | 81 | ¥5.83 |
44
+ | 搜索笔记 | 66 | ¥4.75 |
45
+ | 图文笔记详情 | 58 | ¥4.18 |
46
+ | 获取账号信息 | 26 | ¥1.87 |
47
+ | 视频笔记详情 | 20 | ¥1.44 |
48
+ | 子评论 | 10 | ¥0.72 |
49
+ | Web 笔记详情 | 1 | ¥0.07 |
50
+ | 合计 | 707 | ¥50.90 |
51
+
52
+ ### 4.2 淘宝 / 天猫
53
+
54
+ | 接口 | 上游调用 | 估算成本 |
55
+ | --- | ---: | ---: |
56
+ | 商品详情 v4 | 8 | 约 ¥1.60 |
57
+ | 商品评论 v3 | 8 | 约 ¥1.60 |
58
+ | 商品详情 v3 | 7 | 约 ¥1.40 |
59
+ | 店铺商品列表 v4 | 5 | 约 ¥1.00 |
60
+ | 商品详情 v2 | 1 | 约 ¥0.20 |
61
+ | 商品详情 v5 | 1 | 约 ¥0.20 |
62
+ | 商品搜索 v1 | 1 | 约 ¥0.20 |
63
+ | 合计 | 31 | 约 ¥6.20 |
64
+
65
+ ## 5. 大模型牌价成本
66
+
67
+ ### 林总分身
68
+
69
+ | 模型 | 调用 | 估算牌价成本 |
70
+ | --- | ---: | ---: |
71
+ | Claude Sonnet | 153 | ¥59.81 |
72
+ | DeepSeek Flash | 355 | ¥3.76 |
73
+ | Claude Haiku | 5 | ¥0.06 |
74
+ | 合计 | 513 | ¥63.63 |
75
+
76
+ ### 林煌分身与运营 Agent 共享池
77
+
78
+ | 模型 | 调用 | 估算牌价成本 |
79
+ | --- | ---: | ---: |
80
+ | GLM Flash | 35 | ¥127.04 |
81
+ | DeepSeek Flash | 305 | ¥8.13 |
82
+ | GPT-4o | 2 | ¥0.15 |
83
+ | 合计 | 342 | ¥135.33 |
84
+
85
+ ## 6. 成本侧结论
86
+
87
+ 1. VOC 上游成本的最大单项是“小红书账号已发布笔记”,估算 ¥24.70。
88
+ 2. 大模型成本明显高于 VOC 数据成本,尤其是共享池 GLM Flash,估算 ¥127.04。
89
+ 3. 成本优化应优先关注高频接口和高单次上下文请求,并在后续日志中保留可追踪的执行标识。
90
+ 4. 后续需要用渠道实际结算账单校准大模型与国内电商估算值,并在日志中记录成本版本。
91
+
92
+ ## 7. 数据边界
93
+
94
+ 1. 共享池当前不能拆分林煌分身与运营 Agent。
95
+ 2. 当前没有 `usageTraceId/reportId`,报告场景归因依赖账户、接口与执行时间。
96
+ 3. 本文件不包含任何 Session Token、API Key、Bot Secret、密码或支付凭证。