@optima-chat/optima-agent 0.4.27 → 0.4.29

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 (40) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/.claude/skills/product/SKILL.md +19 -3
  3. package/dist/src/hooks-loader.d.ts +6 -0
  4. package/dist/src/hooks-loader.d.ts.map +1 -0
  5. package/dist/src/hooks-loader.js +215 -0
  6. package/dist/src/hooks-loader.js.map +1 -0
  7. package/dist/src/ui/headless-types.d.ts +9 -2
  8. package/dist/src/ui/headless-types.d.ts.map +1 -1
  9. package/dist/src/ui/headless.d.ts.map +1 -1
  10. package/dist/src/ui/headless.js +7 -0
  11. package/dist/src/ui/headless.js.map +1 -1
  12. package/dist/src/validation/error-formatter.d.ts +21 -0
  13. package/dist/src/validation/error-formatter.d.ts.map +1 -0
  14. package/dist/src/validation/error-formatter.js +98 -0
  15. package/dist/src/validation/error-formatter.js.map +1 -0
  16. package/dist/src/validation/index.d.ts +10 -0
  17. package/dist/src/validation/index.d.ts.map +1 -0
  18. package/dist/src/validation/index.js +10 -0
  19. package/dist/src/validation/index.js.map +1 -0
  20. package/dist/src/validation/json-validator.d.ts +25 -0
  21. package/dist/src/validation/json-validator.d.ts.map +1 -0
  22. package/dist/src/validation/json-validator.js +173 -0
  23. package/dist/src/validation/json-validator.js.map +1 -0
  24. package/dist/src/validation/schema.d.ts +353 -0
  25. package/dist/src/validation/schema.d.ts.map +1 -0
  26. package/dist/src/validation/schema.js +57 -0
  27. package/dist/src/validation/schema.js.map +1 -0
  28. package/dist/src/validation/suggestions.d.ts +25 -0
  29. package/dist/src/validation/suggestions.d.ts.map +1 -0
  30. package/dist/src/validation/suggestions.js +144 -0
  31. package/dist/src/validation/suggestions.js.map +1 -0
  32. package/dist/src/validation/types.d.ts +40 -0
  33. package/dist/src/validation/types.d.ts.map +1 -0
  34. package/dist/src/validation/types.js +5 -0
  35. package/dist/src/validation/types.js.map +1 -0
  36. package/dist/src/validation/yaml-validator.d.ts +25 -0
  37. package/dist/src/validation/yaml-validator.d.ts.map +1 -0
  38. package/dist/src/validation/yaml-validator.js +177 -0
  39. package/dist/src/validation/yaml-validator.js.map +1 -0
  40. package/package.json +1 -1
@@ -0,0 +1,144 @@
1
+ /**
2
+ * 从 Zod 错误生成修复建议
3
+ */
4
+ export function generateSuggestionsFromZodError(zodError) {
5
+ const suggestions = [];
6
+ for (const issue of zodError.issues) {
7
+ switch (issue.code) {
8
+ case "invalid_type":
9
+ suggestions.push(`字段 "${issue.path.join(".")}" 的类型应该是 ${issue.expected},但实际是 ${issue.received}`);
10
+ break;
11
+ case "invalid_enum_value":
12
+ suggestions.push(`字段 "${issue.path.join(".")}" 只能是以下值之一: ${issue.options.join(", ")}`);
13
+ break;
14
+ case "too_small":
15
+ if (issue.type === "string") {
16
+ suggestions.push(`字段 "${issue.path.join(".")}" 至少需要 ${issue.minimum} 个字符`);
17
+ }
18
+ else if (issue.type === "array") {
19
+ suggestions.push(`字段 "${issue.path.join(".")}" 至少需要 ${issue.minimum} 个元素`);
20
+ }
21
+ else if (issue.type === "number") {
22
+ suggestions.push(`字段 "${issue.path.join(".")}" 的值不能小于 ${issue.minimum}`);
23
+ }
24
+ break;
25
+ case "too_big":
26
+ if (issue.type === "string") {
27
+ suggestions.push(`字段 "${issue.path.join(".")}" 最多 ${issue.maximum} 个字符`);
28
+ }
29
+ else if (issue.type === "array") {
30
+ suggestions.push(`字段 "${issue.path.join(".")}" 最多 ${issue.maximum} 个元素`);
31
+ }
32
+ else if (issue.type === "number") {
33
+ suggestions.push(`字段 "${issue.path.join(".")}" 的值不能大于 ${issue.maximum}`);
34
+ }
35
+ break;
36
+ case "invalid_literal":
37
+ suggestions.push(`字段 "${issue.path.join(".")}" 必须是 "${issue.expected}"`);
38
+ break;
39
+ case "unrecognized_keys":
40
+ suggestions.push(`未识别的字段: ${issue.keys.join(", ")}。请检查拼写是否正确`);
41
+ break;
42
+ default:
43
+ suggestions.push(issue.message);
44
+ }
45
+ }
46
+ return suggestions;
47
+ }
48
+ /**
49
+ * 为 YAML 语法错误生成建议
50
+ */
51
+ export function generateYamlSyntaxSuggestions(errorMessage) {
52
+ const suggestions = [];
53
+ if (errorMessage.includes("indent") || errorMessage.includes("缩进")) {
54
+ suggestions.push("检查 YAML 缩进是否正确(应使用 2 个空格)");
55
+ suggestions.push("确保同级元素的缩进对齐");
56
+ }
57
+ if (errorMessage.includes("unexpected") || errorMessage.includes("意外")) {
58
+ suggestions.push("检查是否有多余的冒号、逗号或引号");
59
+ suggestions.push("确保字符串包含特殊字符时使用引号");
60
+ }
61
+ if (errorMessage.includes("mapping") || errorMessage.includes("键值对")) {
62
+ suggestions.push("确保每个键后面有冒号和空格(key: value)");
63
+ suggestions.push("检查是否有重复的键");
64
+ }
65
+ if (errorMessage.includes("sequence") || errorMessage.includes("列表")) {
66
+ suggestions.push("列表项应以 '- ' 开头(破折号后有空格)");
67
+ suggestions.push("确保列表项的缩进一致");
68
+ }
69
+ // 通用建议
70
+ if (suggestions.length === 0) {
71
+ suggestions.push("检查 YAML 语法是否正确");
72
+ suggestions.push("可以使用在线 YAML 验证工具检查格式");
73
+ }
74
+ return suggestions;
75
+ }
76
+ /**
77
+ * 为 JSON 语法错误生成建议
78
+ */
79
+ export function generateJsonSyntaxSuggestions(errorMessage) {
80
+ const suggestions = [];
81
+ if (errorMessage.includes("Unexpected token") || errorMessage.includes("意外的标记")) {
82
+ suggestions.push("检查是否有多余的逗号(特别是最后一个元素后)");
83
+ suggestions.push("确保所有字符串都用双引号包裹");
84
+ suggestions.push("检查括号、方括号是否成对");
85
+ }
86
+ if (errorMessage.includes("Expected") || errorMessage.includes("期望")) {
87
+ suggestions.push("检查是否缺少逗号、冒号或引号");
88
+ suggestions.push("确保对象的键都是字符串(用双引号包裹)");
89
+ }
90
+ if (errorMessage.includes("position") || errorMessage.includes("位置")) {
91
+ suggestions.push("检查指定位置附近的语法");
92
+ }
93
+ // 通用建议
94
+ suggestions.push("可以使用 JSON 格式化工具检查格式");
95
+ suggestions.push("JSON 不支持注释,请删除所有注释");
96
+ return suggestions;
97
+ }
98
+ /**
99
+ * 为 Skill 配置生成特定建议
100
+ */
101
+ export function generateSkillConfigSuggestions(path) {
102
+ const suggestions = [];
103
+ const field = path.join(".");
104
+ if (field === "name") {
105
+ suggestions.push("name 是必需字段,用于标识 skill");
106
+ suggestions.push("name 应该使用小写字母和连字符,如 'my-skill'");
107
+ }
108
+ if (field === "description") {
109
+ suggestions.push("description 建议填写,用于说明 skill 的功能");
110
+ }
111
+ if (field.includes("hooks")) {
112
+ suggestions.push("hooks 支持的事件类型: SessionStart, PreToolUse, PostToolUse, Stop");
113
+ suggestions.push("每个事件可以包含多个钩子配置");
114
+ }
115
+ if (field.includes("hooks") && field.includes("command")) {
116
+ suggestions.push("command 应该是有效的 shell 命令");
117
+ suggestions.push("可以使用 ${CLAUDE_PLUGIN_ROOT} 引用 skill 目录");
118
+ }
119
+ if (field.includes("matcher")) {
120
+ suggestions.push("matcher 是可选的正则表达式,用于匹配特定的工具调用");
121
+ suggestions.push("如果不需要匹配,可以省略 matcher 字段");
122
+ }
123
+ return suggestions;
124
+ }
125
+ /**
126
+ * 为 Optima 配置生成特定建议
127
+ */
128
+ export function generateOptimaConfigSuggestions(path) {
129
+ const suggestions = [];
130
+ const field = path.join(".");
131
+ if (field === "model") {
132
+ suggestions.push("model 指定使用的 Claude 模型");
133
+ suggestions.push("建议使用最新的模型以获得最佳性能");
134
+ }
135
+ if (field === "theme") {
136
+ suggestions.push("theme 只能是 'dark' 或 'light'");
137
+ }
138
+ if (field.includes("server.port")) {
139
+ suggestions.push("端口号必须是 1-65535 之间的整数");
140
+ suggestions.push("确保端口未被其他程序占用");
141
+ }
142
+ return suggestions;
143
+ }
144
+ //# sourceMappingURL=suggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestions.js","sourceRoot":"","sources":["../../../src/validation/suggestions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 配置验证模块类型定义
3
+ */
4
+ export interface ValidationError {
5
+ /** 错误类型 */
6
+ type: "syntax" | "schema" | "semantic";
7
+ /** 文件路径 */
8
+ filePath: string;
9
+ /** 错误消息 */
10
+ message: string;
11
+ /** 详细描述 */
12
+ details?: string;
13
+ /** 错误位置(行号) */
14
+ line?: number;
15
+ /** 错误位置(列号) */
16
+ column?: number;
17
+ /** 问题字段路径 */
18
+ path?: string[];
19
+ /** 修复建议 */
20
+ suggestions: string[];
21
+ /** 相关文档链接 */
22
+ docUrl?: string;
23
+ /** 示例配置路径 */
24
+ examplePath?: string;
25
+ }
26
+ export interface ValidationResult {
27
+ /** 是否验证成功 */
28
+ valid: boolean;
29
+ /** 验证错误列表 */
30
+ errors: ValidationError[];
31
+ /** 警告列表 */
32
+ warnings?: ValidationError[];
33
+ }
34
+ export interface Validator<T> {
35
+ /** 验证配置 */
36
+ validate(content: string, filePath: string): ValidationResult;
37
+ /** 解析配置(验证成功后) */
38
+ parse(content: string): T | null;
39
+ }
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/validation/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IACvC,WAAW;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW;IACX,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa;IACb,KAAK,EAAE,OAAO,CAAC;IACf,aAAa;IACb,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,WAAW;IACX,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,WAAW;IACX,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC9D,kBAAkB;IAClB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;CAClC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 配置验证模块类型定义
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/validation/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,25 @@
1
+ import type { Validator, ValidationResult } from "./types.js";
2
+ import { type SkillYamlFrontmatter } from "./schema.js";
3
+ export declare class YamlValidator implements Validator<SkillYamlFrontmatter> {
4
+ /**
5
+ * 从内容中提取 YAML frontmatter
6
+ */
7
+ private extractFrontmatter;
8
+ /**
9
+ * 解析 YAML 内容
10
+ */
11
+ private parseYaml;
12
+ /**
13
+ * 从 YAML 错误中提取行号
14
+ */
15
+ private extractLineNumber;
16
+ /**
17
+ * 验证 YAML frontmatter
18
+ */
19
+ validate(content: string, filePath: string): ValidationResult;
20
+ /**
21
+ * 解析配置(验证成功后调用)
22
+ */
23
+ parse(content: string): SkillYamlFrontmatter | null;
24
+ }
25
+ //# sourceMappingURL=yaml-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-validator.d.ts","sourceRoot":"","sources":["../../../src/validation/yaml-validator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAmB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAA8B,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAQpF,qBAAa,aAAc,YAAW,SAAS,CAAC,oBAAoB,CAAC;IACnE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IAmH7D;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI;CAiBpD"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * YAML 配置验证器
3
+ */
4
+ import yaml from "js-yaml";
5
+ import { ZodError } from "zod";
6
+ import { SkillYamlFrontmatterSchema } from "./schema.js";
7
+ import { generateSuggestionsFromZodError, generateYamlSyntaxSuggestions, generateSkillConfigSuggestions, } from "./suggestions.js";
8
+ export class YamlValidator {
9
+ /**
10
+ * 从内容中提取 YAML frontmatter
11
+ */
12
+ extractFrontmatter(content) {
13
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
14
+ if (!match) {
15
+ return null;
16
+ }
17
+ return {
18
+ yaml: match[1],
19
+ line: 1, // frontmatter 从第一行开始
20
+ };
21
+ }
22
+ /**
23
+ * 解析 YAML 内容
24
+ */
25
+ parseYaml(yamlContent) {
26
+ try {
27
+ const data = yaml.load(yamlContent);
28
+ return { data };
29
+ }
30
+ catch (error) {
31
+ return { data: null, error: error };
32
+ }
33
+ }
34
+ /**
35
+ * 从 YAML 错误中提取行号
36
+ */
37
+ extractLineNumber(error) {
38
+ // js-yaml 的错误消息通常包含 "at line X, column Y"
39
+ const match = error.message.match(/at line (\d+)/);
40
+ if (match) {
41
+ return parseInt(match[1], 10);
42
+ }
43
+ return undefined;
44
+ }
45
+ /**
46
+ * 验证 YAML frontmatter
47
+ */
48
+ validate(content, filePath) {
49
+ const errors = [];
50
+ const warnings = [];
51
+ // 1. 检查是否存在 frontmatter
52
+ const frontmatter = this.extractFrontmatter(content);
53
+ if (!frontmatter) {
54
+ errors.push({
55
+ type: "syntax",
56
+ filePath,
57
+ message: "未找到 YAML frontmatter",
58
+ details: "SKILL.md 文件应该以 YAML frontmatter 开头(用 --- 包裹)",
59
+ suggestions: [
60
+ "在文件开头添加 YAML frontmatter",
61
+ "格式应为: ---\\n配置内容\\n---",
62
+ "参考示例: .claude/skills/planning-with-files/SKILL.md",
63
+ ],
64
+ examplePath: ".claude/skills/planning-with-files/SKILL.md",
65
+ });
66
+ return { valid: false, errors, warnings };
67
+ }
68
+ // 2. 解析 YAML
69
+ const { data, error: yamlError } = this.parseYaml(frontmatter.yaml);
70
+ if (yamlError) {
71
+ const line = this.extractLineNumber(yamlError);
72
+ errors.push({
73
+ type: "syntax",
74
+ filePath,
75
+ message: "YAML 语法错误",
76
+ details: yamlError.message,
77
+ line,
78
+ suggestions: generateYamlSyntaxSuggestions(yamlError.message),
79
+ examplePath: ".claude/skills/planning-with-files/SKILL.md",
80
+ });
81
+ return { valid: false, errors, warnings };
82
+ }
83
+ // 3. 使用 Zod 验证 schema
84
+ try {
85
+ SkillYamlFrontmatterSchema.parse(data);
86
+ }
87
+ catch (error) {
88
+ if (error instanceof ZodError) {
89
+ for (const issue of error.issues) {
90
+ const zodSuggestions = generateSuggestionsFromZodError(error);
91
+ const skillSuggestions = generateSkillConfigSuggestions(issue.path.map(String));
92
+ errors.push({
93
+ type: "schema",
94
+ filePath,
95
+ message: issue.message,
96
+ path: issue.path.map(String),
97
+ suggestions: [...zodSuggestions, ...skillSuggestions],
98
+ examplePath: ".claude/skills/planning-with-files/SKILL.md",
99
+ });
100
+ }
101
+ }
102
+ else {
103
+ errors.push({
104
+ type: "schema",
105
+ filePath,
106
+ message: "未知的验证错误",
107
+ details: String(error),
108
+ suggestions: ["请检查配置文件格式"],
109
+ });
110
+ }
111
+ return { valid: false, errors, warnings };
112
+ }
113
+ // 4. 语义检查和警告
114
+ if (!data.description) {
115
+ warnings.push({
116
+ type: "semantic",
117
+ filePath,
118
+ message: "建议添加 description 字段",
119
+ suggestions: ["description 可以帮助用户理解 skill 的功能", "建议填写清晰的功能描述"],
120
+ });
121
+ }
122
+ // 检查 hooks 中的命令
123
+ if (data.hooks) {
124
+ for (const [eventType, configs] of Object.entries(data.hooks)) {
125
+ if (Array.isArray(configs)) {
126
+ for (const config of configs) {
127
+ if (config.hooks) {
128
+ for (const hook of config.hooks) {
129
+ if (hook.command && hook.command.includes("${CLAUDE_PLUGIN_ROOT}")) {
130
+ // 检查命令中的路径引用
131
+ const scriptPath = hook.command.match(/\$\{CLAUDE_PLUGIN_ROOT\}\/(.+?)(?:\s|$)/)?.[1];
132
+ if (scriptPath) {
133
+ warnings.push({
134
+ type: "semantic",
135
+ filePath,
136
+ message: `确保脚本文件存在: ${scriptPath}`,
137
+ path: ["hooks", eventType, "hooks", "command"],
138
+ suggestions: [
139
+ "检查脚本文件是否在 skill 目录中",
140
+ "确保脚本文件有执行权限(chmod +x)",
141
+ ],
142
+ });
143
+ }
144
+ }
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ return {
152
+ valid: errors.length === 0,
153
+ errors,
154
+ warnings,
155
+ };
156
+ }
157
+ /**
158
+ * 解析配置(验证成功后调用)
159
+ */
160
+ parse(content) {
161
+ const frontmatter = this.extractFrontmatter(content);
162
+ if (!frontmatter) {
163
+ return null;
164
+ }
165
+ const { data, error } = this.parseYaml(frontmatter.yaml);
166
+ if (error) {
167
+ return null;
168
+ }
169
+ try {
170
+ return SkillYamlFrontmatterSchema.parse(data);
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ }
176
+ }
177
+ //# sourceMappingURL=yaml-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-validator.js","sourceRoot":"","sources":["../../../src/validation/yaml-validator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/optima-agent",
3
- "version": "0.4.27",
3
+ "version": "0.4.29",
4
4
  "description": "基于 Claude Agent SDK 的电商运营 AI 助手",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",