mcp-probe-kit 2.1.1 → 2.2.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/tools/__tests__/start_ui.integration.test.js +8 -5
- package/build/tools/__tests__/start_ui.unit.test.js +2 -2
- package/build/tools/init_project_context.js +379 -379
- package/build/tools/start_ui.js +151 -16
- package/docs/CNAME +1 -0
- package/docs/pages/all-tools.html +56 -4
- package/docs/styles/page.css +49 -0
- package/package.json +4 -4
|
@@ -16,12 +16,15 @@ describe('start_ui 集成测试', () => {
|
|
|
16
16
|
const text = result.content[0].text || '';
|
|
17
17
|
// 1. 应该包含快速开始部分
|
|
18
18
|
expect(text).toMatch(/^#\s+快速开始/m);
|
|
19
|
-
// 2. 应该包含
|
|
20
|
-
expect(text).toMatch(/步骤 1
|
|
21
|
-
expect(text).toMatch(/步骤 2
|
|
22
|
-
expect(text).toMatch(/步骤 3
|
|
23
|
-
expect(text).toMatch(/步骤 4
|
|
19
|
+
// 2. 应该包含 6 个步骤(新增了项目上下文和更新索引)
|
|
20
|
+
expect(text).toMatch(/步骤 1.*生成项目上下文/);
|
|
21
|
+
expect(text).toMatch(/步骤 2.*生成设计系统/);
|
|
22
|
+
expect(text).toMatch(/步骤 3.*生成组件目录/);
|
|
23
|
+
expect(text).toMatch(/步骤 4.*搜索.*模板/);
|
|
24
|
+
expect(text).toMatch(/步骤 5.*渲染.*代码/);
|
|
25
|
+
expect(text).toMatch(/步骤 6.*更新项目上下文/);
|
|
24
26
|
// 3. 每个步骤应该包含工具名称
|
|
27
|
+
expect(text).toMatch(/init_project_context/);
|
|
25
28
|
expect(text).toMatch(/ui_design_system/);
|
|
26
29
|
expect(text).toMatch(/init_component_catalog/);
|
|
27
30
|
expect(text).toMatch(/ui_search/);
|
|
@@ -35,9 +35,9 @@ describe('start_ui 单元测试', () => {
|
|
|
35
35
|
});
|
|
36
36
|
});
|
|
37
37
|
describe('参数解析', () => {
|
|
38
|
-
test('默认 framework 为
|
|
38
|
+
test('默认 framework 为 html(最通用)', async () => {
|
|
39
39
|
const result = await startUi({ description: '测试' });
|
|
40
|
-
expect(result.content[0].text).toMatch(/
|
|
40
|
+
expect(result.content[0].text).toMatch(/html/i);
|
|
41
41
|
});
|
|
42
42
|
test('支持 vue framework', async () => {
|
|
43
43
|
const result = await startUi({
|
|
@@ -168,112 +168,112 @@ async function generateProjectContext(docsDir, projectRoot = process.cwd()) {
|
|
|
168
168
|
*/
|
|
169
169
|
function generateGuideText(detection, projectInfo, docs, docsDir) {
|
|
170
170
|
const timestamp = new Date().toISOString();
|
|
171
|
-
return `# 项目上下文文档生成指导
|
|
172
|
-
|
|
173
|
-
## 📊 项目信息
|
|
174
|
-
|
|
175
|
-
- **项目名称**: ${projectInfo.name}
|
|
176
|
-
- **版本**: ${projectInfo.version}
|
|
177
|
-
- **语言**: ${detection.language}
|
|
178
|
-
- **框架**: ${detection.framework || '未检测到'}
|
|
179
|
-
- **类型**: ${detection.category}
|
|
180
|
-
- **置信度**: ${detection.confidence}%
|
|
181
|
-
|
|
182
|
-
## 📋 需要生成的文档
|
|
183
|
-
|
|
184
|
-
请按照以下结构生成 **${docs.length + 1}** 个文档:
|
|
185
|
-
|
|
186
|
-
\`\`\`
|
|
187
|
-
${docsDir}/
|
|
188
|
-
├── project-context.md # 索引文件(必须首先生成)
|
|
189
|
-
└── project-context/ # 分类文档目录
|
|
190
|
-
${docs.map(doc => ` ├── ${doc.file.padEnd(28)} # ${doc.title}`).join('\n')}
|
|
191
|
-
\`\`\`
|
|
192
|
-
|
|
193
|
-
---
|
|
194
|
-
|
|
195
|
-
## 🎯 生成步骤
|
|
196
|
-
|
|
197
|
-
### 第一步:生成索引文件(最重要!)
|
|
198
|
-
|
|
199
|
-
**文件**: \`${docsDir}/project-context.md\`
|
|
200
|
-
|
|
201
|
-
这是项目上下文的**灵魂**,必须首先生成。它是所有文档的入口和导航中心。
|
|
202
|
-
|
|
203
|
-
**模板**:
|
|
204
|
-
|
|
205
|
-
\`\`\`markdown
|
|
206
|
-
# ${projectInfo.name} - 项目上下文
|
|
207
|
-
|
|
208
|
-
> 本文档是项目上下文的索引文件,提供项目概览和文档导航。
|
|
209
|
-
|
|
210
|
-
## 📊 项目概览
|
|
211
|
-
|
|
212
|
-
| 属性 | 值 |
|
|
213
|
-
|------|-----|
|
|
214
|
-
| 项目名称 | ${projectInfo.name} |
|
|
215
|
-
| 版本 | ${projectInfo.version} |
|
|
216
|
-
| 语言 | ${detection.language} |
|
|
217
|
-
| 框架 | ${detection.framework || '无'} |
|
|
218
|
-
| 类型 | ${detection.category} |
|
|
219
|
-
| 描述 | ${projectInfo.description || '待补充'} |
|
|
220
|
-
|
|
221
|
-
## 📚 文档导航
|
|
222
|
-
|
|
223
|
-
${docs.map(doc => `### [${doc.title}](./project-context/${doc.file})
|
|
224
|
-
${doc.purpose}
|
|
225
|
-
`).join('\n')}
|
|
226
|
-
|
|
227
|
-
## 🚀 快速开始
|
|
228
|
-
|
|
229
|
-
1. 阅读 [技术栈](./project-context/tech-stack.md) 了解项目使用的技术
|
|
230
|
-
2. 阅读 [架构设计](./project-context/architecture.md) 了解项目结构
|
|
231
|
-
3. 根据需要查看具体的操作指南
|
|
232
|
-
|
|
233
|
-
## 💡 开发时查看对应文档
|
|
234
|
-
|
|
235
|
-
根据你要做的事情,查看对应的文档:
|
|
236
|
-
|
|
237
|
-
${generateDevGuide(docs)}
|
|
238
|
-
|
|
239
|
-
---
|
|
240
|
-
*生成时间: ${timestamp}*
|
|
241
|
-
*生成工具: MCP Probe Kit - init_project_context v2.1*
|
|
242
|
-
\`\`\`
|
|
243
|
-
|
|
244
|
-
**使用 fsWrite 创建此文件**
|
|
245
|
-
|
|
246
|
-
---
|
|
247
|
-
|
|
248
|
-
### 第二步:生成分类文档
|
|
249
|
-
|
|
250
|
-
${docs.map((doc, index) => generateDocTemplate(doc, index + 2, projectInfo, detection, docsDir)).join('\n\n---\n\n')}
|
|
251
|
-
|
|
252
|
-
---
|
|
253
|
-
|
|
254
|
-
## ✅ 完成标准
|
|
255
|
-
|
|
256
|
-
请确认:
|
|
257
|
-
|
|
258
|
-
- [ ] 已使用 fsWrite 创建 **${docs.length + 1}** 个文件
|
|
259
|
-
- [ ] 索引文件 \`project-context.md\` 已创建(最重要!)
|
|
260
|
-
- [ ] 所有文档都包含**真实的文件路径**(不是 [xxx] 占位符)
|
|
261
|
-
- [ ] 所有文档都包含**实际的代码示例**(从项目中复制)
|
|
262
|
-
- [ ] 所有步骤都具体可操作
|
|
263
|
-
- [ ] 所有示例都来自项目实际代码
|
|
264
|
-
|
|
265
|
-
---
|
|
266
|
-
|
|
267
|
-
**重要提示**:
|
|
268
|
-
1. **必须从项目中提取真实示例** - 不要编造代码
|
|
269
|
-
2. **路径必须真实存在** - 检查文件是否存在
|
|
270
|
-
3. **步骤必须具体** - 不要写"根据需要修改"这种模糊的话
|
|
271
|
-
4. **代码必须完整** - 不要用 ... 省略
|
|
272
|
-
|
|
273
|
-
---
|
|
274
|
-
|
|
275
|
-
*工具: MCP Probe Kit - init_project_context*
|
|
276
|
-
*版本: 2.1.0*
|
|
171
|
+
return `# 项目上下文文档生成指导
|
|
172
|
+
|
|
173
|
+
## 📊 项目信息
|
|
174
|
+
|
|
175
|
+
- **项目名称**: ${projectInfo.name}
|
|
176
|
+
- **版本**: ${projectInfo.version}
|
|
177
|
+
- **语言**: ${detection.language}
|
|
178
|
+
- **框架**: ${detection.framework || '未检测到'}
|
|
179
|
+
- **类型**: ${detection.category}
|
|
180
|
+
- **置信度**: ${detection.confidence}%
|
|
181
|
+
|
|
182
|
+
## 📋 需要生成的文档
|
|
183
|
+
|
|
184
|
+
请按照以下结构生成 **${docs.length + 1}** 个文档:
|
|
185
|
+
|
|
186
|
+
\`\`\`
|
|
187
|
+
${docsDir}/
|
|
188
|
+
├── project-context.md # 索引文件(必须首先生成)
|
|
189
|
+
└── project-context/ # 分类文档目录
|
|
190
|
+
${docs.map(doc => ` ├── ${doc.file.padEnd(28)} # ${doc.title}`).join('\n')}
|
|
191
|
+
\`\`\`
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## 🎯 生成步骤
|
|
196
|
+
|
|
197
|
+
### 第一步:生成索引文件(最重要!)
|
|
198
|
+
|
|
199
|
+
**文件**: \`${docsDir}/project-context.md\`
|
|
200
|
+
|
|
201
|
+
这是项目上下文的**灵魂**,必须首先生成。它是所有文档的入口和导航中心。
|
|
202
|
+
|
|
203
|
+
**模板**:
|
|
204
|
+
|
|
205
|
+
\`\`\`markdown
|
|
206
|
+
# ${projectInfo.name} - 项目上下文
|
|
207
|
+
|
|
208
|
+
> 本文档是项目上下文的索引文件,提供项目概览和文档导航。
|
|
209
|
+
|
|
210
|
+
## 📊 项目概览
|
|
211
|
+
|
|
212
|
+
| 属性 | 值 |
|
|
213
|
+
|------|-----|
|
|
214
|
+
| 项目名称 | ${projectInfo.name} |
|
|
215
|
+
| 版本 | ${projectInfo.version} |
|
|
216
|
+
| 语言 | ${detection.language} |
|
|
217
|
+
| 框架 | ${detection.framework || '无'} |
|
|
218
|
+
| 类型 | ${detection.category} |
|
|
219
|
+
| 描述 | ${projectInfo.description || '待补充'} |
|
|
220
|
+
|
|
221
|
+
## 📚 文档导航
|
|
222
|
+
|
|
223
|
+
${docs.map(doc => `### [${doc.title}](./project-context/${doc.file})
|
|
224
|
+
${doc.purpose}
|
|
225
|
+
`).join('\n')}
|
|
226
|
+
|
|
227
|
+
## 🚀 快速开始
|
|
228
|
+
|
|
229
|
+
1. 阅读 [技术栈](./project-context/tech-stack.md) 了解项目使用的技术
|
|
230
|
+
2. 阅读 [架构设计](./project-context/architecture.md) 了解项目结构
|
|
231
|
+
3. 根据需要查看具体的操作指南
|
|
232
|
+
|
|
233
|
+
## 💡 开发时查看对应文档
|
|
234
|
+
|
|
235
|
+
根据你要做的事情,查看对应的文档:
|
|
236
|
+
|
|
237
|
+
${generateDevGuide(docs)}
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
*生成时间: ${timestamp}*
|
|
241
|
+
*生成工具: MCP Probe Kit - init_project_context v2.1*
|
|
242
|
+
\`\`\`
|
|
243
|
+
|
|
244
|
+
**使用 fsWrite 创建此文件**
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
### 第二步:生成分类文档
|
|
249
|
+
|
|
250
|
+
${docs.map((doc, index) => generateDocTemplate(doc, index + 2, projectInfo, detection, docsDir)).join('\n\n---\n\n')}
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## ✅ 完成标准
|
|
255
|
+
|
|
256
|
+
请确认:
|
|
257
|
+
|
|
258
|
+
- [ ] 已使用 fsWrite 创建 **${docs.length + 1}** 个文件
|
|
259
|
+
- [ ] 索引文件 \`project-context.md\` 已创建(最重要!)
|
|
260
|
+
- [ ] 所有文档都包含**真实的文件路径**(不是 [xxx] 占位符)
|
|
261
|
+
- [ ] 所有文档都包含**实际的代码示例**(从项目中复制)
|
|
262
|
+
- [ ] 所有步骤都具体可操作
|
|
263
|
+
- [ ] 所有示例都来自项目实际代码
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
**重要提示**:
|
|
268
|
+
1. **必须从项目中提取真实示例** - 不要编造代码
|
|
269
|
+
2. **路径必须真实存在** - 检查文件是否存在
|
|
270
|
+
3. **步骤必须具体** - 不要写"根据需要修改"这种模糊的话
|
|
271
|
+
4. **代码必须完整** - 不要用 ... 省略
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
*工具: MCP Probe Kit - init_project_context*
|
|
276
|
+
*版本: 2.1.0*
|
|
277
277
|
`;
|
|
278
278
|
}
|
|
279
279
|
/**
|
|
@@ -283,286 +283,286 @@ function generateDocTemplate(doc, step, projectInfo, detection, docsDir) {
|
|
|
283
283
|
const timestamp = new Date().toISOString();
|
|
284
284
|
// 根据文档类型生成不同的模板
|
|
285
285
|
const templates = {
|
|
286
|
-
'tech-stack.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
287
|
-
|
|
288
|
-
**用途**: ${doc.purpose}
|
|
289
|
-
|
|
290
|
-
**模板**:
|
|
291
|
-
|
|
292
|
-
\`\`\`markdown
|
|
293
|
-
# 技术栈
|
|
294
|
-
|
|
295
|
-
> 本文档描述 ${projectInfo.name} 的技术栈信息。
|
|
296
|
-
|
|
297
|
-
## 基本信息
|
|
298
|
-
|
|
299
|
-
| 属性 | 值 |
|
|
300
|
-
|------|-----|
|
|
301
|
-
| 项目名称 | ${projectInfo.name} |
|
|
302
|
-
| 版本 | ${projectInfo.version} |
|
|
303
|
-
| 语言 | ${detection.language} |
|
|
304
|
-
| 框架 | ${detection.framework || '无'} |
|
|
305
|
-
|
|
306
|
-
## 技术栈详情
|
|
307
|
-
|
|
308
|
-
### 核心技术
|
|
309
|
-
|
|
310
|
-
| 类别 | 技术 | 版本 |
|
|
311
|
-
|------|------|------|
|
|
312
|
-
| 语言 | [从 package.json 或配置文件中提取] | [版本] |
|
|
313
|
-
| 运行时 | [Node.js/Python/Java 等] | [版本] |
|
|
314
|
-
| 框架 | [主要框架] | [版本] |
|
|
315
|
-
|
|
316
|
-
### 开发工具
|
|
317
|
-
|
|
318
|
-
| 类别 | 工具 | 用途 |
|
|
319
|
-
|------|------|------|
|
|
320
|
-
| 构建工具 | [如 TypeScript, Webpack] | [用途] |
|
|
321
|
-
| 测试框架 | [如 Jest, Vitest] | [用途] |
|
|
322
|
-
| 代码检查 | [如 ESLint, Prettier] | [用途] |
|
|
323
|
-
|
|
324
|
-
### 主要依赖
|
|
325
|
-
|
|
326
|
-
列出 5-10 个最重要的依赖包及其用途。
|
|
327
|
-
|
|
328
|
-
---
|
|
329
|
-
*返回索引: [../project-context.md](../project-context.md)*
|
|
330
|
-
\`\`\`
|
|
331
|
-
|
|
332
|
-
**填写指导**:
|
|
333
|
-
1. 读取 \`package.json\` 获取依赖信息
|
|
334
|
-
2. 读取 \`tsconfig.json\` 或其他配置文件
|
|
335
|
-
3. 列出最重要的 5-10 个依赖包
|
|
286
|
+
'tech-stack.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
287
|
+
|
|
288
|
+
**用途**: ${doc.purpose}
|
|
289
|
+
|
|
290
|
+
**模板**:
|
|
291
|
+
|
|
292
|
+
\`\`\`markdown
|
|
293
|
+
# 技术栈
|
|
294
|
+
|
|
295
|
+
> 本文档描述 ${projectInfo.name} 的技术栈信息。
|
|
296
|
+
|
|
297
|
+
## 基本信息
|
|
298
|
+
|
|
299
|
+
| 属性 | 值 |
|
|
300
|
+
|------|-----|
|
|
301
|
+
| 项目名称 | ${projectInfo.name} |
|
|
302
|
+
| 版本 | ${projectInfo.version} |
|
|
303
|
+
| 语言 | ${detection.language} |
|
|
304
|
+
| 框架 | ${detection.framework || '无'} |
|
|
305
|
+
|
|
306
|
+
## 技术栈详情
|
|
307
|
+
|
|
308
|
+
### 核心技术
|
|
309
|
+
|
|
310
|
+
| 类别 | 技术 | 版本 |
|
|
311
|
+
|------|------|------|
|
|
312
|
+
| 语言 | [从 package.json 或配置文件中提取] | [版本] |
|
|
313
|
+
| 运行时 | [Node.js/Python/Java 等] | [版本] |
|
|
314
|
+
| 框架 | [主要框架] | [版本] |
|
|
315
|
+
|
|
316
|
+
### 开发工具
|
|
317
|
+
|
|
318
|
+
| 类别 | 工具 | 用途 |
|
|
319
|
+
|------|------|------|
|
|
320
|
+
| 构建工具 | [如 TypeScript, Webpack] | [用途] |
|
|
321
|
+
| 测试框架 | [如 Jest, Vitest] | [用途] |
|
|
322
|
+
| 代码检查 | [如 ESLint, Prettier] | [用途] |
|
|
323
|
+
|
|
324
|
+
### 主要依赖
|
|
325
|
+
|
|
326
|
+
列出 5-10 个最重要的依赖包及其用途。
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
*返回索引: [../project-context.md](../project-context.md)*
|
|
330
|
+
\`\`\`
|
|
331
|
+
|
|
332
|
+
**填写指导**:
|
|
333
|
+
1. 读取 \`package.json\` 获取依赖信息
|
|
334
|
+
2. 读取 \`tsconfig.json\` 或其他配置文件
|
|
335
|
+
3. 列出最重要的 5-10 个依赖包
|
|
336
336
|
4. 说明每个依赖的用途`,
|
|
337
|
-
'architecture.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
338
|
-
|
|
339
|
-
**用途**: ${doc.purpose}
|
|
340
|
-
|
|
341
|
-
**模板**:
|
|
342
|
-
|
|
343
|
-
\`\`\`markdown
|
|
344
|
-
# 架构设计
|
|
345
|
-
|
|
346
|
-
> 本文档描述 ${projectInfo.name} 的架构和项目结构。
|
|
347
|
-
|
|
348
|
-
## 项目结构
|
|
349
|
-
|
|
350
|
-
\`\`\`
|
|
351
|
-
[使用 listDirectory 工具生成目录树,深度 2-3 层]
|
|
352
|
-
\`\`\`
|
|
353
|
-
|
|
354
|
-
## 主要目录说明
|
|
355
|
-
|
|
356
|
-
| 目录 | 用途 |
|
|
357
|
-
|------|------|
|
|
358
|
-
| [目录名] | [从实际项目中分析得出] |
|
|
359
|
-
|
|
360
|
-
## 入口文件
|
|
361
|
-
|
|
362
|
-
- **主入口**: \`[实际的入口文件路径,如 src/index.ts]\`
|
|
363
|
-
- **配置文件**: \`[如 package.json, tsconfig.json]\`
|
|
364
|
-
|
|
365
|
-
## 架构模式
|
|
366
|
-
|
|
367
|
-
- **项目类型**: ${detection.category}
|
|
368
|
-
- **设计模式**: [从代码中识别,如 MVC, 工具集合, 插件系统等]
|
|
369
|
-
- **模块划分**: [说明主要模块及其职责]
|
|
370
|
-
|
|
371
|
-
## 核心模块
|
|
372
|
-
|
|
373
|
-
### [模块名称]
|
|
374
|
-
- **位置**: \`[实际路径]\`
|
|
375
|
-
- **职责**: [模块功能]
|
|
376
|
-
- **主要文件**: [列出 2-3 个关键文件]
|
|
377
|
-
|
|
378
|
-
---
|
|
379
|
-
*返回索引: [../project-context.md](../project-context.md)*
|
|
380
|
-
\`\`\`
|
|
381
|
-
|
|
382
|
-
**填写指导**:
|
|
383
|
-
1. 使用 listDirectory 工具查看项目结构
|
|
384
|
-
2. 读取主要目录下的文件
|
|
385
|
-
3. 识别项目的组织方式
|
|
337
|
+
'architecture.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
338
|
+
|
|
339
|
+
**用途**: ${doc.purpose}
|
|
340
|
+
|
|
341
|
+
**模板**:
|
|
342
|
+
|
|
343
|
+
\`\`\`markdown
|
|
344
|
+
# 架构设计
|
|
345
|
+
|
|
346
|
+
> 本文档描述 ${projectInfo.name} 的架构和项目结构。
|
|
347
|
+
|
|
348
|
+
## 项目结构
|
|
349
|
+
|
|
350
|
+
\`\`\`
|
|
351
|
+
[使用 listDirectory 工具生成目录树,深度 2-3 层]
|
|
352
|
+
\`\`\`
|
|
353
|
+
|
|
354
|
+
## 主要目录说明
|
|
355
|
+
|
|
356
|
+
| 目录 | 用途 |
|
|
357
|
+
|------|------|
|
|
358
|
+
| [目录名] | [从实际项目中分析得出] |
|
|
359
|
+
|
|
360
|
+
## 入口文件
|
|
361
|
+
|
|
362
|
+
- **主入口**: \`[实际的入口文件路径,如 src/index.ts]\`
|
|
363
|
+
- **配置文件**: \`[如 package.json, tsconfig.json]\`
|
|
364
|
+
|
|
365
|
+
## 架构模式
|
|
366
|
+
|
|
367
|
+
- **项目类型**: ${detection.category}
|
|
368
|
+
- **设计模式**: [从代码中识别,如 MVC, 工具集合, 插件系统等]
|
|
369
|
+
- **模块划分**: [说明主要模块及其职责]
|
|
370
|
+
|
|
371
|
+
## 核心模块
|
|
372
|
+
|
|
373
|
+
### [模块名称]
|
|
374
|
+
- **位置**: \`[实际路径]\`
|
|
375
|
+
- **职责**: [模块功能]
|
|
376
|
+
- **主要文件**: [列出 2-3 个关键文件]
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
*返回索引: [../project-context.md](../project-context.md)*
|
|
380
|
+
\`\`\`
|
|
381
|
+
|
|
382
|
+
**填写指导**:
|
|
383
|
+
1. 使用 listDirectory 工具查看项目结构
|
|
384
|
+
2. 读取主要目录下的文件
|
|
385
|
+
3. 识别项目的组织方式
|
|
386
386
|
4. 找出核心模块和关键文件`,
|
|
387
|
-
'how-to-add-api.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
388
|
-
|
|
389
|
-
**用途**: ${doc.purpose}
|
|
390
|
-
|
|
391
|
-
**模板**:
|
|
392
|
-
|
|
393
|
-
\`\`\`markdown
|
|
394
|
-
# 如何添加新接口
|
|
395
|
-
|
|
396
|
-
> 本文档指导如何在 ${projectInfo.name} 中添加新的 API 接口。
|
|
397
|
-
|
|
398
|
-
## 第一步:找到路由定义位置
|
|
399
|
-
|
|
400
|
-
项目的路由定义在:\`[实际路径,如 src/routes/, src/api/]\`
|
|
401
|
-
|
|
402
|
-
**现有示例**(从项目中找一个真实的路由文件):
|
|
403
|
-
\`\`\`[语言]
|
|
404
|
-
[复制一个实际的路由定义代码]
|
|
405
|
-
\`\`\`
|
|
406
|
-
|
|
407
|
-
## 第二步:创建新路由
|
|
408
|
-
|
|
409
|
-
1. 在 \`[路径]\` 目录下创建文件 \`[命名规范].ts\`
|
|
410
|
-
2. 定义路由:
|
|
411
|
-
|
|
412
|
-
\`\`\`[语言]
|
|
413
|
-
[基于项目实际代码风格的示例]
|
|
414
|
-
\`\`\`
|
|
415
|
-
|
|
416
|
-
## 第三步:实现业务逻辑
|
|
417
|
-
|
|
418
|
-
业务逻辑通常在:\`[实际路径,如 src/controllers/, src/services/]\`
|
|
419
|
-
|
|
420
|
-
**现有示例**:
|
|
421
|
-
\`\`\`[语言]
|
|
422
|
-
[复制一个实际的 controller/service 代码]
|
|
423
|
-
\`\`\`
|
|
424
|
-
|
|
425
|
-
## 第四步:数据验证
|
|
426
|
-
|
|
427
|
-
项目使用 [验证库名称] 进行数据验证。
|
|
428
|
-
|
|
429
|
-
**示例**:
|
|
430
|
-
\`\`\`[语言]
|
|
431
|
-
[从项目中找一个验证示例]
|
|
432
|
-
\`\`\`
|
|
433
|
-
|
|
434
|
-
## 第五步:注册路由
|
|
435
|
-
|
|
436
|
-
在 \`[实际文件路径]\` 中注册新路由:
|
|
437
|
-
|
|
438
|
-
\`\`\`[语言]
|
|
439
|
-
[实际的路由注册代码]
|
|
440
|
-
\`\`\`
|
|
441
|
-
|
|
442
|
-
## 第六步:测试
|
|
443
|
-
|
|
444
|
-
运行测试命令:\`[实际命令,如 npm test]\`
|
|
445
|
-
|
|
446
|
-
---
|
|
447
|
-
*返回索引: [../project-context.md](../project-context.md)*
|
|
448
|
-
\`\`\`
|
|
449
|
-
|
|
450
|
-
**填写指导**:
|
|
451
|
-
1. 搜索 src/routes, src/api, src/controllers 等目录
|
|
452
|
-
2. 找 2-3 个现有的 API 接口作为参考
|
|
453
|
-
3. 复制实际的代码示例(不要编造)
|
|
387
|
+
'how-to-add-api.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
388
|
+
|
|
389
|
+
**用途**: ${doc.purpose}
|
|
390
|
+
|
|
391
|
+
**模板**:
|
|
392
|
+
|
|
393
|
+
\`\`\`markdown
|
|
394
|
+
# 如何添加新接口
|
|
395
|
+
|
|
396
|
+
> 本文档指导如何在 ${projectInfo.name} 中添加新的 API 接口。
|
|
397
|
+
|
|
398
|
+
## 第一步:找到路由定义位置
|
|
399
|
+
|
|
400
|
+
项目的路由定义在:\`[实际路径,如 src/routes/, src/api/]\`
|
|
401
|
+
|
|
402
|
+
**现有示例**(从项目中找一个真实的路由文件):
|
|
403
|
+
\`\`\`[语言]
|
|
404
|
+
[复制一个实际的路由定义代码]
|
|
405
|
+
\`\`\`
|
|
406
|
+
|
|
407
|
+
## 第二步:创建新路由
|
|
408
|
+
|
|
409
|
+
1. 在 \`[路径]\` 目录下创建文件 \`[命名规范].ts\`
|
|
410
|
+
2. 定义路由:
|
|
411
|
+
|
|
412
|
+
\`\`\`[语言]
|
|
413
|
+
[基于项目实际代码风格的示例]
|
|
414
|
+
\`\`\`
|
|
415
|
+
|
|
416
|
+
## 第三步:实现业务逻辑
|
|
417
|
+
|
|
418
|
+
业务逻辑通常在:\`[实际路径,如 src/controllers/, src/services/]\`
|
|
419
|
+
|
|
420
|
+
**现有示例**:
|
|
421
|
+
\`\`\`[语言]
|
|
422
|
+
[复制一个实际的 controller/service 代码]
|
|
423
|
+
\`\`\`
|
|
424
|
+
|
|
425
|
+
## 第四步:数据验证
|
|
426
|
+
|
|
427
|
+
项目使用 [验证库名称] 进行数据验证。
|
|
428
|
+
|
|
429
|
+
**示例**:
|
|
430
|
+
\`\`\`[语言]
|
|
431
|
+
[从项目中找一个验证示例]
|
|
432
|
+
\`\`\`
|
|
433
|
+
|
|
434
|
+
## 第五步:注册路由
|
|
435
|
+
|
|
436
|
+
在 \`[实际文件路径]\` 中注册新路由:
|
|
437
|
+
|
|
438
|
+
\`\`\`[语言]
|
|
439
|
+
[实际的路由注册代码]
|
|
440
|
+
\`\`\`
|
|
441
|
+
|
|
442
|
+
## 第六步:测试
|
|
443
|
+
|
|
444
|
+
运行测试命令:\`[实际命令,如 npm test]\`
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
*返回索引: [../project-context.md](../project-context.md)*
|
|
448
|
+
\`\`\`
|
|
449
|
+
|
|
450
|
+
**填写指导**:
|
|
451
|
+
1. 搜索 src/routes, src/api, src/controllers 等目录
|
|
452
|
+
2. 找 2-3 个现有的 API 接口作为参考
|
|
453
|
+
3. 复制实际的代码示例(不要编造)
|
|
454
454
|
4. 说明项目特定的命名和组织方式`,
|
|
455
|
-
'how-to-new-page.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
456
|
-
|
|
457
|
-
**用途**: ${doc.purpose}
|
|
458
|
-
|
|
459
|
-
**模板**:
|
|
460
|
-
|
|
461
|
-
\`\`\`markdown
|
|
462
|
-
# 如何创建新页面
|
|
463
|
-
|
|
464
|
-
> 本文档指导如何在 ${projectInfo.name} 中创建新的页面组件。
|
|
465
|
-
|
|
466
|
-
## 第一步:找到页面目录
|
|
467
|
-
|
|
468
|
-
项目的页面组件在:\`[实际路径,如 src/pages/, src/views/, app/]\`
|
|
469
|
-
|
|
470
|
-
**现有示例**(从项目中找一个真实的页面):
|
|
471
|
-
\`\`\`[语言]
|
|
472
|
-
[复制一个实际的页面组件代码]
|
|
473
|
-
\`\`\`
|
|
474
|
-
|
|
475
|
-
## 第二步:创建页面文件
|
|
476
|
-
|
|
477
|
-
1. 在 \`[路径]\` 目录下创建 \`[命名规范].tsx\`
|
|
478
|
-
2. 定义组件:
|
|
479
|
-
|
|
480
|
-
\`\`\`[语言]
|
|
481
|
-
[基于项目实际代码风格的示例]
|
|
482
|
-
\`\`\`
|
|
483
|
-
|
|
484
|
-
## 第三步:配置路由
|
|
485
|
-
|
|
486
|
-
项目使用 [路由库名称]。
|
|
487
|
-
|
|
488
|
-
**路由配置位置**: \`[实际文件路径]\`
|
|
489
|
-
|
|
490
|
-
**示例**:
|
|
491
|
-
\`\`\`[语言]
|
|
492
|
-
[从项目中找路由配置示例]
|
|
493
|
-
\`\`\`
|
|
494
|
-
|
|
495
|
-
## 第四步:获取数据
|
|
496
|
-
|
|
497
|
-
项目使用 [数据获取方式,如 useEffect, getServerSideProps, loader]。
|
|
498
|
-
|
|
499
|
-
**示例**:
|
|
500
|
-
\`\`\`[语言]
|
|
501
|
-
[从项目中找数据获取示例]
|
|
502
|
-
\`\`\`
|
|
503
|
-
|
|
504
|
-
## 第五步:编写样式
|
|
505
|
-
|
|
506
|
-
项目使用 [样式方案,如 CSS Modules, Tailwind, styled-components]。
|
|
507
|
-
|
|
508
|
-
**示例**:
|
|
509
|
-
\`\`\`[语言]
|
|
510
|
-
[从项目中找样式示例]
|
|
511
|
-
\`\`\`
|
|
512
|
-
|
|
513
|
-
---
|
|
514
|
-
*返回索引: [../project-context.md](../project-context.md)*
|
|
515
|
-
\`\`\`
|
|
516
|
-
|
|
517
|
-
**填写指导**:
|
|
518
|
-
1. 搜索 src/pages, src/views, app 等目录
|
|
519
|
-
2. 找 1-2 个现有页面作为参考
|
|
520
|
-
3. 复制实际的组件代码
|
|
455
|
+
'how-to-new-page.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
456
|
+
|
|
457
|
+
**用途**: ${doc.purpose}
|
|
458
|
+
|
|
459
|
+
**模板**:
|
|
460
|
+
|
|
461
|
+
\`\`\`markdown
|
|
462
|
+
# 如何创建新页面
|
|
463
|
+
|
|
464
|
+
> 本文档指导如何在 ${projectInfo.name} 中创建新的页面组件。
|
|
465
|
+
|
|
466
|
+
## 第一步:找到页面目录
|
|
467
|
+
|
|
468
|
+
项目的页面组件在:\`[实际路径,如 src/pages/, src/views/, app/]\`
|
|
469
|
+
|
|
470
|
+
**现有示例**(从项目中找一个真实的页面):
|
|
471
|
+
\`\`\`[语言]
|
|
472
|
+
[复制一个实际的页面组件代码]
|
|
473
|
+
\`\`\`
|
|
474
|
+
|
|
475
|
+
## 第二步:创建页面文件
|
|
476
|
+
|
|
477
|
+
1. 在 \`[路径]\` 目录下创建 \`[命名规范].tsx\`
|
|
478
|
+
2. 定义组件:
|
|
479
|
+
|
|
480
|
+
\`\`\`[语言]
|
|
481
|
+
[基于项目实际代码风格的示例]
|
|
482
|
+
\`\`\`
|
|
483
|
+
|
|
484
|
+
## 第三步:配置路由
|
|
485
|
+
|
|
486
|
+
项目使用 [路由库名称]。
|
|
487
|
+
|
|
488
|
+
**路由配置位置**: \`[实际文件路径]\`
|
|
489
|
+
|
|
490
|
+
**示例**:
|
|
491
|
+
\`\`\`[语言]
|
|
492
|
+
[从项目中找路由配置示例]
|
|
493
|
+
\`\`\`
|
|
494
|
+
|
|
495
|
+
## 第四步:获取数据
|
|
496
|
+
|
|
497
|
+
项目使用 [数据获取方式,如 useEffect, getServerSideProps, loader]。
|
|
498
|
+
|
|
499
|
+
**示例**:
|
|
500
|
+
\`\`\`[语言]
|
|
501
|
+
[从项目中找数据获取示例]
|
|
502
|
+
\`\`\`
|
|
503
|
+
|
|
504
|
+
## 第五步:编写样式
|
|
505
|
+
|
|
506
|
+
项目使用 [样式方案,如 CSS Modules, Tailwind, styled-components]。
|
|
507
|
+
|
|
508
|
+
**示例**:
|
|
509
|
+
\`\`\`[语言]
|
|
510
|
+
[从项目中找样式示例]
|
|
511
|
+
\`\`\`
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
*返回索引: [../project-context.md](../project-context.md)*
|
|
515
|
+
\`\`\`
|
|
516
|
+
|
|
517
|
+
**填写指导**:
|
|
518
|
+
1. 搜索 src/pages, src/views, app 等目录
|
|
519
|
+
2. 找 1-2 个现有页面作为参考
|
|
520
|
+
3. 复制实际的组件代码
|
|
521
521
|
4. 说明路由配置方式`
|
|
522
522
|
};
|
|
523
523
|
// 如果没有特定模板,使用通用模板
|
|
524
|
-
const template = templates[doc.file] || `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
525
|
-
|
|
526
|
-
**用途**: ${doc.purpose}
|
|
527
|
-
|
|
528
|
-
**模板**:
|
|
529
|
-
|
|
530
|
-
\`\`\`markdown
|
|
531
|
-
# ${doc.title}
|
|
532
|
-
|
|
533
|
-
> 本文档描述 ${projectInfo.name} 的 ${doc.title.toLowerCase()}。
|
|
534
|
-
|
|
535
|
-
## 概述
|
|
536
|
-
|
|
537
|
-
[简要说明本文档的内容]
|
|
538
|
-
|
|
539
|
-
## 详细步骤
|
|
540
|
-
|
|
541
|
-
### 第一步:[步骤名称]
|
|
542
|
-
|
|
543
|
-
[具体说明]
|
|
544
|
-
|
|
545
|
-
**示例**:
|
|
546
|
-
\`\`\`[语言]
|
|
547
|
-
[从项目中提取的实际代码]
|
|
548
|
-
\`\`\`
|
|
549
|
-
|
|
550
|
-
### 第二步:[步骤名称]
|
|
551
|
-
|
|
552
|
-
[具体说明]
|
|
553
|
-
|
|
554
|
-
---
|
|
555
|
-
*返回索引: [../project-context.md](../project-context.md)*
|
|
556
|
-
\`\`\`
|
|
557
|
-
|
|
558
|
-
**填写指导**:
|
|
559
|
-
1. 分析项目相关代码
|
|
560
|
-
2. 提取真实示例
|
|
524
|
+
const template = templates[doc.file] || `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
525
|
+
|
|
526
|
+
**用途**: ${doc.purpose}
|
|
527
|
+
|
|
528
|
+
**模板**:
|
|
529
|
+
|
|
530
|
+
\`\`\`markdown
|
|
531
|
+
# ${doc.title}
|
|
532
|
+
|
|
533
|
+
> 本文档描述 ${projectInfo.name} 的 ${doc.title.toLowerCase()}。
|
|
534
|
+
|
|
535
|
+
## 概述
|
|
536
|
+
|
|
537
|
+
[简要说明本文档的内容]
|
|
538
|
+
|
|
539
|
+
## 详细步骤
|
|
540
|
+
|
|
541
|
+
### 第一步:[步骤名称]
|
|
542
|
+
|
|
543
|
+
[具体说明]
|
|
544
|
+
|
|
545
|
+
**示例**:
|
|
546
|
+
\`\`\`[语言]
|
|
547
|
+
[从项目中提取的实际代码]
|
|
548
|
+
\`\`\`
|
|
549
|
+
|
|
550
|
+
### 第二步:[步骤名称]
|
|
551
|
+
|
|
552
|
+
[具体说明]
|
|
553
|
+
|
|
554
|
+
---
|
|
555
|
+
*返回索引: [../project-context.md](../project-context.md)*
|
|
556
|
+
\`\`\`
|
|
557
|
+
|
|
558
|
+
**填写指导**:
|
|
559
|
+
1. 分析项目相关代码
|
|
560
|
+
2. 提取真实示例
|
|
561
561
|
3. 编写具体步骤`;
|
|
562
|
-
return `### 第${step}步:${doc.title}
|
|
563
|
-
|
|
564
|
-
${template}
|
|
565
|
-
|
|
562
|
+
return `### 第${step}步:${doc.title}
|
|
563
|
+
|
|
564
|
+
${template}
|
|
565
|
+
|
|
566
566
|
**使用 fsWrite 创建此文件**`;
|
|
567
567
|
}
|
|
568
568
|
/**
|
package/build/tools/start_ui.js
CHANGED
|
@@ -11,20 +11,38 @@ import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
|
11
11
|
import { getReasoningEngine } from "./ui-ux-tools.js";
|
|
12
12
|
import { okStructured } from "../lib/response.js";
|
|
13
13
|
import { UIReportSchema } from "../schemas/structured-output.js";
|
|
14
|
+
import { detectProjectType } from "../lib/project-detector.js";
|
|
14
15
|
const PROMPT_TEMPLATE = `# 快速开始
|
|
15
16
|
|
|
16
17
|
**职责说明**: 本工具仅提供执行指导,不执行实际操作。请按顺序调用以下 MCP 工具。
|
|
17
18
|
|
|
18
19
|
执行以下工具:
|
|
19
20
|
|
|
20
|
-
1. 检查 \`docs/
|
|
21
|
-
2. 检查 \`docs/
|
|
22
|
-
3. \`
|
|
23
|
-
4. \`
|
|
21
|
+
1. 检查 \`docs/project-context.md\` 是否存在,不存在则调用 \`init_project_context\`
|
|
22
|
+
2. 检查 \`docs/design-system.md\` 是否存在,不存在则调用 \`ui_design_system --product_type="SaaS" --stack="{framework}"\`
|
|
23
|
+
3. 检查 \`docs/component-catalog.json\` 是否存在,不存在则调用 \`init_component_catalog\`
|
|
24
|
+
4. \`ui_search --mode=template --query="{description}"\`
|
|
25
|
+
5. \`render_ui --template="docs/ui/{templateName}.json" --framework="{framework}"\`
|
|
26
|
+
6. 将生成的 UI 文档添加到 \`docs/project-context.md\` 索引中
|
|
24
27
|
|
|
25
28
|
---
|
|
26
29
|
|
|
27
|
-
## 步骤 1:
|
|
30
|
+
## 步骤 1: 生成项目上下文(如不存在)📋
|
|
31
|
+
|
|
32
|
+
**检查**: 查看 \`docs/project-context.md\` 是否存在
|
|
33
|
+
|
|
34
|
+
**如果不存在,调用工具**: \`init_project_context\`
|
|
35
|
+
**参数**: 无(使用默认配置)
|
|
36
|
+
|
|
37
|
+
**预期输出**:
|
|
38
|
+
- \`docs/project-context.md\` - 项目上下文索引文件
|
|
39
|
+
- \`docs/project-context/\` - 项目文档目录
|
|
40
|
+
|
|
41
|
+
**失败处理**: 确保 docs 目录存在且有写入权限
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 步骤 2: 生成设计系统(如不存在)🎨
|
|
28
46
|
|
|
29
47
|
**检查**: 查看 \`docs/design-system.md\` 是否存在
|
|
30
48
|
|
|
@@ -43,7 +61,7 @@ const PROMPT_TEMPLATE = `# 快速开始
|
|
|
43
61
|
|
|
44
62
|
---
|
|
45
63
|
|
|
46
|
-
## 步骤
|
|
64
|
+
## 步骤 3: 生成组件目录(如不存在)📦
|
|
47
65
|
|
|
48
66
|
**检查**: 查看 \`docs/component-catalog.json\` 是否存在
|
|
49
67
|
|
|
@@ -51,11 +69,11 @@ const PROMPT_TEMPLATE = `# 快速开始
|
|
|
51
69
|
**参数**: 无
|
|
52
70
|
|
|
53
71
|
**预期输出**: \`docs/component-catalog.json\`
|
|
54
|
-
**失败处理**: 确保步骤
|
|
72
|
+
**失败处理**: 确保步骤 2 的设计系统文件已生成
|
|
55
73
|
|
|
56
74
|
---
|
|
57
75
|
|
|
58
|
-
## 步骤
|
|
76
|
+
## 步骤 4: 搜索 UI 模板 🔍
|
|
59
77
|
|
|
60
78
|
**工具**: \`ui_search\`
|
|
61
79
|
**参数**:
|
|
@@ -67,11 +85,11 @@ const PROMPT_TEMPLATE = `# 快速开始
|
|
|
67
85
|
\`\`\`
|
|
68
86
|
|
|
69
87
|
**预期输出**: 匹配的模板列表(可能为空)
|
|
70
|
-
**失败处理**: 如果没有找到模板,继续到步骤
|
|
88
|
+
**失败处理**: 如果没有找到模板,继续到步骤 5 使用默认模板
|
|
71
89
|
|
|
72
90
|
---
|
|
73
91
|
|
|
74
|
-
## 步骤
|
|
92
|
+
## 步骤 5: 渲染最终代码 💻
|
|
75
93
|
|
|
76
94
|
**工具**: \`render_ui\`
|
|
77
95
|
**参数**:
|
|
@@ -87,6 +105,32 @@ const PROMPT_TEMPLATE = `# 快速开始
|
|
|
87
105
|
|
|
88
106
|
---
|
|
89
107
|
|
|
108
|
+
## 步骤 6: 更新项目上下文索引 📝
|
|
109
|
+
|
|
110
|
+
**操作**: 将生成的 UI 文档添加到 \`docs/project-context.md\` 中
|
|
111
|
+
|
|
112
|
+
**添加内容**:
|
|
113
|
+
在 "## 📚 文档导航" 部分添加:
|
|
114
|
+
|
|
115
|
+
\`\`\`markdown
|
|
116
|
+
### [UI 设计系统](./design-system.md)
|
|
117
|
+
项目的 UI 设计规范,包括颜色、字体、组件样式等
|
|
118
|
+
|
|
119
|
+
### [UI 组件目录](./component-catalog.json)
|
|
120
|
+
可用的 UI 组件及其属性定义
|
|
121
|
+
\`\`\`
|
|
122
|
+
|
|
123
|
+
在 "## 💡 开发时查看对应文档" 部分的 "添加新功能" 下添加:
|
|
124
|
+
\`\`\`markdown
|
|
125
|
+
- **UI 设计系统**: [design-system.md](./design-system.md) - 查看设计规范
|
|
126
|
+
- **UI 组件目录**: [component-catalog.json](./component-catalog.json) - 查看可用组件
|
|
127
|
+
\`\`\`
|
|
128
|
+
|
|
129
|
+
**预期结果**: \`docs/project-context.md\` 包含 UI 相关文档的链接
|
|
130
|
+
**失败处理**: 如果文件不存在,跳过此步骤
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
90
134
|
## 高级选项
|
|
91
135
|
|
|
92
136
|
### 自定义设计系统
|
|
@@ -103,16 +147,75 @@ A: 不需要。如果文件已存在,直接跳过步骤 1。
|
|
|
103
147
|
**Q: 如何使用自定义模板?**
|
|
104
148
|
A: 在 \`docs/ui/\` 目录创建 JSON 模板文件,然后在步骤 4 中指定模板路径。
|
|
105
149
|
`;
|
|
150
|
+
/**
|
|
151
|
+
* 从 project-context.md 读取框架信息
|
|
152
|
+
*/
|
|
153
|
+
function getFrameworkFromContext(projectRoot) {
|
|
154
|
+
try {
|
|
155
|
+
const fs = require('fs');
|
|
156
|
+
const path = require('path');
|
|
157
|
+
const contextPath = path.join(projectRoot, 'docs', 'project-context.md');
|
|
158
|
+
if (!fs.existsSync(contextPath)) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
const content = fs.readFileSync(contextPath, 'utf-8');
|
|
162
|
+
// 匹配表格中的框架信息:| 框架 | xxx |
|
|
163
|
+
const match = content.match(/\|\s*框架\s*\|\s*([^\|]+)\s*\|/);
|
|
164
|
+
if (match && match[1]) {
|
|
165
|
+
const framework = match[1].trim();
|
|
166
|
+
if (framework && framework !== '无' && framework !== '未检测到') {
|
|
167
|
+
return framework;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
106
176
|
/**
|
|
107
177
|
* 统一 UI 开发编排工具
|
|
108
178
|
*/
|
|
109
179
|
export async function startUi(args) {
|
|
110
180
|
try {
|
|
181
|
+
const projectRoot = process.cwd();
|
|
182
|
+
// 优先从 project-context.md 读取框架信息
|
|
183
|
+
let detectedFramework = 'html'; // 默认值
|
|
184
|
+
const contextFramework = getFrameworkFromContext(projectRoot);
|
|
185
|
+
if (contextFramework) {
|
|
186
|
+
// 从 project-context.md 中读取到了框架信息
|
|
187
|
+
const fw = contextFramework.toLowerCase();
|
|
188
|
+
if (fw.includes('vue') || fw.includes('nuxt')) {
|
|
189
|
+
detectedFramework = 'vue';
|
|
190
|
+
}
|
|
191
|
+
else if (fw.includes('react') || fw.includes('next')) {
|
|
192
|
+
detectedFramework = 'react';
|
|
193
|
+
}
|
|
194
|
+
else if (fw.includes('html')) {
|
|
195
|
+
detectedFramework = 'html';
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
// 如果没有 project-context.md,则实时检测
|
|
200
|
+
const detection = detectProjectType(projectRoot);
|
|
201
|
+
if (detection.framework) {
|
|
202
|
+
const fw = detection.framework.toLowerCase();
|
|
203
|
+
if (fw.includes('vue') || fw.includes('nuxt')) {
|
|
204
|
+
detectedFramework = 'vue';
|
|
205
|
+
}
|
|
206
|
+
else if (fw.includes('react') || fw.includes('next')) {
|
|
207
|
+
detectedFramework = 'react';
|
|
208
|
+
}
|
|
209
|
+
else if (fw.includes('html') || fw === 'none') {
|
|
210
|
+
detectedFramework = 'html';
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
111
214
|
// 智能参数解析
|
|
112
215
|
const parsedArgs = parseArgs(args, {
|
|
113
216
|
defaultValues: {
|
|
114
217
|
description: "",
|
|
115
|
-
framework:
|
|
218
|
+
framework: detectedFramework, // 使用检测到的框架
|
|
116
219
|
template: "",
|
|
117
220
|
mode: "manual",
|
|
118
221
|
},
|
|
@@ -125,7 +228,7 @@ export async function startUi(args) {
|
|
|
125
228
|
},
|
|
126
229
|
});
|
|
127
230
|
const description = getString(parsedArgs.description);
|
|
128
|
-
const framework = getString(parsedArgs.framework) ||
|
|
231
|
+
const framework = getString(parsedArgs.framework) || detectedFramework;
|
|
129
232
|
const mode = getString(parsedArgs.mode) || "manual";
|
|
130
233
|
let templateName = getString(parsedArgs.template);
|
|
131
234
|
// 验证 mode 参数
|
|
@@ -184,27 +287,35 @@ start_ui "用户列表" --mode=auto
|
|
|
184
287
|
|
|
185
288
|
请按顺序执行以下命令:
|
|
186
289
|
|
|
187
|
-
### 1.
|
|
290
|
+
### 1. 生成项目上下文 📋
|
|
291
|
+
\`\`\`bash
|
|
292
|
+
init_project_context
|
|
293
|
+
\`\`\`
|
|
294
|
+
|
|
295
|
+
### 2. 生成设计系统 🎨
|
|
188
296
|
\`\`\`bash
|
|
189
297
|
ui_design_system --product_type="${inferredProductType}" --stack="${inferredStack}" --keywords="${inferredKeywords}" --description="${description}"
|
|
190
298
|
\`\`\`
|
|
191
299
|
|
|
192
|
-
###
|
|
300
|
+
### 3. 生成组件目录 📦
|
|
193
301
|
\`\`\`bash
|
|
194
302
|
init_component_catalog
|
|
195
303
|
\`\`\`
|
|
196
304
|
|
|
197
|
-
###
|
|
305
|
+
### 4. 生成 UI 模板 📄
|
|
198
306
|
\`\`\`bash
|
|
199
307
|
# 搜索现有模板或生成新模板
|
|
200
308
|
ui_search --mode=template --query="${templateName || description}"
|
|
201
309
|
\`\`\`
|
|
202
310
|
|
|
203
|
-
###
|
|
311
|
+
### 5. 渲染代码 💻
|
|
204
312
|
\`\`\`bash
|
|
205
313
|
render_ui docs/ui/${templateName || 'template'}.json --framework="${inferredStack}"
|
|
206
314
|
\`\`\`
|
|
207
315
|
|
|
316
|
+
### 6. 更新项目上下文 📝
|
|
317
|
+
将生成的 UI 文档链接添加到 \`docs/project-context.md\` 的文档导航部分。
|
|
318
|
+
|
|
208
319
|
---
|
|
209
320
|
|
|
210
321
|
## 💡 为什么选择这个方案?
|
|
@@ -216,6 +327,11 @@ ${recommendation.reasoning}
|
|
|
216
327
|
summary: `智能 UI 开发:${description}`,
|
|
217
328
|
status: 'pending',
|
|
218
329
|
steps: [
|
|
330
|
+
{
|
|
331
|
+
name: '生成项目上下文',
|
|
332
|
+
status: 'pending',
|
|
333
|
+
description: `调用 init_project_context 生成项目文档`,
|
|
334
|
+
},
|
|
219
335
|
{
|
|
220
336
|
name: '生成设计系统',
|
|
221
337
|
status: 'pending',
|
|
@@ -236,13 +352,20 @@ ${recommendation.reasoning}
|
|
|
236
352
|
status: 'pending',
|
|
237
353
|
description: '调用 render_ui 生成组件代码',
|
|
238
354
|
},
|
|
355
|
+
{
|
|
356
|
+
name: '更新项目上下文',
|
|
357
|
+
status: 'pending',
|
|
358
|
+
description: '将 UI 文档添加到 project-context.md 索引',
|
|
359
|
+
},
|
|
239
360
|
],
|
|
240
361
|
artifacts: [],
|
|
241
362
|
nextSteps: [
|
|
363
|
+
'调用 init_project_context',
|
|
242
364
|
`调用 ui_design_system --product_type="${inferredProductType}" --stack="${inferredStack}"`,
|
|
243
365
|
'调用 init_component_catalog',
|
|
244
366
|
`调用 ui_search --mode=template --query="${description}"`,
|
|
245
367
|
`调用 render_ui --framework="${inferredStack}"`,
|
|
368
|
+
'更新 docs/project-context.md 添加 UI 文档链接',
|
|
246
369
|
],
|
|
247
370
|
designSystem: {
|
|
248
371
|
colors: {},
|
|
@@ -326,6 +449,11 @@ start_ui "设置页面" --framework=react
|
|
|
326
449
|
summary: `UI 开发工作流:${description}`,
|
|
327
450
|
status: 'pending',
|
|
328
451
|
steps: [
|
|
452
|
+
{
|
|
453
|
+
name: '检查项目上下文',
|
|
454
|
+
status: 'pending',
|
|
455
|
+
description: '检查 docs/project-context.md 是否存在',
|
|
456
|
+
},
|
|
329
457
|
{
|
|
330
458
|
name: '检查设计系统',
|
|
331
459
|
status: 'pending',
|
|
@@ -346,13 +474,20 @@ start_ui "设置页面" --framework=react
|
|
|
346
474
|
status: 'pending',
|
|
347
475
|
description: '调用 render_ui 生成组件代码',
|
|
348
476
|
},
|
|
477
|
+
{
|
|
478
|
+
name: '更新项目上下文',
|
|
479
|
+
status: 'pending',
|
|
480
|
+
description: '将 UI 文档添加到 project-context.md 索引',
|
|
481
|
+
},
|
|
349
482
|
],
|
|
350
483
|
artifacts: [],
|
|
351
484
|
nextSteps: [
|
|
485
|
+
'检查项目上下文,如不存在则调用 init_project_context',
|
|
352
486
|
'检查设计系统文件,如不存在则调用 ui_design_system',
|
|
353
487
|
'检查组件目录,如不存在则调用 init_component_catalog',
|
|
354
488
|
`调用 ui_search --mode=template --query="${description}"`,
|
|
355
489
|
`调用 render_ui --framework="${framework}"`,
|
|
490
|
+
'更新 docs/project-context.md 添加 UI 文档链接',
|
|
356
491
|
],
|
|
357
492
|
designSystem: {
|
|
358
493
|
colors: {},
|
package/docs/CNAME
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
mcp-probe-kit.bytezonex.com
|
|
@@ -296,13 +296,19 @@
|
|
|
296
296
|
|
|
297
297
|
<div class="nav-section">
|
|
298
298
|
<div class="nav-section-title">工具文档</div>
|
|
299
|
-
<
|
|
299
|
+
<div class="nav-item nav-item-toggle active expanded" onclick="toggleSubmenu(this)">
|
|
300
300
|
<div class="nav-item-content">
|
|
301
301
|
<span class="icon">🛠️</span>
|
|
302
302
|
<span>所有工具</span>
|
|
303
303
|
</div>
|
|
304
|
-
<
|
|
305
|
-
|
|
304
|
+
<div style="display: flex; align-items: center; gap: 8px;">
|
|
305
|
+
<span class="badge">39</span>
|
|
306
|
+
<span class="toggle-icon">▶</span>
|
|
307
|
+
</div>
|
|
308
|
+
</div>
|
|
309
|
+
<div class="nav-submenu expanded" id="tools-submenu">
|
|
310
|
+
<!-- 工具列表将通过 JavaScript 动态生成 -->
|
|
311
|
+
</div>
|
|
306
312
|
</div>
|
|
307
313
|
|
|
308
314
|
<div class="nav-section">
|
|
@@ -464,6 +470,49 @@
|
|
|
464
470
|
<!-- 引入工具数据 -->
|
|
465
471
|
<script src="../data/tools.js"></script>
|
|
466
472
|
<script>
|
|
473
|
+
// 切换子菜单展开/收起
|
|
474
|
+
function toggleSubmenu(element) {
|
|
475
|
+
element.classList.toggle('expanded');
|
|
476
|
+
const submenu = document.getElementById('tools-submenu');
|
|
477
|
+
submenu.classList.toggle('expanded');
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// 生成侧边栏工具列表
|
|
481
|
+
function generateSidebarTools() {
|
|
482
|
+
const submenu = document.getElementById('tools-submenu');
|
|
483
|
+
let html = '';
|
|
484
|
+
|
|
485
|
+
for (const [categoryKey, categoryInfo] of Object.entries(categories)) {
|
|
486
|
+
const tools = toolsData[categoryKey];
|
|
487
|
+
if (!tools || tools.length === 0) continue;
|
|
488
|
+
|
|
489
|
+
tools.forEach(tool => {
|
|
490
|
+
const toolId = tool.name.replace(/_/g, '-');
|
|
491
|
+
html += `
|
|
492
|
+
<a href="#${toolId}" class="nav-subitem" onclick="scrollToTool('${toolId}')">
|
|
493
|
+
${tool.name}
|
|
494
|
+
</a>
|
|
495
|
+
`;
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
submenu.innerHTML = html;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
// 滚动到指定工具
|
|
503
|
+
function scrollToTool(toolId) {
|
|
504
|
+
const element = document.getElementById(toolId);
|
|
505
|
+
if (element) {
|
|
506
|
+
element.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
507
|
+
// 高亮显示
|
|
508
|
+
element.style.transition = 'background 0.3s';
|
|
509
|
+
element.style.background = 'rgba(37, 99, 235, 0.05)';
|
|
510
|
+
setTimeout(() => {
|
|
511
|
+
element.style.background = '';
|
|
512
|
+
}, 2000);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
467
516
|
// Topbar scroll effect
|
|
468
517
|
const topbar = document.getElementById('topbar');
|
|
469
518
|
window.addEventListener('scroll', () => {
|
|
@@ -584,7 +633,7 @@
|
|
|
584
633
|
}
|
|
585
634
|
|
|
586
635
|
return `
|
|
587
|
-
<div class="tool-card">
|
|
636
|
+
<div class="tool-card" id="${tool.name.replace(/_/g, '-')}">
|
|
588
637
|
<div class="tool-main">
|
|
589
638
|
<div class="tool-header">
|
|
590
639
|
<div class="tool-name">${tool.name}</div>
|
|
@@ -632,6 +681,9 @@
|
|
|
632
681
|
});
|
|
633
682
|
}
|
|
634
683
|
|
|
684
|
+
// 生成侧边栏工具列表
|
|
685
|
+
generateSidebarTools();
|
|
686
|
+
|
|
635
687
|
// 渲染所有工具
|
|
636
688
|
renderTools();
|
|
637
689
|
|
package/docs/styles/page.css
CHANGED
|
@@ -218,6 +218,55 @@ body {
|
|
|
218
218
|
opacity: 1;
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
+
/* 子菜单样式 */
|
|
222
|
+
.nav-item-toggle {
|
|
223
|
+
cursor: pointer;
|
|
224
|
+
user-select: none;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.nav-item-toggle .toggle-icon {
|
|
228
|
+
transition: transform 0.2s;
|
|
229
|
+
font-size: 12px;
|
|
230
|
+
color: var(--text-tertiary);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.nav-item-toggle.expanded .toggle-icon {
|
|
234
|
+
transform: rotate(90deg);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.nav-submenu {
|
|
238
|
+
max-height: 0;
|
|
239
|
+
overflow: hidden;
|
|
240
|
+
transition: max-height 0.3s ease-out;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.nav-submenu.expanded {
|
|
244
|
+
max-height: 2000px;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.nav-subitem {
|
|
248
|
+
display: block;
|
|
249
|
+
padding: 8px 20px 8px 48px;
|
|
250
|
+
margin: 2px 12px;
|
|
251
|
+
color: var(--text-secondary);
|
|
252
|
+
text-decoration: none;
|
|
253
|
+
transition: all 0.2s;
|
|
254
|
+
border-radius: 6px;
|
|
255
|
+
font-size: 13px;
|
|
256
|
+
position: relative;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.nav-subitem:hover {
|
|
260
|
+
background: var(--bg-hover);
|
|
261
|
+
color: var(--primary);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.nav-subitem.active {
|
|
265
|
+
background: rgba(37, 99, 235, 0.05);
|
|
266
|
+
color: var(--primary);
|
|
267
|
+
font-weight: 600;
|
|
268
|
+
}
|
|
269
|
+
|
|
221
270
|
.badge {
|
|
222
271
|
background: var(--bg-hover);
|
|
223
272
|
color: var(--text-secondary);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-probe-kit",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "AI-Powered Development Toolkit - MCP Server with 39 practical tools covering code quality, development efficiency, project management, and UI/UX design. Features: Structured Output, Workflow Orchestration, UI/UX Pro Max, and Requirements Interview.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "build/index.js",
|
|
@@ -63,15 +63,15 @@
|
|
|
63
63
|
"LICENSE"
|
|
64
64
|
],
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@modelcontextprotocol/sdk": "^1.25.3"
|
|
66
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
67
|
+
"csv-parse": "^6.1.0",
|
|
68
|
+
"tar": "^7.5.6"
|
|
67
69
|
},
|
|
68
70
|
"devDependencies": {
|
|
69
71
|
"@types/node": "^20.0.0",
|
|
70
72
|
"@types/tar": "^6.1.13",
|
|
71
73
|
"@vitest/ui": "^4.0.18",
|
|
72
|
-
"csv-parse": "^6.1.0",
|
|
73
74
|
"fast-check": "^4.5.3",
|
|
74
|
-
"tar": "^7.5.6",
|
|
75
75
|
"tsx": "^4.21.0",
|
|
76
76
|
"typescript": "^5.3.0",
|
|
77
77
|
"vitest": "^4.0.18"
|