Sfoglia il codice sorgente

chore(voc-skill): remove all dining content incl. local-dining preset; neutralize examples to home-custom

gangvy 3 mesi fa
parent
commit
be1bb04ecb
41 ha cambiato i file con 582 aggiunte e 829 eliminazioni
  1. 13 13
      claude-code/claude-code-voc-intelligence/README.md
  2. 11 11
      claude-code/claude-code-voc-intelligence/bin/claude-voc.js
  3. 20 20
      claude-code/claude-code-voc-intelligence/docs/boss-prompt-templates.md
  4. 6 6
      claude-code/claude-code-voc-intelligence/docs/capability-map.md
  5. 11 11
      claude-code/claude-code-voc-intelligence/docs/claude-code-troubleshooting-playbook.md
  6. 2 2
      claude-code/claude-code-voc-intelligence/docs/deliverables/seven-day-content-plan.md
  7. 1 1
      claude-code/claude-code-voc-intelligence/docs/deliverables/single-problem-action-plan.md
  8. 1 1
      claude-code/claude-code-voc-intelligence/docs/deliverables/trend-insight-report.md
  9. 6 6
      claude-code/claude-code-voc-intelligence/docs/live-manual-acceptance-checklist.md
  10. 1 1
      claude-code/claude-code-voc-intelligence/install.js
  11. 1 1
      claude-code/claude-code-voc-intelligence/mcp/src/features/douyin-trend/live-collector.js
  12. 1 1
      claude-code/claude-code-voc-intelligence/mcp/src/features/voc-business-workflow/business-workflow.js
  13. 28 28
      claude-code/claude-code-voc-intelligence/mcp/src/features/voc-competitor-map/competitor-map.js
  14. 67 220
      claude-code/claude-code-voc-intelligence/mcp/src/features/voc-content-plan/content-plan.js
  15. 26 26
      claude-code/claude-code-voc-intelligence/mcp/src/features/voc-issue-pool/issue-pool.js
  16. 91 91
      claude-code/claude-code-voc-intelligence/mcp/src/features/voc-problem-deep-dive/deep-dive.js
  17. 0 38
      claude-code/claude-code-voc-intelligence/mcp/src/features/xiaohongshu-trend/industry-presets.js
  18. 1 1
      claude-code/claude-code-voc-intelligence/mcp/src/server.js
  19. 6 6
      claude-code/claude-code-voc-intelligence/package.json
  20. 7 7
      claude-code/claude-code-voc-intelligence/scripts/smoke-cross-industry.js
  21. 30 57
      claude-code/claude-code-voc-intelligence/scripts/smoke-mcp.js
  22. 91 91
      claude-code/claude-code-voc-intelligence/scripts/smoke-package.js
  23. 2 2
      claude-code/claude-code-voc-intelligence/skill-package-manifest.json
  24. 4 4
      claude-code/claude-code-voc-intelligence/skills/douyin-trend-intelligence/SKILL.md
  25. 1 1
      claude-code/claude-code-voc-intelligence/skills/douyin-trend-intelligence/references/live-mode.md
  26. 1 1
      claude-code/claude-code-voc-intelligence/skills/voc-api-catalog/SKILL.md
  27. 1 1
      claude-code/claude-code-voc-intelligence/skills/voc-business-workflow/SKILL.md
  28. 4 4
      claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/SKILL.md
  29. 22 0
      claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/competitor-framework.md
  30. 33 0
      claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/differentiation-patterns.md
  31. 0 25
      claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/restaurant-competitor-framework.md
  32. 0 44
      claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/restaurant-differentiation-patterns.md
  33. 8 8
      claude-code/claude-code-voc-intelligence/skills/voc-content-plan/SKILL.md
  34. 29 0
      claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/content-framework.md
  35. 0 41
      claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/restaurant-content-framework.md
  36. 0 34
      claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/restaurant-speaking-script-patterns.md
  37. 31 0
      claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/speaking-script-patterns.md
  38. 4 4
      claude-code/claude-code-voc-intelligence/skills/voc-issue-pool/SKILL.md
  39. 5 5
      claude-code/claude-code-voc-intelligence/skills/voc-problem-deep-dive/SKILL.md
  40. 14 14
      claude-code/claude-code-voc-intelligence/skills/voc-speaking-script/SKILL.md
  41. 2 2
      claude-code/claude-code-voc-intelligence/skills/xiaohongshu-trend-intelligence/SKILL.md

+ 13 - 13
claude-code/claude-code-voc-intelligence/README.md

@@ -29,7 +29,7 @@
 - “把这些评论整理成问题池”
 - “把这些评论整理成问题池”
 - “哪些问题最影响生意,先改哪个”
 - “哪些问题最影响生意,先改哪个”
 - “这个问题老板该怎么解决”
 - “这个问题老板该怎么解决”
-- “继续深挖排队/价格/服务/味道这个问题”
+- “继续深挖怎么选/价格/服务/质量这个问题”
 - “下周账号发什么内容”
 - “下周账号发什么内容”
 - “根据这些顾客吐槽生成 7 天口播脚本”
 - “根据这些顾客吐槽生成 7 天口播脚本”
 - “这个动作不适合我们,下次别推荐”
 - “这个动作不适合我们,下次别推荐”
@@ -140,7 +140,7 @@ npx --yes @vocmarket/voc-skill@latest install --smoke
 抖音演示样例:
 抖音演示样例:
 
 
 ```text
 ```text
-帮我做一份本地生活餐饮行业的抖音趋势情报。
+帮我做一份家居定制行业的抖音趋势情报。
 先用演示样例跑通流程,不要真实采集。
 先用演示样例跑通流程,不要真实采集。
 在聊天里给我第一轮样本观察和待确认问题。
 在聊天里给我第一轮样本观察和待确认问题。
 ```
 ```
@@ -154,25 +154,25 @@ npx --yes @vocmarket/voc-skill@latest install --smoke
 单点 VOC 深挖:
 单点 VOC 深挖:
 
 
 ```text
 ```text
-继续深挖“排队”这个问题,站在老板视角告诉我怎么解决,给出今天能做的动作和 7 天验证计划。
+继续深挖“怎么选”这个问题,站在老板视角告诉我怎么解决,给出今天能做的动作和 7 天验证计划。
 ```
 ```
 
 
 竞品图谱:
 竞品图谱:
 
 
 ```text
 ```text
-我是南昌做烧烤的,不知道竞品是谁,帮我先做一份竞品图谱和错位竞争建议。
+我是做家居定制的,不知道竞品是谁,帮我先做一份竞品图谱和错位竞争建议。
 ```
 ```
 
 
 7 天内容选题:
 7 天内容选题:
 
 
 ```text
 ```text
-根据“排队久、人均贵、第一次来怕踩雷”这些顾客问题,帮我生成 7 天短视频选题和口播脚本。
+根据“第一次买怎么选、价格贵、怕踩雷”这些用户问题,帮我生成 7 天短视频选题和口播脚本。
 ```
 ```
 
 
 多轮记忆反馈:
 多轮记忆反馈:
 
 
 ```text
 ```text
-这个店不想做等位饮品,更想先改评论区回复和预点单,后面按这个方向继续优化。
+这个品牌不想做试用体验,更想先改评论区回复和案例展示,后面按这个方向继续优化。
 ```
 ```
 
 
 ## Claude Code 应如何调用
 ## Claude Code 应如何调用
@@ -231,10 +231,10 @@ npm --prefix claude-code-voc-intelligence run smoke:package
 - `docs/live-manual-acceptance-checklist.md`
 - `docs/live-manual-acceptance-checklist.md`
 - `docs/payment-package-links.md`
 - `docs/payment-package-links.md`
 - `docs/context-budget-implementation-plan.md`
 - `docs/context-budget-implementation-plan.md`
-- `skills/voc-content-plan/references/restaurant-content-framework.md`
-- `skills/voc-content-plan/references/restaurant-speaking-script-patterns.md`
-- `skills/voc-competitor-map/references/restaurant-competitor-framework.md`
-- `skills/voc-competitor-map/references/restaurant-differentiation-patterns.md`
+- `skills/voc-content-plan/references/content-framework.md`
+- `skills/voc-content-plan/references/speaking-script-patterns.md`
+- `skills/voc-competitor-map/references/competitor-framework.md`
+- `skills/voc-competitor-map/references/differentiation-patterns.md`
 
 
 ## 工作坊输出口径
 ## 工作坊输出口径
 
 
@@ -259,7 +259,7 @@ voc_business_workflow_run
 典型话术:
 典型话术:
 
 
 ```text
 ```text
-帮我看一下南昌餐饮最近顾客在关心什么,并告诉我先改哪里、下周发什么。
+帮我看一下家居定制最近用户在关心什么,并告诉我先改哪里、下周发什么。
 ```
 ```
 
 
 这条链路会自动串起趋势情报、VOC 问题池、单点深挖、7 天内容计划和口播脚本。第一轮仍然是初步判断,必须提示用户结合门店、销售、私域反馈校准。
 这条链路会自动串起趋势情报、VOC 问题池、单点深挖、7 天内容计划和口播脚本。第一轮仍然是初步判断,必须提示用户结合门店、销售、私域反馈校准。
@@ -296,8 +296,8 @@ https://app.fmode.cn/dev/apig-pay/?apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF
 示例:
 示例:
 
 
 ```text
 ```text
-这个动作不适合我们,下次别推荐等位饮品
-这个有效,后面优先做评论区回复和预点单
+这个动作不适合我们,下次别推荐试用体验
+这个有效,后面优先做评论区回复和案例展示
 ```
 ```
 
 
 工具会把反馈沉淀为偏好动作、屏蔽动作、验证有效动作或验证无效动作,让后续建议逐步贴近真实业务。
 工具会把反馈沉淀为偏好动作、屏蔽动作、验证有效动作或验证无效动作,让后续建议逐步贴近真实业务。

+ 11 - 11
claude-code/claude-code-voc-intelligence/bin/claude-voc.js

@@ -468,19 +468,19 @@ function workspaceProblemDeepDiveSkillText(targetDir) {
     '## 命令',
     '## 命令',
     '',
     '',
     '```bash',
     '```bash',
-    `node ${quotedPath(deepDiveRunner)} --issue "排队" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --assistant-message-only`,
+    `node ${quotedPath(deepDiveRunner)} --issue "怎么选" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --assistant-message-only`,
     '```',
     '```',
     '',
     '',
     '## 带记忆的多轮迭代',
     '## 带记忆的多轮迭代',
     '',
     '',
     '```bash',
     '```bash',
-    `node ${quotedPath(deepDiveRunner)} --issue "排队" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --memory "outputs/voc-problem-memory.json" --feedback "老板不想做等位饮品,更想先改评论区回复和预点单" --blocked-actions "等位饮品" --preferred-actions "评论区回复,预点单" --assistant-message-only`,
+    `node ${quotedPath(deepDiveRunner)} --issue "怎么选" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --memory "outputs/voc-problem-memory.json" --feedback "老板不想做直播带看,更想先改评论区回复和方案说明" --blocked-actions "直播带看" --preferred-actions "评论区回复,方案说明" --assistant-message-only`,
     '```',
     '```',
     '',
     '',
     '自然语言反馈也可以直接传入 `feedback`,工具会尝试自动提取偏好和屏蔽动作:',
     '自然语言反馈也可以直接传入 `feedback`,工具会尝试自动提取偏好和屏蔽动作:',
     '',
     '',
     '```bash',
     '```bash',
-    `node ${quotedPath(deepDiveRunner)} --issue "排队" --project "样板门店A" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --feedback "这个店不想做等位饮品,更想先改评论区回复和预点单" --assistant-message-only`,
+    `node ${quotedPath(deepDiveRunner)} --issue "怎么选" --project "示例品牌A" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --feedback "这个品牌不想做直播带看,更想先改评论区回复和方案说明" --assistant-message-only`,
     '```',
     '```',
     '',
     '',
     '运行后把命令输出正文直接发给用户。不要展示 JSON、summary、data、files 或调试日志。',
     '运行后把命令输出正文直接发给用户。不要展示 JSON、summary、data、files 或调试日志。',
@@ -513,13 +513,13 @@ function workspaceIssuePoolSkillText(targetDir) {
     '## 命令',
     '## 命令',
     '',
     '',
     '```bash',
     '```bash',
-    `node ${quotedPath(issuePoolRunner)} --project "样板门店A" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --evidence "排队久,但是不知道值不值得等。,人均有点高,第一次来不知道怎么点不踩雷。,服务忙起来没人理。" --assistant-message-only`,
+    `node ${quotedPath(issuePoolRunner)} --project "示例品牌A" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --evidence "第一次买不知道怎么选,怕踩雷。,价格有点高,不确定值不值。,咨询的时候没人理。" --assistant-message-only`,
     '```',
     '```',
     '',
     '',
     '带报告文件:',
     '带报告文件:',
     '',
     '',
     '```bash',
     '```bash',
-    `node ${quotedPath(issuePoolRunner)} --project "样板门店A" --industry "本地生活餐饮" --report "outputs/douyin-trend-report.md" --assistant-message-only`,
+    `node ${quotedPath(issuePoolRunner)} --project "示例品牌A" --industry "家居定制" --report "outputs/douyin-trend-report.md" --assistant-message-only`,
     '```',
     '```',
     '',
     '',
     '运行后把命令输出正文直接发给用户。不要展示 JSON、summary、data、files 或调试日志。',
     '运行后把命令输出正文直接发给用户。不要展示 JSON、summary、data、files 或调试日志。',
@@ -545,7 +545,7 @@ function workspaceContentPlanSkillText(targetDir) {
     '## 命令',
     '## 命令',
     '',
     '',
     '```bash',
     '```bash',
-    `node ${quotedPath(runner)} --brand "样板门店A" --industry "本地生活餐饮" --issues "第一次来怕踩雷;觉得人均贵;怕排队久" --assistant-message-only`,
+    `node ${quotedPath(runner)} --brand "示例品牌A" --industry "家居定制" --issues "第一次买怕踩雷;觉得价格贵;怕质量不稳定" --assistant-message-only`,
     '```',
     '```',
     '',
     '',
     '运行后把正文直接发给用户,不要展示 JSON。',
     '运行后把正文直接发给用户,不要展示 JSON。',
@@ -571,13 +571,13 @@ function workspaceSpeakingScriptSkillText(targetDir) {
     '## 命令',
     '## 命令',
     '',
     '',
     '```bash',
     '```bash',
-    `node ${quotedPath(runner)} --brand "样板门店A" --industry "本地生活餐饮" --topic "第一次来怎么点不踩雷" --user-issue "第一次来怕点错" --evidence "第一次来不知道怎么点,怕踩雷" --assistant-message-only`,
+    `node ${quotedPath(runner)} --brand "示例品牌A" --industry "家居定制" --topic "第一次买怎么选不踩雷" --user-issue "第一次买怕选错" --evidence "第一次买不知道怎么选,怕踩雷" --assistant-message-only`,
     '```',
     '```',
     '',
     '',
     '改稿:',
     '改稿:',
     '',
     '',
     '```bash',
     '```bash',
-    `node ${quotedPath(runner)} --brand "样板门店A" --topic "第一次来怎么点不踩雷" --user-issue "第一次来怕点错" --evidence "第一次来不知道怎么点,怕踩雷" --feedback "开头更狠一点,老板视角,少讲概念,多给具体场景" --assistant-message-only`,
+    `node ${quotedPath(runner)} --brand "示例品牌A" --topic "第一次买怎么选不踩雷" --user-issue "第一次买怕选错" --evidence "第一次买不知道怎么选,怕踩雷" --feedback "开头更狠一点,老板视角,少讲概念,多给具体场景" --assistant-message-only`,
     '```',
     '```',
     '',
     '',
     '定稿时传 `--finalize true`,工具会写入脚本记忆。运行后把正文直接发给用户,不要展示 JSON。',
     '定稿时传 `--finalize true`,工具会写入脚本记忆。运行后把正文直接发给用户,不要展示 JSON。',
@@ -603,7 +603,7 @@ function workspaceCompetitorMapSkillText(targetDir) {
     '## 命令',
     '## 命令',
     '',
     '',
     '```bash',
     '```bash',
-    `node ${quotedPath(runner)} --brand "样板门店A" --city "南昌" --category "餐饮" --assistant-message-only`,
+    `node ${quotedPath(runner)} --brand "示例品牌A" --city "本地" --category "家居定制" --assistant-message-only`,
     '```',
     '```',
     '',
     '',
     '运行后把正文直接发给用户,不要展示 JSON。',
     '运行后把正文直接发给用户,不要展示 JSON。',
@@ -627,7 +627,7 @@ function workspaceBusinessWorkflowSkillText(targetDir) {
     '## 命令',
     '## 命令',
     '',
     '',
     '```bash',
     '```bash',
-    `node ${quotedPath(runner)} --brand "样板门店A" --industry "本地生活餐饮" --platform douyin --collection-mode sample --keywords "南昌菜,第一次来怎么点,排队" --assistant-message-only`,
+    `node ${quotedPath(runner)} --brand "示例品牌A" --industry "家居定制" --platform douyin --collection-mode sample --keywords "家居定制怎么选,第一次买怎么对比,售后" --assistant-message-only`,
     '```',
     '```',
     '',
     '',
     '真实采集时把 `--collection-mode sample` 换成 `--collection-mode live`。如果工具提示没有 token、余额不足或没有样本,直接把工具正文发给用户,并保留充值/降级建议。',
     '真实采集时把 `--collection-mode sample` 换成 `--collection-mode live`。如果工具提示没有 token、余额不足或没有样本,直接把工具正文发给用户,并保留充值/降级建议。',
@@ -717,7 +717,7 @@ function printNextSteps(targetDir) {
   }
   }
   console.log('');
   console.log('');
   console.log('Try this prompt in Claude Code:');
   console.log('Try this prompt in Claude Code:');
-  console.log('  帮我看一下南昌餐饮最近顾客在关心什么,并告诉我先改哪里、下周发什么。');
+  console.log('  帮我看一下家装全屋定制最近用户在关心什么,并告诉我先改哪里、下周发什么。');
   console.log('');
   console.log('');
   console.log('Or try:');
   console.log('Or try:');
   console.log('  帮我做一份家装全屋定制行业的小红书趋势情报。');
   console.log('  帮我做一份家装全屋定制行业的小红书趋势情报。');

+ 20 - 20
claude-code/claude-code-voc-intelligence/docs/boss-prompt-templates.md

@@ -14,11 +14,11 @@
 ```text
 ```text
 我的品牌/门店是:[品牌名]
 我的品牌/门店是:[品牌名]
 城市/商圈:[城市、商圈、门店位置]
 城市/商圈:[城市、商圈、门店位置]
-行业/品类:[餐饮/家装/医美/教育/零售/本地生活等]
-主打产品/服务:[核心产品、套餐、服务项目]
-人均/客单价:[大概价格,不知道就写不确定]
+行业/品类:[家装/医美/教育/零售/专业服务等]
+主打产品/服务:[核心产品、方案、服务项目]
+客单价:[大概价格,不知道就写不确定]
 主要客群:[谁来买,比如情侣、家庭、宝妈、老板、年轻人、学生等]
 主要客群:[谁来买,比如情侣、家庭、宝妈、老板、年轻人、学生等]
-主要消费场景:[聚餐/约会/生日/装修/送礼/学习/改善型消费等]
+主要消费场景:[约会/生日/装修/送礼/学习/改善型消费等]
 已知竞品:[竞品1、竞品2、竞品3;不知道就写不知道]
 已知竞品:[竞品1、竞品2、竞品3;不知道就写不知道]
 当前最头疼的问题:
 当前最头疼的问题:
 1. [问题1]
 1. [问题1]
@@ -29,7 +29,7 @@
 7. [竞品名3]
 7. [竞品名3]
 
 
 重点追踪这些信号:
 重点追踪这些信号:
-[价格、套餐、排队、服务、出品、效果、口碑、避坑、新鲜感、拍照、复购、竞品对比]
+[价格、方案、怎么选、服务、质量、效果、口碑、避坑、新鲜感、售后、复购、竞品对比]
 
 
 请保留:
 请保留:
 1. 原帖/视频链接
 1. 原帖/视频链接
@@ -80,8 +80,8 @@
 品牌/门店:[品牌名]
 品牌/门店:[品牌名]
 城市/区域:[城市/商圈]
 城市/区域:[城市/商圈]
 行业/品类:[行业品类]
 行业/品类:[行业品类]
-人均/客单价:[价格,不确定就写不确定]
-主要消费场景:[聚餐/约会/家庭/商务/送礼/学习等]
+客单价:[价格,不确定就写不确定]
+主要消费场景:[约会/家庭/商务/送礼/学习等]
 已知竞品:[如果有就写,没有就写不知道]
 已知竞品:[如果有就写,没有就写不知道]
 当前痛点:
 当前痛点:
 1. [痛点1]
 1. [痛点1]
@@ -163,10 +163,10 @@
 请根据这些 VOC 问题,给我做一份 7 天内容计划。
 请根据这些 VOC 问题,给我做一份 7 天内容计划。
 
 
 品牌/门店:[品牌名]
 品牌/门店:[品牌名]
-平台:[小红书/抖音/视频号/大众点评]
+平台:[小红书/抖音/视频号]
 行业/品类:[行业品类]
 行业/品类:[行业品类]
 目标用户:[目标客群]
 目标用户:[目标客群]
-本周想解决的问题:[价格解释/套餐不清楚/排队/服务/新鲜感/竞品对比/信任不足]
+本周想解决的问题:[价格解释/方案不清楚/怎么选/服务/质量/竞品对比/信任不足]
 
 
 用户原话:
 用户原话:
 1. [用户原话1]
 1. [用户原话1]
@@ -264,27 +264,27 @@
 最后告诉我本周先改哪里、下周发什么内容。
 最后告诉我本周先改哪里、下周发什么内容。
 ```
 ```
 
 
-## 12. 盛焰铁板烧可直接使用的版本
+## 12. 可直接使用的样本(家居定制示例)
 
 
 ```text
 ```text
-我是南昌做铁板烧的门店老板,品牌叫盛焰铁板烧
+我是做全屋定制的品牌负责人,品牌叫示例品牌A
 
 
 品牌背景:
 品牌背景:
-盛焰铁板烧是江西本地连锁铁板烧品牌,直营 9 家,主打到店现制、聚餐、套餐和铁板烧体验。
+示例品牌A 是本地全屋定制品牌,直营 9 家门店,主打上门量尺、方案设计、整装方案和定制交付体验。
 
 
 已知竞品:
 已知竞品:
-立方铁、火地、大神太神、炙焰、大渔、航海家
+竞品A、竞品B、竞品C、竞品D、竞品E
 
 
 当前痛点:
 当前痛点:
 1. 日常营销能够带来 TC,但是活动折扣大,客单受影响,最后营业额没有提升。
 1. 日常营销能够带来 TC,但是活动折扣大,客单受影响,最后营业额没有提升。
 2. 营销玩法同质化严重,大多数属于低价竞争,自发传播裂变能力弱。
 2. 营销玩法同质化严重,大多数属于低价竞争,自发传播裂变能力弱。
 3. 品牌模式趋于老化,顾客没有新鲜感,核心竞争力不突出,消费者选择优先级不足。
 3. 品牌模式趋于老化,顾客没有新鲜感,核心竞争力不突出,消费者选择优先级不足。
-4. 铁板烧都是当顾客面现场制作,效率不高,且无法快速通过漂亮菜的模式传递给顾客,无法形成顾客自传播。
+4. 定制交付周期长、细节多,用户第一次买很难判断质量和是否适合,难以形成用户自传播。
 
 
 请基于以上信息做 VOC 经营诊断。
 请基于以上信息做 VOC 经营诊断。
 要求:
 要求:
 1. 先判断现有样本是否足够。
 1. 先判断现有样本是否足够。
-2. 如果不足,先生成小红书和抖音补采矩阵,关键词要具体到南昌铁板烧、盛焰、竞品名、价格、套餐、值不值、排队、聚餐、新鲜感
+2. 如果不足,先生成小红书和抖音补采矩阵,关键词要具体到全屋定制、家居定制、竞品名、价格、方案、值不值、怎么选、质量、售后
 3. 采集或整理时必须保留原帖/视频链接、图片/封面、用户评论原话。
 3. 采集或整理时必须保留原帖/视频链接、图片/封面、用户评论原话。
 4. 问题池只能使用真实用户评论,不要把品牌介绍或报告标题当证据。
 4. 问题池只能使用真实用户评论,不要把品牌介绍或报告标题当证据。
 5. 最后围绕四个痛点输出:问题判断、用户证据、竞品画像、品类心智、老板本周动作、下周内容方向。
 5. 最后围绕四个痛点输出:问题判断、用户证据、竞品画像、品类心智、老板本周动作、下周内容方向。
@@ -301,7 +301,7 @@
 ```text
 ```text
 请基于刚才的 VOC 经营闭环结果继续深入。
 请基于刚才的 VOC 经营闭环结果继续深入。
 
 
-我想重点看:[价格/套餐/排队/服务/新鲜感/竞品/内容传播/复购]
+我想重点看:[价格/方案/怎么选/服务/新鲜感/竞品/内容传播/复购]
 
 
 请不要重新泛泛分析,请直接围绕上一轮结果做:
 请不要重新泛泛分析,请直接围绕上一轮结果做:
 1. 哪些判断有真实评论证据支撑
 1. 哪些判断有真实评论证据支撑
@@ -335,7 +335,7 @@
 请基于刚才 live 采集到的样本继续深入。
 请基于刚才 live 采集到的样本继续深入。
 
 
 我想重点追:[关键词/竞品名/用户痛点/消费场景]
 我想重点追:[关键词/竞品名/用户痛点/消费场景]
-例如:[南昌铁板烧 值不值 / 盛焰铁板烧 / 立方铁 / 大渔 / 排队 / 套餐]
+例如:[家居定制 值不值 / 示例品牌A / 竞品A / 竞品B / 怎么选 / 方案]
 
 
 请输出:
 请输出:
 1. 当前样本里已经出现的真实用户原话
 1. 当前样本里已经出现的真实用户原话
@@ -432,7 +432,7 @@
 
 
 对比维度:
 对比维度:
 1. 用户选择理由
 1. 用户选择理由
-2. 人均/套餐感知
+2. 价格/方案感知
 3. 消费场景
 3. 消费场景
 4. 适合人群
 4. 适合人群
 5. 内容传播点
 5. 内容传播点
@@ -490,7 +490,7 @@
 请把刚才的单点深挖变成门店执行方案。
 请把刚才的单点深挖变成门店执行方案。
 
 
 问题:[问题名]
 问题:[问题名]
-我能投入的资源:[比如:店长、前厅、厨师、拍摄人员、预算]
+我能投入的资源:[比如:店长、设计师、客服、拍摄人员、预算]
 执行周期:[3 天/7 天/14 天]
 执行周期:[3 天/7 天/14 天]
 
 
 请输出:
 请输出:
@@ -529,7 +529,7 @@
 ```text
 ```text
 请基于刚才的 7 天内容计划继续优化。
 请基于刚才的 7 天内容计划继续优化。
 
 
-我要优化的方向是:[老板口吻/更像探店/更适合小红书/更适合抖音/更强转化/更少广告感]
+我要优化的方向是:[老板口吻/更像真实案例/更适合小红书/更适合抖音/更强转化/更少广告感]
 
 
 请重新输出:
 请重新输出:
 1. 每天选题是否对应真实用户问题
 1. 每天选题是否对应真实用户问题

+ 6 - 6
claude-code/claude-code-voc-intelligence/docs/capability-map.md

@@ -41,7 +41,7 @@
 用户典型话术:
 用户典型话术:
 
 
 ```text
 ```text
-帮我看一下南昌餐饮最近顾客在关心什么,并告诉我先改哪里、下周发什么。
+帮我看一下家居定制最近用户在关心什么,并告诉我先改哪里、下周发什么。
 ```
 ```
 
 
 ### `xiaohongshu-trend-intelligence`
 ### `xiaohongshu-trend-intelligence`
@@ -65,14 +65,14 @@
 适合:
 适合:
 
 
 - 抖音趋势情报
 - 抖音趋势情报
-- 本地生活/餐饮评论洞察
+- 行业用户评论洞察
 - 短视频内容机会
 - 短视频内容机会
-- 门店转化线索
+- 线上转化线索
 
 
 用户典型话术:
 用户典型话术:
 
 
 ```text
 ```text
-帮我看下南昌餐饮行业抖音上用户最近在吐槽什么,先小规模真实采集。
+帮我看下家居定制行业抖音上用户最近在吐槽什么,先小规模真实采集。
 ```
 ```
 
 
 ### `voc-problem-deep-dive`
 ### `voc-problem-deep-dive`
@@ -88,7 +88,7 @@
 用户典型话术:
 用户典型话术:
 
 
 ```text
 ```text
-继续深挖“排队”这个问题,告诉老板今天能改什么,7 天怎么验证。
+继续深挖“怎么选”这个问题,告诉老板今天能改什么,7 天怎么验证。
 ```
 ```
 
 
 ### `voc-issue-pool`
 ### `voc-issue-pool`
@@ -155,7 +155,7 @@
 
 
 ## 工作坊输出口径
 ## 工作坊输出口径
 
 
-面向餐饮老板或线下工作坊时,Claude Code 输出优先按:
+面向老板或线下工作坊时,Claude Code 输出优先按:
 
 
 1. 你这轮能拿到什么。
 1. 你这轮能拿到什么。
 2. 我会怎么做。
 2. 我会怎么做。

+ 11 - 11
claude-code/claude-code-voc-intelligence/docs/claude-code-troubleshooting-playbook.md

@@ -8,7 +8,7 @@ This playbook helps Claude Code and maintainers quickly map live VOC collection
 | --- | --- | --- | --- | --- |
 | --- | --- | --- | --- | --- |
 | Douyin live says balance is insufficient, but the account has balance | Search API or keyword request failed and was classified as billing | `needs_keyword_fix` | Check Douyin API error classification and keyword repair | Do not show recharge link unless status is really `needs_recharge` |
 | Douyin live says balance is insufficient, but the account has balance | Search API or keyword request failed and was classified as billing | `needs_keyword_fix` | Check Douyin API error classification and keyword repair | Do not show recharge link unless status is really `needs_recharge` |
 | Douyin returns `社交平台接口请求错误` or HTTP 5xx | Upstream search or input issue | `needs_keyword_fix`, or auto-repair then `ok` | Normalize keyword, retry with a shorter natural keyword | Do not expose raw 5xx body to user |
 | Douyin returns `社交平台接口请求错误` or HTTP 5xx | Upstream search or input issue | `needs_keyword_fix`, or auto-repair then `ok` | Normalize keyword, retry with a shorter natural keyword | Do not expose raw 5xx body to user |
-| User passes `茶饮18元22元` and search is unstable | Compact keyword lacks natural search spacing | Usually auto-repaired | Normalize to `茶饮 18元 22元` | Do not require user to learn CLI flags |
+| User passes `家居定制18元22元` and search is unstable | Compact keyword lacks natural search spacing | Usually auto-repaired | Normalize to `家居定制 18元 22元` | Do not require user to learn CLI flags |
 | User passes empty `--keywords ""` | CLI parser receives an explicit empty value | `needs_keyword_fix` | Keep explicit empty as empty; do not fall back to default keywords | Do not silently search generic defaults |
 | User passes empty `--keywords ""` | CLI parser receives an explicit empty value | `needs_keyword_fix` | Keep explicit empty as empty; do not fall back to default keywords | Do not silently search generic defaults |
 | User asks “进入真实采集 live 模式” but workflow keeps deep-diving | Skill handoff rules are too weak | Should call platform live collector | Update deep-dive/business workflow skill instructions and `nextActions` | Do not keep asking 7-day validation questions |
 | User asks “进入真实采集 live 模式” but workflow keeps deep-diving | Skill handoff rules are too weak | Should call platform live collector | Update deep-dive/business workflow skill instructions and `nextActions` | Do not keep asking 7-day validation questions |
 | MCP output validation fails because warnings contain objects | Structured output schema expects strings | Tool call error | Normalize warnings at MCP server boundary | Do not remove evidence warnings entirely |
 | MCP output validation fails because warnings contain objects | Structured output schema expects strings | Tool call error | Normalize warnings at MCP server boundary | Do not remove evidence warnings entirely |
@@ -64,19 +64,19 @@ Claude Code should prefer short, natural platform search phrases:
 Examples:
 Examples:
 
 
 ```text
 ```text
-茶饮 18元 22元
-茶饮 性价比 新客
-奶茶 套餐 点单 避坑
-本地茶饮 人均 点单
-茶饮 探店 值不值
+家居定制 18元 22元
+家居定制 性价比 新客
+全屋定制 方案 怎么选 避坑
+家居定制 价格 怎么选
+家居定制 对比 值不值
 ```
 ```
 
 
 Repair rules:
 Repair rules:
 
 
-- Insert spacing around Chinese and numbers: `茶饮18元22元` -> `茶饮 18元 22元`.
+- Insert spacing around Chinese and numbers: `家居定制18元22元` -> `家居定制 18元 22元`.
 - Keep keywords under 60 characters.
 - Keep keywords under 60 characters.
-- If price-specific search fails, try intent-specific search: `茶饮 性价比 新客`.
-- If intent search fails, try behavior-specific search: `奶茶 套餐 点单 避坑`.
+- If price-specific search fails, try intent-specific search: `家居定制 性价比 新客`.
+- If intent search fails, try behavior-specific search: `全屋定制 方案 怎么选 避坑`.
 - If all fail, return `needs_keyword_fix` and tell the user what was tried.
 - If all fail, return `needs_keyword_fix` and tell the user what was tried.
 
 
 ## Implementation Checklist For Similar Bugs
 ## Implementation Checklist For Similar Bugs
@@ -124,12 +124,12 @@ npm run claude-voc:build
 Live manual check, only when a real token is configured:
 Live manual check, only when a real token is configured:
 
 
 ```powershell
 ```powershell
-node .claude\plugins\voc-intelligence\mcp\src\tools\douyin-trend-run.js --collection-mode live --industry "茶饮" --business-type "茶饮连锁" --target-audience "新客" --keywords "茶饮18元22元" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 0 --cache-assets false --output "outputs/live-acceptance-douyin-keyword"
+node .claude\plugins\voc-intelligence\mcp\src\tools\douyin-trend-run.js --collection-mode live --industry "家居定制" --business-type "全屋定制品牌" --target-audience "新客" --keywords "家居定制18元22元" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 0 --cache-assets false --output "outputs/live-acceptance-douyin-keyword"
 ```
 ```
 
 
 Expected:
 Expected:
 
 
-- Compact keyword is normalized to `茶饮 18元 22元`.
+- Compact keyword is normalized to `家居定制 18元 22元`.
 - Search 5xx is auto-repaired or returned as `needs_keyword_fix`.
 - Search 5xx is auto-repaired or returned as `needs_keyword_fix`.
 - Recharge URL appears only for token, valid-token, or real balance states.
 - Recharge URL appears only for token, valid-token, or real balance states.
 - No token value appears in output.
 - No token value appears in output.

+ 2 - 2
claude-code/claude-code-voc-intelligence/docs/deliverables/seven-day-content-plan.md

@@ -8,7 +8,7 @@
 
 
 - 下周账号发什么。
 - 下周账号发什么。
 - 根据这些顾客吐槽生成 7 天口播。
 - 根据这些顾客吐槽生成 7 天口播。
-- 把排队久、人均贵、怕踩雷变成视频脚本。
+- 把第一次买怎么选、价格贵、怕踩雷变成视频脚本。
 
 
 ## 输入字段
 ## 输入字段
 
 
@@ -38,7 +38,7 @@
 ## 验收标准
 ## 验收标准
 
 
 - 每条内容必须绑定一个 VOC 用户问题。
 - 每条内容必须绑定一个 VOC 用户问题。
-- 口播要能被餐饮老板直接照着拍。
+- 口播要能被老板直接照着拍。
 - 不输出泛泛爆款标题。
 - 不输出泛泛爆款标题。
 - 不覆盖创始人故事。
 - 不覆盖创始人故事。
 - 发布后要引导把评论反馈放回 VOC 问题池。
 - 发布后要引导把评论反馈放回 VOC 问题池。

+ 1 - 1
claude-code/claude-code-voc-intelligence/docs/deliverables/single-problem-action-plan.md

@@ -7,7 +7,7 @@
 老板语言入口:
 老板语言入口:
 
 
 - 这个问题老板怎么解决。
 - 这个问题老板怎么解决。
-- 继续深挖排队/价格/服务/味道
+- 继续深挖怎么选/价格/服务/质量
 - 这个差评背后到底是什么问题。
 - 这个差评背后到底是什么问题。
 - 这个动作有效/无效,后面怎么调整。
 - 这个动作有效/无效,后面怎么调整。
 
 

+ 1 - 1
claude-code/claude-code-voc-intelligence/docs/deliverables/trend-insight-report.md

@@ -7,7 +7,7 @@
 老板语言入口:
 老板语言入口:
 
 
 - 帮我看这个品类最近顾客在关心什么。
 - 帮我看这个品类最近顾客在关心什么。
-- 看看南昌餐饮最近有什么机会。
+- 看看家居定制最近有什么机会。
 - 跑一份小红书/抖音趋势情报。
 - 跑一份小红书/抖音趋势情报。
 
 
 ## 输入字段
 ## 输入字段

+ 6 - 6
claude-code/claude-code-voc-intelligence/docs/live-manual-acceptance-checklist.md

@@ -13,7 +13,7 @@
 ## 小红书 live 最小验收
 ## 小红书 live 最小验收
 
 
 ```bash
 ```bash
-node ".claude/plugins/voc-intelligence/mcp/src/tools/xiaohongshu-trend-run.js" --collection-mode live --industry "本地生活餐饮" --keywords "南昌美食,南昌菜" --keyword-limit 1 --notes-per-keyword 1 --max-comment-pages 1 --output "outputs/live-acceptance-xhs" --result-prefix XHS_TREND_RESULT
+node ".claude/plugins/voc-intelligence/mcp/src/tools/xiaohongshu-trend-run.js" --collection-mode live --industry "家居定制" --keywords "全屋定制,家居定制怎么选" --keyword-limit 1 --notes-per-keyword 1 --max-comment-pages 1 --output "outputs/live-acceptance-xhs" --result-prefix XHS_TREND_RESULT
 ```
 ```
 
 
 验收标准:
 验收标准:
@@ -26,7 +26,7 @@ node ".claude/plugins/voc-intelligence/mcp/src/tools/xiaohongshu-trend-run.js" -
 ## 抖音 live 最小验收
 ## 抖音 live 最小验收
 
 
 ```bash
 ```bash
-node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --collection-mode live --industry "本地生活餐饮" --keywords "南昌美食,南昌菜" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 1 --output "outputs/live-acceptance-douyin" --result-prefix DOUYIN_TREND_RESULT
+node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --collection-mode live --industry "家居定制" --keywords "全屋定制,家居定制怎么选" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 1 --output "outputs/live-acceptance-douyin" --result-prefix DOUYIN_TREND_RESULT
 ```
 ```
 
 
 验收标准:
 验收标准:
@@ -41,11 +41,11 @@ node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --coll
 用于确认“搜索请求错误误报余额不足”的问题已经被拦住:
 用于确认“搜索请求错误误报余额不足”的问题已经被拦住:
 
 
 ```bash
 ```bash
-node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --collection-mode live --industry "茶饮" --business-type "茶饮连锁" --target-audience "新客" --keywords "茶饮18元22元" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 0 --cache-assets false --output "outputs/live-acceptance-douyin-keyword" --result-prefix DOUYIN_TREND_RESULT
+node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --collection-mode live --industry "家居定制" --business-type "全屋定制品牌" --target-audience "新客" --keywords "家居定制18元22元" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 0 --cache-assets false --output "outputs/live-acceptance-douyin-keyword" --result-prefix DOUYIN_TREND_RESULT
 ```
 ```
 
 
 验收标准:
 验收标准:
-- `茶饮18元22元` 应被规范成 `茶饮 18元 22元`,报告中的关注关键词也应显示规范化后的词。
+- `家居定制18元22元` 应被规范成 `家居定制 18元 22元`,报告中的关注关键词也应显示规范化后的词。
 - 如果上游返回 `社交平台接口请求错误` 或 5xx,工具应先自动换短关键词重试。
 - 如果上游返回 `社交平台接口请求错误` 或 5xx,工具应先自动换短关键词重试。
 - 自动修复仍失败时,状态应为 `needs_keyword_fix`,不应出现充值链接。
 - 自动修复仍失败时,状态应为 `needs_keyword_fix`,不应出现充值链接。
 - 只有 `needs_token`、`needs_recharge`、`needs_valid_token` 才展示充值/开通链接。
 - 只有 `needs_token`、`needs_recharge`、`needs_valid_token` 才展示充值/开通链接。
@@ -53,11 +53,11 @@ node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --coll
 ## 单点 VOC 记忆验收
 ## 单点 VOC 记忆验收
 
 
 ```bash
 ```bash
-node ".claude/plugins/voc-intelligence/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "排队" --project "样板门店A" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --feedback "这个店不想做等位饮品,更想先改评论区回复和预点单" --assistant-message-only
+node ".claude/plugins/voc-intelligence/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "怎么选" --project "示例品牌A" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --feedback "这个品牌不想做试用体验,更想先改评论区回复和案例展示" --assistant-message-only
 ```
 ```
 
 
 验收标准:
 验收标准:
 
 
 - 输出有“优先级判断、老板视角影响、可执行解决动作、7 天验证计划、下轮验证指标”。
 - 输出有“优先级判断、老板视角影响、可执行解决动作、7 天验证计划、下轮验证指标”。
-- “等位饮品”只能出现在“已应用的使用记忆”,不能出现在“可执行解决动作”。
+- “试用体验”只能出现在“已应用的使用记忆”,不能出现在“可执行解决动作”。
 - 默认记忆文件按项目/行业/场景/人群隔离,不应污染其它行业或其它客户。
 - 默认记忆文件按项目/行业/场景/人群隔离,不应污染其它行业或其它客户。

+ 1 - 1
claude-code/claude-code-voc-intelligence/install.js

@@ -151,7 +151,7 @@ function printNextSteps({ claudeAvailable }) {
   console.log('Next step:');
   console.log('Next step:');
   console.log(`  1. Start Claude Code with: ${loadCommand}`);
   console.log(`  1. Start Claude Code with: ${loadCommand}`);
   console.log('  2. In Claude Code, say:');
   console.log('  2. In Claude Code, say:');
-  console.log('     帮我看一下南昌餐饮最近顾客在关心什么,并告诉我先改哪里、下周发什么。');
+  console.log('     帮我看一下家装全屋定制最近用户在关心什么,并告诉我先改哪里、下周发什么。');
   console.log('  或者说:');
   console.log('  或者说:');
   console.log('     帮我做一份家装全屋定制行业的小红书趋势情报。');
   console.log('     帮我做一份家装全屋定制行业的小红书趋势情报。');
   console.log('     先用演示样例跑通流程,不要真实采集。');
   console.log('     先用演示样例跑通流程,不要真实采集。');

+ 1 - 1
claude-code/claude-code-voc-intelligence/mcp/src/features/douyin-trend/live-collector.js

@@ -226,7 +226,7 @@ function buildKeywordRepairCandidates(keyword, profile = {}) {
   return [
   return [
     withoutPrice,
     withoutPrice,
     normalizeSearchKeyword([base, '性价比', audience].filter(Boolean).join(' ')),
     normalizeSearchKeyword([base, '性价比', audience].filter(Boolean).join(' ')),
-    normalizeSearchKeyword([base, '套餐', '点单'].join(' ')),
+    normalizeSearchKeyword([base, '怎么选', '推荐'].join(' ')),
     normalizeSearchKeyword([base, '避坑', audience].filter(Boolean).join(' '))
     normalizeSearchKeyword([base, '避坑', audience].filter(Boolean).join(' '))
   ]
   ]
     .filter(candidate => candidate && candidate !== current && isUsableKeyword(candidate))
     .filter(candidate => candidate && candidate !== current && isUsableKeyword(candidate))

+ 1 - 1
claude-code/claude-code-voc-intelligence/mcp/src/features/voc-business-workflow/business-workflow.js

@@ -60,7 +60,7 @@ async function runBusinessWorkflow(input = {}) {
     : 'douyin';
     : 'douyin';
   const collectionMode = input.collectionMode || input['collection-mode'] || 'sample';
   const collectionMode = input.collectionMode || input['collection-mode'] || 'sample';
   const project = firstText(input.project, input.brand, input.store, 'VOC经营闭环');
   const project = firstText(input.project, input.brand, input.store, 'VOC经营闭环');
-  const industry = firstText(input.industry, input.category, '本地生活餐饮');
+  const industry = firstText(input.industry, input.category, '通用行业');
   const brand = firstText(input.brand, input.store, project);
   const brand = firstText(input.brand, input.store, project);
   const scenario = firstText(input.scenario, input.scene, '经营诊断');
   const scenario = firstText(input.scenario, input.scene, '经营诊断');
   const audience = firstText(input.audience, input.targetAudience, '目标用户');
   const audience = firstText(input.audience, input.targetAudience, '目标用户');

+ 28 - 28
claude-code/claude-code-voc-intelligence/mcp/src/features/voc-competitor-map/competitor-map.js

@@ -3,24 +3,24 @@ const path = require('path');
 
 
 const DEFAULT_COMPETITOR_TYPES = [
 const DEFAULT_COMPETITOR_TYPES = [
   {
   {
-    name: '同城同品类强势门店',
-    why: '抢同一批顾客的正餐/聚餐选择。',
-    praised: ['招牌菜记忆点强', '排队带来热闹感', '内容里菜品视觉冲击强'],
-    complained: ['排队久', '人均不透明', '第一次来不知道怎么点'],
-    opportunity: '不要只学热闹,要把“第一次来怎么点、几点来更舒服、哪些人适合来”讲清楚。'
+    name: '同品类强势对手',
+    why: '抢同一批用户的选择。',
+    praised: ['核心卖点记忆点强', '声量带来热度', '内容视觉冲击强'],
+    complained: ['响应慢', '价格不透明', '第一次接触不知道怎么选'],
+    opportunity: '不要只学热闹,要把“第一次怎么选、什么时候适合、哪些人适合”讲清楚。'
   },
   },
   {
   {
-    name: '同价格带高口碑门店',
+    name: '同价格带高口碑对手',
     why: '用户会拿它来判断“值不值”。',
     why: '用户会拿它来判断“值不值”。',
-    praised: ['套餐清晰', '服务稳定', '出品稳定'],
-    complained: ['贵', '菜品不够惊喜', '高峰体验下降'],
-    opportunity: '用价值解释和套餐路径降低第一次决策成本。'
+    praised: ['方案清晰', '服务稳定', '交付稳定'],
+    complained: ['贵', '亮点不够惊喜', '高峰体验下降'],
+    opportunity: '用价值解释和方案路径降低第一次决策成本。'
   },
   },
   {
   {
-    name: '内容平台声量高的网红',
-    why: '影响用户种草预期和探店选择。',
+    name: '内容平台声量高的网红对手',
+    why: '影响用户种草预期和选择。',
     praised: ['画面好看', '话题性强', '适合拍照分享'],
     praised: ['画面好看', '话题性强', '适合拍照分享'],
-    complained: ['到店落差', '滤镜重', '不好吃或不稳定'],
+    complained: ['实际落差', '滤镜重', '质量不稳定'],
     opportunity: '用真实场景和避坑表达建立信任,不和对方拼滤镜。'
     opportunity: '用真实场景和避坑表达建立信任,不和对方拼滤镜。'
   }
   }
 ];
 ];
@@ -46,26 +46,26 @@ function collectEvidence(input = {}) {
     return report
     return report
       .split(/\r?\n/)
       .split(/\r?\n/)
       .map(line => line.trim())
       .map(line => line.trim())
-      .filter(line => /评论|吐槽|担心|排队|贵|招牌|服务|好吃|不好吃|人均|套餐/.test(line))
+      .filter(line => /评论|吐槽|担心|价格|贵|卖点|服务|效果|质量|不值|方案|怎么选/.test(line))
       .slice(0, 50);
       .slice(0, 50);
   }
   }
   return [
   return [
-    '排队是排队,但第一次来真的不知道点什么。',
-    '人均有点高,如果没有套餐说明会犹豫。',
-    '视频里很种草,到店以后最怕落差。',
-    '招牌菜好吃,但高峰期服务有点跟不上。',
-    '如果老板能讲清楚适合几个人吃,会更容易决定。'
+    '第一次接触真的不知道怎么选。',
+    '价格有点高,如果没有方案说明会犹豫。',
+    '内容里很种草,实际拿到最怕落差。',
+    '核心做得不错,但高峰期响应有点跟不上。',
+    '如果能讲清楚适合什么人用,会更容易决定。'
   ];
   ];
 }
 }
 
 
 function inferSignals(evidence = []) {
 function inferSignals(evidence = []) {
   const text = evidence.join('\n');
   const text = evidence.join('\n');
   const signals = [];
   const signals = [];
-  if (/排队|等位|等待/.test(text)) signals.push({ term: '排队/等位', risk: '热度带来期待,也带来体验压力' });
-  if (/贵|人均|性价比|值不值|套餐/.test(text)) signals.push({ term: '价格/套餐', risk: '用户需要更清晰的价值解释和点单路径' });
-  if (/招牌|特色|好吃|不好吃|味道/.test(text)) signals.push({ term: '招牌菜/味道', risk: '招牌要从菜名变成可复述的口味记忆' });
-  if (/服务|没人理|态度|卫生|环境/.test(text)) signals.push({ term: '服务/现场体验', risk: '高峰体验会影响复购和差评' });
-  if (/视频|种草|网红|滤镜|落差/.test(text)) signals.push({ term: '内容预期/到店落差', risk: '内容表达需要更真实,主动讲适合谁不适合谁' });
+  if (/怎么选|不会选|第一次|踩雷|决策/.test(text)) signals.push({ term: '选择门槛', risk: '信息太多,用户判断成本高' });
+  if (/贵|价格|性价比|值不值|方案/.test(text)) signals.push({ term: '价格/方案', risk: '用户需要更清晰的价值解释和选择路径' });
+  if (/卖点|特色|效果|质量|不稳定/.test(text)) signals.push({ term: '核心价值/质量', risk: '卖点要从名头变成可复述的价值记忆' });
+  if (/服务|没人理|态度|响应|售后/.test(text)) signals.push({ term: '服务/响应', risk: '高峰体验会影响复购和差评' });
+  if (/视频|种草|网红|滤镜|落差/.test(text)) signals.push({ term: '内容预期/落差', risk: '内容表达需要更真实,主动讲适合谁不适合谁' });
   return signals.length ? signals : [
   return signals.length ? signals : [
     { term: '用户决策不清晰', risk: '需要先补充竞品评论和用户真实反馈' }
     { term: '用户决策不清晰', risk: '需要先补充竞品评论和用户真实反馈' }
   ];
   ];
@@ -81,7 +81,7 @@ function buildCompetitorCandidates(input = {}) {
     }));
     }));
   }
   }
   const city = String(input.city || input.region || '本地').trim();
   const city = String(input.city || input.region || '本地').trim();
-  const category = String(input.category || input.industry || '餐饮').trim();
+  const category = String(input.category || input.industry || '通用品类').trim();
   return DEFAULT_COMPETITOR_TYPES.map(item => ({
   return DEFAULT_COMPETITOR_TYPES.map(item => ({
     name: `${city}${category}${item.name}`,
     name: `${city}${category}${item.name}`,
     type: item.name,
     type: item.name,
@@ -92,9 +92,9 @@ function buildCompetitorCandidates(input = {}) {
 function buildCompetitorMap(input = {}) {
 function buildCompetitorMap(input = {}) {
   const brand = String(input.project || input.brand || input.store || '你的品牌').trim();
   const brand = String(input.project || input.brand || input.store || '你的品牌').trim();
   const city = String(input.city || input.region || '本地').trim();
   const city = String(input.city || input.region || '本地').trim();
-  const category = String(input.category || input.industry || '餐饮').trim();
+  const category = String(input.category || input.industry || '通用品类').trim();
   const priceBand = String(input.priceBand || input.price || '未指定').trim();
   const priceBand = String(input.priceBand || input.price || '未指定').trim();
-  const scene = String(input.scenario || input.scene || '到店消费/聚餐/日常就餐').trim();
+  const scene = String(input.scenario || input.scene || '线上咨询/到店体验/日常使用').trim();
   const evidence = collectEvidence(input);
   const evidence = collectEvidence(input);
   const signals = inferSignals(evidence);
   const signals = inferSignals(evidence);
   const candidates = buildCompetitorCandidates(input);
   const candidates = buildCompetitorCandidates(input);
@@ -110,7 +110,7 @@ function buildCompetitorMap(input = {}) {
   const opportunities = signals.map(signal => ({
   const opportunities = signals.map(signal => ({
     signal: signal.term,
     signal: signal.term,
     risk: signal.risk,
     risk: signal.risk,
-    action: `${brand} 可以围绕“${signal.term}”做错位表达:讲清楚适合谁、怎么点、什么时候来、为什么值,而不是只说好吃或热闹。`,
+    action: `${brand} 可以围绕“${signal.term}”做错位表达:讲清楚适合谁、怎么选、什么时候用、为什么值,而不是只说好或热闹。`,
     contentAngle: `从用户关心的“${signal.term}”切入,拍一条老板解释型视频。`
     contentAngle: `从用户关心的“${signal.term}”切入,拍一条老板解释型视频。`
   }));
   }));
 
 
@@ -123,7 +123,7 @@ function buildCompetitorMap(input = {}) {
     '- 下一步可以直接转成问题池、单点深挖或 7 天内容选题。',
     '- 下一步可以直接转成问题池、单点深挖或 7 天内容选题。',
     '',
     '',
     '## 业务口径',
     '## 业务口径',
-    `- 品牌/门店:${brand}`,
+    `- 品牌:${brand}`,
     `- 城市/区域:${city}`,
     `- 城市/区域:${city}`,
     `- 品类:${category}`,
     `- 品类:${category}`,
     `- 价格带:${priceBand}`,
     `- 价格带:${priceBand}`,

+ 67 - 220
claude-code/claude-code-voc-intelligence/mcp/src/features/voc-content-plan/content-plan.js

@@ -3,147 +3,74 @@ const path = require('path');
 
 
 const DEFAULT_VOC_ISSUES = [
 const DEFAULT_VOC_ISSUES = [
   {
   {
-    issue: '第一次怕踩雷',
-    insight: '用户不是不想来,而是不知道怎么点才稳。',
-    title: '第一次来我们店,照这个顺序点不容易踩雷',
-    hook: '第一次来别一上来就乱点,这 3 个菜最稳。',
-    script: '第一次来我们店,如果你怕点多了浪费、点错了踩雷,可以先按这个顺序来。第一道点招牌菜,先判断口味是不是你喜欢的;第二道点一个下饭菜,适合两三个人一起分;第三道再点一个清爽解腻的。这样人均更稳,也更容易吃出这家店的特色。',
-    shots: ['菜单特写', '招牌菜出餐', '老板解释点单顺序', '顾客桌面组合'],
-    commentPrompt: '第一次来你最怕点错什么?评论区告诉我,我帮你搭配。',
-    metric: '评论里“怎么点/第一次来/套餐/人均”的提问是否增加'
+    issue: '第一次了解怕踩雷',
+    insight: '用户不是不想选,而是不知道怎么判断才稳。',
+    title: '第一次了解我们,按这个顺序看不容易踩雷',
+    hook: '第一次接触别急着下决定,先看这 3 点最稳。',
+    script: '第一次了解我们,如果你怕选错、怕花冤枉钱,可以先按这个顺序判断。第一步先看核心产品或服务能不能解决你最关心的问题;第二步看真实用户的反馈和案例;第三步再对比价格和适配度。这样你不是盲选,而是在判断到底值不值。',
+    shots: ['产品/服务全貌', '核心卖点特写', '真实案例展示', '用户使用场景'],
+    commentPrompt: '第一次了解你最担心什么?评论区告诉我,我帮你判断。',
+    metric: '评论里“怎么选/第一次/适不适合/怎么对比”的提问是否增加'
   },
   },
   {
   {
-    issue: '觉得人均贵',
-    insight: '用户真正想知道的是贵在哪里、值不值、怎么更划算。',
-    title: '为什么这顿饭人均不算低,但很多老客还会再来',
-    hook: '如果你只看人均,会觉得我们不便宜,但这几个地方才是成本。',
-    script: '很多顾客第一次看人均会犹豫,所以今天直接讲清楚。我们贵的地方不是装修噱头,而是这几类食材、这道招牌菜的处理时间,还有高峰期也要保持稳定出品。第一次来不建议乱点,可以先按两人/四人套餐吃,既能吃到招牌,也不会一下子超预算。',
-    shots: ['食材近景', '后厨处理过程', '招牌菜上桌', '套餐组合价格牌'],
-    commentPrompt: '想看两人不踩雷点单,还是四人聚餐点单?',
-    metric: '评论里“贵/值不值”下降,“套餐/怎么点”上升'
+    issue: '觉得价格贵',
+    insight: '用户真正想知道的是贵在哪里、值不值、怎么更划算。',
+    title: '为什么我们不是最便宜的,但很多老用户还会复购',
+    hook: '如果你只看价格,会觉得我们不便宜,但这几个地方才是成本。',
+    script: '很多用户第一次看价格会犹豫,所以今天直接讲清楚。我们贵的地方不是噱头,而是这几项投入、这套服务的稳定性,还有长期使用的保障。第一次不建议盲选,可以先从入门方案开始,既能体验核心价值,也不会一下子超预算。',
+    shots: ['成本构成展示', '服务/工艺过程', '前后效果对比', '不同方案价格说明'],
+    commentPrompt: '想看入门方案怎么选,还是进阶方案怎么搭配?',
+    metric: '评论里“贵/值不值”下降,“方案/怎么选”上升'
   },
   },
   {
   {
-    issue: '怕排队久',
-    insight: '排队问题可以转成预期管理和到店攻略。',
-    title: '不想排太久,建议你这几个时间来',
-    hook: '想吃但怕排队,先记住这 3 个时间点。',
-    script: '我们高峰期确实会排队,但不是任何时间都要等。一般来说,工作日早点来更舒服,周末建议避开正餐最高峰。如果你已经在路上,可以先看评论区置顶的等位提示,或者提前想好要点的招牌菜,到店后更快决定。',
-    shots: ['门口等位情况', '非高峰空桌', '等位提示牌', '招牌菜快剪'],
-    commentPrompt: '你更想知道排队时间,还是想先看点单攻略?',
-    metric: '评论里“几点去/要等多久”的咨询是否变成可引导问题'
+    issue: '担心买了不适合自己',
+    insight: '适配焦虑要用“适合谁、不适合谁”来降低。',
+    title: '这个适合谁、不适合谁,我直接说清楚',
+    hook: '先说不适合什么人,再说适合什么人。',
+    script: '我们不想只讲好的一面,所以今天直接说清楚。我们适合这类需求、这种预算、这种使用场景的人;如果你的情况是另外几种,可能要先看看其他选择。讲清楚不适合谁,反而能减少你拿到手之后的落差。',
+    shots: ['不同人群标签', '适配场景对比', '真实使用反馈', '正面说明'],
+    commentPrompt: '你的需求和预算大概是什么?我帮你判断适不适合。',
+    metric: '评论里“适不适合/像我这种/能不能用”的互动是否增加'
   },
   },
   {
   {
-    issue: '不知道招牌菜是什么',
-    insight: '招牌菜要从“老板推荐”变成“不同人群怎么选”。',
-    title: '第一次来,老板不建议你把所有招牌都点一遍',
-    hook: '招牌菜不是越多越好,第一次来先点这几个就够。',
-    script: '很多人第一次来会问哪个最招牌。我的建议是不要一次点太多,先按口味选。如果你喜欢重口味,先点这一道;如果带孩子或者长辈,先点更稳的这一道;如果是朋友聚餐,再加一个适合分享的菜。招牌不是让你多花钱,而是帮你少踩雷。',
-    shots: ['三道菜并排', '不同人群标签', '老板手指菜单', '夹菜试吃'],
-    commentPrompt: '你是重口味、带家人,还是朋友聚餐?我给你推荐点法。',
-    metric: '评论里“招牌/推荐/带孩子/聚餐”的提问是否增加'
+    issue: '不知道核心差异是什么',
+    insight: '卖点要从“我们很好”讲到“为什么和别人不一样”。',
+    title: '别人也在做,我们到底不一样在哪',
+    hook: '不是所有卖点都重要,但这一个差异值得你了解。',
+    script: '很多同行都说自己好,但用户真正想知道的是差异在哪。我们最核心的不是参数堆叠,而是这个做法、这套体验和这类长期结果。第一次了解,你可以不用全看完,但一定要看这一点,因为它最能代表我们想做的事。',
+    shots: ['核心差异演示', '关键细节特写', '用户真实反应', '对比说明'],
+    commentPrompt: '你选这类产品或服务时,最看重哪个点?',
+    metric: '收藏、转发、评论里“想了解/值得/怎么联系”的信号是否增加'
   },
   },
   {
   {
-    issue: '担心服务忙不过来',
-    insight: '服务焦虑要用流程透明和高峰期提醒来降低。',
-    title: '高峰期来吃饭,先知道这几个小提醒',
-    hook: '我们忙的时候,最怕顾客不知道该找谁。',
-    script: '高峰期服务压力确实更大,所以我们把几个常见问题提前说清楚。加菜、催菜、打包、开发票分别找哪里,桌上也会放提示。你来吃饭不用猜流程,遇到问题直接按提示找对应的人,我们也会持续优化高峰期响应。',
-    shots: ['桌面提示牌', '服务员动线', '加菜流程', '收银台/打包区'],
-    commentPrompt: '你最在意上菜速度、服务响应,还是环境卫生?',
-    metric: '评论里“没人理/服务慢”下降,“流程/提示”正向反馈增加'
+    issue: '担心售后服务跟不上',
+    insight: '服务焦虑要用流程透明和响应承诺来降低。',
+    title: '买之前先知道:出问题找谁、多久响应',
+    hook: '我们最怕的是你遇到问题不知道该找谁。',
+    script: '售后和服务是很多人下单前最担心的,所以我们把流程提前说清楚。咨询、售后、退换、维护分别走哪个入口,多久能响应,都有明确说明。你不用猜流程,遇到问题直接按指引找对应的人,我们也会持续优化响应速度。',
+    shots: ['服务流程图', '响应承诺说明', '售后入口', '真实处理记录'],
+    commentPrompt: '你最在意响应速度、解决能力,还是后续保障?',
+    metric: '评论里“没人管/服务慢”下降,“流程/保障”正向反馈增加'
   },
   },
   {
   {
-    issue: '内容看着种草,到店怕落差',
+    issue: '内容看着种草,实际怕落差',
     insight: '内容要降低夸张表达,主动讲适合谁、不适合谁。',
     insight: '内容要降低夸张表达,主动讲适合谁、不适合谁。',
-    title: '这家店适合谁,不适合谁,老板直接说清楚',
-    hook: '先说缺点,再说适合什么人。',
-    script: '我们不想只拍滤镜很好看的视频,所以今天直接说清楚。我们适合喜欢这种口味、愿意接受高峰等位、想吃本地特色的人;如果你只想安安静静坐很久,或者完全不能吃辣,可能要提前避开某些菜。讲清楚不适合谁,反而能减少到店落差。',
-    shots: ['真实门店环境', '无滤镜菜品', '高峰现场', '老板正面说明'],
-    commentPrompt: '你之前最想先知道优点还是缺点?',
+    title: '不想只拍好看的,今天把真实情况说清楚',
+    hook: '先说缺点,再说适合什么人。',
+    script: '我们不想只拍滤镜很好看的内容,所以今天直接说清楚。我们适合这类需求、愿意接受这些前提的人;如果你期待的是另外几种效果,可能要提前了解清楚。讲清楚真实情况,反而能减少你接触之后的落差。',
+    shots: ['真实场景', '无滤镜实拍', '真实使用过程', '正面说明'],
+    commentPrompt: '你接触之前最想先知道优点还是缺点?',
     metric: '评论里“真实/避坑/适合谁”的互动是否增加'
     metric: '评论里“真实/避坑/适合谁”的互动是否增加'
   },
   },
   {
   {
-    issue: '不知道为什么值得专门来',
-    insight: '门店内容要把特色从“好吃”讲到“为什么值得来”。',
-    title: '如果你只来一次,建议把这顿饭吃明白',
-    hook: '不是所有菜都要点,但这一个理由值得你来一次。',
-    script: '很多店都说自己好吃,但顾客真正想知道为什么值得专门来。我们这家店最核心的不是菜名,而是这个做法、这个口味记忆和这类用餐场景。第一次来,你可以不用点满一桌,但一定要试这一道,因为它最能代表我们想做的味道。',
-    shots: ['核心菜品制作', '口味细节', '顾客夹菜反应', '门头和桌面氛围'],
-    commentPrompt: '你会为了哪种味道专门跑一趟?',
-    metric: '收藏、转发、评论里“想去/值得去/地址”的信号是否增加'
-  }
-];
-
-const TEA_VOC_ISSUES = [
-  {
-    issue: '第一次来怎么点最稳',
-    insight: '新客不是不想买,而是不知道先点哪一杯最能判断这家店稳不稳。',
-    title: '第一次来这家店,照这个顺序点不容易踩雷',
-    hook: '第一次来别乱点,先用这 3 步判断值不值。',
-    script: '第一次喝一家茶饮,别一上来就冲最复杂的新品。先点一杯招牌基础款,看茶底、奶感和甜度稳不稳;第二杯再选你平时喜欢的方向,比如茶感重、奶感重或者清爽型;第三步才考虑加料和特殊口味。这样你不是盲试,而是在判断这家店到底值不值得复购。',
-    shots: ['门头/点单台', '菜单首单推荐区', '三杯不同口味摆拍', '店员指菜单说明'],
-    commentPrompt: '第一次来你最怕点错什么?评论区说口味,我帮你选更稳的点法。',
-    metric: '评论里“第一次来/怎么点/推荐哪个/踩雷”的提问是否增加'
-  },
-  {
-    issue: '18-22 元贵在哪/值在哪',
-    insight: '18-22 元不是绝对贵,关键是用户能不能看见原料、茶底、口味稳定性和适合人群。',
-    title: '18-22 元到底贵不贵?先看这 3 个地方',
-    hook: '你以为贵的是价格,其实要看这杯值不值。',
-    script: '很多人看到 18 到 22 元会先问贵不贵。我的建议是别只看标价,先看三件事:茶底是不是清楚,甜度和口味是不是稳定,配料是不是适合你。如果一杯喝完你觉得茶味、奶感、甜度都在线,而且不会喝完后悔,那它讨论的就不是便宜,而是值不值。',
-    shots: ['价格牌特写', '茶底/原料展示', '出杯过程', '成品和口味标签'],
-    commentPrompt: '你判断一杯茶饮值不值,最看价格、茶底还是口味稳定?',
-    metric: '评论里“贵/值不值”减少,“茶底/口味/适合谁”的讨论增加'
-  },
-  {
-    issue: '券后价和套餐怎么买最划算',
-    insight: '用户不怕优惠少,怕看不懂规则、加料后超预算、套餐不适合自己。',
-    title: '券后价到底怎么算?新客先看这两行',
-    hook: '别只看标价,真正花多少钱在结算页。',
-    script: '很多新客不是不想下单,是看不懂券后价。你先看两件事:第一,券后总价到底是多少;第二,加料、规格、配送费会不会让预算变高。第一次来不要只冲最低价,先选规则最清楚、口味最稳的套餐。看懂总价和条件,再判断这杯是不是划算。',
-    shots: ['手机点单页', '优惠券/套餐页', '券前券后对比', '结算页总价特写'],
-    commentPrompt: '你最想看券后价怎么算,还是套餐怎么点不超预算?',
-    metric: '评论里“券后/套餐/多少钱/怎么买”的提问是否增加'
-  },
-  {
-    issue: '茶底/甜度/配料怎么选',
-    insight: '茶底、甜度、配料和身体反应已经进入新客决策,不是喝完才考虑。',
-    title: '茶底怎么选?下午喝怕睡不着的先看这条',
-    hook: '怕踩雷,先别看颜值,先看茶底和甜度。',
-    script: '有条评论问得很真实:波霸奶茶用什么茶底,下午喝会不会晚上睡不着。第一次来,先看茶底、甜度和配料。平时不喝浓茶的人,别一上来选茶感特别重的;不爱甜的人,先从低甜度开始;对配料敏感的人,先看清楚加料和奶基底。适合你,才是真的值。',
-    shots: ['茶底展示', '甜度选择页', '配料/加料特写', '店员说明适合人群'],
-    commentPrompt: '你更关心茶底、甜度、配料表,还是喝完会不会睡不着?',
-    metric: '评论里“茶底/甜度/配料/睡不着”的问题数量'
-  },
-  {
-    issue: '哪几款不容易踩雷',
-    insight: '避坑内容比单纯推荐更接近新客转化,因为它降低第一次尝试风险。',
-    title: '第一次来,先点这几类,不容易踩雷',
-    hook: '怕踩雷的,先别追新品,先记住这 3 类。',
-    script: '新客最怕的不是贵,是喝完觉得不适合自己。第一次来建议先点三类:基础招牌款,口味大众款,你平时就喝得惯的方向。先用稳的款判断这家店的基本水平,再去试新品和特殊口味。第一次体验稳了,才有下一次复购。',
-    shots: ['三款稳定单品', '适合人群标签', '试喝反应', '菜单避坑提示'],
-    commentPrompt: '你最怕踩雷的是太甜、太淡、茶味重,还是加料不好吃?',
-    metric: '“避坑/踩雷/推荐哪个/哪款稳”类评论和收藏率'
-  },
-  {
-    issue: '外卖到手怎么避免翻车',
-    insight: '外卖场景会放大冰化、分层、口感变化,新客第一次外卖体验会影响复购。',
-    title: '外卖点茶饮,先看这 3 点,不容易翻车',
-    hook: '外卖点错了,到手那一刻就后悔。',
-    script: '茶饮外卖最容易翻车的地方,不是只有配送慢。你要看这杯适不适合外卖,冰量会不会影响口感,打包到手会不会分层。第一次点外卖,建议选口感更稳定、打包后变化小的款,不要先点特别依赖现做状态的口味。到手体验稳,才有复购。',
-    shots: ['打包流程', '封口和保温细节', '外卖到手状态', '冰量/分层对比'],
-    commentPrompt: '你点茶饮外卖最怕冰化、分层,还是口感变淡?',
-    metric: '外卖相关评论、“到手/冰化/翻车”关键词变化'
-  },
-  {
-    issue: '买一送一/团购规则怎么讲清楚',
-    insight: '低价和买一送一能触发注意,但新客还需要确认规则、口味和有没有坑。',
-    title: '买一送一到底怎么算?先看懂规则再下单',
-    hook: '看起来很划算,但规则你真的看懂了吗?',
-    script: '买一送一、团购、低价新品,确实很容易让人心动。但新客真正关心的是有没有坑。下单前先看三件事:券后到底多少钱,能不能叠加,口味和规格有没有限制。规则讲清楚,顾客才不是因为便宜冲动一次,而是因为第一次体验清楚、放心,愿意再来。',
-    shots: ['活动海报', '团购/买一送一点单页', '规则限制特写', '两杯到手展示'],
-    commentPrompt: '你最常看不懂的是团购规则、券后价,还是买一送一限制?',
-    metric: '“划算/有坑/团购/券后价/怎么买”类评论数量'
+    issue: '不知道为什么值得专门选你',
+    insight: '要把特色从“好”讲到“为什么值得选”。',
+    title: '如果你只选一次,建议把这件事想明白',
+    hook: '不是所有理由都重要,但这一个值得你了解一次。',
+    script: '很多同行都说自己好,但用户真正想知道为什么值得专门选你。我们最核心的不是名头,而是这个方法、这份长期结果和这类真实场景。第一次了解,你可以不用全部记住,但一定要看这一点,因为它最能代表我们的价值。',
+    shots: ['核心价值演示', '长期结果展示', '用户真实反馈', '场景氛围'],
+    commentPrompt: '你会为了哪种结果专门选一家?',
+    metric: '收藏、转发、评论里“想要/值得/怎么联系”的信号是否增加'
   }
   }
 ];
 ];
 
 
@@ -164,105 +91,29 @@ function collectIssues(input = {}) {
   const explicit = splitList(input.issues || input.problems || input.vocIssues || input.contentDirections || input.directions || input.evidence || input.comments);
   const explicit = splitList(input.issues || input.problems || input.vocIssues || input.contentDirections || input.directions || input.evidence || input.comments);
   if (explicit.length) return explicit.slice(0, 12);
   if (explicit.length) return explicit.slice(0, 12);
   const text = String(input.reportText || input.evidenceText || input.context || input.background || '').trim() || readTextIfExists(input.report || input.reportPath);
   const text = String(input.reportText || input.evidenceText || input.context || input.background || '').trim() || readTextIfExists(input.report || input.reportPath);
-  const lines = splitList(text).filter(line => /排队|贵|踩雷|服务|招牌|套餐|人均|不好吃|落差|等位|怎么点|券后|团购|买一送一|茶底|甜度|配料|外卖|翻车|值不值|首单|口味/.test(line));
+  const lines = splitList(text).filter(line => /价格|贵|踩雷|服务|售后|怎么选|适合|不适合|落差|案例|对比|值不值|效果|质量|体验|方案|差异|卖点|为什么|预算/.test(line));
   return lines.length ? lines.slice(0, 12) : DEFAULT_VOC_ISSUES.map(item => item.issue);
   return lines.length ? lines.slice(0, 12) : DEFAULT_VOC_ISSUES.map(item => item.issue);
 }
 }
 
 
-function isTeaScenario(input = {}, issue = '') {
-  const text = [
-    input.industry,
-    input.category,
-    input.businessType,
-    input.evidenceText,
-    input.reportText,
-    input.context,
-    input.background,
-    issue
-  ].filter(Boolean).join(' ');
-  return /茶饮|奶茶|新茶饮|茶底|甜度|波霸|买一送一|券后|外卖|冰化|配料表/.test(text);
-}
-
-function selectTeaTemplateByIntent(issue) {
-  const text = String(issue || '');
-  const findByIssue = (pattern) => TEA_VOC_ISSUES.find(item => pattern.test(item.issue));
-
-  const intentRules = [
-    {
-      textPattern: /买一送一|规则|有坑|低价|9\.9|11\.9|21/,
-      issuePattern: /买一送一/
-    },
-    {
-      textPattern: /券后|套餐|划算|优惠/,
-      issuePattern: /券后价/
-    },
-    {
-      textPattern: /第一次|首单|怎么点|点单/,
-      issuePattern: /第一次来/
-    },
-    {
-      textPattern: /18|22|贵|值不值|性价比|价格/,
-      issuePattern: /18-22/
-    },
-    {
-      textPattern: /茶底|甜度|配料|睡不着|波霸|成分/,
-      issuePattern: /茶底/
-    },
-    {
-      textPattern: /踩雷|避坑|哪几款|稳/,
-      issuePattern: /踩雷/
-    },
-    {
-      textPattern: /外卖|到手|冰化|分层|塌口感|翻车/,
-      issuePattern: /外卖/
-    }
-  ];
-
-  for (const rule of intentRules) {
-    if (rule.textPattern.test(text)) {
-      const matched = findByIssue(rule.issuePattern);
-      if (matched) return matched;
-    }
-  }
-
-  return null;
-}
-
 function inferTemplate(issue, index, input = {}) {
 function inferTemplate(issue, index, input = {}) {
   const text = String(issue || '');
   const text = String(issue || '');
-  if (isTeaScenario(input, text)) {
-    const intentMatched = selectTeaTemplateByIntent(text);
-    if (intentMatched) return intentMatched;
-
-    const teaMatched = TEA_VOC_ISSUES.find(item =>
-      text.includes(item.issue) ||
-      item.issue.includes(text) ||
-      (/第一次|首单|怎么点|点单/.test(text) && item.issue.includes('第一次来')) ||
-      (/18|22|贵|值不值|性价比|价格/.test(text) && item.issue.includes('18-22')) ||
-      (/买一送一|规则|有坑|低价|9\.9|11\.9|21/.test(text) && item.issue.includes('买一送一')) ||
-      (/券后|套餐|划算|优惠/.test(text) && item.issue.includes('券后价')) ||
-      (/茶底|甜度|配料|睡不着|波霸|成分/.test(text) && item.issue.includes('茶底')) ||
-      (/踩雷|避坑|哪几款|稳/.test(text) && item.issue.includes('踩雷')) ||
-      (/外卖|到手|冰化|分层|塌口感|翻车/.test(text) && item.issue.includes('外卖'))
-    );
-    return teaMatched || TEA_VOC_ISSUES[index % TEA_VOC_ISSUES.length];
-  }
   const matched = DEFAULT_VOC_ISSUES.find(item =>
   const matched = DEFAULT_VOC_ISSUES.find(item =>
     text.includes(item.issue) ||
     text.includes(item.issue) ||
-    text.includes(item.issue.replace('第一次来', '')) ||
     item.issue.includes(text) ||
     item.issue.includes(text) ||
-    (/排队|等位|等待/.test(text) && item.issue.includes('排队')) ||
-    (/贵|人均|性价比|值不值/.test(text) && item.issue.includes('人均')) ||
-    (/踩雷|怎么点|点单/.test(text) && item.issue.includes('踩雷')) ||
-    (/招牌|推荐菜|特色菜/.test(text) && item.issue.includes('招牌')) ||
-    (/服务|没人理|态度/.test(text) && item.issue.includes('服务')) ||
-    (/落差|网红|滤镜|种草/.test(text) && item.issue.includes('落差'))
+    (/踩雷|第一次|怎么选|不会选/.test(text) && item.issue.includes('踩雷')) ||
+    (/贵|价格|性价比|值不值|预算/.test(text) && item.issue.includes('价格')) ||
+    (/适合|不适合|适配/.test(text) && item.issue.includes('适合')) ||
+    (/差异|卖点|特色|不一样|区别/.test(text) && item.issue.includes('差异')) ||
+    (/服务|售后|没人管|响应|态度/.test(text) && item.issue.includes('服务')) ||
+    (/落差|种草|滤镜|网红/.test(text) && item.issue.includes('落差')) ||
+    (/为什么|值得|理由/.test(text) && item.issue.includes('值得'))
   );
   );
   return matched || DEFAULT_VOC_ISSUES[index % DEFAULT_VOC_ISSUES.length];
   return matched || DEFAULT_VOC_ISSUES[index % DEFAULT_VOC_ISSUES.length];
 }
 }
 
 
 function buildContentPlan(input = {}) {
 function buildContentPlan(input = {}) {
-  const brand = String(input.project || input.brand || input.store || '你的门店').trim();
-  const industry = String(input.industry || input.category || '本地生活餐饮').trim();
+  const brand = String(input.project || input.brand || input.store || '你的品牌').trim();
+  const industry = String(input.industry || input.category || '通用行业').trim();
   const platform = String(input.platform || '抖音/小红书').trim();
   const platform = String(input.platform || '抖音/小红书').trim();
   const days = Math.max(1, Math.min(Number(input.days || 7), 15));
   const days = Math.max(1, Math.min(Number(input.days || 7), 15));
   const issues = collectIssues(input);
   const issues = collectIssues(input);
@@ -275,9 +126,7 @@ function buildContentPlan(input = {}) {
       insight: template.insight,
       insight: template.insight,
       title: template.title,
       title: template.title,
       hook: template.hook,
       hook: template.hook,
-      script: isTeaScenario(input, sourceIssue)
-        ? template.script
-        : template.script.replace(/我们店/g, brand === '你的门店' ? '我们店' : brand),
+      script: template.script,
       shots: template.shots,
       shots: template.shots,
       commentPrompt: template.commentPrompt,
       commentPrompt: template.commentPrompt,
       validationMetric: template.metric,
       validationMetric: template.metric,
@@ -294,7 +143,7 @@ function buildContentPlan(input = {}) {
     '- 每条都包含前 3 秒钩子、口播脚本、镜头建议、评论区引导和验证指标。',
     '- 每条都包含前 3 秒钩子、口播脚本、镜头建议、评论区引导和验证指标。',
     '',
     '',
     '## 业务口径',
     '## 业务口径',
-    `- 品牌/门店:${brand}`,
+    `- 品牌:${brand}`,
     `- 行业/品类:${industry}`,
     `- 行业/品类:${industry}`,
     `- 发布平台:${platform}`,
     `- 发布平台:${platform}`,
     `- 内容周期:${days} 天`,
     `- 内容周期:${days} 天`,
@@ -313,9 +162,7 @@ function buildContentPlan(input = {}) {
     ].join('\n')),
     ].join('\n')),
     '',
     '',
     '## 拍摄提醒',
     '## 拍摄提醒',
-    isTeaScenario(input, issues.join(' '))
-      ? '- 先拍真实门店、真实饮品、真实点单/出杯/打包流程,不要只拍滤镜氛围。'
-      : '- 先拍真实门店、真实产品、真实服务流程,不要只拍滤镜氛围。',
+    '- 先拍真实场景、真实产品、真实服务流程,不要只拍滤镜氛围。',
     '- 每条内容只解决一个用户问题,避免一条视频讲太多。',
     '- 每条内容只解决一个用户问题,避免一条视频讲太多。',
     '- 发完后把评论里的新问题继续放回 VOC 问题池,下一轮再优化。',
     '- 发完后把评论里的新问题继续放回 VOC 问题池,下一轮再优化。',
     '',
     '',

+ 26 - 26
claude-code/claude-code-voc-intelligence/mcp/src/features/voc-issue-pool/issue-pool.js

@@ -7,36 +7,36 @@ const DEFAULT_MEMORY_DIR = 'voc-issue-pool';
 
 
 const ISSUE_CATEGORIES = [
 const ISSUE_CATEGORIES = [
   {
   {
-    id: 'waiting',
-    title: '排队/等待',
-    terms: ['排队', '等位', '等待', '叫号', '翻台', '等太久'],
+    id: 'decision',
+    title: '选择门槛/决策',
+    terms: ['怎么选', '不会选', '第一次', '踩雷', '对比', '挑花眼'],
     severity: 'high',
     severity: 'high',
-    impact: ['新客转化', '现场效率', '口碑预期'],
-    action: '先统一评论区和门口等位预期,再做 7 天翻台/预点单验证。'
+    impact: ['新客转化', '咨询转化', '口碑预期'],
+    action: '先统一评论区和详情页的“怎么选”路径,再做 7 天入门方案/试用验证。'
   },
   },
   {
   {
     id: 'price',
     id: 'price',
     title: '价格/性价比',
     title: '价格/性价比',
-    terms: ['贵', '价格', '人均', '性价比', '不值', '划算', '预算', '增项'],
+    terms: ['贵', '价格', '性价比', '不值', '划算', '预算', '增项'],
     severity: 'high',
     severity: 'high',
     impact: ['新客转化', '客单结构', '信任'],
     impact: ['新客转化', '客单结构', '信任'],
-    action: '把价格解释成点单路径、价值证据和避坑说明,先降低第一次决策成本。'
+    action: '把价格解释成选择路径、价值证据和避坑说明,先降低第一次决策成本。'
   },
   },
   {
   {
-    id: 'taste_quality',
-    title: '味道/出品稳定',
-    terms: ['不好吃', '味道', '出品', '不稳定', '翻车', '口味', '辣', '咸', '淡'],
+    id: 'quality',
+    title: '质量/交付稳定',
+    terms: ['质量', '品质', '效果', '不稳定', '翻车', '参差', '货不对板', '交付'],
     severity: 'high',
     severity: 'high',
     impact: ['复购', '差评风险', '推荐'],
     impact: ['复购', '差评风险', '推荐'],
-    action: '先盯核心单品 SOP 和高峰期出品稳定,避免内容预期高于门店交付。'
+    action: '先盯核心交付 SOP 和稳定性,避免内容预期高于实际交付。'
   },
   },
   {
   {
     id: 'service',
     id: 'service',
     title: '服务/体验',
     title: '服务/体验',
-    terms: ['服务', '态度', '没人理', '员工', '老板', '体验', '环境', '卫生'],
+    terms: ['服务', '态度', '没人理', '员工', '响应', '售后', '体验'],
     severity: 'medium',
     severity: 'medium',
-    impact: ['复购', '带人到店', '现场效率'],
-    action: '把服务问题拆成高峰岗位、响应话术和现场流程,不只归因员工态度。'
+    impact: ['复购', '转介绍', '响应效率'],
+    action: '把服务问题拆成高峰岗位、响应话术和服务流程,不只归因态度。'
   },
   },
   {
   {
     id: 'product_function',
     id: 'product_function',
@@ -48,10 +48,10 @@ const ISSUE_CATEGORIES = [
   },
   },
   {
   {
     id: 'content_expectation',
     id: 'content_expectation',
-    title: '内容预期/到店落差',
+    title: '内容预期/落差',
     terms: ['网红', '视频', '图片', '滤镜', '种草', '实际', '没有想象', '落差'],
     terms: ['网红', '视频', '图片', '滤镜', '种草', '实际', '没有想象', '落差'],
     severity: 'medium',
     severity: 'medium',
-    impact: ['内容信任', '到店转化', '差评风险'],
+    impact: ['内容信任', '转化', '差评风险'],
     action: '降低夸张表达,改成真实场景、适合谁、不适合谁和避坑提醒。'
     action: '降低夸张表达,改成真实场景、适合谁、不适合谁和避坑提醒。'
   }
   }
 ];
 ];
@@ -156,7 +156,7 @@ function looksLikeVoiceLine(line) {
   if (text.length < 3 || text.length > 180) return false;
   if (text.length < 3 || text.length > 180) return false;
   if (looksGeneratedReportLine(text)) return false;
   if (looksGeneratedReportLine(text)) return false;
   if (/[??!!~~]/.test(text)) return true;
   if (/[??!!~~]/.test(text)) return true;
-  if (/(多少钱|贵|便宜|值不值|划算|人均|套餐|排队|等位|等太久|服务|态度|好吃|不好吃|一般|踩雷|出片|拍照|环境|位置|在哪|校内|校外|想去|不想去|下次|推荐|避雷|大渔|立方铁|火地|炙焰|盛焰)/.test(text)) return true;
+  if (/(多少钱|贵|便宜|值不值|划算|价格|服务|态度|效果|质量|一般|踩雷|怎么选|适合|在哪|想要|不想|下次|推荐|避雷|落差)/.test(text)) return true;
   return false;
   return false;
 }
 }
 
 
@@ -221,11 +221,11 @@ function collectEvidence(input = {}) {
   }
   }
   if (!text) {
   if (!text) {
     return [
     return [
-      '想吃但怕排队,到了现场才发现等位时间不确定。',
-      '排了很久以后,如果菜品普通就会觉得不值。',
-      '人均有点高,第一次来不知道怎么点不踩雷。',
-      '视频看着很种草,实际到店体验没有想象中稳定。',
-      '服务忙起来没人理,问问题不知道找谁。'
+      '想买但不知道怎么选,怕选错踩雷。',
+      '价格有点高,不确定值不值。',
+      '第一次接触,不知道怎么对比才不踩雷。',
+      '内容看着很种草,实际体验没有想象中稳定。',
+      '咨询的时候没人理,问问题不知道找谁。'
     ];
     ];
   }
   }
   const fromReport = extractEvidenceFromReportText(text);
   const fromReport = extractEvidenceFromReportText(text);
@@ -241,10 +241,10 @@ function collectEvidence(input = {}) {
 function matchCategory(text) {
 function matchCategory(text) {
   const normalized = String(text || '');
   const normalized = String(text || '');
   const directRules = [
   const directRules = [
-    ['waiting', /(排队|等位|等待|叫号|翻台|排了很久|等太久)/],
-    ['price', /(多少钱|价格|人均|贵|便宜|性价比|值不值|不值|划算|套餐|预算)/],
-    ['taste_quality', /(不好吃|好吃|味道|出品|不稳定|翻车|口味|咸|淡|新鲜)/],
-    ['service', /(服务|态度|没人理|员工|老板|体验|环境|卫生|位置|校内|校外)/],
+    ['decision', /(怎么选|不会选|第一次|踩雷|对比|挑花眼|不知道选)/],
+    ['price', /(多少钱|价格|贵|便宜|性价比|值不值|不值|划算|预算)/],
+    ['quality', /(质量|品质|效果|不稳定|翻车|参差|货不对板|交付|不好用)/],
+    ['service', /(服务|态度|没人理|员工|响应|售后|体验)/],
     ['content_expectation', /(网红|视频|图片|滤镜|种草|实际|没有想象|落差|出片|拍照|发朋友圈|打卡)/]
     ['content_expectation', /(网红|视频|图片|滤镜|种草|实际|没有想象|落差|出片|拍照|发朋友圈|打卡)/]
   ];
   ];
   for (const [id, pattern] of directRules) {
   for (const [id, pattern] of directRules) {

+ 91 - 91
claude-code/claude-code-voc-intelligence/mcp/src/features/voc-problem-deep-dive/deep-dive.js

@@ -7,69 +7,69 @@ const DEFAULT_MEMORY_DIR = 'voc-problem-deep-dive';
 
 
 const ACTION_TERMS = [
 const ACTION_TERMS = [
   '评论区回复',
   '评论区回复',
-  '预点单',
-  '等位饮品',
-  '等位提示牌',
-  '门口提示牌',
-  '推荐先点',
-  '招牌菜',
-  '套餐',
-  '人均',
-  '点单路径',
+  '答疑话术',
+  '案例展示',
+  '方案说明',
+  '试用体验',
+  '对比清单',
+  '适配建议',
+  '入门方案',
+  '点击路径',
   'SOP',
   'SOP',
   '话术',
   '话术',
   '员工培训',
   '员工培训',
-  '收台',
-  '翻台',
-  '试吃',
+  '质检',
+  '响应机制',
+  '预期管理',
   '内容表达',
   '内容表达',
   '复盘',
   '复盘',
   '优惠券',
   '优惠券',
   '会员',
   '会员',
-  '预约'
+  '预约',
+  '售后流程'
 ];
 ];
 
 
 const ISSUE_PRESETS = [
 const ISSUE_PRESETS = [
   {
   {
-    match: /排队|等位|等待|翻台|叫号/,
-    issue: '排队',
+    match: /怎么选|不会选|第一次|踩雷|决策|对比|挑花眼/,
+    issue: '选择门槛',
     priority: 'high',
     priority: 'high',
     severity: '高',
     severity: '高',
     effort: '中',
     effort: '中',
-    impactTargets: ['新客转化', '复购', '内容口碑', '现场效率'],
-    judgment: '排队不是单纯的服务瑕疵,它同时暴露了预期管理、翻台效率和等位体验三个问题。',
-    surface: '用户表面在说“排队久”。',
-    deeper: '深层问题是等待时间不透明、等待过程没有被照顾、排队抬高了用户对出品的预期。',
+    impactTargets: ['新客转化', '咨询转化', '内容口碑'],
+    judgment: '选择门槛不是用户不想买,而是信息太多、判断成本太高,用户不知道怎么选才稳。',
+    surface: '用户表面在说“不知道怎么选、怕选错”。',
+    deeper: '深层问题是缺少清晰的对比维度、决策路径不透明、没有降低第一次尝试的风险。',
     voices: [
     voices: [
-      '想吃但怕排队,到了现场才发现等位时间不确定。',
-      '排了很久以后,如果菜品没有超出预期,就会觉得不值。',
-      '排队可以接受,但希望知道大概要等多久、值不值得等。'
+      '想买但不知道哪个适合自己。',
+      '选项太多,怕选错踩雷。',
+      '希望有人帮我按需求和预算推荐。'
     ],
     ],
     actionsToday: [
     actionsToday: [
-      '统一评论区和门口话术:告诉用户高峰大概要等多久、几点来更舒服。',
-      '在门口放一个简单等位提示牌:当前桌数、预计等待区间、推荐先点的招牌菜。'
+      '整理一份“新手怎么选”清单:按需求、预算、场景给出推荐路径。',
+      '在评论区和详情页统一一句话告诉用户怎么对比、先看哪几点。'
     ],
     ],
     actions7Days: [
     actions7Days: [
-      '测试预点单或排队先点招牌菜,让用户等待时已经进入消费流程。',
-      '连续记录 7 天点单、出餐、结账、收台时间,找出翻台最长卡点。'
+      '测试一个低门槛的入门方案或试用,承接第一次尝试。',
+      '收集高频选择问题,统一回复对比维度和适配建议。'
     ],
     ],
     actionsLongTerm: [
     actionsLongTerm: [
-      '把等位体验设计成品牌体验的一部分,比如小份试吃、等位饮品、等位菜单。',
-      '把内容表达从“天天排队”升级为“怎么排更值、什么时候来体验最好”。'
+      '建立标准化的选购指南和对比清单。',
+      '把内容表达从“我们很好”升级为“怎么选最稳”。'
     ],
     ],
     content: [
     content: [
-      '别只说南昌烧烤排队,告诉用户几点来不用等太久。',
-      '这家店为什么排队还值得等?只讲 3 个超过预期的点。',
-      '老板视角:排队不是炫耀,是一道必须被管理的用户体验。'
+      '第一次接触我们,照这个顺序判断不容易踩雷。',
+      '别人也在做,怎么对比才不被带偏?',
+      '老板视角:帮用户降低选择成本,比堆卖点更有用。'
     ],
     ],
     metrics: [
     metrics: [
-      '评论里“排队久/等太久/不值”出现次数是否下降。',
-      '评论里“几点去/要等多久/能不能预约”是否变成可引导咨询。',
-      '高峰期门口放弃率、翻台时长、预点单比例是否改善。'
+      '评论里“怎么选/会不会踩雷/适不适合”是否变成可引导咨询。',
+      '入门方案/试用转化是否上升。',
+      '用户是否开始按需求提问而不是直接放弃。'
     ]
     ]
   },
   },
   {
   {
-    match: /贵|价格|人均|性价比|不值|划算/,
+    match: /贵|价格|性价比|不值|划算|预算|超支/,
     issue: '价格/性价比',
     issue: '价格/性价比',
     priority: 'high',
     priority: 'high',
     severity: '高',
     severity: '高',
@@ -77,109 +77,109 @@ const ISSUE_PRESETS = [
     impactTargets: ['新客转化', '客单结构', '评论信任'],
     impactTargets: ['新客转化', '客单结构', '评论信任'],
     judgment: '价格争议通常不是用户单纯嫌贵,而是用户没有感知到“贵在哪里值得”。',
     judgment: '价格争议通常不是用户单纯嫌贵,而是用户没有感知到“贵在哪里值得”。',
     surface: '用户表面在说“贵、不值、超预算”。',
     surface: '用户表面在说“贵、不值、超预算”。',
-    deeper: '深层问题是套餐路径不清楚、招牌菜价值没有被解释、用户不知道怎么点最稳。',
+    deeper: '深层问题是方案路径不清楚、核心价值没有被解释、用户不知道怎么选最划算。',
     voices: [
     voices: [
-      '味道可以,但这个人均会让我犹豫要不要再来。',
-      '如果是请客可以,日常吃就有点贵。',
-      '套餐看起来便宜,但实际点下来超预算。'
+      '东西可以,但这个价格会让我犹豫要不要选。',
+      '如果是重要场景可以,日常用就有点贵。',
+      '方案看起来便宜,实际算下来超预算。'
     ],
     ],
     actionsToday: [
     actionsToday: [
-      '做一个 2 人尝鲜点单路径,写清楚人均、分量和适合场景。',
-      '把招牌菜旁边加一句价值解释:贵在哪里、适合谁、怎么吃更值。'
+      '做一个入门方案,写清楚价格、包含什么、适合谁。',
+      '在核心卖点旁加一句价值解释:贵在哪里、适合谁、怎么用更值。'
     ],
     ],
     actions7Days: [
     actions7Days: [
-      '测试 2 人/4 人/6 人套餐,观察用户是否从质疑价格变成询问套餐。',
-      '整理评论区高频价格问题,统一回复人均区间和不踩雷点法。'
+      '测试入门/进阶/高阶方案,观察用户是否从质疑价格变成询问方案。',
+      '整理评论区高频价格问题,统一回复价格区间和怎么选不踩雷。'
     ],
     ],
     actionsLongTerm: [
     actionsLongTerm: [
-      '建立稳定的新客尝鲜套餐,用低决策成本承接第一次到店。',
-      '把价格表达从“便宜”改成“怎么得值”。'
+      '建立稳定的新客入门方案,用低决策成本承接第一次。',
+      '把价格表达从“便宜”改成“怎么得值”。'
     ],
     ],
     content: [
     content: [
-      '第一次来南昌烧烤,照这个 2 人套餐点不容易踩雷。',
-      '这道招牌菜到底贵在哪?老板只讲真实成本和口味差异。',
-      '人均多少能吃舒服?别让顾客到店才算账。'
+      '第一次选我们,照这个入门方案走不容易踩雷。',
+      '我们到底贵在哪?只讲真实成本和价值差异。',
+      '预算多少能用得舒服?别让用户下单后才算账。'
     ],
     ],
     metrics: [
     metrics: [
-      '评论里“贵/不值/踩雷套餐”是否下降。',
-      '首次套餐销量和招牌菜点单率是否上升。',
-      '用户是否开始在评论里询问套餐而不是直接质疑价格。'
+      '评论里“贵/不值/踩雷”是否下降。',
+      '入门方案转化和核心产品选择率是否上升。',
+      '用户是否开始询问方案而不是直接质疑价格。'
     ]
     ]
   },
   },
   {
   {
-    match: /不好吃|味道|出品|稳定|咸|辣|淡|翻车/,
-    issue: '味道/出品稳定',
+    match: /质量|品质|效果|不稳定|翻车|参差|交付|货不对板/,
+    issue: '质量/交付稳定',
     priority: 'high',
     priority: 'high',
     severity: '高',
     severity: '高',
     effort: '中',
     effort: '中',
     impactTargets: ['复购', '转介绍', '差评风险'],
     impactTargets: ['复购', '转介绍', '差评风险'],
-    judgment: '味道问题最伤复购,老板要先判断是单品问题、批次问题,还是用户预期被内容抬高。',
-    surface: '用户表面在说“不好吃、不稳定、没有视频里那么惊艳”。',
-    deeper: '深层问题是招牌菜标准化不足,内容预期和门店交付没有对齐。',
+    judgment: '质量问题最伤复购,先判断是单点问题、批次问题,还是内容把用户预期抬高了。',
+    surface: '用户表面在说“质量不稳定、没有宣传里那么好”。',
+    deeper: '深层问题是核心交付标准化不足,内容预期和实际交付没有对齐。',
     voices: [
     voices: [
-      '刷到视频很想吃,但到店感觉没有说得那么惊艳。',
-      '有时候好吃,有时候味道不稳定。',
-      '辣度、咸淡和火候不稳定,会影响整桌体验。'
+      '看内容很想要,实际拿到感觉没那么惊艳。',
+      '有时候很好,有时候质量不稳定。',
+      '不同批次/不同人做出来差别大,影响整体体验。'
     ],
     ],
     actionsToday: [
     actionsToday: [
-      '先盯 3 个核心单品,记录咸淡、温度、出餐时间和退换反馈。',
-      '把内容里的夸张表达降下来,改成具体口味描述。'
+      '先盯 3 个核心交付点,记录稳定性、问题反馈和退换情况。',
+      '把内容里的夸张表达降下来,改成具体可验证的描述。'
     ],
     ],
     actions7Days: [
     actions7Days: [
-      '连续 7 天复盘招牌菜差评,区分食材、火候、等待、预期四类原因。',
-      '高峰期暂时减少不稳定 SKU,把出品能力集中到招牌菜。'
+      '连续 7 天复盘差评,区分产品、流程、预期、沟通四类原因。',
+      '暂时收紧不稳定的环节,把交付能力集中到核心。'
     ],
     ],
     actionsLongTerm: [
     actionsLongTerm: [
-      '建立核心单品 SOP 和抽检机制。',
-      '把真实口味标签固定下来,让内容、菜单和服务员表达一致。'
+      '建立核心交付 SOP 和抽检机制。',
+      '把真实能力标签固定下来,让内容、详情和服务表达一致。'
     ],
     ],
     content: [
     content: [
-      '别只说好吃,讲清楚这家烧烤到底是哪种口味。',
-      '老板复盘:一条差评背后的出品稳定问题。',
-      '招牌菜为什么要少而稳?比菜单越多越重要。'
+      '别只说好,讲清楚我们到底强在哪。',
+      '老板复盘:一条差评背后的交付稳定问题。',
+      '为什么核心要少而稳?比堆功能更重要。'
     ],
     ],
     metrics: [
     metrics: [
-      '评论里“没想象中好/不稳定/翻车”是否下降。',
-      '招牌菜复点率和退换反馈是否改善。',
-      '用户是否开始用具体口味词夸菜,而不是只说网红。'
+      '评论里“没想象中好/不稳定/翻车”是否下降。',
+      '复购率和退换反馈是否改善。',
+      '用户是否开始用具体细节夸,而不是只说网红。'
     ]
     ]
   },
   },
   {
   {
-    match: /服务|态度|老板|员工|体验|环境|卫生/,
+    match: /服务|态度|响应|售后|体验|没人理/,
     issue: '服务/体验',
     issue: '服务/体验',
     priority: 'medium',
     priority: 'medium',
     severity: '中',
     severity: '中',
     effort: '低',
     effort: '低',
-    impactTargets: ['复购', '带人到店', '现场效率'],
+    impactTargets: ['复购', '转介绍', '响应效率'],
     judgment: '服务体验问题不是一句“培训员工”能解决,而是高峰压力、流程缺口和话术不统一共同造成的。',
     judgment: '服务体验问题不是一句“培训员工”能解决,而是高峰压力、流程缺口和话术不统一共同造成的。',
-    surface: '用户表面在说“没人理、态度差、环境一般”。',
-    deeper: '深层问题是高峰期岗位分工不清楚,用户遇到等待、催菜、投诉时没有稳定回应。',
+    surface: '用户表面在说“没人理、态度差、响应慢”。',
+    deeper: '深层问题是高峰期分工不清楚,用户遇到咨询、催促、投诉时没有稳定回应。',
     voices: [
     voices: [
       '东西还可以,但服务体验让我下次犹豫。',
       '东西还可以,但服务体验让我下次犹豫。',
-      '忙的时候没人理,问题不知道谁。',
-      '环境和卫生会影响我愿不愿意带朋友来。'
+      '忙的时候没人理,问题不知道谁。',
+      '响应和售后会影响我愿不愿意推荐给别人。'
     ],
     ],
     actionsToday: [
     actionsToday: [
-      '设置高峰期固定响应人,专门处理等位、催菜、加单和投诉。',
-      '统一 5 句高频回应话术,避免员工临场发挥。'
+      '设置高峰期固定响应人,专门处理咨询、催促、追单和投诉。',
+      '统一 5 句高频回应话术,避免临场发挥。'
     ],
     ],
     actions7Days: [
     actions7Days: [
-      '每天复盘 3 条现场问题,记录发生时段、岗位、处理结果。',
-      '把收台、明档、卫生细节做成用户看得见的信任信号。'
+      '每天复盘 3 条服务问题,记录发生时段、环节、处理结果。',
+      '把流程、进度、售后细节做成用户看得见的信任信号。'
     ],
     ],
     actionsLongTerm: [
     actionsLongTerm: [
-      '建立高峰期服务动线和岗位表。',
-      '把服务问题从“员工态度”升级为“流程管理”。'
+      '建立高峰期服务动线和责任表。',
+      '把服务问题从“态度”升级为“流程管理”。'
     ],
     ],
     content: [
     content: [
-      '一家烧烤店真正拉开差距的,不只是味道,还有高峰期体验。',
+      '真正拉开差距的,不只是产品,还有高峰期体验。',
       '老板每天复盘 3 个服务问题,比喊口号更有用。',
       '老板每天复盘 3 个服务问题,比喊口号更有用。',
-      '为什么有些小店环境一般,顾客还是愿意反复来?'
+      '为什么有些品牌产品普通,用户还是愿意反复来?'
     ],
     ],
     metrics: [
     metrics: [
-      '评论里“没人理/态度差/环境差/卫生”是否下降。',
-      '高峰催菜次数、投诉次数、收台时长是否下降。',
-      '带朋友/家庭聚餐相关正向评论是否增加。'
+      '评论里“没人理/态度差/响应慢”是否下降。',
+      '高峰催单次数、投诉次数、响应时长是否下降。',
+      '推荐给别人相关的正向评论是否增加。'
     ]
     ]
   }
   }
 ];
 ];
@@ -411,8 +411,8 @@ function inferPreset(issue, evidenceText = '') {
     ],
     ],
     actionsToday: ['先收集 10 条相关评论,按产品、服务、价格、场景四类归因。'],
     actionsToday: ['先收集 10 条相关评论,按产品、服务、价格、场景四类归因。'],
     actions7Days: ['选择一个最小动作做 7 天验证,看负面表达是否下降。'],
     actions7Days: ['选择一个最小动作做 7 天验证,看负面表达是否下降。'],
-    actionsLongTerm: ['把高频问题沉淀成门店 SOP、内容话术和复盘指标。'],
-    content: ['从一条真实评论看门店怎么改。'],
+    actionsLongTerm: ['把高频问题沉淀成业务 SOP、内容话术和复盘指标。'],
+    content: ['从一条真实评论看业务怎么改。'],
     metrics: ['相关负面词出现次数是否下降。']
     metrics: ['相关负面词出现次数是否下降。']
   };
   };
 }
 }
@@ -600,7 +600,7 @@ function buildDeepDive(input = {}) {
       ...preset.content.map((item, index) => `${index + 1}. ${item}`),
       ...preset.content.map((item, index) => `${index + 1}. ${item}`),
       '',
       '',
       '## 7 天验证计划',
       '## 7 天验证计划',
-      '1. 第 1 天:确定一个门店动作和一个内容动作,不要同时改太多。',
+      '1. 第 1 天:确定一个业务动作和一个内容动作,不要同时改太多。',
       '2. 第 2-4 天:记录相关评论、现场反馈和员工反馈。',
       '2. 第 2-4 天:记录相关评论、现场反馈和员工反馈。',
       '3. 第 5-7 天:复查负面词是否下降,咨询型评论是否增加。',
       '3. 第 5-7 天:复查负面词是否下降,咨询型评论是否增加。',
       '',
       '',

+ 0 - 38
claude-code/claude-code-voc-intelligence/mcp/src/features/xiaohongshu-trend/industry-presets.js

@@ -217,44 +217,6 @@ const PRESETS = [
         comments: ['能不能看往期学员作品,比老师头衔更重要。']
         comments: ['能不能看往期学员作品,比老师头衔更重要。']
       }
       }
     ]
     ]
-  },
-  {
-    id: 'local-dining',
-    label: '本地生活餐饮',
-    aliases: ['餐饮', '咖啡', '本地生活', '探店', '火锅', '烘焙', '小吃', '酒馆'],
-    defaultKeywords: ['本地探店', '餐厅推荐', '咖啡店打卡', '火锅避坑', '团购套餐'],
-    preferenceSignals: ['性价比', '氛围感', '出片', '服务', '口味稳定', '排队', '套餐'],
-    decisionSignals: ['价格', '口味', '分量', '环境', '排队', '服务', '停车', '复购'],
-    elementSignals: ['套餐', '招牌菜', '咖啡', '甜品', '包间', '团购', '位置'],
-    riskSignals: ['踩雷', '照骗', '排队久', '服务差', '分量少', '不值'],
-    applicationLabel: '探店内容或到店转化',
-    talkTarget: '到店用户',
-    sampleNotes: [
-      {
-        title: '探店内容别只拍氛围,评论区最关心值不值',
-        content: '用户会被氛围图吸引,但评论里反复问人均、分量、排队和团购能不能用。',
-        author: '城市吃喝指南',
-        imageLabel: '探店性价比',
-        tags: ['本地探店', '性价比', '团购'],
-        comments: ['图很好看,我就想知道两个人吃完到底多少钱。', '排队一小时就劝退了。']
-      },
-      {
-        title: '咖啡店打卡从出片转向长期复购',
-        content: '评论里除了装修,还在问豆子、甜品、座位和工作日体验。复购理由比一次性打卡更重要。',
-        author: '咖啡店观察',
-        imageLabel: '咖啡店复购',
-        tags: ['咖啡', '氛围', '复购'],
-        comments: ['能坐下来办公吗?如果只能拍照就不会再去了。']
-      },
-      {
-        title: '火锅团购套餐最容易翻车的是隐藏限制',
-        content: '用户对团购套餐很敏感,关注锅底、菜量、节假日能不能用和服务态度。',
-        author: '团购避坑局',
-        imageLabel: '火锅团购避坑',
-        tags: ['火锅', '团购', '套餐'],
-        comments: ['套餐看着便宜,结果锅底和小料另算就不香了。']
-      }
-    ]
   }
   }
 ];
 ];
 
 

+ 1 - 1
claude-code/claude-code-voc-intelligence/mcp/src/server.js

@@ -391,7 +391,7 @@ function createServer() {
         'Use when the user says continue digging, what should the boss do, how to solve this problem, or turn this VOC into actions.'
         'Use when the user says continue digging, what should the boss do, how to solve this problem, or turn this VOC into actions.'
       ].join(' '),
       ].join(' '),
       inputSchema: {
       inputSchema: {
-        issue: z.string().optional().describe('Single VOC issue to deep dive, e.g. 排队, 贵, 不好吃, 服务差.'),
+        issue: z.string().optional().describe('Single VOC issue to deep dive, e.g. 怎么选, 贵, 质量不稳定, 服务差.'),
         problem: z.string().optional().describe('Alias for issue.'),
         problem: z.string().optional().describe('Alias for issue.'),
         topic: z.string().optional().describe('Alias for issue.'),
         topic: z.string().optional().describe('Alias for issue.'),
         project: z.string().optional().describe('Optional project, brand, or account name used to isolate deep-dive memory.'),
         project: z.string().optional().describe('Optional project, brand, or account name used to isolate deep-dive memory.'),

+ 6 - 6
claude-code/claude-code-voc-intelligence/package.json

@@ -21,12 +21,12 @@
     "dy:preference-smoke": "node mcp/src/tools/douyin-preference-update.js --message \"保留口播开头和评论区问题,不要只做纯素材剪辑,下一个版本更偏门店转化话术。\" --memory ../outputs/claude-code-douyin-memory-smoke/douyin-trend-memory.json --result-prefix DOUYIN_PREF_RESULT",
     "dy:preference-smoke": "node mcp/src/tools/douyin-preference-update.js --message \"保留口播开头和评论区问题,不要只做纯素材剪辑,下一个版本更偏门店转化话术。\" --memory ../outputs/claude-code-douyin-memory-smoke/douyin-trend-memory.json --result-prefix DOUYIN_PREF_RESULT",
     "dy:sample-with-memory": "node mcp/src/tools/douyin-trend-run.js --collection-mode sample --profile memory-templates/douyin-trend-profile.json --memory ../outputs/claude-code-douyin-memory-smoke/douyin-trend-memory.json --output ../outputs/claude-code-douyin-memory-smoke/report --result-prefix DOUYIN_TREND_RESULT",
     "dy:sample-with-memory": "node mcp/src/tools/douyin-trend-run.js --collection-mode sample --profile memory-templates/douyin-trend-profile.json --memory ../outputs/claude-code-douyin-memory-smoke/douyin-trend-memory.json --output ../outputs/claude-code-douyin-memory-smoke/report --result-prefix DOUYIN_TREND_RESULT",
     "dy:live": "node mcp/src/tools/douyin-trend-run.js --collection-mode live --profile memory-templates/douyin-trend-profile.json --output ../outputs/claude-code-douyin-live --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 1 --result-prefix DOUYIN_TREND_RESULT",
     "dy:live": "node mcp/src/tools/douyin-trend-run.js --collection-mode live --profile memory-templates/douyin-trend-profile.json --output ../outputs/claude-code-douyin-live --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 1 --result-prefix DOUYIN_TREND_RESULT",
-    "voc:issue-pool": "node mcp/src/tools/voc-issue-pool-run.js --project 样板门店A --industry 本地生活餐饮 --scenario 门店经营 --audience 到店顾客 --evidence \"排队久,但是不知道值不值得等。;人均有点高,第一次来不知道怎么点不踩雷。;服务忙起来没人理。\" --assistant-message-only",
-    "voc:deep-dive": "node mcp/src/tools/voc-problem-deep-dive-run.js --issue 排队 --industry 本地生活餐饮 --scenario 门店经营 --audience 到店顾客 --assistant-message-only",
-    "voc:content-plan": "node mcp/src/tools/voc-content-plan-run.js --brand 样板门店A --industry 本地生活餐饮 --issues \"第一次来怕踩雷;觉得人均贵;怕排队久\" --assistant-message-only",
-    "voc:speaking-script": "node mcp/src/tools/voc-speaking-script-run.js --brand 样板门店A --industry 本地生活餐饮 --topic \"第一次来怎么点不踩雷\" --user-issue \"第一次来怕点错\" --evidence \"第一次来不知道怎么点,怕踩雷\" --assistant-message-only",
-    "voc:competitor-map": "node mcp/src/tools/voc-competitor-map-run.js --brand 样板门店A --city 南昌 --category 餐饮 --assistant-message-only",
-    "voc:business-workflow": "node mcp/src/tools/voc-business-workflow-run.js --brand 样板门店A --industry 本地生活餐饮 --platform douyin --collection-mode sample --keywords \"南昌菜,第一次来怎么点,排队\" --assistant-message-only",
+    "voc:issue-pool": "node mcp/src/tools/voc-issue-pool-run.js --project 示例品牌A --industry 家居定制 --scenario 线上获客 --audience 意向用户 --evidence \"第一次买不知道怎么选,怕踩雷。;价格有点高,不确定值不值。;咨询的时候没人理。\" --assistant-message-only",
+    "voc:deep-dive": "node mcp/src/tools/voc-problem-deep-dive-run.js --issue 怎么选 --industry 家居定制 --scenario 线上获客 --audience 意向用户 --assistant-message-only",
+    "voc:content-plan": "node mcp/src/tools/voc-content-plan-run.js --brand 示例品牌A --industry 家居定制 --issues \"第一次买怕踩雷;觉得价格贵;怕质量不稳定\" --assistant-message-only",
+    "voc:speaking-script": "node mcp/src/tools/voc-speaking-script-run.js --brand 示例品牌A --industry 家居定制 --topic \"第一次买怎么选不踩雷\" --user-issue \"第一次买怕选错\" --evidence \"第一次买不知道怎么选,怕踩雷\" --assistant-message-only",
+    "voc:competitor-map": "node mcp/src/tools/voc-competitor-map-run.js --brand 示例品牌A --city 本地 --category 家居定制 --assistant-message-only",
+    "voc:business-workflow": "node mcp/src/tools/voc-business-workflow-run.js --brand 示例品牌A --industry 家居定制 --platform douyin --collection-mode sample --keywords \"家居定制怎么选,第一次买怎么对比,售后\" --assistant-message-only",
     "mcp:start": "node mcp/src/server.js",
     "mcp:start": "node mcp/src/server.js",
     "mcp:smoke": "node scripts/smoke-mcp.js",
     "mcp:smoke": "node scripts/smoke-mcp.js",
     "acceptance": "node scripts/acceptance.js"
     "acceptance": "node scripts/acceptance.js"

+ 7 - 7
claude-code/claude-code-voc-intelligence/scripts/smoke-cross-industry.js

@@ -63,15 +63,15 @@ const CASES = [
     }
     }
   },
   },
   {
   {
-    name: 'local-dining',
+    name: 'fitness',
     profile: {
     profile: {
       project: '行业趋势情报官',
       project: '行业趋势情报官',
-      industry: '本地生活餐饮',
-      businessType: '门店/团购/探店账号',
-      targetAudience: ['到店消费者', '团购用户'],
-      keywords: ['探店', '套餐', '人均', '排队', '氛围'],
-      trendQuestions: ['用户更在意口味还是性价比?', '什么门店体验会影响复购?', '哪些负面点最容易被评论放大?'],
-      mustTrackSignals: ['口味', '服务', '排队', '环境', '复购']
+      industry: '运动健身',
+      businessType: '健身房/私教/内容账号',
+      targetAudience: ['健身新手', '想减脂增肌的用户'],
+      keywords: ['私教课', '减脂', '增肌', '体验课', '怎么选'],
+      trendQuestions: ['用户更在意效果还是价格?', '什么体验会影响续课?', '哪些负面点最容易被评论放大?'],
+      mustTrackSignals: ['效果', '教练', '价格', '环境', '续课']
     }
     }
   }
   }
 ];
 ];

+ 30 - 57
claude-code/claude-code-voc-intelligence/scripts/smoke-mcp.js

@@ -154,14 +154,14 @@ async function main() {
     const issuePoolResult = await client.callTool({
     const issuePoolResult = await client.callTool({
       name: 'voc_issue_pool_run',
       name: 'voc_issue_pool_run',
       arguments: {
       arguments: {
-        project: 'MCP样板门店',
-        industry: '本地生活餐饮',
-        scenario: '门店经营',
-        audience: '到店顾客',
+        project: 'MCP示例品牌',
+        industry: '家居定制',
+        scenario: '线上获客',
+        audience: '意向用户',
         evidence: [
         evidence: [
-          '排队久,但是不知道值不值得等。',
-          '人均有点高,第一次来不知道怎么点不踩雷。',
-          '服务忙起来没人理。'
+          '第一次买不知道怎么选,怕踩雷。',
+          '价格有点高,不确定值不值。',
+          '咨询的时候没人理。'
         ]
         ]
       }
       }
     });
     });
@@ -175,13 +175,13 @@ async function main() {
     const deepDiveResult = await client.callTool({
     const deepDiveResult = await client.callTool({
       name: 'voc_problem_deep_dive_run',
       name: 'voc_problem_deep_dive_run',
       arguments: {
       arguments: {
-        issue: '排队',
-        project: 'MCP样板门店',
-        industry: '本地生活餐饮',
-        scenario: '门店经营',
-        audience: '到店顾客',
-        evidence: ['排队久,但是不知道值不值得等。'],
-        feedback: '老板不想做等位饮品,更想先改评论区回复和预点单'
+        issue: '怎么选',
+        project: 'MCP示例品牌',
+        industry: '家居定制',
+        scenario: '线上获客',
+        audience: '意向用户',
+        evidence: ['第一次买不知道怎么选,怕踩雷。'],
+        feedback: '老板不想做试用体验,更想先改评论区回复和案例展示'
       }
       }
     });
     });
     const deepDiveStructured = deepDiveResult.structuredContent || {};
     const deepDiveStructured = deepDiveResult.structuredContent || {};
@@ -192,8 +192,8 @@ async function main() {
       !deepDiveStructured.summary?.memoryPath) {
       !deepDiveStructured.summary?.memoryPath) {
       throw new Error(`Expected boss-oriented deep dive result, got: ${JSON.stringify(deepDiveStructured)}`);
       throw new Error(`Expected boss-oriented deep dive result, got: ${JSON.stringify(deepDiveStructured)}`);
     }
     }
-    if (!deepDiveStructured.data?.memory?.blockedActions?.includes('等位饮品') ||
-      !deepDiveStructured.data?.memory?.preferredActions?.includes('预点单')) {
+    if (!deepDiveStructured.data?.memory?.blockedActions?.includes('试用体验') ||
+      !deepDiveStructured.data?.memory?.preferredActions?.includes('评论区回复')) {
       throw new Error('Expected deep dive MCP call to parse feedback into scoped memory');
       throw new Error('Expected deep dive MCP call to parse feedback into scoped memory');
     }
     }
     if (!JSON.stringify(deepDiveStructured.nextActions || []).includes('live')) {
     if (!JSON.stringify(deepDiveStructured.nextActions || []).includes('live')) {
@@ -203,9 +203,9 @@ async function main() {
     const contentPlanResult = await client.callTool({
     const contentPlanResult = await client.callTool({
       name: 'voc_content_plan_run',
       name: 'voc_content_plan_run',
       arguments: {
       arguments: {
-        brand: 'MCP样板门店',
-        industry: '本地生活餐饮',
-        issues: ['第一次来怕踩雷', '觉得人均贵', '怕排队久']
+        brand: 'MCP示例品牌',
+        industry: '家居定制',
+        issues: ['第一次买怕踩雷', '觉得价格贵', '怕质量不稳定']
       }
       }
     });
     });
     const contentPlanStructured = contentPlanResult.structuredContent || {};
     const contentPlanStructured = contentPlanResult.structuredContent || {};
@@ -217,41 +217,14 @@ async function main() {
       throw new Error(`Expected VOC content plan result, got: ${JSON.stringify(contentPlanStructured)}`);
       throw new Error(`Expected VOC content plan result, got: ${JSON.stringify(contentPlanStructured)}`);
     }
     }
 
 
-    const teaContentPlanResult = await client.callTool({
-      name: 'voc_content_plan_run',
-      arguments: {
-        brand: '茶饮新客转化',
-        industry: '茶饮',
-        issues: [
-          '第一次来怎么点最稳',
-          '18-22 元贵在哪/值在哪',
-          '券后价和套餐怎么买最划算',
-          '茶底/甜度/配料怎么选',
-          '哪几款不容易踩雷',
-          '外卖到手怎么避免翻车',
-          '买一送一/团购规则怎么讲清楚'
-        ],
-        evidenceText: '小红书评论:波霸奶茶用的什么茶底?我要避雷!!下午喝的,晚上睁眼到天亮。抖音线索:9.9 新品、11.9 单人下午茶、21 元买一送一能触发注意,但还需要解释规则、口味和是否有坑。'
-      }
-    });
-    const teaContentPlanStructured = teaContentPlanResult.structuredContent || {};
-    const teaContentPlanMessage = String(teaContentPlanStructured.assistantMessage || '');
-    if (teaContentPlanStructured.status !== 'ok' ||
-      !teaContentPlanMessage.includes('茶底怎么选') ||
-      !teaContentPlanMessage.includes('买一送一到底怎么算') ||
-      teaContentPlanMessage.includes('招牌菜') ||
-      teaContentPlanMessage.includes('下饭菜')) {
-      throw new Error(`Expected tea-specific VOC content plan result, got: ${JSON.stringify(teaContentPlanStructured)}`);
-    }
-
     const speakingScriptResult = await client.callTool({
     const speakingScriptResult = await client.callTool({
       name: 'voc_speaking_script_run',
       name: 'voc_speaking_script_run',
       arguments: {
       arguments: {
-        brand: 'MCP样板门店',
-        industry: '本地生活餐饮',
-        topic: '第一次来怎么点不踩雷',
-        userIssue: '第一次来怕点错',
-        evidence: ['第一次来不知道怎么点,怕踩雷'],
+        brand: 'MCP示例品牌',
+        industry: '家居定制',
+        topic: '第一次买怎么选不踩雷',
+        userIssue: '第一次买怕选错',
+        evidence: ['第一次买不知道怎么选,怕踩雷'],
         feedback: '开头更狠一点,老板视角,少讲概念,多给具体场景',
         feedback: '开头更狠一点,老板视角,少讲概念,多给具体场景',
         memory: '../outputs/claude-code-xhs-mcp-smoke/voc-speaking-script-memory.json',
         memory: '../outputs/claude-code-xhs-mcp-smoke/voc-speaking-script-memory.json',
         finalize: true
         finalize: true
@@ -271,9 +244,9 @@ async function main() {
     const competitorMapResult = await client.callTool({
     const competitorMapResult = await client.callTool({
       name: 'voc_competitor_map_run',
       name: 'voc_competitor_map_run',
       arguments: {
       arguments: {
-        brand: 'MCP样板门店',
-        city: '南昌',
-        category: '餐饮'
+        brand: 'MCP示例品牌',
+        city: '本地',
+        category: '家居定制'
       }
       }
     });
     });
     const competitorMapStructured = competitorMapResult.structuredContent || {};
     const competitorMapStructured = competitorMapResult.structuredContent || {};
@@ -288,11 +261,11 @@ async function main() {
     const businessWorkflowResult = await client.callTool({
     const businessWorkflowResult = await client.callTool({
       name: 'voc_business_workflow_run',
       name: 'voc_business_workflow_run',
       arguments: {
       arguments: {
-        brand: 'MCP样板门店',
-        industry: '本地生活餐饮',
+        brand: 'MCP示例品牌',
+        industry: '家居定制',
         platform: 'douyin',
         platform: 'douyin',
         collectionMode: 'sample',
         collectionMode: 'sample',
-        keywords: ['南昌菜', '第一次来怎么点', '排队']
+        keywords: ['家居定制怎么选', '第一次买怎么对比', '售后']
       }
       }
     });
     });
     const businessWorkflowStructured = businessWorkflowResult.structuredContent || {};
     const businessWorkflowStructured = businessWorkflowResult.structuredContent || {};

+ 91 - 91
claude-code/claude-code-voc-intelligence/scripts/smoke-package.js

@@ -310,36 +310,36 @@ async function smokeIssuePoolReportEvidenceFiltering() {
   const reportPath = path.join(OUTPUT_ROOT, 'issue-pool-report-filter-smoke.md');
   const reportPath = path.join(OUTPUT_ROOT, 'issue-pool-report-filter-smoke.md');
   const memoryPath = path.join(OUTPUT_ROOT, 'issue-pool-report-filter-memory.json');
   const memoryPath = path.join(OUTPUT_ROOT, 'issue-pool-report-filter-memory.json');
   fs.writeFileSync(reportPath, [
   fs.writeFileSync(reportPath, [
-    '# 盛焰铁板烧竞品图谱',
+    '# 示例品牌竞品图谱',
     '',
     '',
     '## 品牌背景',
     '## 品牌背景',
-    '- 品牌:盛焰铁板烧',
-    '- 城市:南昌',
+    '- 品牌:示例品牌A',
+    '- 城市:本地',
     '',
     '',
     '## 当前经营痛点',
     '## 当前经营痛点',
-    '1. 日常营销能够带来 TC,但是活动折扣大。',
+    '1. 日常营销能够带来线索,但是活动折扣大。',
     '',
     '',
     '## live 采集真实样本',
     '## live 采集真实样本',
-    '1. [南昌铁板烧样本](https://example.test/note)',
+    '1. [价格样本](https://example.test/note)',
     '   - 关键评论:多少钱啊',
     '   - 关键评论:多少钱啊',
-    '   - 可解读点:用户第一反应不是口味,而是价格。',
-    '2. [南昌排队样本](https://example.test/note2)',
-    '   - 高赞评论:排队太久了,下次不想等',
+    '   - 可解读点:用户第一反应不是质量,而是价格。',
+    '2. [选择样本](https://example.test/note2)',
+    '   - 高赞评论:第一次买不知道怎么选,怕踩雷',
     '',
     '',
     '## 下一步建议',
     '## 下一步建议',
-    '- 先选一做深度拆解。'
+    '- 先选一个问题做深度拆解。'
   ].join('\n'));
   ].join('\n'));
   const result = await runVocIssuePool({
   const result = await runVocIssuePool({
-    project: '盛焰铁板烧',
-    industry: '餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    project: '示例品牌A',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     report: reportPath,
     report: reportPath,
     memory: memoryPath
     memory: memoryPath
   });
   });
   const issues = result.data?.issues || [];
   const issues = result.data?.issues || [];
   const evidence = issues.flatMap(issue => issue.evidence || []);
   const evidence = issues.flatMap(issue => issue.evidence || []);
-  if (!issues.some(issue => issue.id === 'price') || !issues.some(issue => issue.id === 'waiting')) {
+  if (!issues.some(issue => issue.id === 'price') || !issues.some(issue => issue.id === 'decision')) {
     throw new Error('issue pool did not classify filtered report comments');
     throw new Error('issue pool did not classify filtered report comments');
   }
   }
   if (issues.some(issue => issue.id === 'other' && issue.count > 0)) {
   if (issues.some(issue => issue.id === 'other' && issue.count > 0)) {
@@ -571,25 +571,25 @@ async function smokeBusinessStatusErrors() {
 }
 }
 
 
 async function smokeDouyinSearchInputErrors() {
 async function smokeDouyinSearchInputErrors() {
-  const normalized = normalizeSearchKeyword('茶饮18元22元');
-  if (normalized !== '茶饮 18元 22元') {
+  const normalized = normalizeSearchKeyword('家居定制18元22元');
+  if (normalized !== '家居定制 18元 22元') {
     throw new Error(`expected douyin keyword spacing normalization, got ${normalized}`);
     throw new Error(`expected douyin keyword spacing normalization, got ${normalized}`);
   }
   }
-  const repairCandidates = buildKeywordRepairCandidates('茶饮 18元 22元', {
-    industry: '茶饮',
+  const repairCandidates = buildKeywordRepairCandidates('家居定制 18元 22元', {
+    industry: '家居定制',
     targetAudience: ['新客']
     targetAudience: ['新客']
   });
   });
-  if (!repairCandidates.includes('茶饮 性价比 新客')) {
+  if (!repairCandidates.includes('家居定制 性价比 新客')) {
     throw new Error(`expected douyin keyword repair candidates, got ${repairCandidates.join(', ')}`);
     throw new Error(`expected douyin keyword repair candidates, got ${repairCandidates.join(', ')}`);
   }
   }
-  if (!keywordValidationIssue('茶饮'.repeat(40))) {
+  if (!keywordValidationIssue('家居定制'.repeat(40))) {
     throw new Error('expected overlong douyin keyword to be rejected before search');
     throw new Error('expected overlong douyin keyword to be rejected before search');
   }
   }
 
 
   const overlong = await runDouyinTrend({
   const overlong = await runDouyinTrend({
     collectionMode: 'live',
     collectionMode: 'live',
     vocToken: 'r:smoke-token',
     vocToken: 'r:smoke-token',
-    keywords: '茶饮'.repeat(40),
+    keywords: '家居定制'.repeat(40),
     output: path.join(OUTPUT_ROOT, 'douyin-overlong-keyword')
     output: path.join(OUTPUT_ROOT, 'douyin-overlong-keyword')
   });
   });
   if (overlong.status !== 'needs_keyword_fix') {
   if (overlong.status !== 'needs_keyword_fix') {
@@ -609,7 +609,7 @@ async function smokeDouyinSearchInputErrors() {
     const result = await runDouyinTrend({
     const result = await runDouyinTrend({
       collectionMode: 'live',
       collectionMode: 'live',
       vocToken: 'r:smoke-token',
       vocToken: 'r:smoke-token',
-      keywords: '茶饮 18元 22元',
+      keywords: '家居定制 18元 22元',
       keywordLimit: 1,
       keywordLimit: 1,
       videosPerKeyword: 1,
       videosPerKeyword: 1,
       maxCommentPages: 0,
       maxCommentPages: 0,
@@ -654,7 +654,7 @@ async function smokeDouyinSearchInputErrors() {
                   data: {
                   data: {
                     aweme_info: {
                     aweme_info: {
                       aweme_id: 'douyin-repair-smoke-1',
                       aweme_id: 'douyin-repair-smoke-1',
-                      desc: '茶饮性价比新客点单避坑',
+                      desc: '家居定制性价比新客怎么选避坑',
                       author: { nickname: 'smoke' },
                       author: { nickname: 'smoke' },
                       statistics: { digg_count: 1, comment_count: 0, share_count: 0 }
                       statistics: { digg_count: 1, comment_count: 0, share_count: 0 }
                     }
                     }
@@ -669,9 +669,9 @@ async function smokeDouyinSearchInputErrors() {
     const repaired = await runDouyinTrend({
     const repaired = await runDouyinTrend({
       collectionMode: 'live',
       collectionMode: 'live',
       vocToken: 'r:smoke-token',
       vocToken: 'r:smoke-token',
-      industry: '茶饮',
+      industry: '家居定制',
       targetAudience: '新客',
       targetAudience: '新客',
-      keywords: '茶饮 18元 22元',
+      keywords: '家居定制 18元 22元',
       keywordLimit: 1,
       keywordLimit: 1,
       videosPerKeyword: 1,
       videosPerKeyword: 1,
       maxCommentPages: 0,
       maxCommentPages: 0,
@@ -746,14 +746,14 @@ async function main() {
   }
   }
 
 
   const deepDive = await runVocProblemDeepDive({
   const deepDive = await runVocProblemDeepDive({
-    issue: '排队',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    issue: '怎么选',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     memory: path.join(OUTPUT_ROOT, 'voc-problem-memory.json'),
     memory: path.join(OUTPUT_ROOT, 'voc-problem-memory.json'),
     evidence: [
     evidence: [
-      '想吃就得排队。',
-      '排了很久以后,如果菜品普通就会觉得不值。'
+      '第一次买就得反复对比。',
+      '对比了很久以后,如果质量普通就会觉得不值。'
     ]
     ]
   });
   });
   const deepDiveBody = String(deepDive.assistantMessage || '');
   const deepDiveBody = String(deepDive.assistantMessage || '');
@@ -773,32 +773,32 @@ async function main() {
     throw new Error('VOC problem deep dive next actions did not hand off to live collection');
     throw new Error('VOC problem deep dive next actions did not hand off to live collection');
   }
   }
   const deepDiveWithMemory = await runVocProblemDeepDive({
   const deepDiveWithMemory = await runVocProblemDeepDive({
-    issue: '排队',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    issue: '怎么选',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     memory: deepDive.summary.memoryPath,
     memory: deepDive.summary.memoryPath,
-    feedback: '老板不想做等位饮品,更想先改评论区回复和预点单',
-    blockedActions: ['等位饮品'],
-    preferredActions: ['评论区回复', '预点单']
+    feedback: '老板不想做试用体验,更想先改评论区回复和案例展示',
+    blockedActions: ['试用体验'],
+    preferredActions: ['评论区回复', '案例展示']
   });
   });
   const memoryBody = String(deepDiveWithMemory.assistantMessage || '');
   const memoryBody = String(deepDiveWithMemory.assistantMessage || '');
   if (!deepDiveWithMemory.summary.memoryApplied || !memoryBody.includes('## 已应用的使用记忆')) {
   if (!deepDiveWithMemory.summary.memoryApplied || !memoryBody.includes('## 已应用的使用记忆')) {
     throw new Error('VOC problem deep dive did not apply iterative memory');
     throw new Error('VOC problem deep dive did not apply iterative memory');
   }
   }
-  smokeDeepDiveMemoryBehavior(deepDiveWithMemory, '等位饮品');
+  smokeDeepDiveMemoryBehavior(deepDiveWithMemory, '试用体验');
 
 
   const issuePool = await runVocIssuePool({
   const issuePool = await runVocIssuePool({
-    project: '样板门店A',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    project: '示例品牌A',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     evidence: [
     evidence: [
-      '排队久,但是不知道值不值得等。',
-      '等位时间不透明,到了现场才知道要等多久。',
-      '人均有点高,第一次来不知道怎么点不踩雷。',
-      '服务忙起来没人理。',
-      '视频很种草,实际到店体验有落差。'
+      '第一次买不知道怎么选,怕踩雷。',
+      '对比来对比去,到了下单才发现细节没说清。',
+      '价格有点高,第一次买不知道怎么选不踩雷。',
+      '咨询忙起来没人理。',
+      '视频很种草,实际拿到手有落差。'
     ]
     ]
   });
   });
   const issuePoolBody = String(issuePool.assistantMessage || '');
   const issuePoolBody = String(issuePool.assistantMessage || '');
@@ -809,22 +809,22 @@ async function main() {
     !issuePool.data?.issues?.length) {
     !issuePool.data?.issues?.length) {
     throw new Error('VOC issue pool did not return prioritized issue output');
     throw new Error('VOC issue pool did not return prioritized issue output');
   }
   }
-  if (!issuePool.data.issues.some(issue => issue.title === '排队/等待')) {
-    throw new Error('VOC issue pool did not classify waiting issue');
+  if (!issuePool.data.issues.some(issue => issue.title === '选择门槛/决策')) {
+    throw new Error('VOC issue pool did not classify decision issue');
   }
   }
   const issuePoolUpdated = await runVocIssuePool({
   const issuePoolUpdated = await runVocIssuePool({
-    project: '样板门店A',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    project: '示例品牌A',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     memory: issuePool.summary.memoryPath,
     memory: issuePool.summary.memoryPath,
-    evidence: ['排队问题已经开始做预点单验证。'],
-    validatingIssues: ['排队/等待']
+    evidence: ['选择问题已经开始做对比清单验证。'],
+    validatingIssues: ['选择门槛/决策']
   });
   });
-  if (!issuePoolUpdated.data?.issues?.some(issue => issue.title === '排队/等待' && issue.status === '验证中')) {
+  if (!issuePoolUpdated.data?.issues?.some(issue => issue.title === '选择门槛/决策' && issue.status === '验证中')) {
     throw new Error('VOC issue pool did not apply issue status update');
     throw new Error('VOC issue pool did not apply issue status update');
   }
   }
-  const waitingTrend = issuePoolUpdated.data?.issues?.find(issue => issue.title === '排队/等待');
+  const waitingTrend = issuePoolUpdated.data?.issues?.find(issue => issue.title === '选择门槛/决策');
   if (!waitingTrend || waitingTrend.previousCount < 1 || waitingTrend.delta >= 0 || waitingTrend.trend !== 'down') {
   if (!waitingTrend || waitingTrend.previousCount < 1 || waitingTrend.delta >= 0 || waitingTrend.trend !== 'down') {
     throw new Error('VOC issue pool did not compare issue trend with previous run');
     throw new Error('VOC issue pool did not compare issue trend with previous run');
   }
   }
@@ -833,48 +833,48 @@ async function main() {
   }
   }
 
 
   const parsedFeedbackDeepDive = await runVocProblemDeepDive({
   const parsedFeedbackDeepDive = await runVocProblemDeepDive({
-    issue: '排队',
-    project: '样板门店A',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
-    feedback: '这个店不想做等位饮品,更想先改评论区回复和预点单'
+    issue: '怎么选',
+    project: '示例品牌A',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
+    feedback: '这个品牌不想做试用体验,更想先改评论区回复和案例展示'
   });
   });
-  smokeDeepDiveMemoryBehavior(parsedFeedbackDeepDive, '等位饮品');
-  if (!String(parsedFeedbackDeepDive.summary.memoryPath || '').includes('样板门店a')) {
+  smokeDeepDiveMemoryBehavior(parsedFeedbackDeepDive, '试用体验');
+  if (!String(parsedFeedbackDeepDive.summary.memoryPath || '').includes('示例品牌a')) {
     throw new Error('VOC problem deep dive did not use scoped default memory path');
     throw new Error('VOC problem deep dive did not use scoped default memory path');
   }
   }
   const parsedMemory = parsedFeedbackDeepDive.data?.memory || {};
   const parsedMemory = parsedFeedbackDeepDive.data?.memory || {};
-  if (!parsedMemory.blockedActions?.includes('等位饮品') ||
+  if (!parsedMemory.blockedActions?.includes('试用体验') ||
     !parsedMemory.preferredActions?.includes('评论区回复') ||
     !parsedMemory.preferredActions?.includes('评论区回复') ||
-    !parsedMemory.preferredActions?.includes('预点单')) {
+    !parsedMemory.preferredActions?.includes('案例展示')) {
     throw new Error('VOC problem deep dive did not parse natural-language feedback into memory');
     throw new Error('VOC problem deep dive did not parse natural-language feedback into memory');
   }
   }
 
 
   const actionWeightedDeepDive = await runVocProblemDeepDive({
   const actionWeightedDeepDive = await runVocProblemDeepDive({
-    issue: '排队',
-    project: '样板门店A',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    issue: '怎么选',
+    project: '示例品牌A',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     memory: parsedFeedbackDeepDive.summary.memoryPath,
     memory: parsedFeedbackDeepDive.summary.memoryPath,
-    validatedActions: ['预点单'],
-    rejectedActions: ['等位饮品'],
-    feedback: '预点单有效,等位饮品无效'
+    validatedActions: ['案例展示'],
+    rejectedActions: ['试用体验'],
+    feedback: '案例展示有效,试用体验无效'
   });
   });
   const actionWeightedBody = String(actionWeightedDeepDive.assistantMessage || '');
   const actionWeightedBody = String(actionWeightedDeepDive.assistantMessage || '');
   if (!actionWeightedBody.includes('为什么优先推荐这些动作')) {
   if (!actionWeightedBody.includes('为什么优先推荐这些动作')) {
     throw new Error('VOC problem deep dive did not explain action-weight memory');
     throw new Error('VOC problem deep dive did not explain action-weight memory');
   }
   }
   const actionStats = actionWeightedDeepDive.data?.memory?.actionStats || {};
   const actionStats = actionWeightedDeepDive.data?.memory?.actionStats || {};
-  if (!actionStats['预点单']?.validatedCount || !actionStats['等位饮品']?.rejectedCount) {
+  if (!actionStats['案例展示']?.validatedCount || !actionStats['试用体验']?.rejectedCount) {
     throw new Error('VOC problem deep dive did not persist action validation stats');
     throw new Error('VOC problem deep dive did not persist action validation stats');
   }
   }
 
 
   const contentPlan = await runVocContentPlan({
   const contentPlan = await runVocContentPlan({
-    brand: '样板门店A',
-    industry: '本地生活餐饮',
-    issues: ['第一次来怕踩雷', '觉得人均贵', '怕排队久']
+    brand: '示例品牌A',
+    industry: '家居定制',
+    issues: ['第一次买怕踩雷', '觉得价格贵', '怕质量不稳定']
   });
   });
   const contentPlanBody = String(contentPlan.assistantMessage || '');
   const contentPlanBody = String(contentPlan.assistantMessage || '');
   if (contentPlan.status !== 'ok' ||
   if (contentPlan.status !== 'ok' ||
@@ -886,11 +886,11 @@ async function main() {
   }
   }
 
 
   const speakingScript = await runVocSpeakingScript({
   const speakingScript = await runVocSpeakingScript({
-    brand: '样板门店A',
-    industry: '本地生活餐饮',
-    topic: '第一次来怎么点不踩雷',
-    userIssue: '第一次来怕点错',
-    evidence: ['第一次来不知道怎么点,怕踩雷'],
+    brand: '示例品牌A',
+    industry: '家居定制',
+    topic: '第一次买怎么选不踩雷',
+    userIssue: '第一次买怕选错',
+    evidence: ['第一次买不知道怎么选,怕踩雷'],
     feedback: '开头更狠一点,老板视角,少讲概念,多给具体场景',
     feedback: '开头更狠一点,老板视角,少讲概念,多给具体场景',
     memory: path.join(OUTPUT_ROOT, 'voc-speaking-script-memory.json'),
     memory: path.join(OUTPUT_ROOT, 'voc-speaking-script-memory.json'),
     finalize: true
     finalize: true
@@ -906,9 +906,9 @@ async function main() {
   }
   }
 
 
   const competitorMap = await runVocCompetitorMap({
   const competitorMap = await runVocCompetitorMap({
-    brand: '样板门店A',
-    city: '南昌',
-    category: '餐饮'
+    brand: '示例品牌A',
+    city: '本地',
+    category: '家居定制'
   });
   });
   const competitorMapBody = String(competitorMap.assistantMessage || '');
   const competitorMapBody = String(competitorMap.assistantMessage || '');
   if (competitorMap.status !== 'ok' ||
   if (competitorMap.status !== 'ok' ||
@@ -919,11 +919,11 @@ async function main() {
   }
   }
 
 
   const businessWorkflow = await runBusinessWorkflow({
   const businessWorkflow = await runBusinessWorkflow({
-    brand: '样板门店A',
-    industry: '本地生活餐饮',
+    brand: '示例品牌A',
+    industry: '家居定制',
     platform: 'douyin',
     platform: 'douyin',
     collectionMode: 'sample',
     collectionMode: 'sample',
-    keywords: ['南昌菜', '第一次来怎么点', '排队']
+    keywords: ['家居定制怎么选', '第一次买怎么对比', '售后']
   });
   });
   const businessWorkflowBody = String(businessWorkflow.assistantMessage || '');
   const businessWorkflowBody = String(businessWorkflow.assistantMessage || '');
   if (businessWorkflow.status !== 'ok' ||
   if (businessWorkflow.status !== 'ok' ||

+ 2 - 2
claude-code/claude-code-voc-intelligence/skill-package-manifest.json

@@ -56,8 +56,8 @@
   ],
   ],
   "recommendedUserPrompts": [
   "recommendedUserPrompts": [
     "帮我做一份家装全屋定制行业的小红书趋势情报。先用演示样例跑通流程,不要真实采集。",
     "帮我做一份家装全屋定制行业的小红书趋势情报。先用演示样例跑通流程,不要真实采集。",
-    "帮我看下南昌餐饮行业抖音上用户最近在吐槽什么,先小规模真实采集。",
-    "继续深挖“排队”这个问题,站在老板视角告诉我怎么解决。"
+    "帮我看下家居定制行业抖音上用户最近在吐槽什么,先小规模真实采集。",
+    "继续深挖“怎么选”这个问题,站在老板视角告诉我怎么解决。"
   ],
   ],
   "sampleCommand": "npm run xhs:sample",
   "sampleCommand": "npm run xhs:sample",
   "mcpSmokeCommand": "npm run mcp:smoke",
   "mcpSmokeCommand": "npm run mcp:smoke",

+ 4 - 4
claude-code/claude-code-voc-intelligence/skills/douyin-trend-intelligence/SKILL.md

@@ -29,14 +29,14 @@ allowed-tools: Read Write Bash(node *)
 live 采集失败时,严禁做以下任何一件事:
 live 采集失败时,严禁做以下任何一件事:
 
 
 - 严禁退回/降级到联网搜索(web search)、`yt-dlp`、`ffmpeg`、手动让用户上传 mp4,或任何“绕过 VOC 接口”的抓取方式。本技能包的 VOC 本地采集是唯一批准的真实数据入口。
 - 严禁退回/降级到联网搜索(web search)、`yt-dlp`、`ffmpeg`、手动让用户上传 mp4,或任何“绕过 VOC 接口”的抓取方式。本技能包的 VOC 本地采集是唯一批准的真实数据入口。
-- 严禁输出“VOC 只支持餐饮/零售类目”“律师/某赛道不可用”“系统设计上有类目限制”这类结论。这是错误结论:任何关键词(律师、法律、医美、教育、专业服务等)都能采集,与类目无关。
+- 严禁输出“VOC 只支持某些类目”“律师/某赛道不可用”“系统设计上有类目限制”这类结论。这是错误结论:任何关键词(律师、法律、医美、教育、专业服务等)都能采集,与类目无关。
 - live 失败的真正原因只可能是这几类:token 无效或类型不对(需要 `r:` 开头的会话 token,而不是 `sk-` 开头的 AIGate API Key)、未开通或额度不足、上游接口抖动(5xx,需重试)。必须如实把工具返回的 `assistantMessage` 转述给用户,不要自行编造原因。
 - live 失败的真正原因只可能是这几类:token 无效或类型不对(需要 `r:` 开头的会话 token,而不是 `sk-` 开头的 AIGate API Key)、未开通或额度不足、上游接口抖动(5xx,需重试)。必须如实把工具返回的 `assistantMessage` 转述给用户,不要自行编造原因。
 - 只有在工具明确返回 `needs_keyword_fix` 时才允许调整关键词;返回 `needs_valid_token` / `needs_token` / `needs_recharge` 时不要换关键词,要转述充值/开通链接。
 - 只有在工具明确返回 `needs_keyword_fix` 时才允许调整关键词;返回 `needs_valid_token` / `needs_token` / `needs_recharge` 时不要换关键词,要转述充值/开通链接。
 
 
 English (same rules):
 English (same rules):
 
 
 - On live failure, NEVER fall back to web search, `yt-dlp`, `ffmpeg`, or asking the user to upload an mp4. The local VOC tool is the only approved real-data path.
 - On live failure, NEVER fall back to web search, `yt-dlp`, `ffmpeg`, or asking the user to upload an mp4. The local VOC tool is the only approved real-data path.
-- NEVER conclude that VOC is limited to restaurant/retail categories or that a vertical (e.g. lawyers) is unsupported. Any keyword works; this is never a category problem.
+- NEVER conclude that VOC is limited to certain categories or that a vertical (e.g. lawyers) is unsupported. Any keyword works; this is never a category problem.
 - The only real causes are: invalid/wrong-type token (need an `r:` session token, not an `sk-` AIGate key), not activated / no balance, or upstream 5xx jitter (retry). Relay the tool's `assistantMessage` verbatim instead of inventing a reason.
 - The only real causes are: invalid/wrong-type token (need an `r:` session token, not an `sk-` AIGate key), not activated / no balance, or upstream 5xx jitter (retry). Relay the tool's `assistantMessage` verbatim instead of inventing a reason.
 - Only adjust keywords when the tool returns `needs_keyword_fix`. For `needs_valid_token` / `needs_token` / `needs_recharge`, do not change keywords — surface the payment/activation link.
 - Only adjust keywords when the tool returns `needs_keyword_fix`. For `needs_valid_token` / `needs_token` / `needs_recharge`, do not change keywords — surface the payment/activation link.
 
 
@@ -47,9 +47,9 @@ When `voc_douyin_trend_run` returns `needs_keyword_fix`, do not tell the user to
 Claude Code should immediately retry once with a short natural keyword before asking the user, unless the user explicitly asked not to retry. Use this shape:
 Claude Code should immediately retry once with a short natural keyword before asking the user, unless the user explicitly asked not to retry. Use this shape:
 
 
 - `品类 + 价格/问题 + 人群/场景`
 - `品类 + 价格/问题 + 人群/场景`
-- Examples (任何行业都适用,不限餐饮): `<品类/服务> <价格区间> <人群>`, `<品类/服务> 性价比 新客`, `<品类/服务> 避坑 怎么选`
+- Examples (任何行业都适用): `<品类/服务> <价格区间> <人群>`, `<品类/服务> 性价比 新客`, `<品类/服务> 避坑 怎么选`
 
 
-If a compact keyword is provided, add spaces between category, numbers, and scenario words. Example: `<品类>18元22元` -> `<品类> 18元 22元`. 不要默认套用餐饮词,按用户真实行业(律师、法律、医美、教育等都可以)替换占位符。
+If a compact keyword is provided, add spaces between category, numbers, and scenario words. Example: `<品类>18元22元` -> `<品类> 18元 22元`. 不要默认套用某个行业的词,按用户真实行业(律师、法律、医美、教育等都可以)替换占位符。
 
 
 Only show the recharge/payment URL for `needs_token`, `needs_recharge`, or `needs_valid_token`. Empty keywords and overlong keywords are keyword/input repair. But upstream failures (5xx / `fetch failed` / `社交平台接口请求错误` / 超时) are NOT keyword problems and NOT category problems — the tool returns `upstream_unstable`; just relay its message and retry the same live command, do not switch keywords or conclude the category is unsupported.
 Only show the recharge/payment URL for `needs_token`, `needs_recharge`, or `needs_valid_token`. Empty keywords and overlong keywords are keyword/input repair. But upstream failures (5xx / `fetch failed` / `社交平台接口请求错误` / 超时) are NOT keyword problems and NOT category problems — the tool returns `upstream_unstable`; just relay its message and retry the same live command, do not switch keywords or conclude the category is unsupported.
 
 

+ 1 - 1
claude-code/claude-code-voc-intelligence/skills/douyin-trend-intelligence/references/live-mode.md

@@ -38,7 +38,7 @@
 推荐格式:
 推荐格式:
 
 
 ```text
 ```text
-<任何行业的品类/服务> + 价格/问题 + 人群/场景(不限餐饮
+<任何行业的品类/服务> + 价格/问题 + 人群/场景(任何行业都适用
 ```
 ```
 
 
 示例:
 示例:

+ 1 - 1
claude-code/claude-code-voc-intelligence/skills/voc-api-catalog/SKILL.md

@@ -43,7 +43,7 @@ VOC 后端是一个**通用转发网关**(`https://server.fmode.cn/api/voc-soc
 - 禁止把**入参/参数错误**(`needs_input`)误报成「采集不到数据 / 该关键词没结果 / 类目不支持」。参数错就如实说参数错,并用 `voc_api_doc` 核对后重试。
 - 禁止把**入参/参数错误**(`needs_input`)误报成「采集不到数据 / 该关键词没结果 / 类目不支持」。参数错就如实说参数错,并用 `voc_api_doc` 核对后重试。
 - 禁止把**上游不稳定**(`upstream_unstable`,如 5xx / 连接超时 / fetch failed)误报成「关键词问题 / 类目不支持 / 余额不足」。如实说明是上游接口波动,稍后重试。
 - 禁止把**上游不稳定**(`upstream_unstable`,如 5xx / 连接超时 / fetch failed)误报成「关键词问题 / 类目不支持 / 余额不足」。如实说明是上游接口波动,稍后重试。
 - 禁止把 **token 无效/类型不对**(`needs_valid_token`)误报成「余额不足」或「类目不支持」。
 - 禁止把 **token 无效/类型不对**(`needs_valid_token`)误报成「余额不足」或「类目不支持」。
-- 禁止输出「只支持餐饮 / 某行业不可用 / 系统只支持某类目」这类结论——**任何行业、任何关键词都能采集**,前提只是 token 类型正确且有额度。
+- 禁止输出「某行业不可用 / 系统只支持某类目」这类结论——**任何行业、任何关键词都能采集**,前提只是 token 类型正确且有额度。
 - 失败时禁止退回 web search / yt-dlp / ffmpeg / 让用户手动传媒体文件来「绕过」采集。
 - 失败时禁止退回 web search / yt-dlp / ffmpeg / 让用户手动传媒体文件来「绕过」采集。
 
 
 ## 状态码含义
 ## 状态码含义

+ 1 - 1
claude-code/claude-code-voc-intelligence/skills/voc-business-workflow/SKILL.md

@@ -40,7 +40,7 @@ description: Run the full VOC business workflow from natural boss language: coll
 ## 用户可说的话
 ## 用户可说的话
 
 
 ```text
 ```text
-帮我看一下南昌餐饮最近顾客在关心什么,并告诉我先改哪里、下周发什么。
+帮我看一下家居定制最近用户在关心什么,并告诉我先改哪里、下周发什么。
 ```
 ```
 
 
 ```text
 ```text

+ 4 - 4
claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/SKILL.md

@@ -11,7 +11,7 @@ allowed-tools: Read Write Bash(node *)
 ## 必须执行
 ## 必须执行
 
 
 - 当用户说“看竞品、竞品分析、错位竞争、别人怎么做、谁做得好、我不知道竞品是谁、竞争策略”时,优先运行 `voc_competitor_map_run`。
 - 当用户说“看竞品、竞品分析、错位竞争、别人怎么做、谁做得好、我不知道竞品是谁、竞争策略”时,优先运行 `voc_competitor_map_run`。
-- 需要判断竞品候选维度、错位竞争表达或餐饮场景时,优先参考 `references/restaurant-competitor-framework.md` 和 `references/restaurant-differentiation-patterns.md`。
+- 需要判断竞品候选维度或错位竞争表达时,优先参考 `references/competitor-framework.md` 和 `references/differentiation-patterns.md`。
 - 如果用户没有明确竞品,先按同城、同品类、同价格带、同消费场景、平台声量生成候选竞品类型。
 - 如果用户没有明确竞品,先按同城、同品类、同价格带、同消费场景、平台声量生成候选竞品类型。
 - 输出必须站在经营视角:别人被夸什么、被骂什么、我方该避开什么、突出什么。
 - 输出必须站在经营视角:别人被夸什么、被骂什么、我方该避开什么、突出什么。
 - 不能只做品牌 SWOT。必须保留用户原话或 VOC 证据样本。
 - 不能只做品牌 SWOT。必须保留用户原话或 VOC 证据样本。
@@ -21,13 +21,13 @@ allowed-tools: Read Write Bash(node *)
 ## CLI 命令
 ## CLI 命令
 
 
 ```bash
 ```bash
-node "<插件目录>/mcp/src/tools/voc-competitor-map-run.js" --brand "样板门店A" --city "南昌" --category "餐饮" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-competitor-map-run.js" --brand "示例品牌A" --city "本地" --category "家居定制" --assistant-message-only
 ```
 ```
 
 
 带竞品名单:
 带竞品名单:
 
 
 ```bash
 ```bash
-node "<插件目录>/mcp/src/tools/voc-competitor-map-run.js" --brand "样板门店A" --city "南昌" --category "烧烤" --competitors "竞品A,竞品B,竞品C" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-competitor-map-run.js" --brand "示例品牌A" --city "本地" --category "家居定制" --competitors "竞品A,竞品B,竞品C" --assistant-message-only
 ```
 ```
 
 
 ## 输出结构
 ## 输出结构
@@ -48,7 +48,7 @@ node "<插件目录>/mcp/src/tools/voc-competitor-map-run.js" --brand "样板门
 ## 典型用户话术
 ## 典型用户话术
 
 
 ```text
 ```text
-我是南昌做烧烤的,不知道竞品是谁,帮我先做一份竞品图谱。
+我是做家居定制的,不知道竞品是谁,帮我先做一份竞品图谱。
 ```
 ```
 
 
 ```text
 ```text

+ 22 - 0
claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/competitor-framework.md

@@ -0,0 +1,22 @@
+# 竞品图谱框架
+
+## 竞品不明确时的候选维度
+
+1. 同品类:抢同一类用户的直接选择。
+2. 同价格带:用户用来对比判断值不值。
+3. 同使用场景:在相同需求下被一起比较的选择。
+4. 内容声量竞品:在平台上更容易刷到的同类账号/品牌。
+5. 替代选择:用户在没下单时会转向的其它方案。
+
+## VOC 对照维度
+
+- 被夸:质量、口碑、价格、服务、体验、内容好看。
+- 被吐槽:贵、服务、质量不稳、到手落差、不知道怎么选。
+- 用户决策理由:为什么想要、为什么犹豫、为什么复购、为什么不推荐。
+- 内容打法:核心卖点、创始人、品牌氛围、攻略、避坑。
+- 我方机会:对方还没解决的顾虑、可承接的未满足需求。
+
+## 输出原则
+
+- 每个竞品类型都要落到“用户为什么选它、它没解决什么”。
+- 把差异写成可执行的错位竞争表达,而不是空泛对比。

+ 33 - 0
claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/differentiation-patterns.md

@@ -0,0 +1,33 @@
+# 错位竞争表达模式
+
+## 常见错位机会
+
+### 对方声量大但体验有落差
+
+我方不只比声量,而是讲清楚:
+
+- 第一次接触怎么更省心。
+- 流程里每一步会发生什么。
+- 不适合的人怎么提前判断。
+
+### 对方内容好看但实际交付差
+
+我方要给:
+
+- 真实场景、真实交付。
+- 适合谁、不适合谁。
+- 无滤镜的产品/服务展示。
+
+### 对方便宜但用户怕踩雷
+
+我方要给:
+
+- 怎么判断质量和适配。
+- 价格之外的长期价值。
+- 售后和兜底机制。
+
+## 表达原则
+
+- 不贬低对手,把差异讲成“我们更适合哪类需求”。
+- 每个错位点都要有 VOC 证据支撑。
+- 落到一个用户能立刻理解的判断标准。

+ 0 - 25
claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/restaurant-competitor-framework.md

@@ -1,25 +0,0 @@
-# 餐饮竞品图谱框架
-
-## 竞品不明确时的候选维度
-
-1. 同城同品类:抢同一批用户的直接选择。
-2. 同价格带:用户用来判断值不值。
-3. 同消费场景:聚餐、家庭餐、夜宵、工作餐、宴请。
-4. 内容声量竞品:平台上更容易被刷到的门店。
-5. 替代选择:用户不吃你时会去吃什么。
-
-## VOC 对比维度
-
-- 被夸点:味道、招牌、分量、价格、服务、环境、排队热闹、内容好看。
-- 被吐槽点:排队久、人均贵、服务慢、出品不稳、到店落差、不知道怎么点。
-- 用户决策理由:为什么想去、为什么犹豫、为什么复购、为什么不推荐。
-- 内容打法:拍菜品、拍老板、拍门店氛围、拍攻略、拍避坑。
-- 我方机会:避开对手强项,承接对手未解决的顾虑。
-
-## 输出原则
-
-- 不做空泛 SWOT。
-- 不只列门店名,要说为什么要看它。
-- 每个错位机会都要能转成经营动作或内容选题。
-- 没有真实竞品名单时,先给候选类型和补充问题。
-

+ 0 - 44
claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/restaurant-differentiation-patterns.md

@@ -1,44 +0,0 @@
-# 餐饮错位竞争表达模板
-
-## 常见错位机会
-
-### 对手热闹但排队久
-
-我方不要只学排队热闹,要讲:
-
-- 几点来更舒服。
-- 等位时怎么先点。
-- 不适合排队的人怎么选择。
-
-### 对手内容好看但到店落差
-
-我方要讲:
-
-- 真实环境。
-- 适合谁、不适合谁。
-- 无滤镜菜品。
-
-### 对手招牌强但点单复杂
-
-我方要讲:
-
-- 第一次来怎么点。
-- 两人/四人/家庭怎么点。
-- 哪些菜不建议第一次点太多。
-
-### 对手价格低
-
-我方不要硬打便宜,要讲:
-
-- 贵在哪里。
-- 怎么点更值。
-- 适合什么场景。
-
-### 对手服务强
-
-我方要补:
-
-- 高峰期流程。
-- 加菜/催菜/打包找谁。
-- 门店提示牌和员工响应。
-

+ 8 - 8
claude-code/claude-code-voc-intelligence/skills/voc-content-plan/SKILL.md

@@ -1,6 +1,6 @@
 ---
 ---
 name: voc-content-plan
 name: voc-content-plan
-description: Turn VOC issues, comments, trend evidence, issue-pool output, or single-problem deep dives into a 7-day content plan with short-video topics, opening hooks, speaking scripts, shot suggestions, comment prompts, and validation metrics. Use when the user asks 下周账号发什么、口播脚本、短视频选题、爆款视频、把用户问题变成内容、7天内容计划、餐饮老板怎么拍视频.
+description: Turn VOC issues, comments, trend evidence, issue-pool output, or single-problem deep dives into a 7-day content plan with short-video topics, opening hooks, speaking scripts, shot suggestions, comment prompts, and validation metrics. Use when the user asks 下周账号发什么、口播脚本、短视频选题、爆款视频、把用户问题变成内容、7天内容计划、老板怎么拍视频.
 allowed-tools: Read Write Bash(node *)
 allowed-tools: Read Write Bash(node *)
 ---
 ---
 
 
@@ -11,9 +11,9 @@ allowed-tools: Read Write Bash(node *)
 ## 必须执行
 ## 必须执行
 
 
 - 当用户说“下周发什么、7 天选题、口播脚本、短视频脚本、爆款视频、账号内容、把问题变成内容”时,优先运行 `voc_content_plan_run`。
 - 当用户说“下周发什么、7 天选题、口播脚本、短视频脚本、爆款视频、账号内容、把问题变成内容”时,优先运行 `voc_content_plan_run`。
-- 需要判断内容结构、口播结构或餐饮拍摄角度时,优先参考 `references/restaurant-content-framework.md` 和 `references/restaurant-speaking-script-patterns.md`。
+- 需要判断内容结构、口播结构或拍摄角度时,优先参考 `references/content-framework.md` 和 `references/speaking-script-patterns.md`。
 - 口播脚本必须来自 VOC:用户真实吐槽、竞品评论差异、问题池 Top 问题或单点深挖动作。
 - 口播脚本必须来自 VOC:用户真实吐槽、竞品评论差异、问题池 Top 问题或单点深挖动作。
-- 不要输出泛泛的爆款标题,不要只给“高级感、烟火气、探店感”这类空词。
+- 不要输出泛泛的爆款标题,不要只给“高级感、氛围感、设计感”这类空词。
 - 每条内容都要包含:用户问题、选题标题、前 3 秒钩子、口播脚本、镜头建议、评论区引导、验证指标。
 - 每条内容都要包含:用户问题、选题标题、前 3 秒钩子、口播脚本、镜头建议、评论区引导、验证指标。
 - 输出默认 7 天计划;用户明确要求 3 天、15 天时再调整。
 - 输出默认 7 天计划;用户明确要求 3 天、15 天时再调整。
 - 不覆盖创始人故事。用户要创始人故事时,说明这不属于 VOC 技能包主线,可另起品牌故事工作流。
 - 不覆盖创始人故事。用户要创始人故事时,说明这不属于 VOC 技能包主线,可另起品牌故事工作流。
@@ -22,19 +22,19 @@ allowed-tools: Read Write Bash(node *)
 ## CLI 命令
 ## CLI 命令
 
 
 ```bash
 ```bash
-node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "样板门店A" --industry "本地生活餐饮" --issues "第一次来怕踩雷;觉得人均贵;怕排队久" --evidence-text "用户评论:第一次来不知道怎么点,怕踩雷;人均有点高,不知道套餐值不值。" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "示例品牌A" --industry "家居定制" --issues "第一次买怕踩雷;觉得价格贵;怕质量不稳定" --evidence-text "用户评论:第一次买不知道怎么选,怕踩雷;价格有点高,不知道方案值不值。" --assistant-message-only
 ```
 ```
 
 
 带报告文件:
 带报告文件:
 
 
 ```bash
 ```bash
-node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "样板门店A" --report "outputs/douyin-trend-report.md" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "示例品牌A" --report "outputs/douyin-trend-report.md" --assistant-message-only
 ```
 ```
 
 
-茶饮新客转化示例:
+多问题示例:
 
 
 ```bash
 ```bash
-node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "茶饮新客转化" --industry "茶饮" --issues "第一次来怎么点最稳;18-22 元贵在哪/值在哪;券后价和套餐怎么买最划算;茶底/甜度/配料怎么选;哪几款不容易踩雷;外卖到手怎么避免翻车;买一送一/团购规则怎么讲清楚" --evidence-text "小红书评论:波霸奶茶用的什么茶底?我要避雷!!下午喝的,晚上睁眼到天亮。抖音线索:9.9 新品、11.9 单人下午茶、21 元买一送一能触发注意,但还需要解释规则、口味和是否有坑。" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "示例品牌A" --industry "家居定制" --issues "第一次买怎么选最稳;贵在哪/值在哪;怎么对比才不踩雷;质量怎么判断;哪几种方案更适合;售后怎么兜底;优惠规则怎么讲清楚" --evidence-text "用户评论:第一次买不知道怎么选,怕踩雷;价格有点高,不确定值不值;担心质量和售后。" --assistant-message-only
 ```
 ```
 
 
 ## 输出结构
 ## 输出结构
@@ -55,7 +55,7 @@ node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "茶饮新
 ```
 ```
 
 
 ```text
 ```text
-把“排队久、人均贵、第一次来怕踩雷”这些问题变成老板能拍的视频。
+把“第一次买怎么选、价格贵、怕踩雷”这些问题变成老板能拍的视频。
 ```
 ```
 
 
 ```text
 ```text

+ 29 - 0
claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/content-framework.md

@@ -0,0 +1,29 @@
+# VOC 内容选题框架
+
+## 使用原则
+
+内容不从“我今天想讲什么”开始,而是从“用户真正在犹豫什么”开始。
+
+每条内容必须回应一个 VOC 问题,例如:
+
+- 怕踩雷:第一次接触怎么选不出错。
+- 嫌贵:贵在哪、值在哪、怎么判断划算。
+- 怕麻烦:流程是什么、要等多久、怎么安排。
+- 不会选:型号/方案/规格太多怎么选。
+- 担心服务:高峰期响应怎么样、稳不稳定。
+- 担心落差:适合谁、不适合谁。
+
+## 内容结构
+
+1. 用户问题:从评论、问题池、竞品吐槽里提取。
+2. 内容承诺:这条视频/笔记用来解决什么。
+3. 前 3 秒钩子:用用户原话或老板视角的反常识表达。
+4. 主体:把卖点翻译成“适合谁、解决什么、怎么判断”。
+5. 证据:真实案例、对比、用户原话。
+6. 结尾:引导评论区补充自己的情况,承接转化。
+
+## 验证指标
+
+- 评论区是否出现“我也担心这个”类共鸣。
+- 私信/咨询是否提到这条内容。
+- 是否降低了首次决策的犹豫。

+ 0 - 41
claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/restaurant-content-framework.md

@@ -1,41 +0,0 @@
-# 餐饮 VOC 内容选题框架
-
-## 使用原则
-
-内容不是从“今天想拍什么”开始,而是从“顾客正在犹豫什么”开始。
-
-每条内容必须回答一个 VOC 问题:
-
-- 怕踩雷:第一次来怎么点。
-- 嫌贵:为什么值、怎么点更稳。
-- 怕排队:什么时候来、等位怎么安排。
-- 不知道招牌:不同人群怎么选。
-- 担心服务:高峰期怎么减少不确定。
-- 担心落差:适合谁、不适合谁。
-
-## 结构
-
-1. 用户问题:从评论、问题池、竞品吐槽中提取。
-2. 内容承诺:这条视频帮用户解决什么。
-3. 前 3 秒钩子:用用户原话或老板反常识表达。
-4. 主体口播:先承认问题,再给具体方案。
-5. 镜头证据:菜品、菜单、门店流程、真实环境。
-6. 评论区引导:让用户继续暴露顾虑。
-7. 验证指标:看评论关键词是否变化。
-
-## 常用钩子
-
-- 第一次来别乱点,先按这个顺序。
-- 觉得我们人均不低,我直接讲贵在哪里。
-- 想吃但怕排队,先记住这几个时间。
-- 这道招牌菜不是所有人都适合点。
-- 先说缺点,再说适合什么人来。
-- 高峰期最容易不舒服的地方,我们直接讲清楚。
-
-## 禁止
-
-- 不要只写“烟火气”“高级感”“宝藏小店”。
-- 不要每条都夸自己。
-- 不要把创始人故事混进 VOC 内容计划。
-- 不要脱离用户问题写泛泛爆款脚本。
-

+ 0 - 34
claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/restaurant-speaking-script-patterns.md

@@ -1,34 +0,0 @@
-# 餐饮口播脚本结构
-
-## 30 秒结构
-
-1. 0-3 秒:用户问题钩子。
-2. 3-8 秒:承认顾虑,不急着自夸。
-3. 8-22 秒:给一个具体建议。
-4. 22-30 秒:评论区引导或到店动作。
-
-示例:
-
-```text
-第一次来别一上来就乱点。
-如果你怕点错、怕人均超预算,可以先按这个顺序来。
-先点招牌,再点一个下饭菜,最后加一个解腻的。
-你是两个人来还是四个人来?评论区告诉我,我给你配一版。
-```
-
-## 60 秒结构
-
-1. 用户原话。
-2. 老板解释真实原因。
-3. 给出方案。
-4. 展示门店证据。
-5. 引导用户继续提问。
-
-## 镜头搭配
-
-- 菜品问题:菜品近景、出餐过程、菜单价格、桌面组合。
-- 排队问题:门口等位、非高峰空桌、等位提示牌。
-- 价格问题:食材、分量、套餐、适合人数。
-- 服务问题:提示牌、动线、员工响应、收银/打包区。
-- 落差问题:无滤镜环境、真实高峰、适合谁不适合谁。
-

+ 31 - 0
claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/speaking-script-patterns.md

@@ -0,0 +1,31 @@
+# 口播脚本结构
+
+## 30 秒结构
+
+1. 0-3 秒:用用户问题做钩子。
+2. 3-8 秒:承接顾虑,不急着夸自己。
+3. 8-22 秒:给一个具体建议或判断标准。
+4. 22-30 秒:评论区引导,承接下一步动作。
+
+示例:
+
+```text
+第一次买,别一上来就比价格。
+如果你也担心选错、怕不适合,可以先按这个顺序看。
+先看适合谁、再看怎么判断质量、最后看售后怎么兜底。
+你是自己用还是送人?评论区告诉我,我帮你按情况给一个更具体的建议。
+```
+
+## 60 秒结构
+
+1. 0-3 秒:钩子,抛出真实顾虑。
+2. 3-15 秒:解释这个顾虑为什么常见,建立信任。
+3. 15-40 秒:给判断标准 + 一个真实案例或对比。
+4. 40-55 秒:把卖点翻译成用户听得懂的证明。
+5. 55-60 秒:评论区引导,承接转化。
+
+## 风格提醒
+
+- 少讲概念,多给可以照做的具体动作。
+- 老板视角:讲清楚这件事影响新客、复购还是口碑。
+- 没有真实证据时,标注为结构推演稿。

+ 4 - 4
claude-code/claude-code-voc-intelligence/skills/voc-issue-pool/SKILL.md

@@ -27,19 +27,19 @@ allowed-tools: Read Write Bash(node *)
 - When the user asks for a VOC report around business pain points, first build or request a clean evidence set, then run `voc_issue_pool_run`; only after that should a single top issue be sent to `voc_problem_deep_dive_run`.
 - When the user asks for a VOC report around business pain points, first build or request a clean evidence set, then run `voc_issue_pool_run`; only after that should a single top issue be sent to `voc_problem_deep_dive_run`.
 
 
 ```bash
 ```bash
-node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "样板门店A" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --evidence "排队久,但是不知道值不值得等。,人均有点高,第一次来不知道怎么点不踩雷。,服务忙起来没人理。" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "示例品牌A" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --evidence "第一次买不知道怎么选,怕踩雷。,价格有点高,不确定值不值。,咨询忙起来没人理。" --assistant-message-only
 ```
 ```
 
 
 带报告文件:
 带报告文件:
 
 
 ```bash
 ```bash
-node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "样板门店A" --industry "本地生活餐饮" --report "outputs/douyin-trend-report.md" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "示例品牌A" --industry "家居定制" --report "outputs/douyin-trend-report.md" --assistant-message-only
 ```
 ```
 
 
 更新状态:
 更新状态:
 
 
 ```bash
 ```bash
-node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "样板门店A" --industry "本地生活餐饮" --resolved-issues "排队/等待" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "示例品牌A" --industry "家居定制" --resolved-issues "选择门槛/决策" --assistant-message-only
 ```
 ```
 
 
 ## 输出结构
 ## 输出结构
@@ -77,5 +77,5 @@ node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "样板门
 ```
 ```
 
 
 ```text
 ```text
-排队问题已经在验证中,服务问题先暂缓,帮我更新一下问题池。
+选择问题已经在验证中,服务问题先暂缓,帮我更新一下问题池。
 ```
 ```

+ 5 - 5
claude-code/claude-code-voc-intelligence/skills/voc-problem-deep-dive/SKILL.md

@@ -38,19 +38,19 @@ allowed-tools: Read Write Bash(node *)
 - If live collection returns `needs_token`, `needs_recharge`, or `needs_valid_token`, repeat the tool's user-facing `assistantMessage` and do not replace it with a generic strategy suggestion.
 - If live collection returns `needs_token`, `needs_recharge`, or `needs_valid_token`, repeat the tool's user-facing `assistantMessage` and do not replace it with a generic strategy suggestion.
 
 
 ```bash
 ```bash
-node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "排队" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "怎么选" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --assistant-message-only
 ```
 ```
 
 
 带记忆的多轮迭代:
 带记忆的多轮迭代:
 
 
 ```bash
 ```bash
-node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "排队" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --memory "outputs/voc-problem-memory.json" --feedback "老板不想做等位饮品,更想先改评论区回复和预点单" --blocked-actions "等位饮品" --preferred-actions "评论区回复,预点单" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "怎么选" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --memory "outputs/voc-problem-memory.json" --feedback "老板不想做试用体验,更想先改评论区回复和案例展示" --blocked-actions "试用体验" --preferred-actions "评论区回复,案例展示" --assistant-message-only
 ```
 ```
 
 
 自然语言反馈也可以直接传入 `feedback`,工具会尝试自动提取偏好和屏蔽动作:
 自然语言反馈也可以直接传入 `feedback`,工具会尝试自动提取偏好和屏蔽动作:
 
 
 ```bash
 ```bash
-node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "排队" --project "样板门店A" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --feedback "这个店不想做等位饮品,更想先改评论区回复和预点单" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "怎么选" --project "示例品牌A" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --feedback "这个品牌不想做试用体验,更想先改评论区回复和案例展示" --assistant-message-only
 ```
 ```
 
 
 如果用户反馈“这个有效”“这个无效”“跑了 7 天有效果/没效果”,要把对应动作传入 `validatedActions` 或 `rejectedActions`,也可以直接放进 `feedback`。工具会沉淀动作验证次数,后续排序会自动提高有效动作、降低无效动作,并说明“为什么优先推荐这些动作”。
 如果用户反馈“这个有效”“这个无效”“跑了 7 天有效果/没效果”,要把对应动作传入 `validatedActions` 或 `rejectedActions`,也可以直接放进 `feedback`。工具会沉淀动作验证次数,后续排序会自动提高有效动作、降低无效动作,并说明“为什么优先推荐这些动作”。
@@ -74,11 +74,11 @@ node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "排队
 ## 典型用户话术
 ## 典型用户话术
 
 
 ```text
 ```text
-这个“排队”问题继续深挖一下,老板能怎么解决?
+这个“怎么选”问题继续深挖一下,老板能怎么解决?
 ```
 ```
 
 
 ```text
 ```text
-这条差评背后到底是什么问题,门店应该怎么改?
+这条差评背后到底是什么问题,品牌应该怎么改?
 ```
 ```
 
 
 ```text
 ```text

+ 14 - 14
claude-code/claude-code-voc-intelligence/skills/voc-speaking-script/SKILL.md

@@ -27,11 +27,11 @@ VOC 问题 -> 7 天内容计划 -> 选择一条选题 -> 口播脚本共创 -> 
 
 
 ```bash
 ```bash
 node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
 node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
-  --brand "样板门店A" \
-  --industry "本地生活餐饮" \
-  --topic "第一次来怎么点不踩雷" \
-  --user-issue "第一次来怕点错" \
-  --evidence "第一次来不知道怎么点,怕踩雷" \
+  --brand "示例品牌A" \
+  --industry "家居定制" \
+  --topic "第一次买怎么选不踩雷" \
+  --user-issue "第一次买怕选错" \
+  --evidence "第一次买不知道怎么选,怕踩雷" \
   --assistant-message-only
   --assistant-message-only
 ```
 ```
 
 
@@ -39,10 +39,10 @@ node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
 
 
 ```bash
 ```bash
 node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
 node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
-  --brand "样板门店A" \
-  --topic "第一次来怎么点不踩雷" \
-  --user-issue "第一次来怕点错" \
-  --evidence "第一次来不知道怎么点,怕踩雷" \
+  --brand "示例品牌A" \
+  --topic "第一次买怎么选不踩雷" \
+  --user-issue "第一次买怕选错" \
+  --evidence "第一次买不知道怎么选,怕踩雷" \
   --feedback "开头更狠一点,老板视角,少讲概念,多给具体场景" \
   --feedback "开头更狠一点,老板视角,少讲概念,多给具体场景" \
   --assistant-message-only
   --assistant-message-only
 ```
 ```
@@ -51,10 +51,10 @@ node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
 
 
 ```bash
 ```bash
 node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
 node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
-  --brand "样板门店A" \
-  --topic "第一次来怎么点不踩雷" \
-  --user-issue "第一次来怕点错" \
-  --evidence "第一次来不知道怎么点,怕踩雷" \
+  --brand "示例品牌A" \
+  --topic "第一次买怎么选不踩雷" \
+  --user-issue "第一次买怕选错" \
+  --evidence "第一次买不知道怎么选,怕踩雷" \
   --feedback "定稿" \
   --feedback "定稿" \
   --finalize true \
   --finalize true \
   --assistant-message-only
   --assistant-message-only
@@ -75,7 +75,7 @@ node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
 ```
 ```
 
 
 ```text
 ```text
-把“排队久”这个 VOC 问题写成一条 60 秒口播稿,要有 30 秒压缩版和提词器版。
+把“第一次买怎么选”这个 VOC 问题写成一条 60 秒口播稿,要有 30 秒压缩版和提词器版。
 ```
 ```
 
 
 ## 输出验收
 ## 输出验收

+ 2 - 2
claude-code/claude-code-voc-intelligence/skills/xiaohongshu-trend-intelligence/SKILL.md

@@ -29,14 +29,14 @@ allowed-tools: Read Write Bash(node *)
 live 采集失败时,严禁做以下任何一件事:
 live 采集失败时,严禁做以下任何一件事:
 
 
 - 严禁退回/降级到联网搜索(web search)、`yt-dlp`、`ffmpeg`、手动让用户上传图片/视频,或任何“绕过 VOC 接口”的抓取方式。本技能包的 VOC 本地采集是唯一批准的真实数据入口。
 - 严禁退回/降级到联网搜索(web search)、`yt-dlp`、`ffmpeg`、手动让用户上传图片/视频,或任何“绕过 VOC 接口”的抓取方式。本技能包的 VOC 本地采集是唯一批准的真实数据入口。
-- 严禁输出“VOC 只支持餐饮/零售类目”“律师/某赛道不可用”“系统设计上有类目限制”这类结论。这是错误结论:任何关键词(律师、法律、医美、教育、专业服务等)都能采集,与类目无关。
+- 严禁输出“VOC 只支持某些类目”“律师/某赛道不可用”“系统设计上有类目限制”这类结论。这是错误结论:任何关键词(律师、法律、医美、教育、专业服务等)都能采集,与类目无关。
 - live 失败的真正原因只可能是这几类:token 无效或类型不对(需要 `r:` 开头的会话 token,而不是 `sk-` 开头的 AIGate API Key)、未开通或额度不足、上游接口抖动(5xx,需重试)。必须如实把工具返回的 `assistantMessage` 转述给用户,不要自行编造原因。
 - live 失败的真正原因只可能是这几类:token 无效或类型不对(需要 `r:` 开头的会话 token,而不是 `sk-` 开头的 AIGate API Key)、未开通或额度不足、上游接口抖动(5xx,需重试)。必须如实把工具返回的 `assistantMessage` 转述给用户,不要自行编造原因。
 - 只有在工具明确返回 `needs_keyword_fix` 时才允许调整关键词;返回 `needs_valid_token` / `needs_token` / `needs_recharge` 时不要换关键词,要转述充值/开通链接。
 - 只有在工具明确返回 `needs_keyword_fix` 时才允许调整关键词;返回 `needs_valid_token` / `needs_token` / `needs_recharge` 时不要换关键词,要转述充值/开通链接。
 
 
 English (same rules):
 English (same rules):
 
 
 - On live failure, NEVER fall back to web search, `yt-dlp`, `ffmpeg`, or asking the user to upload media. The local VOC tool is the only approved real-data path.
 - On live failure, NEVER fall back to web search, `yt-dlp`, `ffmpeg`, or asking the user to upload media. The local VOC tool is the only approved real-data path.
-- NEVER conclude that VOC is limited to restaurant/retail categories or that a vertical (e.g. lawyers) is unsupported. Any keyword works; this is never a category problem.
+- NEVER conclude that VOC is limited to certain categories or that a vertical (e.g. lawyers) is unsupported. Any keyword works; this is never a category problem.
 - The only real causes are: invalid/wrong-type token (need an `r:` session token, not an `sk-` AIGate key), not activated / no balance, or upstream 5xx jitter (retry). Relay the tool's `assistantMessage` verbatim instead of inventing a reason.
 - The only real causes are: invalid/wrong-type token (need an `r:` session token, not an `sk-` AIGate key), not activated / no balance, or upstream 5xx jitter (retry). Relay the tool's `assistantMessage` verbatim instead of inventing a reason.
 - Only adjust keywords when the tool returns `needs_keyword_fix`. For `needs_valid_token` / `needs_token` / `needs_recharge`, do not change keywords — surface the payment/activation link.
 - Only adjust keywords when the tool returns `needs_keyword_fix`. For `needs_valid_token` / `needs_token` / `needs_recharge`, do not change keywords — surface the payment/activation link.