mcp-probe-kit 3.0.3 → 3.0.6
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 +457 -423
- package/build/index.js +434 -140
- package/build/lib/template-loader.js +317 -317
- package/build/lib/tool-execution-context.d.ts +8 -0
- package/build/lib/tool-execution-context.js +20 -0
- package/build/schemas/git-tools.js +16 -16
- package/build/tools/__tests__/start_bugfix.unit.test.js +14 -14
- package/build/tools/__tests__/start_ui.unit.test.js +11 -11
- package/build/tools/add_feature.js +79 -79
- package/build/tools/ask_user.js +5 -5
- package/build/tools/interview.js +9 -9
- package/build/tools/start_bugfix.d.ts +2 -1
- package/build/tools/start_bugfix.js +131 -122
- package/build/tools/start_feature.d.ts +2 -1
- package/build/tools/start_feature.js +113 -104
- package/build/tools/start_onboard.d.ts +2 -1
- package/build/tools/start_onboard.js +57 -51
- package/build/tools/start_product.d.ts +2 -1
- package/build/tools/start_product.js +9 -1
- package/build/tools/start_ralph.d.ts +2 -1
- package/build/tools/start_ralph.js +9 -3
- package/build/tools/start_ui.d.ts +2 -1
- package/build/tools/start_ui.js +102 -88
- package/build/tools/ui-ux-tools.d.ts +2 -1
- package/build/tools/ui-ux-tools.js +19 -3
- package/build/utils/ui-sync.d.ts +6 -2
- package/build/utils/ui-sync.js +125 -29
- package/docs/assets/font/MaterialSymbolsOutlined.codepoints +4102 -0
- package/docs/assets/font/MaterialSymbolsOutlined.ttf +0 -0
- package/docs/assets/font/noto-sans-sc-400.ttf +0 -0
- package/docs/assets/font/noto-sans-sc-700.ttf +0 -0
- package/docs/assets/font/noto-sans-sc-900.ttf +0 -0
- package/docs/assets/js/i18n.js +375 -0
- package/docs/assets/js/tailwind.js +83 -83
- package/docs/assets/logo-zh.png +0 -0
- package/docs/assets/logo.png +0 -0
- package/docs/data/tools.js +21 -21
- package/docs/debug-i18n.html +163 -0
- package/docs/i18n/all-tools/en.json +157 -0
- package/docs/i18n/all-tools/ja.json +157 -0
- package/docs/i18n/all-tools/ko.json +157 -0
- package/docs/i18n/all-tools/zh-CN.json +157 -0
- package/docs/i18n/en.json +518 -0
- package/docs/i18n/ja.json +518 -0
- package/docs/i18n/ko.json +518 -0
- package/docs/i18n/zh-CN.json +518 -0
- package/docs/index.html +43 -32
- package/docs/pages/all-tools.html +514 -330
- package/docs/pages/examples.html +689 -673
- package/docs/pages/getting-started.html +589 -577
- package/docs/pages/migration.html +298 -283
- package/package.json +6 -6
- package/docs/project-context/architecture.md +0 -0
- package/docs/project-context/how-to-develop.md +0 -313
- package/docs/project-context/how-to-test.md +0 -457
- package/docs/project-context/tech-stack.md +0 -96
- package/docs/project-context.md +0 -53
- package/docs/specs/git-work-report/design.md +0 -568
- package/docs/specs/git-work-report/requirements.md +0 -131
- package/docs/specs/git-work-report/tasks.md +0 -197
|
@@ -1,568 +0,0 @@
|
|
|
1
|
-
# 设计文档:git-work-report
|
|
2
|
-
|
|
3
|
-
## 概述
|
|
4
|
-
|
|
5
|
-
本设计文档描述 git-work-report 功能的技术实现方案。该工具作为 MCP Probe Kit 的新工具,遵循现有的工具架构模式,通过 MCP 协议提供服务。
|
|
6
|
-
|
|
7
|
-
**设计目标:**
|
|
8
|
-
- 与现有工具架构保持一致
|
|
9
|
-
- 高效处理 Git 命令执行
|
|
10
|
-
- 提供清晰的错误处理
|
|
11
|
-
- 支持结构化输出
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## 技术方案
|
|
16
|
-
|
|
17
|
-
### 技术选型
|
|
18
|
-
|
|
19
|
-
| 类别 | 选择 | 理由 |
|
|
20
|
-
|------|------|------|
|
|
21
|
-
| 语言 | TypeScript | 与项目现有技术栈一致 |
|
|
22
|
-
| Git 交互 | child_process (promisify) | Node.js 标准库,无需额外依赖 |
|
|
23
|
-
| 日期处理 | 原生 Date + 字符串格式化 | 避免引入额外依赖(如 moment.js) |
|
|
24
|
-
| 输出格式化 | formatResponse (现有工具) | 保持输出格式一致性 |
|
|
25
|
-
| Schema 定义 | JSON Schema | 符合 MCP 协议规范 |
|
|
26
|
-
|
|
27
|
-
### 架构设计
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
用户请求 (MCP Client)
|
|
31
|
-
↓
|
|
32
|
-
MCP 服务器 (src/index.ts)
|
|
33
|
-
↓
|
|
34
|
-
git_work_report 工具 (src/tools/git_work_report.ts)
|
|
35
|
-
↓
|
|
36
|
-
├─→ 参数验证
|
|
37
|
-
├─→ Git 命令执行 (child_process)
|
|
38
|
-
│ ├─→ git log (获取提交列表)
|
|
39
|
-
│ └─→ git show (获取每个提交的 diff)
|
|
40
|
-
├─→ Diff 内容聚合
|
|
41
|
-
├─→ AI 分析提示构建
|
|
42
|
-
└─→ 返回结构化输出
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### 工作流程
|
|
46
|
-
|
|
47
|
-
```
|
|
48
|
-
1. 参数验证
|
|
49
|
-
├─ 检查日期参数是否提供
|
|
50
|
-
├─ 验证日期格式 (YYYY-MM-DD)
|
|
51
|
-
└─ 检查参数冲突
|
|
52
|
-
|
|
53
|
-
2. 获取提交列表
|
|
54
|
-
├─ 构建 git log 命令
|
|
55
|
-
├─ 执行命令获取提交哈希列表
|
|
56
|
-
└─ 处理无提交情况
|
|
57
|
-
|
|
58
|
-
3. 获取 Diff 内容
|
|
59
|
-
├─ 遍历提交哈希列表
|
|
60
|
-
├─ 对每个提交执行 git show
|
|
61
|
-
└─ 聚合所有 diff 内容
|
|
62
|
-
|
|
63
|
-
4. 构建 AI 分析提示
|
|
64
|
-
├─ 组装 diff 内容
|
|
65
|
-
├─ 添加分析要求
|
|
66
|
-
└─ 格式化输出指令
|
|
67
|
-
|
|
68
|
-
5. 返回结果
|
|
69
|
-
├─ 使用 formatResponse 格式化
|
|
70
|
-
├─ 可选:写入输出文件
|
|
71
|
-
└─ 返回给 MCP 客户端
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
## 数据模型
|
|
77
|
-
|
|
78
|
-
### 输入参数接口
|
|
79
|
-
|
|
80
|
-
```typescript
|
|
81
|
-
interface GitWorkReportArgs {
|
|
82
|
-
date?: string; // 单个日期 (YYYY-MM-DD)
|
|
83
|
-
start_date?: string; // 起始日期 (YYYY-MM-DD)
|
|
84
|
-
end_date?: string; // 结束日期 (YYYY-MM-DD)
|
|
85
|
-
output_file?: string; // 输出文件路径
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 内部数据结构
|
|
90
|
-
|
|
91
|
-
```typescript
|
|
92
|
-
interface CommitInfo {
|
|
93
|
-
hash: string; // 提交哈希
|
|
94
|
-
diff: string; // diff 内容
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
interface DateRange {
|
|
98
|
-
start: string; // 开始日期时间 (YYYY-MM-DD HH:mm:ss)
|
|
99
|
-
end: string; // 结束日期时间 (YYYY-MM-DD HH:mm:ss)
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## API 设计
|
|
106
|
-
|
|
107
|
-
### MCP 工具 Schema
|
|
108
|
-
|
|
109
|
-
```typescript
|
|
110
|
-
export const gitWorkReportSchema: Tool = {
|
|
111
|
-
name: "git_work_report",
|
|
112
|
-
description: `基于 Git diff 分析生成工作报告(日报/周期报)
|
|
113
|
-
|
|
114
|
-
核心功能:
|
|
115
|
-
- 支持日报模式(单个日期)和周期报模式(日期范围)
|
|
116
|
-
- 自动读取指定日期的所有 Git 提交
|
|
117
|
-
- 对每个提交执行 git show 获取完整 diff
|
|
118
|
-
- 使用 AI 分析 diff 内容提取实际工作内容
|
|
119
|
-
|
|
120
|
-
输出格式:
|
|
121
|
-
- 只输出「工作内容」部分
|
|
122
|
-
- 每条以 - 开头,中文,简洁专业
|
|
123
|
-
- 格式:做了什么 + 改了哪里/达到什么效果
|
|
124
|
-
- 不输出:提交哈希、文件列表、统计数据、风险总结
|
|
125
|
-
|
|
126
|
-
使用示例:
|
|
127
|
-
- 日报:git_work_report --date 2026-1-27
|
|
128
|
-
- 周期报:git_work_report --start_date 2026-2-1 --end_date 2026-2-6`,
|
|
129
|
-
inputSchema: {
|
|
130
|
-
type: "object",
|
|
131
|
-
properties: {
|
|
132
|
-
date: {
|
|
133
|
-
type: "string",
|
|
134
|
-
description: "单个日期,格式 YYYY-MM-DD(日报模式)",
|
|
135
|
-
},
|
|
136
|
-
start_date: {
|
|
137
|
-
type: "string",
|
|
138
|
-
description: "起始日期,格式 YYYY-MM-DD(周期报模式)",
|
|
139
|
-
},
|
|
140
|
-
end_date: {
|
|
141
|
-
type: "string",
|
|
142
|
-
description: "结束日期,格式 YYYY-MM-DD(周期报模式)",
|
|
143
|
-
},
|
|
144
|
-
output_file: {
|
|
145
|
-
type: "string",
|
|
146
|
-
description: "可选,输出文件路径",
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
};
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### 工具函数签名
|
|
154
|
-
|
|
155
|
-
```typescript
|
|
156
|
-
export async function gitWorkReport(
|
|
157
|
-
args: GitWorkReportArgs
|
|
158
|
-
): Promise<ToolResponse>
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## 文件结构
|
|
164
|
-
|
|
165
|
-
```
|
|
166
|
-
mcp-probe-kit/
|
|
167
|
-
├── src/
|
|
168
|
-
│ ├── tools/
|
|
169
|
-
│ │ ├── git_work_report.ts # 新增:工具实现
|
|
170
|
-
│ │ ├── index.ts # 修改:导出新工具
|
|
171
|
-
│ │ └── __tests__/
|
|
172
|
-
│ │ └── git_work_report.test.ts # 新增:单元测试
|
|
173
|
-
│ ├── schemas/
|
|
174
|
-
│ │ ├── git-tools.ts # 修改:添加 Schema
|
|
175
|
-
│ │ └── index.ts # 修改:导出 Schema
|
|
176
|
-
│ └── index.ts # 修改:注册工具路由
|
|
177
|
-
├── docs/
|
|
178
|
-
│ └── specs/
|
|
179
|
-
│ └── git-work-report/ # 新增:规格文档目录
|
|
180
|
-
│ ├── requirements.md
|
|
181
|
-
│ ├── design.md
|
|
182
|
-
│ └── tasks.md
|
|
183
|
-
└── README.md # 修改:更新工具列表
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## 返回格式说明
|
|
191
|
-
|
|
192
|
-
### 工具输出
|
|
193
|
-
|
|
194
|
-
`git_work_report` 作为原子工具,直接返回 text 格式的内容,而不是委托式执行计划(step)。
|
|
195
|
-
|
|
196
|
-
**返回内容:**
|
|
197
|
-
1. **有提交时**: 返回包含所有 diff 和分析要求的 AI 提示文本
|
|
198
|
-
2. **无提交时**: 返回 "- 当日无代码提交(Git 无 commit 记录)"
|
|
199
|
-
3. **错误时**: 返回错误信息
|
|
200
|
-
|
|
201
|
-
**示例输出(有提交):**
|
|
202
|
-
```
|
|
203
|
-
请分析以下 Git diff 内容,提取实际工作内容:
|
|
204
|
-
|
|
205
|
-
diff --git a/src/auth.ts b/src/auth.ts
|
|
206
|
-
+++ b/src/auth.ts
|
|
207
|
-
@@ -10,6 +10,12 @@
|
|
208
|
-
+export function validateToken(token: string) {
|
|
209
|
-
+ // JWT 验证逻辑
|
|
210
|
-
+}
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
diff --git a/src/api.ts b/src/api.ts
|
|
215
|
-
...
|
|
216
|
-
|
|
217
|
-
要求:
|
|
218
|
-
- 只输出「工作内容」部分
|
|
219
|
-
- 每条以 - 开头
|
|
220
|
-
- 中文,简洁专业,避免空话
|
|
221
|
-
- 格式:做了什么 + 改了哪里/达到什么效果
|
|
222
|
-
...
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
**AI 处理后的最终输出:**
|
|
226
|
-
```
|
|
227
|
-
- 实现了用户认证功能,添加了 JWT token 验证中间件,提升了 API 安全性
|
|
228
|
-
- 修复了订单列表分页bug,调整了 SQL 查询逻辑,解决了数据重复显示问题
|
|
229
|
-
- 优化了首页加载性能,使用懒加载技术,减少了 40% 的初始加载时间
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### 与编排工具的区别
|
|
233
|
-
|
|
234
|
-
| 特性 | 原子工具 (git_work_report) | 编排工具 (start_*) |
|
|
235
|
-
|------|---------------------------|-------------------|
|
|
236
|
-
| 返回格式 | text | structuredContent with plan |
|
|
237
|
-
| 执行方式 | 直接返回结果 | 返回执行计划,需要按步骤执行 |
|
|
238
|
-
| 用户体验 | 一次调用即可 | 需要多次工具调用 |
|
|
239
|
-
| 适用场景 | 单一功能 | 复杂工作流 |
|
|
240
|
-
|
|
241
|
-
---
|
|
242
|
-
|
|
243
|
-
## 核心实现
|
|
244
|
-
|
|
245
|
-
### 完整工作流程
|
|
246
|
-
|
|
247
|
-
```typescript
|
|
248
|
-
export async function gitWorkReport(args: GitWorkReportArgs) {
|
|
249
|
-
try {
|
|
250
|
-
// 1. 参数验证
|
|
251
|
-
validateArgs(args);
|
|
252
|
-
|
|
253
|
-
// 2. 构建日期范围(用户输入日期,内部转换为完整时间)
|
|
254
|
-
const dateRange = buildDateRange(args);
|
|
255
|
-
// 例如:date="2026-1-27" -> {start: "2026-1-27 00:00:00", end: "2026-1-27 23:59:59"}
|
|
256
|
-
|
|
257
|
-
// 3. 获取提交列表
|
|
258
|
-
const commitList = await getCommitList(dateRange);
|
|
259
|
-
|
|
260
|
-
if (commitList.length === 0) {
|
|
261
|
-
const message = "- 当日无代码提交(Git 无 commit 记录)";
|
|
262
|
-
|
|
263
|
-
if (args.output_file) {
|
|
264
|
-
await writeOutputFile(args.output_file, message);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
return formatResponse(message);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
// 4. 获取每个提交的 diff
|
|
271
|
-
const diffPromises = commitList.map(hash => getCommitDiff(hash));
|
|
272
|
-
const diffs = await Promise.all(diffPromises);
|
|
273
|
-
|
|
274
|
-
// 5. 构建 AI 分析提示
|
|
275
|
-
const analysisPrompt = buildAnalysisPrompt(diffs);
|
|
276
|
-
|
|
277
|
-
// 6. 可选:写入输出文件
|
|
278
|
-
if (args.output_file) {
|
|
279
|
-
await writeOutputFile(args.output_file, analysisPrompt);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// 7. 返回 AI 分析提示(MCP 客户端的 AI 会处理并生成最终报告)
|
|
283
|
-
return formatResponse(analysisPrompt);
|
|
284
|
-
|
|
285
|
-
} catch (error) {
|
|
286
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
287
|
-
return formatResponse(`错误: ${errorMessage}`, true);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
### 1. 参数验证
|
|
293
|
-
|
|
294
|
-
```typescript
|
|
295
|
-
function validateArgs(args: GitWorkReportArgs): void {
|
|
296
|
-
const isDaily = !!args.date;
|
|
297
|
-
const isPeriod = !!(args.start_date && args.end_date);
|
|
298
|
-
|
|
299
|
-
if (!isDaily && !isPeriod) {
|
|
300
|
-
throw new Error("请提供 date(日报)或 start_date + end_date(周期报)");
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
if (isDaily && isPeriod) {
|
|
304
|
-
throw new Error("不能同时使用日报和周期报模式");
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
// 验证日期格式
|
|
308
|
-
const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
|
|
309
|
-
if (args.date && !dateRegex.test(args.date)) {
|
|
310
|
-
throw new Error("日期格式错误,应为 YYYY-MM-DD");
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
if (isPeriod) {
|
|
314
|
-
if (!dateRegex.test(args.start_date!) || !dateRegex.test(args.end_date!)) {
|
|
315
|
-
throw new Error("日期格式错误,应为 YYYY-MM-DD");
|
|
316
|
-
}
|
|
317
|
-
if (args.start_date! > args.end_date!) {
|
|
318
|
-
throw new Error("结束日期不能早于开始日期");
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
### 2. 日期范围构建
|
|
325
|
-
|
|
326
|
-
```typescript
|
|
327
|
-
function buildDateRange(args: GitWorkReportArgs): DateRange {
|
|
328
|
-
if (args.date) {
|
|
329
|
-
// 日报模式:用户输入 "2026-1-27",转换为完整时间范围
|
|
330
|
-
return {
|
|
331
|
-
start: `${args.date} 00:00:00`,
|
|
332
|
-
end: `${args.date} 23:59:59`,
|
|
333
|
-
};
|
|
334
|
-
} else {
|
|
335
|
-
// 周期报模式:用户输入日期范围,转换为完整时间范围
|
|
336
|
-
return {
|
|
337
|
-
start: `${args.start_date} 00:00:00`,
|
|
338
|
-
end: `${args.end_date} 23:59:59`,
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
### 3. Git 命令执行
|
|
345
|
-
|
|
346
|
-
```typescript
|
|
347
|
-
import { exec } from "child_process";
|
|
348
|
-
import { promisify } from "util";
|
|
349
|
-
|
|
350
|
-
const execAsync = promisify(exec);
|
|
351
|
-
|
|
352
|
-
function buildDateRange(args: GitWorkReportArgs): DateRange {
|
|
353
|
-
if (args.date) {
|
|
354
|
-
// 日报模式:单个日期转换为完整时间范围
|
|
355
|
-
return {
|
|
356
|
-
start: `${args.date} 00:00:00`,
|
|
357
|
-
end: `${args.date} 23:59:59`,
|
|
358
|
-
};
|
|
359
|
-
} else {
|
|
360
|
-
// 周期报模式:日期范围转换为完整时间范围
|
|
361
|
-
return {
|
|
362
|
-
start: `${args.start_date} 00:00:00`,
|
|
363
|
-
end: `${args.end_date} 23:59:59`,
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
async function getCommitList(dateRange: DateRange): Promise<string[]> {
|
|
369
|
-
const gitCommand = `git log --since="${dateRange.start}" --until="${dateRange.end}" --format=%H`;
|
|
370
|
-
|
|
371
|
-
try {
|
|
372
|
-
const { stdout } = await execAsync(gitCommand);
|
|
373
|
-
return stdout.trim().split('\n').filter(Boolean);
|
|
374
|
-
} catch (error) {
|
|
375
|
-
throw new Error(`Git 命令执行失败: ${error.message}`);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
async function getCommitDiff(hash: string): Promise<string> {
|
|
380
|
-
try {
|
|
381
|
-
const { stdout } = await execAsync(`git show ${hash}`);
|
|
382
|
-
return stdout;
|
|
383
|
-
} catch (error) {
|
|
384
|
-
throw new Error(`获取提交 ${hash} 的 diff 失败: ${error.message}`);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
```
|
|
388
|
-
|
|
389
|
-
### 3. Git 命令执行
|
|
390
|
-
|
|
391
|
-
```typescript
|
|
392
|
-
async function getCommitList(dateRange: DateRange): Promise<string[]> {
|
|
393
|
-
// 使用完整时间范围查询
|
|
394
|
-
const gitCommand = `git log --since="${dateRange.start}" --until="${dateRange.end}" --format=%H`;
|
|
395
|
-
|
|
396
|
-
try {
|
|
397
|
-
const { stdout } = await execAsync(gitCommand);
|
|
398
|
-
return stdout.trim().split('\n').filter(Boolean);
|
|
399
|
-
} catch (error) {
|
|
400
|
-
throw new Error(`Git 命令执行失败: ${error.message}`);
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
async function getCommitDiff(hash: string): Promise<string> {
|
|
405
|
-
try {
|
|
406
|
-
const { stdout } = await execAsync(`git show ${hash}`);
|
|
407
|
-
return stdout;
|
|
408
|
-
} catch (error) {
|
|
409
|
-
throw new Error(`获取提交 ${hash} 的 diff 失败: ${error.message}`);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
### 4. AI 分析提示构建
|
|
415
|
-
|
|
416
|
-
```typescript
|
|
417
|
-
function buildAnalysisPrompt(diffs: string[]): string {
|
|
418
|
-
return `
|
|
419
|
-
请分析以下 Git diff 内容,提取实际工作内容:
|
|
420
|
-
|
|
421
|
-
${diffs.join('\n\n---\n\n')}
|
|
422
|
-
|
|
423
|
-
要求:
|
|
424
|
-
- 只输出「工作内容」部分
|
|
425
|
-
- 每条以 - 开头
|
|
426
|
-
- 中文,简洁专业,避免空话
|
|
427
|
-
- 格式:做了什么 + 改了哪里/达到什么效果
|
|
428
|
-
- 不输出:提交哈希、文件列表原文、统计数据、风险评估、总结段落
|
|
429
|
-
|
|
430
|
-
示例输出:
|
|
431
|
-
- 实现了用户认证功能,添加了 JWT token 验证中间件,提升了 API 安全性
|
|
432
|
-
- 修复了订单列表分页bug,调整了 SQL 查询逻辑,解决了数据重复显示问题
|
|
433
|
-
- 优化了首页加载性能,使用懒加载技术,减少了 40% 的初始加载时间
|
|
434
|
-
`;
|
|
435
|
-
}
|
|
436
|
-
```
|
|
437
|
-
|
|
438
|
-
### 4. AI 分析提示构建
|
|
439
|
-
|
|
440
|
-
```typescript
|
|
441
|
-
function buildAnalysisPrompt(diffs: string[]): string {
|
|
442
|
-
return `
|
|
443
|
-
请分析以下 Git diff 内容,提取实际工作内容:
|
|
444
|
-
|
|
445
|
-
${diffs.join('\n\n---\n\n')}
|
|
446
|
-
|
|
447
|
-
要求:
|
|
448
|
-
- 只输出「工作内容」部分
|
|
449
|
-
- 每条以 - 开头
|
|
450
|
-
- 中文,简洁专业,避免空话
|
|
451
|
-
- 格式:做了什么 + 改了哪里/达到什么效果
|
|
452
|
-
- 不输出:提交哈希、文件列表原文、统计数据、风险评估、总结段落
|
|
453
|
-
|
|
454
|
-
示例输出:
|
|
455
|
-
- 实现了用户认证功能,添加了 JWT token 验证中间件,提升了 API 安全性
|
|
456
|
-
- 修复了订单列表分页bug,调整了 SQL 查询逻辑,解决了数据重复显示问题
|
|
457
|
-
- 优化了首页加载性能,使用懒加载技术,减少了 40% 的初始加载时间
|
|
458
|
-
`;
|
|
459
|
-
}
|
|
460
|
-
```
|
|
461
|
-
|
|
462
|
-
### 5. 输出文件写入
|
|
463
|
-
|
|
464
|
-
```typescript
|
|
465
|
-
import { writeFile, mkdir } from "fs/promises";
|
|
466
|
-
import { dirname } from "path";
|
|
467
|
-
|
|
468
|
-
async function writeOutputFile(filePath: string, content: string): Promise<void> {
|
|
469
|
-
try {
|
|
470
|
-
// 确保目录存在
|
|
471
|
-
await mkdir(dirname(filePath), { recursive: true });
|
|
472
|
-
// 写入文件
|
|
473
|
-
await writeFile(filePath, content, 'utf-8');
|
|
474
|
-
} catch (error) {
|
|
475
|
-
throw new Error(`写入文件失败: ${error.message}`);
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
```
|
|
479
|
-
|
|
480
|
-
---
|
|
481
|
-
|
|
482
|
-
## 设计决策
|
|
483
|
-
|
|
484
|
-
### 决策 1: 使用 AI 分析而非规则提取
|
|
485
|
-
|
|
486
|
-
**问题**: 如何从 diff 内容中提取工作描述?
|
|
487
|
-
|
|
488
|
-
**选项**:
|
|
489
|
-
1. **规则匹配**: 使用正则表达式和关键词匹配提取
|
|
490
|
-
2. **AI 分析**: 将 diff 内容交给 AI 模型分析
|
|
491
|
-
|
|
492
|
-
**决策**: 选择 AI 分析
|
|
493
|
-
|
|
494
|
-
**理由**:
|
|
495
|
-
- diff 内容复杂多样,规则难以覆盖所有情况
|
|
496
|
-
- AI 能理解代码语义,生成更准确的描述
|
|
497
|
-
- 符合 MCP Probe Kit 的 AI 驱动理念
|
|
498
|
-
- 用户可以通过 AI 模型获得更自然的语言输出
|
|
499
|
-
|
|
500
|
-
### 决策 2: 返回格式 - 直接返回 AI 分析提示
|
|
501
|
-
|
|
502
|
-
**问题**: 工具应该返回什么格式的内容?
|
|
503
|
-
|
|
504
|
-
**选项**:
|
|
505
|
-
1. **返回 text**: 返回包含 diff 和分析要求的提示文本,由 AI 生成最终报告
|
|
506
|
-
2. **返回 step**: 返回委托式执行计划,需要用户再执行步骤
|
|
507
|
-
|
|
508
|
-
**决策**: 选择返回 text
|
|
509
|
-
|
|
510
|
-
**理由**:
|
|
511
|
-
- 这是原子工具,不是编排工具(`start_*`)
|
|
512
|
-
- 用户期望直接获得报告,不需要额外步骤
|
|
513
|
-
- 符合项目中其他基础工具的模式(如 `gencommit`、`code_review`)
|
|
514
|
-
- step 模式仅适用于需要多步骤编排的 `start_*` 工具
|
|
515
|
-
|
|
516
|
-
### 决策 3: 不在工具内直接调用 AI
|
|
517
|
-
|
|
518
|
-
**问题**: 工具是否应该直接调用 AI 模型?
|
|
519
|
-
|
|
520
|
-
**选项**:
|
|
521
|
-
1. **工具内调用**: 在工具中集成 AI SDK,直接生成报告
|
|
522
|
-
2. **返回提示**: 返回分析提示,由 MCP 客户端的 AI 处理
|
|
523
|
-
|
|
524
|
-
**决策**: 选择返回提示
|
|
525
|
-
|
|
526
|
-
**理由**:
|
|
527
|
-
- 保持工具轻量,不引入额外的 AI SDK 依赖
|
|
528
|
-
- 利用 MCP 客户端已有的 AI 能力
|
|
529
|
-
- 用户可以根据需要调整 AI 模型和参数
|
|
530
|
-
- 符合 MCP 协议的设计理念
|
|
531
|
-
|
|
532
|
-
### 决策 3: 日期时间范围处理
|
|
533
|
-
|
|
534
|
-
**问题**: 如何处理日期参数的时间范围?
|
|
535
|
-
|
|
536
|
-
**选项**:
|
|
537
|
-
1. **仅日期**: 使用 `--since=2026-1-27 --until=2026-1-27`
|
|
538
|
-
2. **完整时间**: 使用 `--since="2026-1-27 00:00:00" --until="2026-1-27 23:59:59"`
|
|
539
|
-
|
|
540
|
-
**决策**: 选择完整时间
|
|
541
|
-
|
|
542
|
-
**理由**:
|
|
543
|
-
- 确保覆盖整个日期的所有提交(00:00:00 到 23:59:59)
|
|
544
|
-
- 避免时区问题导致的遗漏
|
|
545
|
-
- Git 命令支持完整时间格式
|
|
546
|
-
- 用户输入简洁(只需日期),内部自动转换为完整时间范围
|
|
547
|
-
|
|
548
|
-
---
|
|
549
|
-
|
|
550
|
-
## 风险评估
|
|
551
|
-
|
|
552
|
-
| 风险 | 影响 | 缓解措施 |
|
|
553
|
-
|------|------|----------|
|
|
554
|
-
| Git 命令执行失败 | 高 | 完善错误处理,提供清晰的错误信息 |
|
|
555
|
-
| 大量提交导致性能问题 | 中 | 限制最大提交数量,提供进度提示 |
|
|
556
|
-
| Diff 内容过大 | 中 | 限制单个 diff 的大小,超过则截断 |
|
|
557
|
-
| 日期格式不一致 | 低 | 严格验证日期格式,提供示例 |
|
|
558
|
-
| 输出文件路径无效 | 低 | 自动创建目录,验证路径合法性 |
|
|
559
|
-
|
|
560
|
-
---
|
|
561
|
-
|
|
562
|
-
## 检查清单
|
|
563
|
-
|
|
564
|
-
- [x] 技术方案与现有架构一致
|
|
565
|
-
- [x] 数据模型与接口定义清晰
|
|
566
|
-
- [x] 关键设计决策已记录
|
|
567
|
-
- [x] 风险评估完整
|
|
568
|
-
- [x] 错误处理方案明确
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
# 需求文档:git-work-report
|
|
2
|
-
|
|
3
|
-
## 功能概述
|
|
4
|
-
|
|
5
|
-
开发一个基于 Git diff 分析的工作报告生成工具,支持生成日报和周期报(周报、月报等)。该工具通过分析 Git 提交的实际代码变更(diff),而非仅依赖 commit message,智能提取实际工作内容,生成简洁专业的中文工作报告。
|
|
6
|
-
|
|
7
|
-
**核心价值:**
|
|
8
|
-
- 自动化日报/周报生成,节省手动整理时间
|
|
9
|
-
- 基于实际代码变更分析,内容更准确
|
|
10
|
-
- 输出格式统一规范,便于汇报和存档
|
|
11
|
-
|
|
12
|
-
## 术语定义
|
|
13
|
-
|
|
14
|
-
- **日报模式**: 生成单个日期的工作报告
|
|
15
|
-
- **周期报模式**: 生成指定日期范围的工作报告(如周报、月报)
|
|
16
|
-
- **Git diff**: Git 提交中的代码变更内容
|
|
17
|
-
- **工作内容**: 从代码变更中提取的实际开发工作描述
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## 需求列表
|
|
22
|
-
|
|
23
|
-
### 需求 1: 日报生成
|
|
24
|
-
|
|
25
|
-
**用户故事:** 作为开发者,我想要生成指定日期的工作日报,以便快速汇报当天的工作内容。
|
|
26
|
-
|
|
27
|
-
#### 验收标准
|
|
28
|
-
|
|
29
|
-
1. WHEN 用户提供单个日期参数(如 `--date 2026-1-27`)THEN 系统 SHALL 读取该日期的所有 Git 提交
|
|
30
|
-
2. WHEN 该日期有提交记录 THEN 系统 SHALL 对每个提交执行 `git show` 获取完整 diff
|
|
31
|
-
3. WHEN 该日期无提交记录 THEN 系统 SHALL 输出 "- 当日无代码提交(Git 无 commit 记录)"
|
|
32
|
-
4. WHEN 分析完成 THEN 系统 SHALL 输出符合格式要求的工作内容列表
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
### 需求 2: 周期报生成
|
|
37
|
-
|
|
38
|
-
**用户故事:** 作为开发者,我想要生成指定日期范围的工作报告,以便汇总一段时间的工作内容(如周报、月报)。
|
|
39
|
-
|
|
40
|
-
#### 验收标准
|
|
41
|
-
|
|
42
|
-
1. WHEN 用户提供日期范围参数(如 `--start_date 2026-2-1 --end_date 2026-2-6`)THEN 系统 SHALL 读取该范围内的所有 Git 提交
|
|
43
|
-
2. WHEN 日期范围内有提交记录 THEN 系统 SHALL 对每个提交执行 `git show` 获取完整 diff
|
|
44
|
-
3. WHEN 日期范围内无提交记录 THEN 系统 SHALL 输出 "- 当日无代码提交(Git 无 commit 记录)"
|
|
45
|
-
4. WHEN 分析完成 THEN 系统 SHALL 输出符合格式要求的工作内容列表
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
### 需求 3: Diff 内容分析
|
|
50
|
-
|
|
51
|
-
**用户故事:** 作为开发者,我想要工具分析实际的代码变更内容,以便生成准确的工作描述。
|
|
52
|
-
|
|
53
|
-
#### 验收标准
|
|
54
|
-
|
|
55
|
-
1. WHEN 获取到提交的 diff 内容 THEN 系统 SHALL 使用 AI 分析代码变更
|
|
56
|
-
2. WHEN 分析 diff THEN 系统 SHALL 识别实际的功能变更、Bug 修复、重构等工作类型
|
|
57
|
-
3. WHEN 提取工作内容 THEN 系统 SHALL 忽略提交哈希、文件列表、统计数据等元信息
|
|
58
|
-
4. WHEN 生成描述 THEN 系统 SHALL 使用"做了什么 + 改了哪里/达到什么效果"的格式
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
### 需求 4: 输出格式规范
|
|
63
|
-
|
|
64
|
-
**用户故事:** 作为开发者,我想要工具输出统一规范的报告格式,以便直接用于汇报。
|
|
65
|
-
|
|
66
|
-
#### 验收标准
|
|
67
|
-
|
|
68
|
-
1. WHEN 输出工作内容 THEN 系统 SHALL 只输出「工作内容」部分,无其他章节
|
|
69
|
-
2. WHEN 输出每条内容 THEN 系统 SHALL 以 "- " 开头
|
|
70
|
-
3. WHEN 生成描述 THEN 系统 SHALL 使用中文,简洁专业,避免空话
|
|
71
|
-
4. WHEN 输出报告 THEN 系统 SHALL NOT 包含提交哈希、文件列表原文、统计数据、风险评估、总结段落
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
### 需求 5: 参数验证
|
|
76
|
-
|
|
77
|
-
**用户故事:** 作为开发者,我想要工具验证输入参数,以便及时发现使用错误。
|
|
78
|
-
|
|
79
|
-
#### 验收标准
|
|
80
|
-
|
|
81
|
-
1. WHEN 用户未提供日期参数 THEN 系统 SHALL 提示错误信息
|
|
82
|
-
2. WHEN 用户同时提供 `date` 和 `start_date/end_date` THEN 系统 SHALL 提示参数冲突
|
|
83
|
-
3. WHEN 用户提供的日期格式不正确 THEN 系统 SHALL 提示日期格式错误
|
|
84
|
-
4. IF 周期报模式下结束日期早于开始日期 THEN 系统 SHALL 提示日期范围错误
|
|
85
|
-
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
### 需求 6: 输出文件支持
|
|
89
|
-
|
|
90
|
-
**用户故事:** 作为开发者,我想要将报告保存到文件,以便存档和分享。
|
|
91
|
-
|
|
92
|
-
#### 验收标准
|
|
93
|
-
|
|
94
|
-
1. WHEN 用户提供 `--output_file` 参数 THEN 系统 SHALL 将报告写入指定文件
|
|
95
|
-
2. WHEN 输出文件已存在 THEN 系统 SHALL 覆盖原文件
|
|
96
|
-
3. WHEN 输出文件路径不存在 THEN 系统 SHALL 创建必要的目录
|
|
97
|
-
4. WHEN 写入文件失败 THEN 系统 SHALL 提示错误信息
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## 非功能需求
|
|
102
|
-
|
|
103
|
-
### 性能要求
|
|
104
|
-
- 单次报告生成时间应在 30 秒内完成(假设提交数量 < 50)
|
|
105
|
-
- 支持处理最多 100 个提交的日期范围
|
|
106
|
-
|
|
107
|
-
### 安全要求
|
|
108
|
-
- 不应泄露敏感信息(如密码、密钥)到报告中
|
|
109
|
-
- 执行 Git 命令时应防止命令注入
|
|
110
|
-
|
|
111
|
-
### 兼容性要求
|
|
112
|
-
- 支持 Git 2.0+ 版本
|
|
113
|
-
- 支持 Windows、macOS、Linux 操作系统
|
|
114
|
-
- 与 MCP Probe Kit 现有工具架构兼容
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## 依赖关系
|
|
119
|
-
|
|
120
|
-
- 依赖 Git 命令行工具(需要在系统中安装)
|
|
121
|
-
- 依赖 Node.js child_process 模块执行 Git 命令
|
|
122
|
-
- 依赖 AI 模型进行 diff 内容分析(通过 MCP 协议)
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
## 检查清单
|
|
127
|
-
|
|
128
|
-
- [x] 需求覆盖核心场景与边界场景
|
|
129
|
-
- [x] 验收标准使用 EARS 格式
|
|
130
|
-
- [x] 非功能需求明确
|
|
131
|
-
- [x] 依赖关系完整
|