- MCP Server 新增 GET/SSE 端点,Claude Code 原生 MCP 打通 - 项目导师面板显示复盘笔记覆盖率统计与缺口提醒 - usage.json 快照新增 complexity_dist、rework_count 等扩展字段 - 独立项目自动创建产品组并注入 MCP - 新增 retro-catchup 技能用于批量补写历史复盘笔记 - 补全飞轮存量函数单元测试 - NewProjectModal 支持更灵活的模板参数配置
130 lines
5.0 KiB
Markdown
130 lines
5.0 KiB
Markdown
---
|
||
name: retro-catchup
|
||
description: 为项目中所有已完成但缺少复盘笔记的 M/L 任务卡补写历史复盘笔记,并通过 MCP append_project_note 写入炼境。Use when a project has completed M/L tasks but zero or few retrospective notes.
|
||
allowed-tools: Read, Glob, Grep, Bash(git log *), Bash(git diff *), Bash(python *), Bash(python3 *), mcp__lian*
|
||
---
|
||
|
||
# 复盘笔记补写(Retro Catch-Up)
|
||
|
||
为已完成的 M/L 任务卡补写事后重建版复盘笔记,推动飞轮数据积累。
|
||
|
||
> ⚠️ 这些笔记是**事后重建**,基于任务卡内容 + git 历史推断,比实时记录精度低。但对识别高频模式仍然有价值。
|
||
|
||
## 写入通道(三级降级)
|
||
|
||
每次调用 `append_project_note` 时,按以下顺序尝试,成功即停止:
|
||
|
||
**① 原生 MCP**:若 `append_project_note` 工具可用,直接调用。
|
||
|
||
**② Python HTTP 直调**:若原生 MCP 不可用(Claude Code 与炼境握手失败的已知问题),读取项目 `.claude/settings.json`,提取 group_id,用 Python 直接 POST 炼境 API:
|
||
|
||
```python
|
||
import urllib.request, json, sys
|
||
|
||
# 从 .claude/settings.json 提取 group_id
|
||
with open('.claude/settings.json') as f:
|
||
cfg = json.load(f)
|
||
group_id = None
|
||
for key in cfg.get('mcpServers', {}):
|
||
if key.startswith('lian-jing:group-'):
|
||
group_id = key.split('lian-jing:group-')[1]
|
||
break
|
||
|
||
# project_id 通过先调用 list_group_projects 获得
|
||
url = f'http://localhost:27190/mcp/group/{group_id}'
|
||
|
||
def mcp_call(method, params={}):
|
||
payload = json.dumps({'jsonrpc':'2.0','id':1,'method':method,'params':params}).encode()
|
||
req = urllib.request.Request(url, data=payload, method='POST')
|
||
req.add_header('Content-Type', 'application/json')
|
||
req.add_header('Accept', 'application/json')
|
||
with urllib.request.urlopen(req, timeout=10) as r:
|
||
return json.loads(r.read().decode('utf-8', errors='replace'))
|
||
|
||
# 调用示例
|
||
result = mcp_call('tools/call', {
|
||
'name': 'append_project_note',
|
||
'arguments': {'project_id': PROJECT_ID, 'content': NOTE_CONTENT}
|
||
})
|
||
```
|
||
|
||
**③ 本地文件兜底**:若炼境未运行(连接超时),将所有笔记追加写入 `.blueprint/retro-notes.md`,格式与正式笔记相同,头部加注 `<!-- 待炼境恢复后手动同步 -->`。
|
||
|
||
## 步骤
|
||
|
||
### 1. 确认写入通道 + 项目 ID
|
||
|
||
按以下顺序确定:
|
||
|
||
1. 检测 `append_project_note` 是否在可用工具中 → 是则用**通道①**
|
||
2. 否则检测 `localhost:27190` 是否可达(`curl -s --max-time 2 http://localhost:27190` 或 Python urlopen)→ 可达则用**通道②**,同时读取 `.claude/settings.json` 提取 `group_id`,再调用 `list_group_projects` 获取当前项目 `project_id`
|
||
3. 均不可达 → 用**通道③**,无需 project_id
|
||
|
||
告知用户当前使用哪个通道,例如:`使用通道②(Python HTTP 直调)`。
|
||
|
||
### 2. 扫描所有已完成 M/L 任务卡
|
||
|
||
遍历 `.blueprint/modules/*.md`,收集满足以下条件的任务卡:
|
||
- 前缀为 ✅(status: done)
|
||
- complexity 为 `M` 或 `L`
|
||
|
||
输出扫描结果:共找到 N 张,列出标题 + 所属模块。
|
||
|
||
### 3. 逐卡重建复盘笔记
|
||
|
||
对每张任务卡按顺序处理:
|
||
|
||
**3a. 读取证据**
|
||
- 读取任务卡的 `files` 字段列出的所有文件(当前代码状态)
|
||
- 执行 `git log --oneline -- <file>` 查看相关文件的提交历史
|
||
- 若提交数 > 1,执行 `git diff <first_commit>^..<last_commit> -- <file>` 了解变更量
|
||
|
||
**3b. 推断执行情况**
|
||
根据证据推断:
|
||
- **实际轮数**:相关文件的提交次数(粗估)
|
||
- **是否返工**:若同一文件有多次修改且 message 含 fix/修复/重新/又 等关键词
|
||
- **返工原因**:从 commit message 或代码变更中推断
|
||
- **有效策略**:从最终实现方式中提取关键设计决策
|
||
|
||
**3c. 写入笔记**
|
||
|
||
按步骤 1 确定的通道调用 `append_project_note`,内容格式:
|
||
|
||
```
|
||
【复盘·重建】<任务标题>
|
||
任务类型: 后端命令 | 前端组件 | 数据层 | MCP工具 | 架构调整
|
||
复杂度: M | L
|
||
实际轮数: N轮(事后推断,基于 git 提交数)
|
||
是否返工: 是/否/不确定
|
||
返工原因: <若返工,从 commit message 推断>
|
||
有效策略: <从最终实现中提取的关键做法>
|
||
遗留风险: <若代码中有明显 TODO 或边界情况未处理>
|
||
备注: 此笔记为事后重建,非实时记录
|
||
```
|
||
|
||
每写完一张,告知用户"✅ 已写入:<任务标题>"。
|
||
|
||
### 4. 输出汇总
|
||
|
||
```
|
||
## 复盘补写完成
|
||
|
||
共处理 N 张 M/L 任务卡:
|
||
- ✅ 成功写入:X 张
|
||
- ⏭️ 跳过(无足够证据):Y 张
|
||
|
||
飞轮状态:累计复盘笔记 Z 条
|
||
```
|
||
|
||
## 跳过条件
|
||
|
||
以下情况跳过该任务卡,不强行写入:
|
||
- `files` 字段为空,且 git 中找不到相关提交
|
||
- 任务卡内容过于简单(S 级错标为 M 的情况)
|
||
|
||
## 原则
|
||
|
||
- 笔记头部必须标注 `【复盘·重建】` 与 `备注: 此笔记为事后重建`,与实时笔记区分
|
||
- 宁可跳过,不要捏造。证据不足时注明"信息不足,无法推断"
|
||
- 每张卡独立处理,写入失败不影响后续
|