@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,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":"AAKA;;GAEG;AACH,MAAM,UAAU,+BAA+B,CAAC,QAAkB;IAChE,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,cAAc;gBACjB,WAAW,CAAC,IAAI,CACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,QAAQ,SAAS,KAAK,CAAC,QAAQ,EAAE,CAC/E,CAAC;gBACF,MAAM;YAER,KAAK,oBAAoB;gBACvB,WAAW,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvF,MAAM;YAER,KAAK,WAAW;gBACd,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC5B,WAAW,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;gBAC7E,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAClC,WAAW,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;gBAC7E,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACnC,WAAW,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3E,CAAC;gBACD,MAAM;YAER,KAAK,SAAS;gBACZ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC5B,WAAW,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;gBAC3E,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAClC,WAAW,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;gBAC3E,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACnC,WAAW,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3E,CAAC;gBACD,MAAM;YAER,KAAK,iBAAiB;gBACpB,WAAW,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACzE,MAAM;YAER,KAAK,mBAAmB;gBACtB,WAAW,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC/D,MAAM;YAER;gBACE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAAC,YAAoB;IAChE,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,WAAW,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC9C,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACvE,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACrC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrE,WAAW,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC9C,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,WAAW,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC3C,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IAED,OAAO;IACP,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnC,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAAC,YAAoB;IAChE,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,IAAI,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChF,WAAW,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC3C,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;IACP,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACxC,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAEvC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,IAAc;IAC3D,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE7B,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,WAAW,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC1C,WAAW,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAC/E,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC5C,WAAW,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,WAAW,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAClD,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,+BAA+B,CAAC,IAAc;IAC5D,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE7B,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,WAAW,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC1C,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,WAAW,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACzC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -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 @@
|
|
|
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.9.
|
|
3
|
+
"version": "0.9.45",
|
|
4
4
|
"description": "基于 Claude Agent SDK 的电商运营 AI 助手",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -36,17 +36,6 @@
|
|
|
36
36
|
],
|
|
37
37
|
"author": "Optima Chat",
|
|
38
38
|
"license": "MIT",
|
|
39
|
-
"scripts": {
|
|
40
|
-
"build": "npm run sync:kb-skills && tsc",
|
|
41
|
-
"dev": "tsx watch src/index.ts",
|
|
42
|
-
"start": "node dist/src/index.js",
|
|
43
|
-
"typecheck": "tsc --noEmit",
|
|
44
|
-
"test": "vitest run",
|
|
45
|
-
"test:watch": "vitest",
|
|
46
|
-
"optima": "tsx bin/optima.ts",
|
|
47
|
-
"prepublishOnly": "npm run build",
|
|
48
|
-
"sync:kb-skills": "tsx bin/sync-kb-skills.ts"
|
|
49
|
-
},
|
|
50
39
|
"dependencies": {
|
|
51
40
|
"@anthropic-ai/claude-agent-sdk": "^0.2.63",
|
|
52
41
|
"@optima-chat/ads-cli": "latest",
|
|
@@ -75,5 +64,15 @@
|
|
|
75
64
|
},
|
|
76
65
|
"engines": {
|
|
77
66
|
"node": ">=18.0.0"
|
|
67
|
+
},
|
|
68
|
+
"scripts": {
|
|
69
|
+
"build": "npm run sync:kb-skills && tsc",
|
|
70
|
+
"dev": "tsx watch src/index.ts",
|
|
71
|
+
"start": "node dist/src/index.js",
|
|
72
|
+
"typecheck": "tsc --noEmit",
|
|
73
|
+
"test": "vitest run",
|
|
74
|
+
"test:watch": "vitest",
|
|
75
|
+
"optima": "tsx bin/optima.ts",
|
|
76
|
+
"sync:kb-skills": "tsx bin/sync-kb-skills.ts"
|
|
78
77
|
}
|
|
79
|
-
}
|
|
78
|
+
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# 数据索引
|
|
2
|
-
|
|
3
|
-
本文件记录已收集的所有数据,agent 分析前先读此文件了解数据全貌。
|
|
4
|
-
|
|
5
|
-
## 市场搜索
|
|
6
|
-
|
|
7
|
-
| 关键词 | 时间 | 结果数 | 数据文件 |
|
|
8
|
-
|--------|------|--------|---------|
|
|
9
|
-
|
|
10
|
-
## 社交/趋势
|
|
11
|
-
|
|
12
|
-
| 平台 | 关键词 | 时间 | 数据文件 |
|
|
13
|
-
|------|--------|------|---------|
|
|
14
|
-
|
|
15
|
-
## 竞品数据
|
|
16
|
-
|
|
17
|
-
| ASIN | 产品名 | product | reviews | keepa | 上次更新 |
|
|
18
|
-
|------|--------|---------|---------|-------|---------|
|
|
19
|
-
|
|
20
|
-
## 供应商数据
|
|
21
|
-
|
|
22
|
-
| 搜索方式 | 关键词/图片 | 时间 | 结果数 | 数据文件 |
|
|
23
|
-
|---------|-----------|------|--------|---------|
|
|
24
|
-
|
|
25
|
-
## 卖家精灵数据(关键词/市场/广告)
|
|
26
|
-
|
|
27
|
-
| 类型 | ASIN/关键词 | 时间 | 数据文件 |
|
|
28
|
-
|------|-----------|------|---------|
|
|
29
|
-
|
|
30
|
-
## 数据关系
|
|
31
|
-
|
|
32
|
-
{记录数据之间的关联,如:哪个供应商对应哪个竞品,哪些 ASIN 来自哪次搜索}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
# {产品名称}
|
|
2
|
-
|
|
3
|
-
## 基本信息
|
|
4
|
-
- 创建时间: {date}
|
|
5
|
-
- 当前阶段: 概念 | 计划 | 开发 | 验证 | 发布 | 生命周期
|
|
6
|
-
- 状态: 进行中 | 暂停 | 已决策(Go) | 已决策(No-Go)
|
|
7
|
-
|
|
8
|
-
## 研究目标
|
|
9
|
-
{为什么研究这个产品?初始假设是什么?}
|
|
10
|
-
|
|
11
|
-
## SPAN 定位
|
|
12
|
-
- 市场吸引力: {高/中/低}(规模、增长率、利润潜力)
|
|
13
|
-
- 竞争地位: {强/中/弱}(差异化能力、资金、供应链)
|
|
14
|
-
- 战略象限: 投资 | 选择性投入 | 收割 | 退出
|
|
15
|
-
|
|
16
|
-
## 阶段进度
|
|
17
|
-
|
|
18
|
-
### 概念阶段(产品立项书)
|
|
19
|
-
- [ ] 趋势扫描(TikTok/Reddit/Twitter/Web Search 发现热度信号)
|
|
20
|
-
- [ ] Amazon 市场全景扫描(多关键词 ×50 条 + 竞品补充,覆盖 30+ 竞品)
|
|
21
|
-
- [ ] 子品类聚类(识别 5+ 子品类,标注各自规模和竞争度)
|
|
22
|
-
- [ ] 需求验证(精确月搜索量、购买量、转化率)
|
|
23
|
-
- [ ] 竞争格局(品牌集中度、卖家国籍分布、各子品类竞争强度)
|
|
24
|
-
- [ ] SPAN 初步定位(市场吸引力 + 竞争地位)
|
|
25
|
-
- [ ] 初步利润估算(毛利率 > PROFILE 最低毛利率?)
|
|
26
|
-
- [ ] 供应端初探(1688 参考价,≥3 家供应商报价)
|
|
27
|
-
- [ ] IP/合规初筛(商标、专利、认证要求)
|
|
28
|
-
- [ ] **数据完整性检查通过**(10 项全部通过)
|
|
29
|
-
- **CDCP Gate**: 市场够大?利润够高?竞争可打?无 IP 风险?
|
|
30
|
-
|
|
31
|
-
### 计划阶段(商业计划书)
|
|
32
|
-
- [ ] 头部竞品深挖(5-8 个,含产品详情 + 流量关键词 + Listing 能力矩阵)
|
|
33
|
-
- [ ] 历史销量与季节性分析(14 个月销量数据,识别波峰波谷)
|
|
34
|
-
- [ ] $APPEALS 竞品评分(TOP 5 竞品 8 维度打分)
|
|
35
|
-
- [ ] 用户痛点挖掘(差评聚类 → 差异化方向)
|
|
36
|
-
- [ ] 历史趋势分析(Keepa BSR/价格/卖家数 → 生命周期判断)
|
|
37
|
-
- [ ] 差异化策略(基于 $APPEALS 缺口确定产品定位)
|
|
38
|
-
- [ ] FAN 财务分析(单元经济、盈亏平衡、场景分析、回本周期)
|
|
39
|
-
- [ ] 供应商初步接触(3-5 家询价、MOQ、交期)
|
|
40
|
-
- [ ] 风险评估(竞争加剧、价格战、季节性、合规变化)
|
|
41
|
-
- [ ] **数据完整性检查通过**(13 项全部通过)
|
|
42
|
-
- **PDCP Gate**: 有明确差异化?供应商可行?商业计划书成立?
|
|
43
|
-
|
|
44
|
-
### 开发阶段(产品实现)
|
|
45
|
-
- [ ] 供应商评估与选定(质量/交期/配合度/定制能力)
|
|
46
|
-
- [ ] 成本模型定稿(原材料+制造+包装+运费+关税+FBA prep)
|
|
47
|
-
- [ ] 产品规格确认(材料、尺寸、包装、认证)
|
|
48
|
-
- [ ] 样品迭代(至少 2 轮打样确认)
|
|
49
|
-
- [ ] 包装设计(品牌包装、FBA 尺寸优化)
|
|
50
|
-
- [ ] Listing 素材准备(图片、A+、视频)
|
|
51
|
-
- **开发 Gate**: 样品达标?成本在预算内?Listing 就绪?
|
|
52
|
-
|
|
53
|
-
### 验证阶段(上线验证)
|
|
54
|
-
- [ ] 第三方质检(AQL 抽检)
|
|
55
|
-
- [ ] 小批量测试(50-100 件,验证转化率和退货率)
|
|
56
|
-
- [ ] Listing A/B 测试(主图、标题变体)
|
|
57
|
-
- [ ] PPC 测试(验证 ACoS 假设)
|
|
58
|
-
- [ ] 首批评论分析(前 10-20 条反馈)
|
|
59
|
-
- **ADCP Gate**: 质量过关?转化达预期?ACoS 可控?
|
|
60
|
-
|
|
61
|
-
### 发布阶段
|
|
62
|
-
- [ ] 正式库存到仓
|
|
63
|
-
- [ ] Launch 推广策略执行
|
|
64
|
-
- [ ] 评论加速计划
|
|
65
|
-
- [ ] 竞品动态监控
|
|
66
|
-
|
|
67
|
-
### 生命周期
|
|
68
|
-
- [ ] 月度复盘(BSR/评论/竞品/利润 vs 商业计划书)
|
|
69
|
-
- [ ] 变体扩展评估
|
|
70
|
-
- [ ] EOL 决策(何时退出)
|
|
71
|
-
|
|
72
|
-
## $APPEALS 评分卡
|
|
73
|
-
|
|
74
|
-
| 维度 | 本品(目标)| 竞品A | 竞品B | 竞品C | 差距/机会 |
|
|
75
|
-
|------|-----------|-------|-------|-------|----------|
|
|
76
|
-
| $ 价格 | | | | | |
|
|
77
|
-
| A 可获得性 | | | | | |
|
|
78
|
-
| P 包装 | | | | | |
|
|
79
|
-
| P 性能 | | | | | |
|
|
80
|
-
| E 易用性 | | | | | |
|
|
81
|
-
| A 保证 | | | | | |
|
|
82
|
-
| L 生命周期成本 | | | | | |
|
|
83
|
-
| S 社会接受度 | | | | | |
|
|
84
|
-
|
|
85
|
-
## FAN 财务模型
|
|
86
|
-
|
|
87
|
-
| 项目 | 数值 | 备注 |
|
|
88
|
-
|------|------|------|
|
|
89
|
-
| 售价 | | |
|
|
90
|
-
| COGS(1688 采购) | | |
|
|
91
|
-
| 头程运费 + 关税 | | |
|
|
92
|
-
| FBA 费用 | | |
|
|
93
|
-
| **毛利** | | 售价 - COGS - 运费关税 - FBA |
|
|
94
|
-
| **毛利率** | | 概念阶段判断用 |
|
|
95
|
-
| PPC 分摊/单位 | | |
|
|
96
|
-
| 退货损耗 | | |
|
|
97
|
-
| 其他费用 | | |
|
|
98
|
-
| **单位净利润** | | 毛利 - PPC - 退货 - 其他 |
|
|
99
|
-
| **净利率** | | 计划阶段判断用 |
|
|
100
|
-
| 盈亏平衡(月销量) | | |
|
|
101
|
-
| 首批投入 | | |
|
|
102
|
-
| 回本周期 | | |
|
|
103
|
-
|
|
104
|
-
## 关键发现
|
|
105
|
-
{研究过程中的重要发现,随时更新}
|
|
106
|
-
|
|
107
|
-
## 风险清单
|
|
108
|
-
| 风险 | 影响 | 概率 | 应对 |
|
|
109
|
-
|------|------|------|------|
|
|
110
|
-
|
|
111
|
-
## 决策记录
|
|
112
|
-
| 日期 | Gate | 决策 | 依据 |
|
|
113
|
-
|------|------|------|------|
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# 竞品分析
|
|
2
|
-
|
|
3
|
-
## TOP 竞品概览
|
|
4
|
-
|
|
5
|
-
| ASIN | 产品名 | 价格 | 评分 | 评论数 | BSR | 月销估算 | 卖家类型 |
|
|
6
|
-
|------|--------|------|------|--------|-----|---------|---------|
|
|
7
|
-
|
|
8
|
-
## $APPEALS 对比
|
|
9
|
-
|
|
10
|
-
| 维度 | 行业均值 | 竞品A | 竞品B | 竞品C | 缺口机会 |
|
|
11
|
-
|------|---------|-------|-------|-------|---------|
|
|
12
|
-
| $ 价格 | | | | | |
|
|
13
|
-
| A 可获得性 | | | | | |
|
|
14
|
-
| P 包装 | | | | | |
|
|
15
|
-
| P 性能 | | | | | |
|
|
16
|
-
| E 易用性 | | | | | |
|
|
17
|
-
| A 保证 | | | | | |
|
|
18
|
-
| L 生命周期成本 | | | | | |
|
|
19
|
-
| S 社会接受度 | | | | | |
|
|
20
|
-
|
|
21
|
-
## Listing 能力矩阵
|
|
22
|
-
| ASIN | 图片数 | A+ | 视频 | Bullets 质量 | 品牌注册 | Coupon/促销 | 优化空间 |
|
|
23
|
-
|------|--------|----|----- |------------|---------|-----------|---------|
|
|
24
|
-
|
|
25
|
-
## 季节性分析(14 个月历史销量)
|
|
26
|
-
|
|
27
|
-
| ASIN | 产品名 | 波峰月份 | 波谷月份 | 旺季/淡季倍数 | 趋势方向 |
|
|
28
|
-
|------|--------|---------|---------|-------------|---------|
|
|
29
|
-
|
|
30
|
-
{基于 scout sp predict 数据,分析季节规律和最佳上架时间}
|
|
31
|
-
|
|
32
|
-
## 差异化机会总结
|
|
33
|
-
{基于 $APPEALS 缺口 + 差评痛点 + 子品类空白,用户最在乎但竞品最弱的交叉维度}
|
|
File without changes
|