mcp-probe-kit 1.8.0 → 1.9.0
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/README.md +44 -2
- package/build/tools/add_feature.d.ts +0 -11
- package/build/tools/add_feature.js +19 -10
- package/build/tools/analyze_project.js +76 -61
- package/build/tools/check_deps.d.ts +1 -1
- package/build/tools/check_deps.js +2 -2
- package/build/tools/code_review.js +15 -2
- package/build/tools/convert.js +18 -3
- package/build/tools/css_order.js +55 -55
- package/build/tools/debug.js +14 -2
- package/build/tools/design2code.d.ts +2 -11
- package/build/tools/design2code.js +21 -4
- package/build/tools/detect_shell.js +15 -2
- package/build/tools/estimate.js +21 -4
- package/build/tools/explain.js +15 -2
- package/build/tools/fix.js +15 -2
- package/build/tools/fix_bug.js +24 -5
- package/build/tools/gen_mock.js +24 -5
- package/build/tools/gen_skill.d.ts +0 -3
- package/build/tools/gen_skill.js +21 -4
- package/build/tools/genapi.js +15 -2
- package/build/tools/genchangelog.js +18 -3
- package/build/tools/gencommit.js +16 -2
- package/build/tools/gendoc.js +18 -3
- package/build/tools/genpr.js +15 -2
- package/build/tools/genreadme.js +15 -2
- package/build/tools/gensql.js +15 -2
- package/build/tools/gentest.js +15 -2
- package/build/tools/genui.js +15 -2
- package/build/tools/init_project.js +15 -2
- package/build/tools/init_project_context.d.ts +0 -6
- package/build/tools/init_project_context.js +12 -2
- package/build/tools/perf.js +15 -2
- package/build/tools/refactor.js +15 -2
- package/build/tools/resolve_conflict.js +12 -1
- package/build/tools/security_scan.js +18 -3
- package/build/tools/split.js +15 -2
- package/build/tools/start_api.d.ts +0 -6
- package/build/tools/start_api.js +18 -3
- package/build/tools/start_bugfix.d.ts +0 -6
- package/build/tools/start_bugfix.js +15 -2
- package/build/tools/start_doc.d.ts +0 -6
- package/build/tools/start_doc.js +20 -3
- package/build/tools/start_feature.d.ts +0 -6
- package/build/tools/start_feature.js +18 -3
- package/build/tools/start_onboard.d.ts +0 -6
- package/build/tools/start_onboard.js +15 -2
- package/build/tools/start_refactor.d.ts +0 -6
- package/build/tools/start_refactor.js +15 -2
- package/build/tools/start_release.d.ts +0 -6
- package/build/tools/start_release.js +18 -3
- package/build/tools/start_review.d.ts +0 -6
- package/build/tools/start_review.js +15 -2
- package/build/utils/parseArgs.d.ts +39 -0
- package/build/utils/parseArgs.js +153 -0
- package/docs/BEST_PRACTICES.md +9 -0
- package/docs/HOW_TO_TRIGGER.html +124 -69
- package/docs/HOW_TO_TRIGGER.md +41 -2
- package/docs/MCP-Probe-Kit-/344/275/277/347/224/250/346/211/213/345/206/214.html +420 -0
- package/docs/MCP-Probe-Kit-/344/275/277/347/224/250/346/211/213/345/206/214.md +609 -0
- package/package.json +1 -1
- package/docs/specs/add-feature/design.md +0 -608
- package/docs/specs/add-feature/requirements.md +0 -175
- package/docs/specs/add-feature/tasks.md +0 -111
- package/docs/specs/design2code/README.md +0 -0
- package/docs/specs/design2code/requirements.md +0 -0
- package/docs/specs/estimate/design.md +0 -209
- package/docs/specs/estimate/requirements.md +0 -140
- package/docs/specs/estimate/tasks.md +0 -66
- package/docs/specs/fix-bug/design.md +0 -259
- package/docs/specs/fix-bug/requirements.md +0 -132
- package/docs/specs/fix-bug/tasks.md +0 -66
- package/docs/specs/gen-mock/design.md +0 -241
- package/docs/specs/gen-mock/requirements.md +0 -137
- package/docs/specs/gen-mock/tasks.md +0 -66
- package/docs/specs/init-project-context/design.md +0 -515
- package/docs/specs/init-project-context/requirements.md +0 -144
- package/docs/specs/init-project-context/tasks.md +0 -93
- package/docs/specs/security-scan/design.md +0 -152
- package/docs/specs/security-scan/requirements.md +0 -150
- package/docs/specs/security-scan/tasks.md +0 -67
- package/docs/specs/start-bugfix/design.md +0 -42
- package/docs/specs/start-bugfix/requirements.md +0 -70
- package/docs/specs/start-bugfix/tasks.md +0 -21
- package/docs/specs/start-feature/design.md +0 -41
- package/docs/specs/start-feature/requirements.md +0 -90
- package/docs/specs/start-feature/tasks.md +0 -21
- package/docs/specs/start-review/requirements.md +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
1
2
|
/**
|
|
2
3
|
* start_bugfix 智能编排工具
|
|
3
4
|
*
|
|
@@ -101,11 +102,23 @@ const PROMPT_TEMPLATE = `# 🐛 Bug 修复编排指南
|
|
|
101
102
|
`;
|
|
102
103
|
export async function startBugfix(args) {
|
|
103
104
|
try {
|
|
104
|
-
|
|
105
|
+
// 智能参数解析,支持自然语言输入
|
|
106
|
+
const parsedArgs = parseArgs(args, {
|
|
107
|
+
defaultValues: {
|
|
108
|
+
error_message: "",
|
|
109
|
+
stack_trace: "",
|
|
110
|
+
},
|
|
111
|
+
primaryField: "error_message", // 纯文本输入默认映射到 error_message 字段
|
|
112
|
+
fieldAliases: {
|
|
113
|
+
error_message: ["error", "err", "message", "错误", "错误信息"],
|
|
114
|
+
stack_trace: ["stack", "trace", "堆栈", "调用栈"],
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
const errorMessage = getString(parsedArgs.error_message);
|
|
118
|
+
const stackTrace = getString(parsedArgs.stack_trace);
|
|
105
119
|
if (!errorMessage) {
|
|
106
120
|
throw new Error("缺少必填参数: error_message(错误信息)");
|
|
107
121
|
}
|
|
108
|
-
const stackTrace = args?.stack_trace || "";
|
|
109
122
|
const stackTraceSection = stackTrace
|
|
110
123
|
? `**堆栈跟踪**:\n\`\`\`\n${stackTrace}\n\`\`\``
|
|
111
124
|
: "";
|
package/build/tools/start_doc.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
1
2
|
/**
|
|
2
3
|
* start_doc 智能编排工具
|
|
3
4
|
*
|
|
@@ -166,12 +167,28 @@ const PROMPT_TEMPLATE = `# 📖 文档生成编排指南
|
|
|
166
167
|
`;
|
|
167
168
|
export async function startDoc(args) {
|
|
168
169
|
try {
|
|
169
|
-
|
|
170
|
+
// 智能参数解析,支持自然语言输入
|
|
171
|
+
const parsedArgs = parseArgs(args, {
|
|
172
|
+
defaultValues: {
|
|
173
|
+
code: "",
|
|
174
|
+
project_info: "",
|
|
175
|
+
style: "jsdoc",
|
|
176
|
+
lang: "zh",
|
|
177
|
+
},
|
|
178
|
+
primaryField: "code", // 纯文本输入默认映射到 code 字段
|
|
179
|
+
fieldAliases: {
|
|
180
|
+
code: ["source", "src", "代码", "content"],
|
|
181
|
+
project_info: ["info", "project", "项目信息"],
|
|
182
|
+
style: ["format", "type", "风格", "注释风格"],
|
|
183
|
+
lang: ["language", "语言"],
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
const code = getString(parsedArgs.code) || getString(parsedArgs.project_info);
|
|
187
|
+
const style = getString(parsedArgs.style) || "jsdoc";
|
|
188
|
+
const lang = getString(parsedArgs.lang) || "zh";
|
|
170
189
|
if (!code) {
|
|
171
190
|
throw new Error("缺少必填参数: code 或 project_info");
|
|
172
191
|
}
|
|
173
|
-
const style = args?.style || "jsdoc";
|
|
174
|
-
const lang = args?.lang || "zh";
|
|
175
192
|
const guide = PROMPT_TEMPLATE
|
|
176
193
|
.replace(/{code}/g, code)
|
|
177
194
|
.replace(/{style}/g, style)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
1
2
|
/**
|
|
2
3
|
* start_feature 智能编排工具
|
|
3
4
|
*
|
|
@@ -95,15 +96,29 @@ const PROMPT_TEMPLATE = `# 🚀 新功能开发编排指南
|
|
|
95
96
|
`;
|
|
96
97
|
export async function startFeature(args) {
|
|
97
98
|
try {
|
|
98
|
-
|
|
99
|
-
const
|
|
99
|
+
// 智能参数解析,支持自然语言输入
|
|
100
|
+
const parsedArgs = parseArgs(args, {
|
|
101
|
+
defaultValues: {
|
|
102
|
+
feature_name: "",
|
|
103
|
+
description: "",
|
|
104
|
+
docs_dir: "docs",
|
|
105
|
+
},
|
|
106
|
+
primaryField: "description", // 纯文本输入默认映射到 description 字段
|
|
107
|
+
fieldAliases: {
|
|
108
|
+
feature_name: ["name", "feature", "功能名", "功能名称"],
|
|
109
|
+
description: ["desc", "requirement", "描述", "需求"],
|
|
110
|
+
docs_dir: ["dir", "output", "目录", "文档目录"],
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
const featureName = getString(parsedArgs.feature_name);
|
|
114
|
+
const description = getString(parsedArgs.description);
|
|
115
|
+
const docsDir = getString(parsedArgs.docs_dir) || "docs";
|
|
100
116
|
if (!featureName) {
|
|
101
117
|
throw new Error("缺少必填参数: feature_name(功能名称)");
|
|
102
118
|
}
|
|
103
119
|
if (!description) {
|
|
104
120
|
throw new Error("缺少必填参数: description(功能描述)");
|
|
105
121
|
}
|
|
106
|
-
const docsDir = args?.docs_dir || "docs";
|
|
107
122
|
const guide = PROMPT_TEMPLATE
|
|
108
123
|
.replace(/{feature_name}/g, featureName)
|
|
109
124
|
.replace(/{description}/g, description)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
1
2
|
/**
|
|
2
3
|
* start_onboard 智能编排工具
|
|
3
4
|
*
|
|
@@ -127,8 +128,20 @@ const PROMPT_TEMPLATE = `# 📚 快速上手编排指南
|
|
|
127
128
|
`;
|
|
128
129
|
export async function startOnboard(args) {
|
|
129
130
|
try {
|
|
130
|
-
|
|
131
|
-
const
|
|
131
|
+
// 智能参数解析,支持自然语言输入
|
|
132
|
+
const parsedArgs = parseArgs(args, {
|
|
133
|
+
defaultValues: {
|
|
134
|
+
project_path: ".",
|
|
135
|
+
docs_dir: "docs",
|
|
136
|
+
},
|
|
137
|
+
primaryField: "project_path", // 纯文本输入默认映射到 project_path 字段
|
|
138
|
+
fieldAliases: {
|
|
139
|
+
project_path: ["path", "dir", "directory", "路径", "项目路径"],
|
|
140
|
+
docs_dir: ["docs", "output", "目录", "文档目录"],
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
const projectPath = getString(parsedArgs.project_path) || ".";
|
|
144
|
+
const docsDir = getString(parsedArgs.docs_dir) || "docs";
|
|
132
145
|
const guide = PROMPT_TEMPLATE
|
|
133
146
|
.replace(/{project_path}/g, projectPath)
|
|
134
147
|
.replace(/{docs_dir}/g, docsDir);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
1
2
|
/**
|
|
2
3
|
* start_refactor 智能编排工具
|
|
3
4
|
*
|
|
@@ -146,11 +147,23 @@ const PROMPT_TEMPLATE = `# ♻️ 代码重构编排指南
|
|
|
146
147
|
`;
|
|
147
148
|
export async function startRefactor(args) {
|
|
148
149
|
try {
|
|
149
|
-
|
|
150
|
+
// 智能参数解析,支持自然语言输入
|
|
151
|
+
const parsedArgs = parseArgs(args, {
|
|
152
|
+
defaultValues: {
|
|
153
|
+
code: "",
|
|
154
|
+
goal: "improve_readability",
|
|
155
|
+
},
|
|
156
|
+
primaryField: "code", // 纯文本输入默认映射到 code 字段
|
|
157
|
+
fieldAliases: {
|
|
158
|
+
code: ["source", "src", "代码", "content"],
|
|
159
|
+
goal: ["target", "objective", "目标", "重构目标"],
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
const code = getString(parsedArgs.code);
|
|
163
|
+
const goal = getString(parsedArgs.goal) || "improve_readability";
|
|
150
164
|
if (!code) {
|
|
151
165
|
throw new Error("缺少必填参数: code(需要重构的代码)");
|
|
152
166
|
}
|
|
153
|
-
const goal = args?.goal || "improve_readability";
|
|
154
167
|
const goalDesc = {
|
|
155
168
|
improve_readability: "提高可读性",
|
|
156
169
|
reduce_complexity: "降低复杂度",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
1
2
|
/**
|
|
2
3
|
* start_release 智能编排工具
|
|
3
4
|
*
|
|
@@ -127,12 +128,26 @@ const PROMPT_TEMPLATE = `# 📦 发布准备编排指南
|
|
|
127
128
|
`;
|
|
128
129
|
export async function startRelease(args) {
|
|
129
130
|
try {
|
|
130
|
-
|
|
131
|
+
// 智能参数解析,支持自然语言输入
|
|
132
|
+
const parsedArgs = parseArgs(args, {
|
|
133
|
+
defaultValues: {
|
|
134
|
+
version: "",
|
|
135
|
+
from_tag: "上个版本 tag",
|
|
136
|
+
branch: "",
|
|
137
|
+
},
|
|
138
|
+
primaryField: "version", // 纯文本输入默认映射到 version 字段
|
|
139
|
+
fieldAliases: {
|
|
140
|
+
version: ["ver", "v", "版本", "版本号"],
|
|
141
|
+
from_tag: ["from", "start", "起始", "起始版本"],
|
|
142
|
+
branch: ["分支", "发布分支"],
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
const version = getString(parsedArgs.version);
|
|
146
|
+
const fromTag = getString(parsedArgs.from_tag) || "上个版本 tag";
|
|
147
|
+
const branch = getString(parsedArgs.branch) || "release/" + version;
|
|
131
148
|
if (!version) {
|
|
132
149
|
throw new Error("缺少必填参数: version(版本号,如 v1.2.0)");
|
|
133
150
|
}
|
|
134
|
-
const fromTag = args?.from_tag || "上个版本 tag";
|
|
135
|
-
const branch = args?.branch || "release/" + version;
|
|
136
151
|
const guide = PROMPT_TEMPLATE
|
|
137
152
|
.replace(/{version}/g, version)
|
|
138
153
|
.replace(/{from_tag}/g, fromTag)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
1
2
|
/**
|
|
2
3
|
* start_review 智能编排工具
|
|
3
4
|
*
|
|
@@ -140,11 +141,23 @@ const PROMPT_TEMPLATE = `# 🔍 代码体检编排指南
|
|
|
140
141
|
`;
|
|
141
142
|
export async function startReview(args) {
|
|
142
143
|
try {
|
|
143
|
-
|
|
144
|
+
// 智能参数解析,支持自然语言输入
|
|
145
|
+
const parsedArgs = parseArgs(args, {
|
|
146
|
+
defaultValues: {
|
|
147
|
+
code: "",
|
|
148
|
+
language: "auto",
|
|
149
|
+
},
|
|
150
|
+
primaryField: "code", // 纯文本输入默认映射到 code 字段
|
|
151
|
+
fieldAliases: {
|
|
152
|
+
code: ["source", "src", "代码", "content"],
|
|
153
|
+
language: ["lang", "语言", "编程语言"],
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
const code = getString(parsedArgs.code);
|
|
157
|
+
const language = getString(parsedArgs.language) || "auto";
|
|
144
158
|
if (!code) {
|
|
145
159
|
throw new Error("缺少必填参数: code(需要审查的代码)");
|
|
146
160
|
}
|
|
147
|
-
const language = args?.language || "auto";
|
|
148
161
|
const guide = PROMPT_TEMPLATE
|
|
149
162
|
.replace(/{code}/g, code)
|
|
150
163
|
.replace(/{language}/g, language);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 通用参数解析工具
|
|
3
|
+
* 支持自然语言输入,让 AI 工具更易用
|
|
4
|
+
*
|
|
5
|
+
* 设计理念:
|
|
6
|
+
* - AI 工具应该接受自然语言,而不是强制 JSON 格式
|
|
7
|
+
* - 用户可以直接说 "帮我生成 commit 消息" 而不是 {"changes": "..."}
|
|
8
|
+
* - 智能推断用户意图,自动映射到对应参数
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* 解析工具参数,支持多种格式
|
|
12
|
+
* @param args - 原始参数(对象、字符串、自然语言等)
|
|
13
|
+
* @param config - 配置选项
|
|
14
|
+
* @returns 解析后的参数对象
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseArgs<T extends Record<string, any>>(args: any, config?: {
|
|
17
|
+
defaultValues?: Partial<T>;
|
|
18
|
+
primaryField?: string;
|
|
19
|
+
fieldAliases?: Record<string, string[]>;
|
|
20
|
+
}): T;
|
|
21
|
+
/**
|
|
22
|
+
* 验证必填参数
|
|
23
|
+
* @param args - 参数对象
|
|
24
|
+
* @param requiredFields - 必填字段列表
|
|
25
|
+
* @throws Error 如果缺少必填参数
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateRequired(args: Record<string, any>, requiredFields: string[]): void;
|
|
28
|
+
/**
|
|
29
|
+
* 安全地获取字符串参数
|
|
30
|
+
*/
|
|
31
|
+
export declare function getString(value: any, defaultValue?: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* 安全地获取数字参数
|
|
34
|
+
*/
|
|
35
|
+
export declare function getNumber(value: any, defaultValue?: number): number;
|
|
36
|
+
/**
|
|
37
|
+
* 安全地获取布尔参数
|
|
38
|
+
*/
|
|
39
|
+
export declare function getBoolean(value: any, defaultValue?: boolean): boolean;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 通用参数解析工具
|
|
3
|
+
* 支持自然语言输入,让 AI 工具更易用
|
|
4
|
+
*
|
|
5
|
+
* 设计理念:
|
|
6
|
+
* - AI 工具应该接受自然语言,而不是强制 JSON 格式
|
|
7
|
+
* - 用户可以直接说 "帮我生成 commit 消息" 而不是 {"changes": "..."}
|
|
8
|
+
* - 智能推断用户意图,自动映射到对应参数
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* 解析工具参数,支持多种格式
|
|
12
|
+
* @param args - 原始参数(对象、字符串、自然语言等)
|
|
13
|
+
* @param config - 配置选项
|
|
14
|
+
* @returns 解析后的参数对象
|
|
15
|
+
*/
|
|
16
|
+
export function parseArgs(args, config = {}) {
|
|
17
|
+
const { defaultValues = {}, primaryField, fieldAliases = {} } = config;
|
|
18
|
+
let parsedArgs = {};
|
|
19
|
+
// 1. 处理 null/undefined - 返回默认值
|
|
20
|
+
if (args === null || args === undefined) {
|
|
21
|
+
return { ...defaultValues };
|
|
22
|
+
}
|
|
23
|
+
// 2. 处理字符串类型 - 最常见的自然语言输入
|
|
24
|
+
if (typeof args === "string") {
|
|
25
|
+
const trimmed = args.trim();
|
|
26
|
+
// 2.1 尝试解析为 JSON(兼容标准格式)
|
|
27
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
28
|
+
try {
|
|
29
|
+
parsedArgs = JSON.parse(trimmed);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// JSON 解析失败,当作普通文本处理
|
|
33
|
+
parsedArgs = mapStringToArgs(trimmed, primaryField, defaultValues);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// 2.2 检查是否是 key=value 格式(包含 = 且包含 & 或 ,)
|
|
37
|
+
else if (trimmed.includes("=") && /[&,]/.test(trimmed)) {
|
|
38
|
+
parsedArgs = parseKeyValueString(trimmed);
|
|
39
|
+
}
|
|
40
|
+
// 2.3 纯自然语言 - 智能映射到主字段
|
|
41
|
+
else {
|
|
42
|
+
parsedArgs = mapStringToArgs(trimmed, primaryField, defaultValues);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// 3. 处理对象类型 - 标准 JSON 对象
|
|
46
|
+
else if (typeof args === "object" && !Array.isArray(args)) {
|
|
47
|
+
parsedArgs = normalizeObjectKeys(args, fieldAliases);
|
|
48
|
+
}
|
|
49
|
+
// 4. 其他类型
|
|
50
|
+
else {
|
|
51
|
+
parsedArgs = { value: args };
|
|
52
|
+
}
|
|
53
|
+
// 5. 合并默认值
|
|
54
|
+
return { ...defaultValues, ...parsedArgs };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 将字符串映射到参数对象
|
|
58
|
+
* 智能推断用户意图
|
|
59
|
+
*/
|
|
60
|
+
function mapStringToArgs(text, primaryField, defaultValues) {
|
|
61
|
+
// 如果指定了主字段,直接映射
|
|
62
|
+
if (primaryField) {
|
|
63
|
+
return { [primaryField]: text };
|
|
64
|
+
}
|
|
65
|
+
// 否则映射到第一个默认值字段
|
|
66
|
+
const firstKey = Object.keys(defaultValues)[0];
|
|
67
|
+
if (firstKey) {
|
|
68
|
+
return { [firstKey]: text };
|
|
69
|
+
}
|
|
70
|
+
// 兜底:使用通用字段名
|
|
71
|
+
return { input: text };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 解析 key=value 格式的字符串
|
|
75
|
+
* 例如: "changes=fix bug&type=fixed"
|
|
76
|
+
*/
|
|
77
|
+
function parseKeyValueString(str) {
|
|
78
|
+
const result = {};
|
|
79
|
+
// 支持 & 或 , 作为分隔符
|
|
80
|
+
const pairs = str.split(/[&,]/);
|
|
81
|
+
for (const pair of pairs) {
|
|
82
|
+
const [key, ...valueParts] = pair.split("=");
|
|
83
|
+
if (key) {
|
|
84
|
+
const value = valueParts.join("=").trim();
|
|
85
|
+
result[key.trim()] = value || "";
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 规范化对象的键名,支持别名映射
|
|
92
|
+
* 例如: { msg: "..." } -> { message: "..." }
|
|
93
|
+
*/
|
|
94
|
+
function normalizeObjectKeys(obj, aliases) {
|
|
95
|
+
const result = { ...obj };
|
|
96
|
+
// 遍历别名映射,将别名转换为标准字段名
|
|
97
|
+
for (const [standardKey, aliasList] of Object.entries(aliases)) {
|
|
98
|
+
for (const alias of aliasList) {
|
|
99
|
+
if (obj[alias] !== undefined && obj[standardKey] === undefined) {
|
|
100
|
+
result[standardKey] = obj[alias];
|
|
101
|
+
delete result[alias];
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 验证必填参数
|
|
110
|
+
* @param args - 参数对象
|
|
111
|
+
* @param requiredFields - 必填字段列表
|
|
112
|
+
* @throws Error 如果缺少必填参数
|
|
113
|
+
*/
|
|
114
|
+
export function validateRequired(args, requiredFields) {
|
|
115
|
+
const missing = requiredFields.filter((field) => args[field] === undefined || args[field] === null || args[field] === "");
|
|
116
|
+
if (missing.length > 0) {
|
|
117
|
+
throw new Error(`缺少必填参数: ${missing.join(", ")}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 安全地获取字符串参数
|
|
122
|
+
*/
|
|
123
|
+
export function getString(value, defaultValue = "") {
|
|
124
|
+
if (value === null || value === undefined) {
|
|
125
|
+
return defaultValue;
|
|
126
|
+
}
|
|
127
|
+
return String(value);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 安全地获取数字参数
|
|
131
|
+
*/
|
|
132
|
+
export function getNumber(value, defaultValue = 0) {
|
|
133
|
+
if (value === null || value === undefined) {
|
|
134
|
+
return defaultValue;
|
|
135
|
+
}
|
|
136
|
+
const num = Number(value);
|
|
137
|
+
return isNaN(num) ? defaultValue : num;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 安全地获取布尔参数
|
|
141
|
+
*/
|
|
142
|
+
export function getBoolean(value, defaultValue = false) {
|
|
143
|
+
if (value === null || value === undefined) {
|
|
144
|
+
return defaultValue;
|
|
145
|
+
}
|
|
146
|
+
if (typeof value === "boolean") {
|
|
147
|
+
return value;
|
|
148
|
+
}
|
|
149
|
+
if (typeof value === "string") {
|
|
150
|
+
return value.toLowerCase() === "true" || value === "1";
|
|
151
|
+
}
|
|
152
|
+
return Boolean(value);
|
|
153
|
+
}
|
package/docs/BEST_PRACTICES.md
CHANGED
|
@@ -112,6 +112,15 @@ fix_bug
|
|
|
112
112
|
# 工作量估算
|
|
113
113
|
estimate
|
|
114
114
|
然后描述任务:"实现用户登录功能"
|
|
115
|
+
|
|
116
|
+
# 生成 Agent Skills 文档
|
|
117
|
+
gen_skill
|
|
118
|
+
|
|
119
|
+
# 生成单个工具的技能文档
|
|
120
|
+
gen_skill --tool_name code_review
|
|
121
|
+
|
|
122
|
+
# 生成分析类工具的技能文档
|
|
123
|
+
gen_skill --scope analysis
|
|
115
124
|
```
|
|
116
125
|
|
|
117
126
|
#### 项目管理工具
|