@optima-chat/optima-agent 0.9.38 → 0.9.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/.claude/settings.local.json +166 -0
  2. package/.claude/skills/scout/SKILL.md +46 -141
  3. package/.claude/skills/scout/references/analysis-framework.md +4 -4
  4. package/.claude/skills/scout/references/concept.md +49 -46
  5. package/.claude/skills/scout/references/cross-project.md +9 -9
  6. package/.claude/skills/scout/references/development.md +13 -13
  7. package/.claude/skills/scout/references/launch.md +1 -1
  8. package/.claude/skills/scout/references/lifecycle.md +3 -3
  9. package/.claude/skills/scout/references/market-management.md +18 -18
  10. package/.claude/skills/scout/references/planning.md +25 -24
  11. package/.claude/skills/scout/references/qualification.md +11 -11
  12. package/.claude/skills/scout/references/requirements.md +10 -10
  13. package/.claude/skills/scout/template/kb/AGENTS.md +151 -0
  14. package/.claude/skills/scout/template/kb/wiki/entities/projects-template.md +113 -0
  15. package/.claude/skills/scout/template/kb/wiki/entities/seller-profile.md +23 -0
  16. package/.claude/skills/scout/template/kb/wiki/overview/cbb.md +33 -0
  17. package/.claude/skills/scout/template/kb/wiki/overview/competition-template.md +33 -0
  18. package/.claude/skills/scout/template/kb/wiki/overview/market-template.md +32 -0
  19. package/.claude/skills/scout/template/kb/wiki/overview/pain-points-template.md +19 -0
  20. package/.claude/skills/scout/template/kb/wiki/overview/roadmap.md +41 -0
  21. package/.claude/skills/scout/template/kb/wiki/overview/suppliers-template.md +34 -0
  22. package/.claude/skills/scout/template/kb/wiki/overview/trends-template.md +23 -0
  23. package/dist/bin/bi-cli.js +0 -0
  24. package/dist/bin/browser-cli.js +0 -0
  25. package/dist/bin/channels.js +0 -0
  26. package/dist/bin/comfy.d.ts +3 -0
  27. package/dist/bin/comfy.d.ts.map +1 -0
  28. package/dist/bin/comfy.js +3 -0
  29. package/dist/bin/comfy.js.map +1 -0
  30. package/dist/bin/commerce.js +0 -0
  31. package/dist/bin/gen.js +0 -0
  32. package/dist/bin/google-ads.js +0 -0
  33. package/dist/bin/growth.d.ts +3 -0
  34. package/dist/bin/growth.d.ts.map +1 -0
  35. package/dist/bin/growth.js +3 -0
  36. package/dist/bin/growth.js.map +1 -0
  37. package/dist/bin/kb-skills.js +0 -0
  38. package/dist/bin/logistics.js +0 -0
  39. package/dist/bin/optima.js +0 -0
  40. package/dist/bin/scout.js +0 -0
  41. package/dist/bin/sentinel.js +0 -0
  42. package/dist/bin/shopify.js +0 -0
  43. package/dist/src/hooks-loader.d.ts +6 -0
  44. package/dist/src/hooks-loader.d.ts.map +1 -0
  45. package/dist/src/hooks-loader.js +215 -0
  46. package/dist/src/hooks-loader.js.map +1 -0
  47. package/dist/src/ui/App.d.ts +6 -0
  48. package/dist/src/ui/App.d.ts.map +1 -0
  49. package/dist/src/ui/App.js +164 -0
  50. package/dist/src/ui/App.js.map +1 -0
  51. package/dist/src/ui/components/Composer.d.ts +10 -0
  52. package/dist/src/ui/components/Composer.d.ts.map +1 -0
  53. package/dist/src/ui/components/Composer.js +13 -0
  54. package/dist/src/ui/components/Composer.js.map +1 -0
  55. package/dist/src/ui/components/Header.d.ts +7 -0
  56. package/dist/src/ui/components/Header.d.ts.map +1 -0
  57. package/dist/src/ui/components/Header.js +7 -0
  58. package/dist/src/ui/components/Header.js.map +1 -0
  59. package/dist/src/ui/components/Message.d.ts +12 -0
  60. package/dist/src/ui/components/Message.d.ts.map +1 -0
  61. package/dist/src/ui/components/Message.js +21 -0
  62. package/dist/src/ui/components/Message.js.map +1 -0
  63. package/dist/src/ui/components/MessageList.d.ts +9 -0
  64. package/dist/src/ui/components/MessageList.d.ts.map +1 -0
  65. package/dist/src/ui/components/MessageList.js +18 -0
  66. package/dist/src/ui/components/MessageList.js.map +1 -0
  67. package/dist/src/ui/components/Spinner.d.ts +6 -0
  68. package/dist/src/ui/components/Spinner.d.ts.map +1 -0
  69. package/dist/src/ui/components/Spinner.js +7 -0
  70. package/dist/src/ui/components/Spinner.js.map +1 -0
  71. package/dist/src/ui/components/StatusBar.d.ts +11 -0
  72. package/dist/src/ui/components/StatusBar.d.ts.map +1 -0
  73. package/dist/src/ui/components/StatusBar.js +7 -0
  74. package/dist/src/ui/components/StatusBar.js.map +1 -0
  75. package/dist/src/ui/components/index.d.ts +7 -0
  76. package/dist/src/ui/components/index.d.ts.map +1 -0
  77. package/dist/src/ui/components/index.js +7 -0
  78. package/dist/src/ui/components/index.js.map +1 -0
  79. package/dist/src/ui/headless.d.ts.map +1 -1
  80. package/dist/src/ui/headless.js +4 -9
  81. package/dist/src/ui/headless.js.map +1 -1
  82. package/dist/src/validation/error-formatter.d.ts +21 -0
  83. package/dist/src/validation/error-formatter.d.ts.map +1 -0
  84. package/dist/src/validation/error-formatter.js +98 -0
  85. package/dist/src/validation/error-formatter.js.map +1 -0
  86. package/dist/src/validation/index.d.ts +10 -0
  87. package/dist/src/validation/index.d.ts.map +1 -0
  88. package/dist/src/validation/index.js +10 -0
  89. package/dist/src/validation/index.js.map +1 -0
  90. package/dist/src/validation/json-validator.d.ts +25 -0
  91. package/dist/src/validation/json-validator.d.ts.map +1 -0
  92. package/dist/src/validation/json-validator.js +173 -0
  93. package/dist/src/validation/json-validator.js.map +1 -0
  94. package/dist/src/validation/schema.d.ts +353 -0
  95. package/dist/src/validation/schema.d.ts.map +1 -0
  96. package/dist/src/validation/schema.js +57 -0
  97. package/dist/src/validation/schema.js.map +1 -0
  98. package/dist/src/validation/suggestions.d.ts +25 -0
  99. package/dist/src/validation/suggestions.d.ts.map +1 -0
  100. package/dist/src/validation/suggestions.js +144 -0
  101. package/dist/src/validation/suggestions.js.map +1 -0
  102. package/dist/src/validation/types.d.ts +40 -0
  103. package/dist/src/validation/types.d.ts.map +1 -0
  104. package/dist/src/validation/types.js +5 -0
  105. package/dist/src/validation/types.js.map +1 -0
  106. package/dist/src/validation/yaml-validator.d.ts +25 -0
  107. package/dist/src/validation/yaml-validator.d.ts.map +1 -0
  108. package/dist/src/validation/yaml-validator.js +177 -0
  109. package/dist/src/validation/yaml-validator.js.map +1 -0
  110. package/package.json +12 -13
@@ -0,0 +1,166 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(gh api:*)",
5
+ "WebFetch(domain:platform.claude.com)",
6
+ "Bash(git init:*)",
7
+ "Bash(mkdir:*)",
8
+ "Bash(npm run typecheck:*)",
9
+ "Bash(npm view:*)",
10
+ "WebSearch",
11
+ "Bash(commerce --help)",
12
+ "Bash(done)",
13
+ "Bash(commerce product:*)",
14
+ "Bash(commerce order:*)",
15
+ "Bash(commerce i18n:*)",
16
+ "Bash(google-ads:*)",
17
+ "Bash(scout --help:*)",
18
+ "Bash(tree:*)",
19
+ "Bash(cloc:*)",
20
+ "Bash(npm run build:*)",
21
+ "Bash(git restore:*)",
22
+ "Bash(gh repo view:*)",
23
+ "Bash(mv:*)",
24
+ "Bash(rmdir:*)",
25
+ "Bash(git add:*)",
26
+ "Bash(git commit:*)",
27
+ "Bash(git push)",
28
+ "Bash(timeout 5 npm run optima:*)",
29
+ "Bash(npm install:*)",
30
+ "Bash(cat:*)",
31
+ "Bash(gh issue create:*)",
32
+ "Bash(npx tsx:*)",
33
+ "Bash(timeout 30 npx tsx:*)",
34
+ "Bash(git push origin feature/ask-user-question)",
35
+ "Bash(node:*)",
36
+ "Bash(npm version:*)",
37
+ "Bash(git push:*)",
38
+ "Bash(npm publish:*)",
39
+ "Bash(pkill:*)",
40
+ "Bash(git -C /Users/verypro/optima-agent log --oneline --all -- \".claude/\")",
41
+ "Bash(wc:*)",
42
+ "Bash(grep:*)",
43
+ "Bash(find:*)",
44
+ "Bash(commerce collection --help:*)",
45
+ "Bash(commerce collection update --help:*)",
46
+ "Bash(commerce collection set-cover:*)",
47
+ "Bash(commerce collection get --help:*)",
48
+ "Bash(commerce collection list --help:*)",
49
+ "Bash(commerce collection create --help:*)",
50
+ "Bash(commerce collection remove-products:*)",
51
+ "Bash(commerce collection list-products:*)",
52
+ "Bash(commerce --version:*)",
53
+ "Bash(bi-cli --version:*)",
54
+ "Bash(commerce homepage create --help:*)",
55
+ "Bash(commerce homepage reorder --help:*)",
56
+ "Bash(commerce homepage delete --help:*)",
57
+ "Bash(commerce homepage update-images:*)",
58
+ "Bash(commerce homepage update-collections:*)",
59
+ "Bash(commerce homepage update-target:*)",
60
+ "Bash(commerce homepage switch-template:*)",
61
+ "Bash(commerce inventory:*)",
62
+ "Bash(commerce merchant:*)",
63
+ "Bash(commerce review:*)",
64
+ "Bash(commerce product-page:*)",
65
+ "Bash(bi-cli:*)",
66
+ "Bash(comfy:*)",
67
+ "Bash(scout search:*)",
68
+ "Bash(scout product:*)",
69
+ "Bash(commerce homepage create-collections:*)",
70
+ "Bash(commerce homepage create-featured:*)",
71
+ "Bash(commerce homepage create-collection-products:*)",
72
+ "Bash(commerce homepage create-banner:*)",
73
+ "Bash(xargs -I {} sh -c 'echo \"\"\"\"=== {} ===\"\"\"\"; head -3 /Users/verypro/optima-agent/.claude/skills/{}/SKILL.md | grep \"\"\"\"name:\"\"\"\"')",
74
+ "Bash(ls:*)",
75
+ "Bash(gh issue view:*)",
76
+ "Bash(npx markdownlint-cli:*)",
77
+ "Bash(chmod:*)",
78
+ "Bash(npm whoami:*)",
79
+ "Bash(tsx test-scripts/test-headless-progress.ts:*)",
80
+ "Bash(DEBUG_STREAM=1 node dist/bin/optima.js:*)",
81
+ "Bash(git describe:*)",
82
+ "WebFetch(domain:github.com)",
83
+ "Bash(./scripts/test-headless.sh:*)",
84
+ "Bash(./scripts/test-headless-simple.sh:*)",
85
+ "Bash(env)",
86
+ "Bash(gh pr list:*)",
87
+ "Bash(gh pr view:*)",
88
+ "Bash(gh pr diff:*)",
89
+ "Bash(optima --version:*)",
90
+ "Bash(optima agent headless:*)",
91
+ "Bash(optima headless:*)",
92
+ "Bash(/Users/verypro/optima-agent/scripts/test-headless.sh:*)",
93
+ "Bash(/Users/verypro/optima-agent/scripts/test-headless-simple.sh:*)",
94
+ "Bash(tee:*)",
95
+ "Bash(CONV_ID=\"conv-1\":*)",
96
+ "Bash(echo:*)",
97
+ "Bash(scout tiktok trending --help:*)",
98
+ "Bash(scout tiktok trending:*)",
99
+ "Bash(git checkout:*)",
100
+ "Bash(npm test:*)",
101
+ "Bash(git tag:*)",
102
+ "Bash(/private/tmp/claude/-Users-verypro-optima-agent/68a9ac2c-def2-44e1-b42b-e53bd9022ab6/scratchpad/test-canUseTool.sh)",
103
+ "Bash(optima --help:*)",
104
+ "Bash(npx @optima-chat/ads-cli:*)",
105
+ "Bash(head:*)",
106
+ "Bash(git pull:*)",
107
+ "Bash(pnpm build:*)",
108
+ "Skill(read-code)",
109
+ "Bash(npm run cli:*)",
110
+ "Bash(scout:*)",
111
+ "WebFetch(domain:docs.scrapecreators.com)",
112
+ "WebFetch(domain:scrapecreators.com)",
113
+ "Bash(gh auth status:*)",
114
+ "Bash(optima-agent:*)",
115
+ "Bash(python3:*)",
116
+ "Bash(python3 -c \" import sys content = sys.stdin.read\\(\\) # Find flushMessageQueueSync idx = content.find\\(''flushMessageQueueSync''\\) # Get context around it lines = content.split\\(''\\\\n''\\) for i, line in enumerate\\(lines\\): if ''flushMessageQueueSync'' in line and ''private'' in line: for j in range\\(i, min\\(i+20, len\\(lines\\)\\)\\): print\\(f''{j+1}: {lines[j]}''\\) break \")",
117
+ "Bash(optima:*)",
118
+ "WebFetch(domain:www.npmjs.com)",
119
+ "WebFetch(domain:registry.npmjs.org)",
120
+ "WebFetch(domain:zod.dev)",
121
+ "Bash(npm ls:*)",
122
+ "Bash(NODE_DEBUG=child_process npx tsx:*)",
123
+ "Bash(DEBUG_CLAUDE_AGENT_SDK=1 npx tsx:*)",
124
+ "Bash(CLAUDECODE= npx tsx:*)",
125
+ "Bash(env:*)",
126
+ "Bash(gh release:*)",
127
+ "Bash(npm info:*)",
128
+ "Bash(gh run:*)",
129
+ "Bash(gtimeout 90:*)",
130
+ "Bash(sentinel:*)",
131
+ "Bash(gh pr:*)",
132
+ "Bash(git fetch:*)",
133
+ "Bash(git log:*)",
134
+ "Bash(npm bin:*)",
135
+ "Bash(git status:*)",
136
+ "Bash(browser-cli --version && browser-cli --help)",
137
+ "Bash(browser-cli status:*)",
138
+ "Bash(browser-cli launch:*)",
139
+ "Bash(browser-cli screenshot:*)",
140
+ "Bash(browser-cli --version)",
141
+ "Bash(browser-cli close:*)",
142
+ "Bash(npm update:*)",
143
+ "Bash(node -e \"console.log\\(require\\('./node_modules/@optima-chat/browser-cli/package.json'\\).version\\)\")",
144
+ "WebFetch(domain:raw.githubusercontent.com)",
145
+ "Bash(aws ecs:*)",
146
+ "Bash(aws ecr:*)",
147
+ "Bash(gh search:*)",
148
+ "Bash(npx tsc:*)",
149
+ "Bash(find /Users/verypro/optima-agent -path */node_modules -prune -o -type f \\\\\\(-name *comfy* -o -name *gen* \\\\\\) -print)",
150
+ "Bash(export PATH=\"/usr/local/bin:$PATH\")",
151
+ "Bash(pnpm add:*)",
152
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/max-rounds-hit)",
153
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/budget-almost-spent)",
154
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/two-active-campaigns)",
155
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/brand-only)",
156
+ "Bash(pnpm vitest:*)",
157
+ "Bash(pnpm test:*)",
158
+ "Bash(pnpm --filter @optima-scout/backend test --reporter=verbose backend/src/routes/outreach/__tests__/lock.test.ts backend/src/routes/outreach/__tests__/inbound.test.ts)",
159
+ "Bash(npx vitest:*)",
160
+ "Bash(DATABASE_URL=postgres://optima_scout:optima_scout_dev@localhost:7293/optima_scout pnpm --filter @optima-scout/backend test)",
161
+ "Bash(pnpm --filter @optima-scout/backend exec vitest run src/routes/outreach/__tests__/inbound.test.ts)"
162
+ ],
163
+ "deny": [],
164
+ "ask": []
165
+ }
166
+ }
@@ -1,24 +1,23 @@
1
1
  ---
2
2
  name: scout
3
- description: "基于 IPD 方法论的产品研究全生命周期工具。在 ~/products/ 管理研究项目,跨对话持久化数据。引导用户通过概念→计划→开发→验证→发布→生命周期阶段,使用 SPAN 定位、$APPEALS 竞品评分、FAN 财务分析和结构化 Gate 评审(CDCP/PDCP/ADCP)。当用户提到以下场景时使用:产品研究、选品、市场调研、竞品分析、市场验证、需求分析、供应商、采购、1688、找货、商业分析、利润、成本、趋势、走势、热度、评论、差评、痛点、价格历史、BSR、产品组合、对比分析、卖什么、开店、做什么产品。"
3
+ description: "基于 IPD 方法论的产品研究全生命周期工具。在 ~/kb/product-research/ 管理研究项目,跨对话持久化数据。引导用户通过概念→计划→开发→验证→发布→生命周期阶段,使用 SPAN 定位、$APPEALS 竞品评分、FAN 财务分析和结构化 Gate 评审(CDCP/PDCP/ADCP)。当用户提到以下场景时使用:产品研究、选品、市场调研、竞品分析、市场验证、需求分析、供应商、采购、1688、找货、商业分析、利润、成本、趋势、走势、热度、评论、差评、痛点、价格历史、BSR、产品组合、对比分析、卖什么、开店、做什么产品。"
4
4
  ---
5
5
 
6
6
  # Scout — IPD 产品研究
7
7
 
8
8
  ## 启动 SOP
9
9
 
10
- 1. 检查 `~/products/` 是否存在
11
- - 不存在 → template/user/ 复制 PROFILE.md、OVERVIEW.md、CBB.md、ROADMAP.md 到 `~/products/`
12
- - 初始化 git 仓库:`cd ~/products && git init && git add -A && git commit -m "init: 初始化产品研究工作区"`
13
- - **必须询问用户填写 PROFILE.md 的关键字段**(至少:主营市场、目标价位、最低毛利率、最低净利率、单品启动预算)。这些信息直接影响 SPAN 评分和 FAN 判断,缺失会导致分析不准确。用户可以简短回答,agent 帮填入。
14
- 2. 检查 PROFILE.md 是否已填写关键字段
10
+ 1. 检查 `~/kb/product-research/` 是否存在
11
+ - 不存在 → 使用 kb-skills initializing-kb 流程创建(名称: product-research),AGENTS.md 内容从 `template/kb/AGENTS.md` 复制
12
+ - **必须询问用户填写 `wiki/entities/seller-profile.md` 的关键字段**(至少:主营市场、目标价位、最低毛利率、最低净利率、单品启动预算)。这些信息直接影响 SPAN 评分和 FAN 判断,缺失会导致分析不准确。用户可以简短回答,agent 帮填入。
13
+ 2. 检查 `wiki/entities/seller-profile.md` 是否已填写关键字段
15
14
  - 未填写 → 必须询问(不能跳过关键字段:最低毛利率、最低净利率、单品启动预算)
16
- 3. 读取 `~/products/PROFILE.md` + `~/products/OVERVIEW.md` + `~/products/CBB.md` + `~/products/ROADMAP.md`
15
+ 3. 读取 `~/kb/product-research/wiki/entities/seller-profile.md` + `~/kb/product-research/index.md` + `~/kb/product-research/wiki/overview/roadmap.md` + `~/kb/product-research/wiki/overview/cbb.md`
17
16
  4. 判断用户意图:
18
- - 指定了具体产品 → 匹配已有项目(按名称/关键词)或新建
17
+ - 指定了具体产品 → 匹配已有项目(检查 `wiki/entities/projects/` 下已有项目)或新建
19
18
  - 未指定 → 展示当前项目状态,询问继续/新建
20
19
  - 要求跨项目分析 → 加载 [cross-project.md](references/cross-project.md)
21
- 5. 进入项目后读取 `~/products/{slug}/RESEARCH.md` + `~/products/{slug}/LOGS.md`(了解上次做到哪了)
20
+ 5. 进入项目后读取 `~/kb/product-research/wiki/entities/projects/{slug}.md` + `~/kb/product-research/log.md`(了解上次做到哪了)
22
21
  6. 根据当前阶段加载对应 reference 文件
23
22
 
24
23
  ## 快速研究模式
@@ -31,12 +30,13 @@ description: "基于 IPD 方法论的产品研究全生命周期工具。在 ~/p
31
30
  1. 立即执行 `scout search` 或 `scout product`(先拿数据再说)
32
31
  2. 分享关键发现(价格区间、竞争强度、销量信号)
33
32
  3. 询问用户:"要深入研究吗?我可以立项做完整的 IPD 分析。"
34
- - 用户说"深入" → 新建项目,进入概念阶段
35
- - 用户说"不用" → 对话结束,数据不落盘
33
+ - 用户说"深入" → 使用 `scout project use <name>` 立项,会自动迁入快速模式缓存数据,进入概念阶段
34
+ - 用户说"不用" → 对话结束,数据已自动缓存到 `~/.scout/cache/_quick/`,如需深入可立项迁入
36
35
 
37
36
  **原则**:
38
37
  - 先数据后建议 — 不要在没有数据的情况下给任何建议
39
- - 快速模式不创建项目、不落盘、不走 Gate
38
+ - 快速模式不创建项目、不走 Gate
39
+ - CLI 自动缓存到 `~/.scout/cache/_quick/{session}/`,无需手动管理
40
40
  - 用户随时可以从快速模式升级为正式 IPD 研究
41
41
 
42
42
  ## 项目管理
@@ -44,149 +44,62 @@ description: "基于 IPD 方法论的产品研究全生命周期工具。在 ~/p
44
44
  ### 新建项目
45
45
 
46
46
  1. 确定 slug(英文 kebab-case,如 titanium-tumbler)
47
- 2. template/product/ 复制完整目录到 `~/products/{slug}/`
48
- 3. 在 RESEARCH.md 中填入:产品名称、创建日期、研究目标
49
- 4. 在 OVERVIEW.md 中添加一行到"活跃项目"表
50
- 5. 在 ROADMAP.md 品类机会池中添加该产品(状态=已立项)
51
- 6. 在 LOGS.md 中记录:"立项:{产品名称}"
52
- 7. 检查 CBB.md:是否有可复用的能力模块?如有,告知用户并纳入 SPAN 评分考量
53
- 8. `cd ~/products && git add -A && git commit -m "新建项目: {slug}"`
47
+ 2. `scout project use {slug}` 设置当前项目上下文
48
+ 3. 在 `~/kb/product-research/wiki/entities/projects/{slug}.md` 中填入:产品名称、创建日期、研究目标
49
+ 4. 在 `index.md` 中添加一行到"活跃项目"表
50
+ 5. 在 `wiki/overview/roadmap.md` 品类机会池中添加该产品(状态=已立项)
51
+ 6. 在 `log.md` 中记录:"立项:{产品名称}"
52
+ 7. 检查 `wiki/overview/cbb.md`:是否有可复用的能力模块?如有,告知用户并纳入 SPAN 评分考量
53
+ 8. `cd ~/kb/product-research && git add -A && git commit -m "新建项目: {slug}"`
54
54
 
55
55
  ### 切换项目
56
56
 
57
- 读取 OVERVIEW.md → 列出活跃项目 → 用户选择 → 加载对应 RESEARCH.md
57
+ 读取 `index.md` → 列出活跃项目 → 用户选择 → 加载对应 `wiki/entities/projects/{slug}.md`
58
58
 
59
59
  ### 阶段回退
60
60
 
61
61
  如果用户要求回到前一阶段(如"我想重新评估竞品"):
62
- 1. 更新 RESEARCH.md 当前阶段(回退)
62
+ 1. 更新 `wiki/entities/projects/{slug}.md` 当前阶段(回退)
63
63
  2. 保留已有数据不删除
64
64
  3. 将对应阶段的 checklist 中需要重做的项取消勾选
65
65
  4. 加载对应阶段的 reference 重新执行
66
66
 
67
67
  ### 并行项目
68
68
 
69
- - 支持同时进行多个项目(OVERVIEW.md 多行活跃)
69
+ - 支持同时进行多个项目(`index.md` 多行活跃)
70
70
  - 建议同时进行的概念/计划阶段项目不超过 3 个(避免资源分散)
71
71
  - 每次对话聚焦一个项目,切换时明确告知用户
72
72
 
73
73
  ### 归档项目
74
74
 
75
- 1. 更新 RESEARCH.md 状态 → 已决策(Go) 或 已决策(No-Go)
76
- 2. 更新 OVERVIEW.md:从"活跃项目"移到"已完结"
77
- 3. 提示用户:"这次研究积累了什么可复用的能力?"→ 更新 CBB.md
78
-
79
- ## 数据落盘规则
80
-
81
- ### 前提
82
-
83
- 数据只在**有明确关联项目**时自动落盘:
84
- - 已选定项目 → 自动落盘到对应目录
85
- - 未选定项目 → 提示:"这个搜索结果要保存到某个项目里吗?"
86
- - 指定项目 → 落盘
87
- - 新建项目 → 初始化后落盘
88
- - 不保存 → 仅存在于对话上下文
89
-
90
- ### 落盘映射
91
-
92
- 原始数据统一存放在 `data/` 目录,活文档在各子目录。
93
-
94
- | 命令 | 原始数据(data/ 下) | 更新的活文档 | 更新 INDEX.md |
95
- |------|-------------------|------------|-------------|
96
- | `scout search` | data/searches/{date}-{keyword}.json | market/MARKET.md | ✅ |
97
- | `scout tiktok *` | data/social/{date}-tiktok.json | market/MARKET.md | ✅ |
98
- | `scout reddit *` | data/social/{date}-reddit.json | market/MARKET.md | ✅ |
99
- | `scout twitter *` | data/social/{date}-twitter.json | market/MARKET.md | ✅ |
100
- | `scout instagram *` | data/social/{date}-instagram.json | market/MARKET.md | ✅ |
101
- | `scout douyin *` | data/social/{date}-douyin.json | market/MARKET.md | ✅ |
102
- | `scout xhs *` | data/social/{date}-xhs.json | market/MARKET.md | ✅ |
103
- | `scout shein-search` | data/searches/{date}-shein.json | market/MARKET.md | ✅ |
104
- | `scout temu-search` | data/searches/{date}-temu.json | market/MARKET.md | ✅ |
105
- | `scout taobao *` | data/searches/{date}-taobao.json | market/MARKET.md | ✅ |
106
- | Web Search | data/social/{date}-web.json | market/MARKET.md | ✅ |
107
- | `scout product` | data/products/{ASIN}.json | competitors/COMPETITORS.md | ✅ |
108
- | `scout reviews` | data/reviews/{ASIN}-{star}.json | reviews/PAIN-POINTS.md | ✅ |
109
- | `scout keepa product` | data/keepa/{date}-batch.json | trends/TRENDS.md | ✅ |
110
- | `scout supplier-search` | data/suppliers/{date}-keyword.json | suppliers/SUPPLIERS.md | ✅ |
111
- | `scout supplier-search-image` | data/suppliers/{date}-image.json | suppliers/SUPPLIERS.md | ✅ |
112
- | `scout sp keywords` | data/sellersprite/{ASIN}-keywords.json | competitors/COMPETITORS.md | ✅ |
113
- | `scout sp keywords-mine` | data/sellersprite/{date}-{keyword}-mine.json | market/MARKET.md | ✅ |
114
- | `scout sp keywords-order` | data/sellersprite/{ASIN}-orders.json | competitors/COMPETITORS.md | ✅ |
115
- | `scout sp keywords-research` | data/sellersprite/{date}-{keyword}-research.json | market/MARKET.md | ✅ |
116
- | `scout sp keywords-trends` | data/sellersprite/{date}-{keyword}-trends.json | trends/TRENDS.md | ✅ |
117
- | `scout sp traffic-*` | data/sellersprite/{ASIN}-traffic-{type}.json | competitors/COMPETITORS.md | ✅ |
118
- | `scout sp predict` | data/sellersprite/{ASIN}-predict.json | competitors/COMPETITORS.md | ✅ |
119
- | `scout sp competitors` | data/sellersprite/{ASIN}-competitors.json | competitors/COMPETITORS.md | ✅ |
120
- | `scout sp coupon` | data/sellersprite/{ASIN}-coupon.json | competitors/COMPETITORS.md | ✅ |
121
- | `scout sp category` | data/sellersprite/{date}-category-{keyword}.json | market/MARKET.md | ✅ |
122
- | `scout sp market*` | data/sellersprite/{date}-market-{nodeIdPath}.json | market/MARKET.md | ✅ |
123
- | `scout sp brands` | data/sellersprite/{date}-brands-{nodeIdPath}.json | market/MARKET.md | ✅ |
124
- | `scout sp sellers` | data/sellersprite/{date}-sellers-{nodeIdPath}.json | market/MARKET.md | ✅ |
125
- | `scout sp demand` | data/sellersprite/{date}-demand-{nodeIdPath}.json | market/MARKET.md | ✅ |
126
- | `scout sp prices` | data/sellersprite/{date}-prices-{nodeIdPath}.json | market/MARKET.md | ✅ |
127
- | `scout sp google-trend` | data/sellersprite/{date}-google-{keyword}.json | market/MARKET.md | ✅ |
128
- | `scout sp aba-*` | data/sellersprite/{date}-aba-{keyword}.json | market/MARKET.md | ✅ |
129
-
130
- **文件命名规则**:
131
- - `{date}` = YYYY-MM-DD(如 2026-05-05)
132
- - `{keyword}` = 搜索关键词的 slug(如 open-ear-earbuds)
133
- - `{ASIN}` = 10 位 Amazon 产品 ID
134
- - `{star}` = 评论星级筛选(如 one-star、all-stars)
135
- - 同一 ASIN 多次拉取时覆盖(产品数据取最新值);搜索类数据带日期不覆盖
136
-
137
- **注意**:所有路径相对于项目目录 `~/products/{slug}/`。
138
-
139
- ### 落盘执行顺序(必须严格遵守)
140
-
141
- 每次执行 `scout` 命令后,**必须按以下五步操作**:
142
-
143
- 1. **存原始数据** — 将命令完整输出保存到 `data/` 对应文件。使用 `--format json` 获取结构化数据。
144
- 2. **更新 INDEX.md** — 在数据索引中添加/更新该条数据的记录(文件路径、时间、关联关系)。
145
- 3. **更新活文档** — 基于新数据更新对应的 Markdown 活文档。
146
- 4. **追加 LOGS.md** — 在操作日志中记录本次操作(时间 + 做了什么 + 关键发现)。
147
- 5. **git commit** — `cd ~/products && git add -A && git commit -m "{简短描述}"`
148
-
149
- **绝对不能**:
150
- - 只写活文档不存原始数据(数据丢失,无法回溯和重新分析)
151
- - 只在对话中展示结果不落盘(下次对话无法使用)
152
- - 把摘要当作原始数据存储(必须是完整返回)
153
- - 忘记更新 INDEX.md(agent 下次无法发现已有数据)
154
- - 忘记写 LOGS.md(跨会话上下文会丢失)
155
- - 忘记 git commit(版本历史会断裂)
156
-
157
- **JSON 存储示例**:
158
- ```bash
159
- # 正确做法:命令输出直接存文件
160
- scout search "open ear earbuds" --limit 15 --format json > /tmp/scout-result.json
161
- # 然后将结果追加到项目 JSON 文件
162
- ```
75
+ 1. 更新 `wiki/entities/projects/{slug}.md` 状态 → 已决策(Go) 或 已决策(No-Go)
76
+ 2. 更新 `index.md`:从"活跃项目"移到"已完结"
77
+ 3. 提示用户:"这次研究积累了什么可复用的能力?"→ 更新 `wiki/overview/cbb.md`
163
78
 
164
- ### JSON 格式
79
+ ## 数据管理
165
80
 
166
- 每个 JSON 文件是数组,每次追加带时间戳的条目:
167
- ```json
168
- [
169
- { "timestamp": "2026-05-05T10:30:00Z", "command": "scout search", "args": {"query": "titanium cup", "limit": 15}, "results": [...] }
170
- ]
171
- ```
81
+ ### CLI 自动缓存
82
+
83
+ 所有 `scout` 数据命令执行后自动缓存完整 JSON 到 `~/.scout/cache/{project}/`。
84
+ - 使用 `scout project use <name>` 设置当前项目
85
+ - 使用 `scout cache list` 查看已缓存文件
86
+ - stdout 输出摘要 + 缓存路径,不再输出完整 JSON
172
87
 
173
- ### 活文档更新策略
88
+ ### 数据进入 KB
174
89
 
175
- 活文档不是追加原始数据,而是**分析性更新**:
176
- - 新数据进来后重新审视文档,更新总结和判断
177
- - 新数据与旧分析矛盾时,更新结论并标注变化原因
178
- - 保持简洁可读(原始数据的职责在 JSON 中)
90
+ 数据通过 kb-skills 的 ingest 流程进入 `~/kb/product-research/`:
91
+ - 在数据完整性检查通过后批量 ingest
92
+ - ingest 将缓存文件复制到 `raw/`,生成 `wiki/sources/` 摘要页
93
+ - 自动更新相关 entity 和 overview 页面
94
+ - 具体 ingest 规则见 `~/kb/product-research/AGENTS.md`
179
95
 
180
- ### Checklist 自动更新
96
+ ### 分析数据来源
181
97
 
182
- 每次落盘后判断对应 checklist 项是否满足完成标准:
183
- - 不是"跑过命令=完成",而是**数据充分性**判断
184
- - 未完成时主动建议补充数据
185
- - 全部完成时主动发起 Gate 评审
98
+ agent 分析时读 `wiki/` 下的结构化页面,不直接读 raw JSON。
186
99
 
187
100
  ## 阶段路由
188
101
 
189
- 根据 RESEARCH.md "当前阶段"加载对应指引:
102
+ 根据 `wiki/entities/projects/{slug}.md` 当前阶段加载对应指引:
190
103
 
191
104
  | 阶段 | Reference |
192
105
  |------|-----------|
@@ -214,7 +127,7 @@ scout search "open ear earbuds" --limit 15 --format json > /tmp/scout-result.jso
214
127
  2. 逐项回答评审问题,引用已收集数据作为证据
215
128
  3. 给出 Go/Kill/Redirect 建议
216
129
  4. 等待用户确认
217
- 5. 确认后更新 RESEARCH.md(阶段、决策记录)+ OVERVIEW.md
130
+ 5. 确认后更新 `wiki/entities/projects/{slug}.md`(阶段、决策记录)+ `index.md`
218
131
 
219
132
  **评审结果格式:**
220
133
  ```
@@ -229,7 +142,7 @@ scout search "open ear earbuds" --limit 15 --format json > /tmp/scout-result.jso
229
142
 
230
143
  ## 报告生成
231
144
 
232
- 用户可随时要求生成报告,保存到 `~/products/{slug}/reports/YYYY-MM-DD-{标题}.md`。
145
+ 用户可随时要求生成报告,保存到 `~/kb/product-research/wiki/analyses/{slug}-{type}.md`。
233
146
 
234
147
  报告类型对齐 IPD 交付物:
235
148
  - 市场管理(MM) → 品类分析报告
@@ -297,17 +210,9 @@ Shein/Temu 低价($X)vs Amazon 中高价($Y)vs 1688 成本(¥Z)
297
210
 
298
211
  **不要用 WebFetch 直接抓 Amazon 页面**(会被反爬拦截)。
299
212
 
300
- ## KB 集成(可选)
301
-
302
- 如果 `~/kb/` 存在且有相关知识库:
303
- - 分析阶段可查询已有实体页、综述页辅助判断
304
- - 避免重复研究已知信息
305
-
306
- 报告生成后可建议用户 ingest 到 KB:
307
- - "这份报告要收录到知识库吗?"
308
- - 用户同意 → 触发 ingesting-sources 流程
213
+ ## KB 集成
309
214
 
310
- **不自动创建 KB。** 当积累 3+ 个完成的研究项目后,可主动建议创建产品研究知识库。
215
+ `~/kb/product-research/` 是产品研究的主数据存储。所有研究数据通过 CLI 自动缓存后,经 kb-skills 的 ingest 流程进入 KB。分析时读取 `wiki/` 下的结构化页面,不直接读 raw JSON。
311
216
 
312
217
  ## 交互风格
313
218
 
@@ -315,5 +220,5 @@ Shein/Temu 低价($X)vs Amazon 中高价($Y)vs 1688 成本(¥Z)
315
220
  - 每次操作后分享关键发现,不堆砌原始数据
316
221
  - 根据阶段主动建议下一步动作
317
222
  - Gate 评审时给出明确建议但尊重用户决策
318
- - 参考 PROFILE.md 过滤不匹配的产品/方向
223
+ - 参考 `wiki/entities/seller-profile.md` 过滤不匹配的产品/方向
319
224
  - 数据不足时主动建议补充,不强行给结论
@@ -25,7 +25,7 @@ SPAN 是一个 2×2 矩阵工具,用于判断一个商机是否值得投入。
25
25
  | 维度 | 权重 | 数据来源 | 评分标准 |
26
26
  |------|------|----------|----------|
27
27
  | 差异化能力 | 35% | $APPEALS 竞品缺口分析 | 5=明确可实现的差异化, 4=较明确, 3=有空间但不确定, 2=空间小, 1=无差异化空间 |
28
- | 资金匹配度 | 25% | PROFILE 预算 vs 所需投入 | 5=充裕(>3倍), 4=宽裕(2-3倍), 3=匹配, 2=紧张, 1=不足 |
28
+ | 资金匹配度 | 25% | seller-profile 预算 vs 所需投入 | 5=充裕(>3倍), 4=宽裕(2-3倍), 3=匹配, 2=紧张, 1=不足 |
29
29
  | 供应链能力 | 25% | 1688 供应商搜索结果 | 5=多家优质+低MOQ, 4=多家可选, 3=少量可用, 2=选择有限, 1=极少或无 |
30
30
  | 进入壁垒 | 15% | 头部评论数/品牌占比/认证要求;可用 `scout sp brands` 量化品牌集中度 | 5=低壁垒(无品牌垄断), 4=较低, 3=中等, 2=较高, 1=极高(强品牌+认证+专利) |
31
31
 
@@ -116,7 +116,7 @@ SPAN 是一个 2×2 矩阵工具,用于判断一个商机是否值得投入。
116
116
 
117
117
  ### 判断标准
118
118
 
119
- - 对照 PROFILE.md 中定义的**最低净利率**要求
119
+ - 对照 wiki/entities/seller-profile.md 中定义的**最低净利率**要求
120
120
  - 基准场景净利率 ≥ 最低要求 → 通过
121
121
  - 悲观场景仍盈利 → 安全
122
122
  - 基准场景不达标 → 不通过,除非有明确的战略理由
@@ -133,7 +133,7 @@ IPD 流程中的三个关键决策门(Decision Checkpoint),每个Gate有5
133
133
  | # | 问题 | 通过标准 | Kill 标准 |
134
134
  |---|------|----------|-----------|
135
135
  | 1 | 市场是否真实存在? | 月搜索量>1000 或 BSR drops 验证需求 | 搜索量<100 且无增长趋势 |
136
- | 2 | 能赚钱吗? | 初步估算毛利率 ≥ PROFILE 最低毛利率 | 毛利率 < 20% |
136
+ | 2 | 能赚钱吗? | 初步估算毛利率 ≥ seller-profile 最低毛利率 | 毛利率 < 20% |
137
137
  | 3 | 竞争打得过吗? | 存在可实现的差异化方向 | 头部5家全是强品牌+高评论 |
138
138
  | 4 | 有法律/合规风险吗? | 无专利/认证/资质壁垒 或 可解决 | 存在不可规避的专利/强制认证 |
139
139
  | 5 | SPAN 定位可接受吗? | 落入投资或选择性投入象限 | 落入退出象限 |
@@ -146,7 +146,7 @@ IPD 流程中的三个关键决策门(Decision Checkpoint),每个Gate有5
146
146
  |---|------|----------|-----------|
147
147
  | 1 | 差异化是否明确? | $APPEALS 识别出2+高权重弱项维度 | 无法找到差异化切入点 |
148
148
  | 2 | 供应商是否可行? | 已联系2+供应商, MOQ/价格可接受 | 无法找到合格供应商 |
149
- | 3 | 财务模型是否成立? | FAN 基准场景净利率 ≥ PROFILE 最低净利率 | 悲观场景亏损且无改善路径 |
149
+ | 3 | 财务模型是否成立? | FAN 基准场景净利率 ≥ seller-profile 最低净利率 | 悲观场景亏损且无改善路径 |
150
150
  | 4 | 风险是否可控? | 已识别TOP 3风险并有对策 | 存在不可控致命风险 |
151
151
  | 5 | 时间窗口是否合适? | 能在旺季前3个月就位 | 已错过时间窗口且无下一窗口 |
152
152