@optima-chat/optima-agent 0.4.28 → 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 (35) 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 +1 -1
  4. package/dist/src/hooks-loader.d.ts.map +1 -1
  5. package/dist/src/hooks-loader.js +116 -12
  6. package/dist/src/hooks-loader.js.map +1 -1
  7. package/dist/src/validation/error-formatter.d.ts +21 -0
  8. package/dist/src/validation/error-formatter.d.ts.map +1 -0
  9. package/dist/src/validation/error-formatter.js +98 -0
  10. package/dist/src/validation/error-formatter.js.map +1 -0
  11. package/dist/src/validation/index.d.ts +10 -0
  12. package/dist/src/validation/index.d.ts.map +1 -0
  13. package/dist/src/validation/index.js +10 -0
  14. package/dist/src/validation/index.js.map +1 -0
  15. package/dist/src/validation/json-validator.d.ts +25 -0
  16. package/dist/src/validation/json-validator.d.ts.map +1 -0
  17. package/dist/src/validation/json-validator.js +173 -0
  18. package/dist/src/validation/json-validator.js.map +1 -0
  19. package/dist/src/validation/schema.d.ts +353 -0
  20. package/dist/src/validation/schema.d.ts.map +1 -0
  21. package/dist/src/validation/schema.js +57 -0
  22. package/dist/src/validation/schema.js.map +1 -0
  23. package/dist/src/validation/suggestions.d.ts +25 -0
  24. package/dist/src/validation/suggestions.d.ts.map +1 -0
  25. package/dist/src/validation/suggestions.js +144 -0
  26. package/dist/src/validation/suggestions.js.map +1 -0
  27. package/dist/src/validation/types.d.ts +40 -0
  28. package/dist/src/validation/types.d.ts.map +1 -0
  29. package/dist/src/validation/types.js +5 -0
  30. package/dist/src/validation/types.js.map +1 -0
  31. package/dist/src/validation/yaml-validator.d.ts +25 -0
  32. package/dist/src/validation/yaml-validator.d.ts.map +1 -0
  33. package/dist/src/validation/yaml-validator.js +177 -0
  34. package/dist/src/validation/yaml-validator.js.map +1 -0
  35. package/package.json +1 -1
@@ -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":"AAAA;;GAEG;AACH,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE/B,OAAO,EAAE,0BAA0B,EAA6B,MAAM,aAAa,CAAC;AACpF,OAAO,EACL,+BAA+B,EAC/B,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC;AAG1B,MAAM,OAAO,aAAa;IACxB;;OAEG;IACK,kBAAkB,CAAC,OAAe;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACd,IAAI,EAAE,CAAC,EAAE,qBAAqB;SAC/B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,WAAmB;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAY;QACpC,0CAA0C;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACnD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAe,EAAE,QAAgB;QACxC,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAsB,EAAE,CAAC;QAEvC,wBAAwB;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ;gBACR,OAAO,EAAE,sBAAsB;gBAC/B,OAAO,EAAE,8CAA8C;gBACvD,WAAW,EAAE;oBACX,0BAA0B;oBAC1B,wBAAwB;oBACxB,mDAAmD;iBACpD;gBACD,WAAW,EAAE,6CAA6C;aAC3D,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC5C,CAAC;QAED,aAAa;QACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ;gBACR,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,IAAI;gBACJ,WAAW,EAAE,6BAA6B,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7D,WAAW,EAAE,6CAA6C;aAC3D,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC5C,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC;YACH,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;gBAC9B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjC,MAAM,cAAc,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAC;oBAC9D,MAAM,gBAAgB,GAAG,8BAA8B,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;oBAEhF,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,QAAQ;wBACR,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;wBAC5B,WAAW,EAAE,CAAC,GAAG,cAAc,EAAE,GAAG,gBAAgB,CAAC;wBACrD,WAAW,EAAE,6CAA6C;qBAC3D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,QAAQ;oBACR,OAAO,EAAE,SAAS;oBAClB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;oBACtB,WAAW,EAAE,CAAC,WAAW,CAAC;iBAC3B,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC5C,CAAC;QAED,aAAa;QACb,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,QAAQ;gBACR,OAAO,EAAE,qBAAqB;gBAC9B,WAAW,EAAE,CAAC,gCAAgC,EAAE,aAAa,CAAC;aAC/D,CAAC,CAAC;QACL,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,KAAK,MAAM,MAAM,IAAI,OAAgB,EAAE,CAAC;wBACtC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;4BACjB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gCAChC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;oCACnE,aAAa;oCACb,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oCACtF,IAAI,UAAU,EAAE,CAAC;wCACf,QAAQ,CAAC,IAAI,CAAC;4CACZ,IAAI,EAAE,UAAU;4CAChB,QAAQ;4CACR,OAAO,EAAE,aAAa,UAAU,EAAE;4CAClC,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;4CAC9C,WAAW,EAAE;gDACX,qBAAqB;gDACrB,uBAAuB;6CACxB;yCACF,CAAC,CAAC;oCACL,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,OAAO,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/optima-agent",
3
- "version": "0.4.28",
3
+ "version": "0.4.29",
4
4
  "description": "基于 Claude Agent SDK 的电商运营 AI 助手",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",