mcp-probe-kit 1.8.1 → 1.10.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/build/index.js +123 -578
- 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 +24 -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/HOW_TO_TRIGGER.html +56 -0
- package/docs/MCP-Probe-Kit-/344/275/277/347/224/250/346/211/213/345/206/214.html +449 -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/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/HOW_TO_TRIGGER.html
CHANGED
|
@@ -179,6 +179,62 @@ table th { background-color: #ddd; font-weight: bold; }
|
|
|
179
179
|
<p><strong>2. 使用上下文:</strong> "这个方法性能不好,帮我优化" - AI会调用 perf 分析,然后 refactor</p>
|
|
180
180
|
<p><strong>3. 明确范围:</strong> "审查所有API文件" - code_review @api/*.ts</p>
|
|
181
181
|
|
|
182
|
+
<div class="divider"></div>
|
|
183
|
+
|
|
184
|
+
<h2>OpenCode / oh-my-opencode 使用</h2>
|
|
185
|
+
|
|
186
|
+
<h3>配置 MCP</h3>
|
|
187
|
+
<p>在 <code>~/.opencode/mcp.json</code> 中添加:</p>
|
|
188
|
+
<p><code>{ "mcpServers": { "mcp-probe-kit": { "command": "npx", "args": ["mcp-probe-kit@latest"] } } }</code></p>
|
|
189
|
+
|
|
190
|
+
<h3>命令行调用</h3>
|
|
191
|
+
<p><strong>/tool</strong> - 列出所有可用工具</p>
|
|
192
|
+
<p><strong>/tool code_review</strong> - 调用指定工具</p>
|
|
193
|
+
<p><strong>/mcp</strong> - 查看 MCP 服务器状态</p>
|
|
194
|
+
|
|
195
|
+
<h3>对话式调用(推荐)</h3>
|
|
196
|
+
<p>直接在对话中使用关键词,AI 会自动调用对应工具:</p>
|
|
197
|
+
<p>"审查这段代码" → code_review</p>
|
|
198
|
+
<p>"debug 这个错误" → debug</p>
|
|
199
|
+
<p>"生成测试" → gentest</p>
|
|
200
|
+
<p>"start_feature 用户登录" → start_feature</p>
|
|
201
|
+
|
|
202
|
+
<h3>oh-my-opencode 高级功能</h3>
|
|
203
|
+
<p><strong>关键词检测器</strong> - 自动检测提示中的关键词并激活专门模式:</p>
|
|
204
|
+
<table>
|
|
205
|
+
<thead>
|
|
206
|
+
<tr><th>关键词</th><th>模式</th><th>说明</th></tr>
|
|
207
|
+
</thead>
|
|
208
|
+
<tbody>
|
|
209
|
+
<tr><td><code>ultrawork</code> / <code>ulw</code></td><td>最大性能模式</td><td>并行智能体编排</td></tr>
|
|
210
|
+
<tr><td><code>search</code> / <code>find</code></td><td>搜索模式</td><td>并行 explore + librarian 智能体</td></tr>
|
|
211
|
+
<tr><td><code>analyze</code> / <code>investigate</code></td><td>深度分析模式</td><td>多阶段专家咨询</td></tr>
|
|
212
|
+
</tbody>
|
|
213
|
+
</table>
|
|
214
|
+
|
|
215
|
+
<p><strong>Ralph Loop</strong> - 自引用开发循环,持续运行直到任务完成:</p>
|
|
216
|
+
<p>使用 <code>/ralph-loop "构建一个 REST API"</code> 开始</p>
|
|
217
|
+
<p>结束条件:检测到 <promise>DONE</promise>、达到最大迭代次数(默认100)或 <code>/cancel-ralph</code></p>
|
|
218
|
+
<p>配置:<code>oh-my-opencode.json</code> 中 <code>{ "ralph_loop": { "enabled": true, "default_max_iterations": 100 } }</code></p>
|
|
219
|
+
|
|
220
|
+
<h3>常用命令示例</h3>
|
|
221
|
+
<table>
|
|
222
|
+
<thead>
|
|
223
|
+
<tr><th>命令</th><th>说明</th></tr>
|
|
224
|
+
</thead>
|
|
225
|
+
<tbody>
|
|
226
|
+
<tr><td><code>/tool code_review</code></td><td>代码审查</td></tr>
|
|
227
|
+
<tr><td><code>/tool debug</code></td><td>调试分析</td></tr>
|
|
228
|
+
<tr><td><code>/tool gentest</code></td><td>生成测试</td></tr>
|
|
229
|
+
<tr><td><code>/tool gencommit</code></td><td>生成提交信息</td></tr>
|
|
230
|
+
<tr><td><code>/tool start_feature</code></td><td>新功能开发编排</td></tr>
|
|
231
|
+
<tr><td><code>/tool start_review</code></td><td>代码体检编排</td></tr>
|
|
232
|
+
<tr><td><code>/tool start_bugfix</code></td><td>Bug修复编排</td></tr>
|
|
233
|
+
<tr><td><code>ulw 重构这个模块</code></td><td>最大性能模式</td></tr>
|
|
234
|
+
<tr><td><code>/ralph-loop "任务描述"</code></td><td>自引用循环</td></tr>
|
|
235
|
+
</tbody>
|
|
236
|
+
</table>
|
|
237
|
+
|
|
182
238
|
<div style="text-align:center;margin-top:0.4cm;padding:0.2cm;border-top:1px solid #000;">
|
|
183
239
|
<p style="font-size:10pt;"><strong>MCP Probe Kit v1.8.1 - AI 开发增强工具集(40个工具)</strong></p>
|
|
184
240
|
</div>
|