# Progress Reporter

> 读取 code-tape 项目 progress.md，结合项目时间规划、技术模块拆解和工作流程，将 GitHub ID 映射为同学姓名，生成带上下文的进展报告并发送到飞书群聊。

- Skill: `ceilf6/progress-reporter` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add ceilf6/progress-reporter`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ceilf6/progress-reporter/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ceilf6 (https://skillmd.com/u/ceilf6)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ceilf6/progress-reporter

---


# Progress Reporter

将 `docs/progress.md` 中的团队进展数据转换为带项目上下文的中文报告，发送到飞书群聊。

## 触发词

"发送进展"、"进度报告"、"群发进度"、"send progress"、"发到群聊"、"汇报进展"

## 工作流程

### 1. 读取进展数据

读取以下文件（均相对于项目根目录 `Desktop/code-tape`）：
- `docs/progress.md` — 积分与任务数据（自动生成）
- `docs/项目时间规划.md` — 阶段划分与里程碑
- `docs/技术模块拆解.md` — 技术模块与优先级
- `references/name-mapping.md` — GitHub ID 映射表

使用 `gh issue list` 获取全部 Issue（含状态、认领人、label），用于生成完整任务列表：
```bash
gh issue list --limit 50 --state all --json number,title,state,assignees,labels
```

### 2. 映射 GitHub ID → 姓名

使用 `references/name-mapping.md` 中的映射表，将 GitHub 用户名替换为中文姓名。未在映射表中的 GitHub ID 保持原样。

### 3. 判断当前阶段

根据 `docs/项目时间规划.md` 的时间规划和当前日期，判断团队处于哪个阶段：

| 阶段 | 时间 | 关键词 |
| --- | --- | --- |
| 阶段一：技术方案与高风险 PoC | 5/24 前 | 技术方案、事件模型、录制包格式、关键 PoC |
| 阶段二：P0 录制链路 | 5/28 前 | 编辑器、操作录制、音视频录制、录制总控 |
| 阶段三：P0 回放链路 | 6/1 前 | 回放调度、倍速、seek、同步展示 |
| 阶段四：加分项最小展示 | 6/2 前 | 多语言、AI 字幕、WebRTC |
| 阶段五：联调冻结与 Demo | 6/3 | 验收、演示、兜底 |

同时识别最近的里程碑检查点：
- 5/24：技术方案冻结
- 5/28：录制链路打通
- 6/1：回放链路打通
- 6/2：加分项最小展示
- 6/3：Demo 交付（DDL）

### 4. 检查进度是否落后

根据当前日期和里程碑时间节点，判断进度是否落后：

| 里程碑 | 截止日期 | 检查方式 |
| --- | --- | --- |
| 技术方案冻结 | 5/24 | 阶段一调研 Issue 是否全部关闭 |
| 录制链路打通 | 5/28 | P0 录制相关 Issue 是否全部关闭 |
| 回放链路打通 | 6/1 | P0 回放相关 Issue 是否全部关闭 |
| 加分项最小展示 | 6/2 | 加分项 Issue 是否有可展示结果 |
| Demo 交付 | 6/3 | 全部 P0 是否完成 |

判断规则：
- 当前日期已超过某里程碑日期，且对应任务未全部完成 → 输出警告：`⚠ 落后：{里程碑名称}（{截止日期}）未达成，{未完成任务列表}`
- 当前日期距里程碑不足 1 天，且对应任务完成度低于 50% → 输出提醒：`⏳ 临近：{里程碑名称}（{截止日期}）即将到来，当前完成度不足`
- 进度正常 → 不显示任何警告

警告插入位置：在"近期里程碑"行之后，单独一行显示。

### 5. 识别当前任务对应的技术模块

根据 Issue 标题中的关键词，匹配 `docs/技术模块拆解.md` 中的模块：

- 含"编辑器"/"Monaco"/"CodeMirror"/"语法" → 代码编辑器模块（P0）
- 含"录制"/"事件"/"操作"/"鼠标"/"快捷键"/"光标"/"选区" → 操作录制模块（P0）
- 含"音频"/"麦克风"/"摄像头"/"Media" → 音视频录制模块（P0）
- 含"总控"/"状态机"/"录制包" → 录制总控模块（P0）
- 含"回放"/"播放"/"seek"/"倍速" → 回放模块（P0）
- 含"UI"/"主题"/"布局" → UI 与交互模块（P1）
- 含"云端"/"上传"/"列表" → 云端回放中心（P1）
- 含"WebRTC"/"实时"/"面试" → WebRTC 实时面试模块（P1+）
- 含"字幕"/"AI"/"Whisper" → AI 字幕模块（P1+）
- 含"调研"/"方案"/"PoC"/"选型" → 阶段一调研类任务
- 含"沙箱"/"执行"/"运行" → 代码执行/展示沙箱（P0/P1）

未匹配的 Issue 不标注模块。

### 6. 生成格式化报告

#### 报告模板

```
<at user_id="all">所有人</at>

# code-tape 进展
更新时间：{北京时间}

当前阶段：{阶段名称}（不显示日期，除非落后）
近期里程碑：{最近检查点}（不显示日期，除非落后）
{进度落后时在里程碑行后插入警告行，警告中需包含截止日期}

## 每人当前任务

- {姓名}：[#N](链接) {标题}（{模块名称}）
- {姓名}：暂无任务

待认领：{未认领的任务列表，格式为 #N 标题，逗号分隔}

## 最近动态

- {时间} — {描述}（{涉及人员及分数变化}）

```

格式要求：
- 不使用 emoji 图标
- 各段落之间空一行分隔
- 消息开头用 `<at user_id="all">所有人</at>` 全员提醒（飞书 text 消息的 @mention 格式），与正文之间空一行
- 时间转换为北京时间（+8），格式 `MM-DD HH:mm`
- 分数只在非零时显示，总分为 0 时可省略该行或只显示姓名
- 没有当前任务时显示"暂无"
- 没有流水时显示"暂无"
- 未映射的 GitHub ID 原样保留
- Issue/PR 编号使用 Markdown 超链接，格式为 `[#N](https://github.com/ceilf6/code-tape/issues/N)` 或 `[#N](https://github.com/ceilf6/code-tape/pull/N)`
- 排除总控 Issue：没有 `score:*` label 的 Issue（如 #2 PRD 拆解总控、#3 竞品调研总控）属于元任务/跟踪 Issue，不出现在任务列表中
- 当前任务：按人分组，每人一行，有任务显示任务链接，无任务显示“暂无任务”
- 未认领的可认领任务单独列出，标题为“待认领”
- 模块名称用括号标注在标题后
- 积分总览部分默认省略，如用户需要再单独展示


### 7. 发送到飞书群聊

由于 session visibility 限制，从私聊 session 无法直接 `sessions_send` 到群聊 session。需要通过 `sessions_spawn` 派出子任务发送：

1. 使用 `sessions_spawn` 创建子任务，task 中包含目标 session key 和完整报告内容
2. 子任务内部用 `sessions_send` 发送到群聊 session
3. 使用 `sessions_yield` 等待子任务完成

目标群聊 session key：`feishu:group:oc_029e808c7d757020aace7c0f4d46fad6`

如果用户未指定目标群聊，询问用户提供群聊的 chat_id（格式 `oc_xxx`）。

发送时直接使用报告文本作为 message 内容，无需额外包装。

## 注意事项

- `progress.md` 由 GitHub Actions 自动生成，格式固定，无需容错处理
- 报告语言为中文
- 分数为 0 的字段在报告中省略，保持简洁
- 更新时间使用 progress.md 中的原始 UTC 时间转换
- 阶段判断和模块匹配基于关键词，若有歧义可人工确认

