@optima-chat/optima-agent 0.9.59 → 0.9.61
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/skills/scout/references/concept.md +8 -3
- package/.claude/skills/video-edit/SKILL.md +3 -3
- package/dist/bin/banner-tool.js +6 -5
- package/dist/bin/banner-tool.js.map +1 -1
- 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/commerce.js +0 -0
- package/dist/bin/gen.js +0 -0
- package/dist/bin/google-ads.js +0 -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/package.json +13 -12
- package/.claude/settings.local.json +0 -166
- package/dist/bin/comfy.d.ts +0 -3
- package/dist/bin/comfy.d.ts.map +0 -1
- package/dist/bin/comfy.js +0 -3
- package/dist/bin/comfy.js.map +0 -1
- package/dist/bin/growth.d.ts +0 -3
- package/dist/bin/growth.d.ts.map +0 -1
- package/dist/bin/growth.js +0 -3
- package/dist/bin/growth.js.map +0 -1
- package/dist/src/hooks-loader.d.ts +0 -6
- package/dist/src/hooks-loader.d.ts.map +0 -1
- package/dist/src/hooks-loader.js +0 -215
- package/dist/src/hooks-loader.js.map +0 -1
- package/dist/src/ui/App.d.ts +0 -6
- package/dist/src/ui/App.d.ts.map +0 -1
- package/dist/src/ui/App.js +0 -164
- package/dist/src/ui/App.js.map +0 -1
- package/dist/src/ui/components/Composer.d.ts +0 -10
- package/dist/src/ui/components/Composer.d.ts.map +0 -1
- package/dist/src/ui/components/Composer.js +0 -13
- package/dist/src/ui/components/Composer.js.map +0 -1
- package/dist/src/ui/components/Header.d.ts +0 -7
- package/dist/src/ui/components/Header.d.ts.map +0 -1
- package/dist/src/ui/components/Header.js +0 -7
- package/dist/src/ui/components/Header.js.map +0 -1
- package/dist/src/ui/components/Message.d.ts +0 -12
- package/dist/src/ui/components/Message.d.ts.map +0 -1
- package/dist/src/ui/components/Message.js +0 -21
- package/dist/src/ui/components/Message.js.map +0 -1
- package/dist/src/ui/components/MessageList.d.ts +0 -9
- package/dist/src/ui/components/MessageList.d.ts.map +0 -1
- package/dist/src/ui/components/MessageList.js +0 -18
- package/dist/src/ui/components/MessageList.js.map +0 -1
- package/dist/src/ui/components/Spinner.d.ts +0 -6
- package/dist/src/ui/components/Spinner.d.ts.map +0 -1
- package/dist/src/ui/components/Spinner.js +0 -7
- package/dist/src/ui/components/Spinner.js.map +0 -1
- package/dist/src/ui/components/StatusBar.d.ts +0 -11
- package/dist/src/ui/components/StatusBar.d.ts.map +0 -1
- package/dist/src/ui/components/StatusBar.js +0 -7
- package/dist/src/ui/components/StatusBar.js.map +0 -1
- package/dist/src/ui/components/index.d.ts +0 -7
- package/dist/src/ui/components/index.d.ts.map +0 -1
- package/dist/src/ui/components/index.js +0 -7
- package/dist/src/ui/components/index.js.map +0 -1
- package/dist/src/validation/error-formatter.d.ts +0 -21
- package/dist/src/validation/error-formatter.d.ts.map +0 -1
- package/dist/src/validation/error-formatter.js +0 -98
- package/dist/src/validation/error-formatter.js.map +0 -1
- package/dist/src/validation/index.d.ts +0 -10
- package/dist/src/validation/index.d.ts.map +0 -1
- package/dist/src/validation/index.js +0 -10
- package/dist/src/validation/index.js.map +0 -1
- package/dist/src/validation/json-validator.d.ts +0 -25
- package/dist/src/validation/json-validator.d.ts.map +0 -1
- package/dist/src/validation/json-validator.js +0 -173
- package/dist/src/validation/json-validator.js.map +0 -1
- package/dist/src/validation/schema.d.ts +0 -353
- package/dist/src/validation/schema.d.ts.map +0 -1
- package/dist/src/validation/schema.js +0 -57
- package/dist/src/validation/schema.js.map +0 -1
- package/dist/src/validation/suggestions.d.ts +0 -25
- package/dist/src/validation/suggestions.d.ts.map +0 -1
- package/dist/src/validation/suggestions.js +0 -144
- package/dist/src/validation/suggestions.js.map +0 -1
- package/dist/src/validation/types.d.ts +0 -40
- package/dist/src/validation/types.d.ts.map +0 -1
- package/dist/src/validation/types.js +0 -5
- package/dist/src/validation/types.js.map +0 -1
- package/dist/src/validation/yaml-validator.d.ts +0 -25
- package/dist/src/validation/yaml-validator.d.ts.map +0 -1
- package/dist/src/validation/yaml-validator.js +0 -177
- package/dist/src/validation/yaml-validator.js.map +0 -1
|
@@ -157,9 +157,14 @@
|
|
|
157
157
|
## 第三步:数据分析
|
|
158
158
|
|
|
159
159
|
=== GATE CHECK ===
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
160
|
+
运行以下两条命令对比:
|
|
161
|
+
```
|
|
162
|
+
cache_count=$(ls ~/.scout/cache/{project}/ | wc -l)
|
|
163
|
+
raw_count=$(ls ~/kb/product-research/raw/ | wc -l)
|
|
164
|
+
echo "cache: $cache_count, raw: $raw_count"
|
|
165
|
+
```
|
|
166
|
+
- 如果 raw_count < cache_count → **STOP。有缓存文件未 ingest。返回第二步执行 Ingest。**
|
|
167
|
+
- 如果 raw_count >= cache_count → 继续分析。
|
|
163
168
|
=== END GATE CHECK ===
|
|
164
169
|
|
|
165
170
|
**所有分析数据必须通过 `Skill("querying-the-wiki")` 从 KB 查询,禁止直接读 `~/.scout/cache/` 中的 JSON 文件。**
|
|
@@ -138,11 +138,11 @@ review 通过后再烧字幕:
|
|
|
138
138
|
video-edit subtitle <video>
|
|
139
139
|
```
|
|
140
140
|
|
|
141
|
-
### Banner
|
|
141
|
+
### Banner(顶部持续标语横幅)
|
|
142
142
|
|
|
143
|
-
|
|
143
|
+
视频顶部持续显示 4-12 字大字标题,牌匾风(深酒红实心底色块 + 米白思源黑体加粗 72pt)。
|
|
144
144
|
|
|
145
|
-
|
|
145
|
+
**这是默认动作,不是可选**:subtitle 跑完后,**主动**走以下 4 步,不要等用户开口要求。唯一跳过条件——Step 1 判脸贴顶;或用户初始 prompt 已明确说"不要标题/不要 banner"。
|
|
146
146
|
|
|
147
147
|
#### Step 1:判断是否适合加 banner
|
|
148
148
|
|
package/dist/bin/banner-tool.js
CHANGED
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* banner-tool inject <ass-path> --text <文本> --duration <秒> [options]
|
|
4
4
|
*
|
|
5
|
-
* 在 ASS 字幕文件里注入"顶部持续 banner Style + Dialogue"(
|
|
5
|
+
* 在 ASS 字幕文件里注入"顶部持续 banner Style + Dialogue"(牌匾风)。
|
|
6
6
|
*
|
|
7
|
-
* 视觉:深酒红 #
|
|
7
|
+
* 视觉:深酒红 #5A1414 实心底色块 + 米白 #F5F5F5 思源黑体加粗 72pt
|
|
8
|
+
* + 8pt 内 padding + Layer 1 在主字幕之上 + 0s 持续到结束。
|
|
8
9
|
* 幂等:重跑 Style 不重复添加,Dialogue 替换。
|
|
9
10
|
*/
|
|
10
11
|
import { readFileSync, writeFileSync, existsSync, renameSync } from 'fs';
|
|
11
12
|
import { tmpdir } from 'os';
|
|
12
13
|
import { join } from 'path';
|
|
13
|
-
const KAIPAI_BANNER_STYLE = 'Style: Banner,Source Han Sans SC,
|
|
14
|
+
const KAIPAI_BANNER_STYLE = 'Style: Banner,Source Han Sans SC,72,&H00F5F5F5,&H00F5F5F5,&H0014145A,&H00000000,1,0,0,0,100,100,2,0,3,8,0,8,90,90,60,1';
|
|
14
15
|
function parseArgs(argv) {
|
|
15
16
|
// 全局 --help / -h
|
|
16
17
|
if (argv.includes('--help') || argv.includes('-h')) {
|
|
@@ -104,11 +105,11 @@ function injectBanner(args) {
|
|
|
104
105
|
content = content.replace(/(\[V4\+ Styles\][\s\S]*?)(\n\n\[Events\])/, `$1\n${KAIPAI_BANNER_STYLE}$2`);
|
|
105
106
|
styleAdded = true;
|
|
106
107
|
}
|
|
107
|
-
// 2. Dialogue 替换或附加
|
|
108
|
+
// 2. Dialogue 替换或附加 — 实心红底牌匾,无 ━ 装饰
|
|
108
109
|
const wrapped = wrapText(args.text);
|
|
109
110
|
const startTime = fmtAssTime(args.start);
|
|
110
111
|
const endTime = fmtAssTime(args.start + args.duration);
|
|
111
|
-
const newDialogue = `Dialogue: 1,${startTime},${endTime},Banner,,
|
|
112
|
+
const newDialogue = `Dialogue: 1,${startTime},${endTime},Banner,,90,90,60,,${wrapped}`;
|
|
112
113
|
if (/^Dialogue: \d+,[^,]+,[^,]+,Banner,/m.test(content)) {
|
|
113
114
|
content = content.replace(/^Dialogue: \d+,[^,]+,[^,]+,Banner,[^\n]+/m, newDialogue);
|
|
114
115
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner-tool.js","sourceRoot":"","sources":["../../bin/banner-tool.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"banner-tool.js","sourceRoot":"","sources":["../../bin/banner-tool.ts"],"names":[],"mappings":"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"}
|
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
|
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
|
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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@optima-chat/optima-agent",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.61",
|
|
4
4
|
"description": "基于 Claude Agent SDK 的电商运营 AI 助手",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -37,6 +37,17 @@
|
|
|
37
37
|
],
|
|
38
38
|
"author": "Optima Chat",
|
|
39
39
|
"license": "MIT",
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "npm run sync:kb-skills && tsc",
|
|
42
|
+
"dev": "tsx watch src/index.ts",
|
|
43
|
+
"start": "node dist/src/index.js",
|
|
44
|
+
"typecheck": "tsc --noEmit",
|
|
45
|
+
"test": "vitest run",
|
|
46
|
+
"test:watch": "vitest",
|
|
47
|
+
"optima": "tsx bin/optima.ts",
|
|
48
|
+
"prepublishOnly": "npm run build",
|
|
49
|
+
"sync:kb-skills": "tsx bin/sync-kb-skills.ts"
|
|
50
|
+
},
|
|
40
51
|
"dependencies": {
|
|
41
52
|
"@anthropic-ai/claude-agent-sdk": "^0.2.63",
|
|
42
53
|
"@optima-chat/ads-cli": "latest",
|
|
@@ -65,15 +76,5 @@
|
|
|
65
76
|
},
|
|
66
77
|
"engines": {
|
|
67
78
|
"node": ">=18.0.0"
|
|
68
|
-
},
|
|
69
|
-
"scripts": {
|
|
70
|
-
"build": "npm run sync:kb-skills && tsc",
|
|
71
|
-
"dev": "tsx watch src/index.ts",
|
|
72
|
-
"start": "node dist/src/index.js",
|
|
73
|
-
"typecheck": "tsc --noEmit",
|
|
74
|
-
"test": "vitest run",
|
|
75
|
-
"test:watch": "vitest",
|
|
76
|
-
"optima": "tsx bin/optima.ts",
|
|
77
|
-
"sync:kb-skills": "tsx bin/sync-kb-skills.ts"
|
|
78
79
|
}
|
|
79
|
-
}
|
|
80
|
+
}
|
|
@@ -1,166 +0,0 @@
|
|
|
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
|
-
}
|
package/dist/bin/comfy.d.ts
DELETED
package/dist/bin/comfy.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"comfy.d.ts","sourceRoot":"","sources":["../../bin/comfy.ts"],"names":[],"mappings":";AACA,OAAO,wBAAwB,CAAC"}
|
package/dist/bin/comfy.js
DELETED
package/dist/bin/comfy.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"comfy.js","sourceRoot":"","sources":["../../bin/comfy.ts"],"names":[],"mappings":";AACA,OAAO,wBAAwB,CAAC"}
|
package/dist/bin/growth.d.ts
DELETED
package/dist/bin/growth.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"growth.d.ts","sourceRoot":"","sources":["../../bin/growth.ts"],"names":[],"mappings":";AACA,OAAO,yBAAyB,CAAC"}
|
package/dist/bin/growth.js
DELETED
package/dist/bin/growth.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"growth.js","sourceRoot":"","sources":["../../bin/growth.ts"],"names":[],"mappings":";AACA,OAAO,yBAAyB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/src/hooks-loader.js
DELETED
|
@@ -1,215 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-loader.js","sourceRoot":"","sources":["../../src/hooks-loader.ts"],"names":[],"mappings":"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"}
|
package/dist/src/ui/App.d.ts
DELETED
package/dist/src/ui/App.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|