@optima-chat/optima-agent 0.8.14 → 0.8.15
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/i18n/SKILL.md +27 -0
- package/.claude/skills/product/SKILL.md +1 -0
- package/dist/bin/bi-cli.js +0 -0
- package/dist/bin/comfy.js +0 -0
- package/dist/bin/commerce.js +0 -0
- package/dist/bin/google-ads.js +0 -0
- package/dist/bin/optima.js +0 -0
- package/dist/bin/scout.js +0 -0
- package/package.json +1 -1
- package/.claude/settings.local.json +0 -132
- 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
|
@@ -7,6 +7,33 @@ description: Internationalization and translation management. Add multilingual t
|
|
|
7
7
|
|
|
8
8
|
国际化模块,用于管理商品、变体、集合、商户和首页的多语言翻译。
|
|
9
9
|
|
|
10
|
+
## 核心策略(重要)
|
|
11
|
+
|
|
12
|
+
**English (en-US) is the base/default language of the Optima platform.**
|
|
13
|
+
|
|
14
|
+
- 平台默认语言是英文,商品主表内容对应英文用户看到的内容
|
|
15
|
+
- 中文和其他语言通过 `i18n` 命令作为翻译添加(存储在翻译表中)
|
|
16
|
+
- 未翻译的内容自动回退到主表内容(英文)
|
|
17
|
+
|
|
18
|
+
**语言选择规则**:
|
|
19
|
+
- 用户同时提供中英文内容 → **英文作为主表内容,中文通过 i18n 添加翻译**
|
|
20
|
+
- 用户只提供中文内容 → 用中文创建商品,但建议同时添加英文翻译
|
|
21
|
+
- 用户要求"国际化"或"多语言" → 确保英文内容在主表,其他语言通过 i18n 添加
|
|
22
|
+
|
|
23
|
+
**推荐的国际化流程**:
|
|
24
|
+
```bash
|
|
25
|
+
# 1. 用英文创建商品(作为基础语言存入主表)
|
|
26
|
+
commerce product create --name "Cotton T-Shirt" --price 99 --description "100% cotton, breathable and comfortable"
|
|
27
|
+
|
|
28
|
+
# 2. 添加中文翻译
|
|
29
|
+
commerce i18n product create --product-id prod_123 --lang zh-CN --name "纯棉T恤" --description "100% 纯棉,舒适透气"
|
|
30
|
+
|
|
31
|
+
# 3. 根据需要添加其他语言
|
|
32
|
+
commerce i18n product create --product-id prod_123 --lang ja-JP --name "コットンTシャツ" --description "..."
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**避免**:用中文创建商品后再加英文翻译 —— 这会导致主表存储中文,英文用户(无翻译覆盖时)看到中文内容。
|
|
36
|
+
|
|
10
37
|
## 典型场景 (Typical Scenarios)
|
|
11
38
|
|
|
12
39
|
### 场景决策表
|
|
@@ -336,6 +336,7 @@ commerce product get --id prod_123
|
|
|
336
336
|
|
|
337
337
|
## 重要提示
|
|
338
338
|
|
|
339
|
+
- **国际化策略** - 平台默认语言是英文(en-US)。当用户同时提供中英文内容时,用英文创建商品,中文通过 `i18n` skill 添加翻译。当用户要求"国际化"时,确保英文在主表,其他语言通过 i18n 添加。详见 i18n skill。
|
|
339
340
|
- **库存管理请使用 inventory skill** - 如果用户要求更新库存、设置库存数量、补货等,请加载 `/inventory` skill。特别是有变体的产品,必须通过 inventory skill 更新变体库存,不能直接更新产品库存。
|
|
340
341
|
- **商品描述支持 Markdown 格式**,可以使用标题、列表、加粗、链接等排版
|
|
341
342
|
- 所有命令默认 JSON 输出,便于 AI 解析
|
package/dist/bin/bi-cli.js
CHANGED
|
File without changes
|
package/dist/bin/comfy.js
CHANGED
|
File without changes
|
package/dist/bin/commerce.js
CHANGED
|
File without changes
|
package/dist/bin/google-ads.js
CHANGED
|
File without changes
|
package/dist/bin/optima.js
CHANGED
|
File without changes
|
package/dist/bin/scout.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,132 +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
|
-
],
|
|
129
|
-
"deny": [],
|
|
130
|
-
"ask": []
|
|
131
|
-
}
|
|
132
|
-
}
|
|
@@ -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"}
|
package/dist/src/ui/App.js
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useCallback, useRef } from "react";
|
|
3
|
-
import { Box, useApp, useInput } from "ink";
|
|
4
|
-
import { Header, Composer, MessageList, StatusBar, Spinner, } from "./components/index.js";
|
|
5
|
-
import { OptimaAgent } from "../agent.js";
|
|
6
|
-
const VERSION = "0.1.25";
|
|
7
|
-
export function App({ cwd }) {
|
|
8
|
-
const { exit } = useApp();
|
|
9
|
-
const [input, setInput] = useState("");
|
|
10
|
-
const [messages, setMessages] = useState([]);
|
|
11
|
-
const [isProcessing, setIsProcessing] = useState(false);
|
|
12
|
-
const [skills, setSkills] = useState([]);
|
|
13
|
-
const [tokens, setTokens] = useState();
|
|
14
|
-
const [agent] = useState(() => new OptimaAgent({ cwd }));
|
|
15
|
-
const abortControllerRef = useRef(null);
|
|
16
|
-
// 处理斜杠命令
|
|
17
|
-
const handleSlashCommand = useCallback((command) => {
|
|
18
|
-
const cmd = command.toLowerCase().trim();
|
|
19
|
-
if (cmd === "/help") {
|
|
20
|
-
setMessages((prev) => [
|
|
21
|
-
...prev,
|
|
22
|
-
{
|
|
23
|
-
role: "assistant",
|
|
24
|
-
content: `可用命令:
|
|
25
|
-
/help - 显示帮助
|
|
26
|
-
/clear - 清空对话
|
|
27
|
-
/skills - 查看已加载技能
|
|
28
|
-
/exit - 退出`,
|
|
29
|
-
},
|
|
30
|
-
]);
|
|
31
|
-
return true;
|
|
32
|
-
}
|
|
33
|
-
if (cmd === "/clear") {
|
|
34
|
-
setMessages([]);
|
|
35
|
-
agent.reset();
|
|
36
|
-
setSkills([]);
|
|
37
|
-
setTokens(undefined);
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
if (cmd === "/skills") {
|
|
41
|
-
setMessages((prev) => [
|
|
42
|
-
...prev,
|
|
43
|
-
{
|
|
44
|
-
role: "assistant",
|
|
45
|
-
content: skills.length > 0
|
|
46
|
-
? `已加载技能: ${skills.join(", ")}`
|
|
47
|
-
: "暂无已加载技能",
|
|
48
|
-
},
|
|
49
|
-
]);
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
if (cmd === "/exit") {
|
|
53
|
-
exit();
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
return false;
|
|
57
|
-
}, [agent, exit, skills]);
|
|
58
|
-
// 取消当前请求
|
|
59
|
-
const handleCancel = useCallback(() => {
|
|
60
|
-
if (abortControllerRef.current) {
|
|
61
|
-
abortControllerRef.current.abort();
|
|
62
|
-
abortControllerRef.current = null;
|
|
63
|
-
setIsProcessing(false);
|
|
64
|
-
setMessages((prev) => [
|
|
65
|
-
...prev,
|
|
66
|
-
{ role: "system", content: "已取消" },
|
|
67
|
-
]);
|
|
68
|
-
}
|
|
69
|
-
}, []);
|
|
70
|
-
// 处理消息提交
|
|
71
|
-
const handleSubmit = useCallback(async (text) => {
|
|
72
|
-
// 检查斜杠命令
|
|
73
|
-
if (text.startsWith("/")) {
|
|
74
|
-
if (handleSlashCommand(text)) {
|
|
75
|
-
setInput("");
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// 添加用户消息
|
|
80
|
-
setMessages((prev) => [...prev, { role: "user", content: text }]);
|
|
81
|
-
setInput("");
|
|
82
|
-
setIsProcessing(true);
|
|
83
|
-
// 创建 AbortController
|
|
84
|
-
const abortController = new AbortController();
|
|
85
|
-
abortControllerRef.current = abortController;
|
|
86
|
-
let assistantContent = "";
|
|
87
|
-
try {
|
|
88
|
-
for await (const msg of agent.chat(text, { signal: abortController.signal })) {
|
|
89
|
-
// 处理系统消息(获取 skills)
|
|
90
|
-
if (msg.type === "system" && "skills" in msg && msg.skills) {
|
|
91
|
-
const skillsData = msg.skills;
|
|
92
|
-
setSkills(skillsData.filter(Boolean));
|
|
93
|
-
}
|
|
94
|
-
// 处理助手消息
|
|
95
|
-
if (msg.type === "assistant" && msg.message?.content) {
|
|
96
|
-
for (const block of msg.message.content) {
|
|
97
|
-
if (block.type === "text") {
|
|
98
|
-
assistantContent += block.text;
|
|
99
|
-
}
|
|
100
|
-
else if (block.type === "tool_use") {
|
|
101
|
-
// 显示工具调用
|
|
102
|
-
setMessages((prev) => [
|
|
103
|
-
...prev,
|
|
104
|
-
{
|
|
105
|
-
role: "tool",
|
|
106
|
-
toolName: block.name,
|
|
107
|
-
content: typeof block.input === "string"
|
|
108
|
-
? block.input
|
|
109
|
-
: JSON.stringify(block.input, null, 2),
|
|
110
|
-
},
|
|
111
|
-
]);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// 处理结果(累计 tokens)
|
|
116
|
-
if (msg.type === "result") {
|
|
117
|
-
const usage = msg.usage;
|
|
118
|
-
setTokens((prev) => ({
|
|
119
|
-
input: (prev?.input ?? 0) + (usage?.input_tokens ?? 0),
|
|
120
|
-
output: (prev?.output ?? 0) + (usage?.output_tokens ?? 0),
|
|
121
|
-
}));
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
// 添加助手回复
|
|
125
|
-
if (assistantContent) {
|
|
126
|
-
setMessages((prev) => [
|
|
127
|
-
...prev,
|
|
128
|
-
{ role: "assistant", content: assistantContent },
|
|
129
|
-
]);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
catch (error) {
|
|
133
|
-
// 用户取消不显示错误
|
|
134
|
-
const errorMsg = error instanceof Error ? error.message : "未知错误";
|
|
135
|
-
if (!errorMsg.includes("aborted")) {
|
|
136
|
-
setMessages((prev) => [
|
|
137
|
-
...prev,
|
|
138
|
-
{
|
|
139
|
-
role: "error",
|
|
140
|
-
content: errorMsg,
|
|
141
|
-
},
|
|
142
|
-
]);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
finally {
|
|
146
|
-
setIsProcessing(false);
|
|
147
|
-
abortControllerRef.current = null;
|
|
148
|
-
}
|
|
149
|
-
}, [agent, handleSlashCommand]);
|
|
150
|
-
// 快捷键
|
|
151
|
-
useInput((input, key) => {
|
|
152
|
-
if (key.ctrl && input === "c") {
|
|
153
|
-
exit();
|
|
154
|
-
}
|
|
155
|
-
if (key.ctrl && input === "l") {
|
|
156
|
-
setMessages([]);
|
|
157
|
-
}
|
|
158
|
-
if (key.escape && isProcessing) {
|
|
159
|
-
handleCancel();
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
return (_jsxs(Box, { flexDirection: "column", height: "100%", children: [_jsx(Header, { version: VERSION }), _jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, children: [_jsx(MessageList, { messages: messages }), isProcessing && _jsx(Spinner, {})] }), _jsx(StatusBar, { skills: skills, tokens: tokens }), _jsx(Composer, { value: input, onChange: setInput, onSubmit: handleSubmit, disabled: isProcessing })] }));
|
|
163
|
-
}
|
|
164
|
-
//# sourceMappingURL=App.js.map
|
package/dist/src/ui/App.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/ui/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
interface ComposerProps {
|
|
3
|
-
value: string;
|
|
4
|
-
onChange: (value: string) => void;
|
|
5
|
-
onSubmit: (value: string) => void;
|
|
6
|
-
disabled?: boolean;
|
|
7
|
-
}
|
|
8
|
-
export declare const Composer: React.NamedExoticComponent<ComposerProps>;
|
|
9
|
-
export {};
|
|
10
|
-
//# sourceMappingURL=Composer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/Composer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAIjD,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,QAAQ,2CA6BnB,CAAC"}
|