@optima-chat/optima-agent 0.9.43 → 0.9.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +166 -0
- package/.claude/skills/scout/references/concept.md +27 -30
- package/dist/bin/bi-cli.js +0 -0
- package/dist/bin/browser-cli.js +0 -0
- package/dist/bin/channels.js +0 -0
- package/dist/bin/comfy.d.ts +3 -0
- package/dist/bin/comfy.d.ts.map +1 -0
- package/dist/bin/comfy.js +3 -0
- package/dist/bin/comfy.js.map +1 -0
- package/dist/bin/commerce.js +0 -0
- package/dist/bin/gen.js +0 -0
- package/dist/bin/google-ads.js +0 -0
- package/dist/bin/growth.d.ts +3 -0
- package/dist/bin/growth.d.ts.map +1 -0
- package/dist/bin/growth.js +3 -0
- package/dist/bin/growth.js.map +1 -0
- package/dist/bin/kb-skills.js +0 -0
- package/dist/bin/logistics.js +0 -0
- package/dist/bin/optima.js +0 -0
- package/dist/bin/scout.js +0 -0
- package/dist/bin/sentinel.js +0 -0
- package/dist/bin/shopify.js +0 -0
- package/dist/src/hooks-loader.d.ts +6 -0
- package/dist/src/hooks-loader.d.ts.map +1 -0
- package/dist/src/hooks-loader.js +215 -0
- package/dist/src/hooks-loader.js.map +1 -0
- package/dist/src/ui/App.d.ts +6 -0
- package/dist/src/ui/App.d.ts.map +1 -0
- package/dist/src/ui/App.js +164 -0
- package/dist/src/ui/App.js.map +1 -0
- package/dist/src/ui/components/Composer.d.ts +10 -0
- package/dist/src/ui/components/Composer.d.ts.map +1 -0
- package/dist/src/ui/components/Composer.js +13 -0
- package/dist/src/ui/components/Composer.js.map +1 -0
- package/dist/src/ui/components/Header.d.ts +7 -0
- package/dist/src/ui/components/Header.d.ts.map +1 -0
- package/dist/src/ui/components/Header.js +7 -0
- package/dist/src/ui/components/Header.js.map +1 -0
- package/dist/src/ui/components/Message.d.ts +12 -0
- package/dist/src/ui/components/Message.d.ts.map +1 -0
- package/dist/src/ui/components/Message.js +21 -0
- package/dist/src/ui/components/Message.js.map +1 -0
- package/dist/src/ui/components/MessageList.d.ts +9 -0
- package/dist/src/ui/components/MessageList.d.ts.map +1 -0
- package/dist/src/ui/components/MessageList.js +18 -0
- package/dist/src/ui/components/MessageList.js.map +1 -0
- package/dist/src/ui/components/Spinner.d.ts +6 -0
- package/dist/src/ui/components/Spinner.d.ts.map +1 -0
- package/dist/src/ui/components/Spinner.js +7 -0
- package/dist/src/ui/components/Spinner.js.map +1 -0
- package/dist/src/ui/components/StatusBar.d.ts +11 -0
- package/dist/src/ui/components/StatusBar.d.ts.map +1 -0
- package/dist/src/ui/components/StatusBar.js +7 -0
- package/dist/src/ui/components/StatusBar.js.map +1 -0
- package/dist/src/ui/components/index.d.ts +7 -0
- package/dist/src/ui/components/index.d.ts.map +1 -0
- package/dist/src/ui/components/index.js +7 -0
- package/dist/src/ui/components/index.js.map +1 -0
- package/dist/src/validation/error-formatter.d.ts +21 -0
- package/dist/src/validation/error-formatter.d.ts.map +1 -0
- package/dist/src/validation/error-formatter.js +98 -0
- package/dist/src/validation/error-formatter.js.map +1 -0
- package/dist/src/validation/index.d.ts +10 -0
- package/dist/src/validation/index.d.ts.map +1 -0
- package/dist/src/validation/index.js +10 -0
- package/dist/src/validation/index.js.map +1 -0
- package/dist/src/validation/json-validator.d.ts +25 -0
- package/dist/src/validation/json-validator.d.ts.map +1 -0
- package/dist/src/validation/json-validator.js +173 -0
- package/dist/src/validation/json-validator.js.map +1 -0
- package/dist/src/validation/schema.d.ts +353 -0
- package/dist/src/validation/schema.d.ts.map +1 -0
- package/dist/src/validation/schema.js +57 -0
- package/dist/src/validation/schema.js.map +1 -0
- package/dist/src/validation/suggestions.d.ts +25 -0
- package/dist/src/validation/suggestions.d.ts.map +1 -0
- package/dist/src/validation/suggestions.js +144 -0
- package/dist/src/validation/suggestions.js.map +1 -0
- package/dist/src/validation/types.d.ts +40 -0
- package/dist/src/validation/types.d.ts.map +1 -0
- package/dist/src/validation/types.js +5 -0
- package/dist/src/validation/types.js.map +1 -0
- package/dist/src/validation/yaml-validator.d.ts +25 -0
- package/dist/src/validation/yaml-validator.d.ts.map +1 -0
- package/dist/src/validation/yaml-validator.js +177 -0
- package/dist/src/validation/yaml-validator.js.map +1 -0
- package/package.json +12 -13
- package/.claude/skills/scout/template/product/INDEX.md +0 -32
- package/.claude/skills/scout/template/product/LOGS.md +0 -4
- package/.claude/skills/scout/template/product/RESEARCH.md +0 -113
- package/.claude/skills/scout/template/product/competitors/COMPETITORS.md +0 -33
- package/.claude/skills/scout/template/product/data/.gitkeep +0 -0
- package/.claude/skills/scout/template/product/market/MARKET.md +0 -32
- package/.claude/skills/scout/template/product/reports/.gitkeep +0 -0
- package/.claude/skills/scout/template/product/reviews/PAIN-POINTS.md +0 -19
- package/.claude/skills/scout/template/product/suppliers/SUPPLIERS.md +0 -34
- package/.claude/skills/scout/template/product/trends/TRENDS.md +0 -23
- package/.claude/skills/scout/template/user/CBB.md +0 -33
- package/.claude/skills/scout/template/user/OVERVIEW.md +0 -13
- package/.claude/skills/scout/template/user/PROFILE.md +0 -23
- package/.claude/skills/scout/template/user/ROADMAP.md +0 -41
|
@@ -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
|
+
}
|
|
@@ -104,55 +104,54 @@
|
|
|
104
104
|
|
|
105
105
|
---
|
|
106
106
|
|
|
107
|
-
##
|
|
107
|
+
## 第二步:Ingest + 数据完整性检查
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
### Ingest
|
|
110
110
|
|
|
111
|
-
|
|
111
|
+
数据采集完成后,将所有缓存文件 ingest 到 KB:
|
|
112
|
+
- 对 `~/.scout/cache/{project}/` 中的每个缓存文件调用 kb-skills 的 ingesting-sources 流程
|
|
113
|
+
- 确认 raw/、wiki/sources/ 和相关 entity/overview 页面已更新
|
|
114
|
+
|
|
115
|
+
### 数据完整性检查
|
|
116
|
+
|
|
117
|
+
**Ingest 完成后执行检查。10 项全部通过才能进入分析阶段。任何一项未通过 → 补齐后重新检查。**
|
|
112
118
|
|
|
113
119
|
```
|
|
114
120
|
数据完整性检查清单:
|
|
115
121
|
|
|
116
|
-
□
|
|
117
|
-
□
|
|
118
|
-
□ 精确搜索量:有 sp-keywords-mine
|
|
119
|
-
□ 品牌集中度:有 sp-brands
|
|
120
|
-
□ 卖家国籍:有 sp-seller-countries
|
|
121
|
-
□ 卖家类型:有 sp-seller-types
|
|
122
|
-
□ 供应端成本:有 supplier-search
|
|
123
|
-
□ 趋势信号:有至少 2
|
|
122
|
+
□ 搜索覆盖度:wiki/sources/ 中搜索结果覆盖 ≥ 30 个不重复 ASIN?
|
|
123
|
+
□ 子品类聚类:wiki/overview/market-{slug}.md 中有 ≥ 5 个子品类?
|
|
124
|
+
□ 精确搜索量:有 sp-keywords-mine 来源页?
|
|
125
|
+
□ 品牌集中度:有 sp-brands 来源页?
|
|
126
|
+
□ 卖家国籍:有 sp-seller-countries 来源页?
|
|
127
|
+
□ 卖家类型:有 sp-seller-types 来源页?
|
|
128
|
+
□ 供应端成本:有 supplier-search 来源页(≥ 3 家供应商)?
|
|
129
|
+
□ 趋势信号:有至少 2 个社交平台来源页?
|
|
124
130
|
□ 缓存完整:~/.scout/cache/{project}/ 文件数 ≥ 命令执行数?
|
|
125
|
-
□
|
|
131
|
+
□ Ingest 完整:所有缓存文件已 ingest(raw/ + wiki/sources/ 对应存在)?
|
|
126
132
|
```
|
|
127
133
|
|
|
128
|
-
**如果有未通过的项,告知用户缺什么,补齐后重新检查。**
|
|
129
|
-
|
|
130
|
-
检查通过后,批量 ingest 所有缓存文件到 ~/kb/product-research/:
|
|
131
|
-
- 对每个缓存文件调用 kb-skills 的 ingesting-sources 流程
|
|
132
|
-
- 确认 wiki/sources/ 中所有来源页已创建
|
|
133
|
-
- 确认相关 entity 和 overview 页已更新
|
|
134
|
-
|
|
135
134
|
**输出格式**:
|
|
136
135
|
```
|
|
137
136
|
📋 数据完整性检查
|
|
138
137
|
✅ 搜索覆盖度:42 个不重复 ASIN(≥ 30)
|
|
139
138
|
✅ 子品类聚类:7 个子品类(≥ 5)
|
|
140
|
-
✅ 精确搜索量:3
|
|
141
|
-
❌ 品牌集中度:未采集 → 需要执行 scout sp brands
|
|
142
|
-
❌ 卖家国籍:未采集 → 需要执行 scout sp seller-countries
|
|
139
|
+
✅ 精确搜索量:3 组关键词已有来源页
|
|
140
|
+
❌ 品牌集中度:未采集 → 需要执行 scout sp brands 并 ingest
|
|
141
|
+
❌ 卖家国籍:未采集 → 需要执行 scout sp seller-countries 并 ingest
|
|
143
142
|
✅ 供应端成本:5 家供应商报价
|
|
144
143
|
✅ 趋势信号:TikTok + Reddit
|
|
145
144
|
✅ 缓存完整:12/12 已缓存
|
|
146
|
-
✅
|
|
145
|
+
✅ Ingest 完整:10/12 已 ingest(缺品牌集中度、卖家国籍)
|
|
147
146
|
|
|
148
|
-
|
|
147
|
+
结论:需要补充品牌集中度和卖家国籍数据,采集后 ingest 再重新检查。
|
|
149
148
|
```
|
|
150
149
|
|
|
151
150
|
---
|
|
152
151
|
|
|
153
152
|
## 第三步:数据分析
|
|
154
153
|
|
|
155
|
-
|
|
154
|
+
**10/10 全部通过后才进入分析。分析时使用 kb-skills 的 querying-the-wiki 流程从 KB 查询数据,不直接读缓存 JSON。**
|
|
156
155
|
|
|
157
156
|
### 5. SPAN 初步定位
|
|
158
157
|
|
|
@@ -315,17 +314,15 @@ scout supplier-search "钛合金杯子" --limit 10
|
|
|
315
314
|
|
|
316
315
|
CLI 自动缓存所有 API 响应到 `~/.scout/cache/{project}/`,无需手动落盘。
|
|
317
316
|
|
|
318
|
-
|
|
317
|
+
**第二步:Ingest + 完整性检查**
|
|
319
318
|
|
|
320
|
-
|
|
319
|
+
将所有缓存文件 ingest 到 KB,然后执行完整性检查。
|
|
321
320
|
|
|
322
321
|
> "📋 数据完整性检查:10/10 全部通过。可以开始分析了。"
|
|
323
322
|
|
|
324
|
-
检查通过后 ingest 所有缓存文件到 KB。
|
|
325
|
-
|
|
326
323
|
**第三步:分析**
|
|
327
324
|
|
|
328
|
-
|
|
325
|
+
从 wiki/ 页面读取结构化数据,做 SPAN 评分、利润估算、IP 检查。
|
|
329
326
|
|
|
330
327
|
**第四步:CDCP Gate 评审**
|
|
331
328
|
|
package/dist/bin/bi-cli.js
CHANGED
|
File without changes
|
package/dist/bin/browser-cli.js
CHANGED
|
File without changes
|
package/dist/bin/channels.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comfy.d.ts","sourceRoot":"","sources":["../../bin/comfy.ts"],"names":[],"mappings":";AACA,OAAO,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comfy.js","sourceRoot":"","sources":["../../bin/comfy.ts"],"names":[],"mappings":";AACA,OAAO,wBAAwB,CAAC"}
|
package/dist/bin/commerce.js
CHANGED
|
File without changes
|
package/dist/bin/gen.js
CHANGED
|
File without changes
|
package/dist/bin/google-ads.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"growth.d.ts","sourceRoot":"","sources":["../../bin/growth.ts"],"names":[],"mappings":";AACA,OAAO,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"growth.js","sourceRoot":"","sources":["../../bin/growth.ts"],"names":[],"mappings":";AACA,OAAO,yBAAyB,CAAC"}
|
package/dist/bin/kb-skills.js
CHANGED
|
File without changes
|
package/dist/bin/logistics.js
CHANGED
|
File without changes
|
package/dist/bin/optima.js
CHANGED
|
File without changes
|
package/dist/bin/scout.js
CHANGED
|
File without changes
|
package/dist/bin/sentinel.js
CHANGED
|
File without changes
|
package/dist/bin/shopify.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-loader.d.ts","sourceRoot":"","sources":["../../src/hooks-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AAwL5D;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,MAAM,GAAG,SAAS,GACrC,WAAW,CAiFb"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, existsSync, writeFileSync, mkdirSync } from "fs";
|
|
2
|
+
import { join, dirname } from "path";
|
|
3
|
+
import yaml from "js-yaml";
|
|
4
|
+
import { execSync } from "child_process";
|
|
5
|
+
import { YamlValidator, formatValidationErrors, formatValidationWarning } from "./validation/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* 从 SKILL.md 提取 YAML frontmatter
|
|
8
|
+
*/
|
|
9
|
+
function extractYamlFrontmatter(content) {
|
|
10
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
11
|
+
if (!match)
|
|
12
|
+
return null;
|
|
13
|
+
try {
|
|
14
|
+
return yaml.load(match[1]);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
console.error("Failed to parse YAML frontmatter:", error);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 执行 shell 命令并返回结果
|
|
23
|
+
*/
|
|
24
|
+
function executeCommand(command, cwd, skillDir, sessionId) {
|
|
25
|
+
try {
|
|
26
|
+
// 替换环境变量
|
|
27
|
+
const expandedCommand = command
|
|
28
|
+
.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, skillDir)
|
|
29
|
+
.replace(/\$\{SESSION_ID\}/g, sessionId || 'default');
|
|
30
|
+
const result = execSync(expandedCommand, {
|
|
31
|
+
cwd,
|
|
32
|
+
encoding: "utf-8",
|
|
33
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
34
|
+
});
|
|
35
|
+
return result.trim();
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
// 命令失败不阻塞,返回错误信息
|
|
39
|
+
return error.stdout || error.message || "";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 转换 skill hooks 为 SDK hooks 格式
|
|
44
|
+
*/
|
|
45
|
+
function convertSkillHooksToSdkHooks(skillHooks, skillDir, cwd, getSessionId, hookType) {
|
|
46
|
+
return skillHooks.map((hookConfig) => ({
|
|
47
|
+
matcher: hookConfig.matcher,
|
|
48
|
+
hooks: hookConfig.hooks.map((hook) => {
|
|
49
|
+
// SDK HookCallback 签名: (input, toolUseID, options) => Promise<HookJSONOutput>
|
|
50
|
+
return async (input, toolUseID, options) => {
|
|
51
|
+
// PreToolUse: 拦截并重定向 planning 文件操作
|
|
52
|
+
if (hookType === "PreToolUse" && input.tool_name && input.tool_input) {
|
|
53
|
+
const toolName = input.tool_name;
|
|
54
|
+
const toolInput = input.tool_input;
|
|
55
|
+
// 处理文件操作工具的路径重定向
|
|
56
|
+
if ((toolName === "Write" || toolName === "Read" || toolName === "Edit") && toolInput.file_path) {
|
|
57
|
+
const filePath = toolInput.file_path;
|
|
58
|
+
if (filePath.includes(".planning/default/")) {
|
|
59
|
+
const sessionId = getSessionId() || "default";
|
|
60
|
+
const updatedPath = filePath.replace(".planning/default/", `.planning/${sessionId}/`);
|
|
61
|
+
console.log(`[hooks-loader] Intercepting and redirecting: ${filePath} -> ${updatedPath}`);
|
|
62
|
+
// 手动执行文件操作并 return,不要继续到 command 部分
|
|
63
|
+
try {
|
|
64
|
+
console.log(`[hooks-loader] Inside try block, toolName=${toolName}`);
|
|
65
|
+
if (toolName === "Write") {
|
|
66
|
+
console.log(`[hooks-loader] Handling Write operation`);
|
|
67
|
+
// 创建目录
|
|
68
|
+
const dir = dirname(updatedPath);
|
|
69
|
+
if (!existsSync(dir)) {
|
|
70
|
+
mkdirSync(dir, { recursive: true });
|
|
71
|
+
}
|
|
72
|
+
// 写入文件
|
|
73
|
+
writeFileSync(updatedPath, toolInput.content || "", "utf-8");
|
|
74
|
+
console.log(`[hooks-loader] File written to ${updatedPath}`);
|
|
75
|
+
// Block 原始工具执行
|
|
76
|
+
return {
|
|
77
|
+
decision: "block",
|
|
78
|
+
systemMessage: `File written to session-specific directory`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
else if (toolName === "Read") {
|
|
82
|
+
// 读取文件
|
|
83
|
+
if (existsSync(updatedPath)) {
|
|
84
|
+
const content = readFileSync(updatedPath, "utf-8");
|
|
85
|
+
console.log(`[hooks-loader] File read from ${updatedPath}`);
|
|
86
|
+
// Block 原始工具,返回文件内容
|
|
87
|
+
return {
|
|
88
|
+
decision: "block",
|
|
89
|
+
systemMessage: `File content:\n\n${content}`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
return {
|
|
94
|
+
decision: "block",
|
|
95
|
+
systemMessage: `File not found: ${updatedPath}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (toolName === "Edit") {
|
|
100
|
+
// Edit 需要读取、修改、写入
|
|
101
|
+
if (existsSync(updatedPath)) {
|
|
102
|
+
let content = readFileSync(updatedPath, "utf-8");
|
|
103
|
+
// 执行替换
|
|
104
|
+
if (toolInput.old_string && toolInput.new_string) {
|
|
105
|
+
if (toolInput.replace_all) {
|
|
106
|
+
content = content.split(toolInput.old_string).join(toolInput.new_string);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
content = content.replace(toolInput.old_string, toolInput.new_string);
|
|
110
|
+
}
|
|
111
|
+
writeFileSync(updatedPath, content, "utf-8");
|
|
112
|
+
console.log(`[hooks-loader] File edited at ${updatedPath}`);
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
decision: "block",
|
|
116
|
+
systemMessage: `File edited successfully`,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
return {
|
|
121
|
+
decision: "block",
|
|
122
|
+
systemMessage: `File not found: ${updatedPath}`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.error(`[hooks-loader] Error:`, error);
|
|
129
|
+
return {
|
|
130
|
+
decision: "block",
|
|
131
|
+
systemMessage: `Error: ${error.message}`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (hook.type === "command") {
|
|
138
|
+
const sessionId = getSessionId();
|
|
139
|
+
const result = executeCommand(hook.command, cwd, skillDir, sessionId);
|
|
140
|
+
// 如果有输出,作为系统消息返回
|
|
141
|
+
if (result) {
|
|
142
|
+
return {
|
|
143
|
+
continue: true,
|
|
144
|
+
systemMessage: result,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return { continue: true };
|
|
149
|
+
};
|
|
150
|
+
}),
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 从 skills 目录加载所有 skill 的 hooks
|
|
155
|
+
*/
|
|
156
|
+
export function loadSkillHooks(skillsDir, cwd, getSessionId) {
|
|
157
|
+
const hooks = {};
|
|
158
|
+
if (!existsSync(skillsDir)) {
|
|
159
|
+
return hooks;
|
|
160
|
+
}
|
|
161
|
+
const skillDirs = readdirSync(skillsDir, { withFileTypes: true })
|
|
162
|
+
.filter((dirent) => dirent.isDirectory())
|
|
163
|
+
.map((dirent) => dirent.name);
|
|
164
|
+
for (const skillName of skillDirs) {
|
|
165
|
+
const skillDir = join(skillsDir, skillName);
|
|
166
|
+
const skillMdPath = join(skillDir, "SKILL.md");
|
|
167
|
+
if (!existsSync(skillMdPath)) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const content = readFileSync(skillMdPath, "utf-8");
|
|
172
|
+
// 验证配置文件
|
|
173
|
+
const validator = new YamlValidator();
|
|
174
|
+
const validationResult = validator.validate(content, skillMdPath);
|
|
175
|
+
// 显示错误
|
|
176
|
+
if (!validationResult.valid) {
|
|
177
|
+
console.error(formatValidationErrors(validationResult.errors));
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
// 显示警告
|
|
181
|
+
if (validationResult.warnings && validationResult.warnings.length > 0) {
|
|
182
|
+
for (const warning of validationResult.warnings) {
|
|
183
|
+
console.warn(formatValidationWarning(warning));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const frontmatter = extractYamlFrontmatter(content);
|
|
187
|
+
if (!frontmatter?.hooks) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
// 转换各个 hook 事件
|
|
191
|
+
if (frontmatter.hooks.SessionStart) {
|
|
192
|
+
hooks.SessionStart = hooks.SessionStart || [];
|
|
193
|
+
hooks.SessionStart.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.SessionStart, skillDir, cwd, getSessionId, "SessionStart"));
|
|
194
|
+
}
|
|
195
|
+
if (frontmatter.hooks.PreToolUse) {
|
|
196
|
+
hooks.PreToolUse = hooks.PreToolUse || [];
|
|
197
|
+
hooks.PreToolUse.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.PreToolUse, skillDir, cwd, getSessionId, "PreToolUse"));
|
|
198
|
+
}
|
|
199
|
+
if (frontmatter.hooks.PostToolUse) {
|
|
200
|
+
hooks.PostToolUse = hooks.PostToolUse || [];
|
|
201
|
+
hooks.PostToolUse.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.PostToolUse, skillDir, cwd, getSessionId, "PostToolUse"));
|
|
202
|
+
}
|
|
203
|
+
if (frontmatter.hooks.Stop) {
|
|
204
|
+
hooks.Stop = hooks.Stop || [];
|
|
205
|
+
hooks.Stop.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.Stop, skillDir, cwd, getSessionId, "Stop"));
|
|
206
|
+
}
|
|
207
|
+
console.log(`[hooks-loader] Loaded hooks from skill: ${skillName}`);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.error(`[hooks-loader] Failed to load hooks from ${skillName}:`, error);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return hooks;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=hooks-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-loader.js","sourceRoot":"","sources":["../../src/hooks-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/ui/App.tsx"],"names":[],"mappings":"AAcA,UAAU,QAAQ;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,QAAQ,2CAqMpC"}
|