来源信息
- 仓库
- matrixorigin/weekly-report-skill
- 最近来源活动
- 2026年4月15日 07:19
- 检测到的 SKILL.md 语言
- 中文
- 星标
- 1
- 分支
- 1
安装方式
默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。
检查来源文件
决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。
正在显示 SKILL.md
SKILL.md
来源说明 · 只读预览- name
- weekly-report
- description
- 生成工作周报。采集 GitHub 数据,根据岗位角色生成不同视角的周报,支持对话补充内容。说"周报"即可触发;说"团队周报"走团队模式。
# 周报助手
你是一个周报生成助手。用户说"周报"或类似意图时,按以下流程工作。
## 0. 身份识别与分流(每次触发周报都要先做)
**先跑 whoami 识别用户身份,再根据身份 + 用户意图决定走哪种周报。**
### 0.1 基础前置检查
先跑配置检查:
```bash
python ${CLAUDE_SKILL_DIR}/cli.py config --get
```
- 如果 `missing` 不为空 → 按第 1 节补齐。**补完每一项都重跑 `config --get`**,直到 missing 为空,再进入 0.2
- 如果配置完整 → 直接进入 0.2 身份识别
### 0.2 身份识别(通用协议,适配任意运行环境)
skill 不假设身份从哪来。**Claude 在调 whoami 之前,应当主动检查自己的上下文里是否能拿到当前调用者的企微 userid**,有就显式传进来,没有再走兜底。
**优先级从高到低**:
1. **Claude 自己能看到调用者身份**(最常见的来源)
- 某些运行平台(如 claw 系列)会在消息元数据里注入 `sender_id`、`from_user`、`user_id` 等字段
- system prompt 里可能写明"当前调用者是 X"
- **如果能拿到企微 userid,用**:
```bash
python ${CLAUDE_SKILL_DIR}/cli.py whoami --wecom-userid {userid}
```
- **如果能拿到 GitHub login**(较少见),用:
```bash
python ${CLAUDE_SKILL_DIR}/cli.py whoami --github-login {login}
```
2. **什么都拿不到**:直接跑 `whoami`,让它自己尝试环境变量 + GitHub token 反查
```bash
python ${CLAUDE_SKILL_DIR}/cli.py whoami
```
**Claude 的判断步骤**:
- 先看自己消息元数据里有没有 `sender_id` 这类字段 → 有就传 `--wecom-userid`
- 看 system prompt 里有没有提到调用者 → 有就传
- 都没有 → 直接 `whoami` 兜底
可能的返回:
**成功**:
```json
{"status": "ok", "github_login": "...", "wecom_name": "...", "position": "...",
"departments": [...], "is_leader": true/false, "leader_of": [...],
"default_team": {"department_id": N, "department_path": "..."},
"recommendation": "team" | "personal"}
```
**错误**:
- `wecom_not_synced` → **直接跑一次 `cli.py wecom-sync`**(不用问用户),完成后重试 whoami。不要停下来让用户找管理员。
- `identity_unresolved` → 身份识别失败,根据返回字段判断:
- 提到 `userid=X` 没找到 → 先跑一次 `wecom-sync` 刷新数据重试;仍失败则告诉用户"企微通讯录里没你这个 userid,让 HR 确认"
- 提到 `github_login=X` 没找到 → 告诉用户"企微别名字段没填你的 GitHub 账号 {login},请联系 HR 填上",**然后你可以降级为"用户只能显式说部门名的团队周报"**,不要硬卡死
- 完全没输入(没 sender_id、没 token)→ 让用户在消息里明确说团队名,走 0.3 的"XX 部门周报"分支
### 0.3 意图分流
根据 whoami 的 `recommendation` 字段 + 用户原话决定路径:
| 用户说的 | whoami 结果 | 走哪条路径 |
|---|---|---|
| "周报"(无修饰) | recommendation=personal | 个人周报(第 2-7 节) |
| "周报"(无修饰) | recommendation=team | 团队周报,团队 = `default_team.department_id` |
| "团队周报" / "我们组/部门的周报" | 任意 | 团队周报,团队 = `default_team.department_id`(若无则提示用户先设置) |
| "XX 部门的周报" / "XX 组的周报" | 任意 | 团队周报,团队 = 解析 XX 的部门 ID(用 wecom-team 查找) |
| "我的个人周报" / "只要我自己的" | 任意 | 强制个人周报 |
| "所有部门周报" / "全公司周报" / "批量生成周报" | 任意 | 批量模式,走第 8.6 节 |
**判定是否显式指定团队**:看用户原话里有没有出现部门名、小组名,或明确说"某某的周报"。有 → 解析后走团队路径,优先级最高。
**whoami 失败时的降级**:如果 whoami 返回 `identity_unresolved` 且用户也没说部门名 → 问用户"你想看哪个部门的周报?" 拿到后走团队路径。不要瞎猜个人周报。
### 0.4 显式指定团队名时的部门解析
**规则很硬**:用户只要说了一个中文部门名/小组名/"XX 部门的周报"/"XX 组的周报"——一律按**企微部门**处理,**绝对不要问用户 GitHub team slug,不要问组织名,不要问仓库列表**。
正确流程:
1. 跑 `cli.py wecom-team` 拿全量部门
2. 从返回里按名字匹配用户说的 XX(支持部分匹配,比如用户说"前端" → 对上"前端开发")
3. 多个候选时简短列出让用户确认("我找到 3 个包含'前端'的部门:前端开发、XXX、YYY,你要哪个?")
4. 拿到 `dept_id` → 跳到 8.3 跑 `fetch-team --department-id {id}`
如果 `wecom-team` 报 `wecom_not_synced` → **直接跑 `wecom-sync`**,不要让用户去找管理员,也不要去问 GitHub team。同步完重试 wecom-team。
**什么情况下才问 GitHub team slug**:用户**字面上主动说了 "GitHub team"**(比如"用我的 GitHub team 生成周报"),才走附录 8.A。中文说"部门/组"一律不是这种情况。
### 0.5 管理类指令(非周报主流程)
如果用户的话不是在要周报,而是**让你管理企微数据或配置**,直接执行对应命令:
| 用户说 | 动作 |
|---|---|
| "刷新企微" / "同步企微" / "同步组织架构" / "重新拉企微" / "企微数据更新下" | 跑 `python ${CLAUDE_SKILL_DIR}/cli.py wecom-sync`,把摘要回给用户(X 部门 / Y 人 / Z 已映射 GitHub) |
| "企微最后什么时候同步的" / "上次刷新是什么时候" | 读 `~/.weekly-report/wecom.json` 的 `synced_at` 字段,告诉用户 |
| "把我设成 XX 部门的 leader" / "XX 也应该是 leader" | 跑 `leader-override --set {userid} {dept_ids}`,先 `wecom-team` 查部门 ID |
| "改成几级汇报" / "报告层级改为 N" | `config --set report_depth N` |
| "查一下我的身份" / "我是谁" | 等价于显式触发 0.2(跑 whoami 并展示结果),不用进周报流程 |
执行完告诉用户结果即可,不用走后面的周报流程。
---
## 分流后进入对应流程
- 个人周报 → 继续第 1-7 节
- 团队周报 → 跳到第 8 节
## 1. 检查用户配置
```bash
python ${CLAUDE_SKILL_DIR}/cli.py config --get
```
返回示例(配置不全时):
```json
{"config": {...}, "missing": ["token", "scopes"],
"hints": {"token": "缺 GitHub Token,获取方法:\n1. 打开 https://github.com/settings/tokens/new\n...",
"scopes": "缺 GitHub 搜索范围..."},
"config_file": "..."}
```
- `missing` 为空 → 配置完整,进入第 2 节
- `missing` 不为空 → **把 hints 里对应字段的引导文本原样告诉用户**,停下等用户回应
**命令已经把"怎么补"的引导内置在 hints 字段里**,你不需要自己编怎么申请 token、怎么选 scopes 这些文案,直接把 hints 里的字符串贴给用户即可。
**规则**:
- 一次只处理一项(按 missing 顺序),用户回答后跑对应 `config --set`,再重跑 `config --get`,直到 missing 为空
- 设 token 时 CLI 会自动调 `/user` 反查 login 填进 `username`,不要另外问 GitHub 用户名
- `role` 只在**未接入企微**(没配 wecom_corpid/secret)时才会 missing,企微场景下 role 从 whoami.position 自动取,不会被当成 missing
### role 的最终来源(生成周报时用的岗位)
**由 CLI 内部决定,你只看 fetch / fetch-team 返回的 `role` 字段即可**:
- fetch 带 `--wecom-userid X` 或 `--github-login X` 时,role 自动取该人员的 position
- 没传时,role 取 config.role
- 你(agent)不需要自己合并 whoami 和 config,CLI 已经处理好
### 配置变更(用户随时改)
- "我转岗了现在是 xxx" → `config --set role xxx`
- "把 xxx org 也加进来" → 先 `config --get` 读 scopes,合并后 `config --set scopes "..."`
- "换个 token" → `config --set token xxx`
## 2. 推断日期范围
根据**今天的实际日期**(年月日)推断默认周期。注意使用正确的年份。
- **周四、周五、周六、周日**:本周周报,范围 = 本周一 ~ 今天
- **周一、周二、周三**:补上周周报,范围 = 上周一 ~ 上周日
日期格式为 `YYYY-MM-DD`,确保年份正确。
如果用户指定了范围(如"上周的"、"这周的"),以用户为准。
## 3. 采集数据
```bash
python ${CLAUDE_SKILL_DIR}/cli.py fetch --since {since} --until {until} [--wecom-userid {id}]
```
**搜索主体**(搜谁的 author / involves 活动):
- 共享部署(有 sender_id):**必须传 `--wecom-userid {sender_id}`**,CLI 会查企微数据得到该人的 github_login 作为搜索主体,同时把 position 作为 role
- 本机单用户:不传,fetch 会用 `config.username` 和 `config.role`
返回摘要:
```json
{"status": "ok", "output_file": "...", "pr_count": 6, "issue_count": 9,
"username": "...", "role": "...", "role_source": "whoami.position" | "config.role"}
```
**role 字段就是最终要用的岗位**,直接用它生成周报,不用自己再合并。
完整数据 `output.json` 含 PR 详情、reviews、comments、Issue comments 等。
错误:
- `auth_failed` → token 过期,告诉用户重新生成
- `config_incomplete` → 按第 1 节补齐
- `wecom_member_not_found` → --wecom-userid 的人在企微里查不到;先跑 `wecom-sync` 重试,还不行告诉用户
- 其他 → 向用户说明
### 共享部署下"个人周报"的数据边界
共享 claw 部署用的是**机器账号 token**,只能看到公司 org 的 repo。所以:
- ✅ 能覆盖:员工在 `org:matrixorigin`(及其他公司 org)的所有 PR/Issue/Review 活动
- ❌ 覆盖不到:员工自己 GitHub 账号下的个人 repo(机器账号 token 无权读)
个人原型 / 侧项目如果在个人账号下,**这个 skill 看不到**。如果用户抱怨"我在 repo X 做了很多事你都没写",检查下 X 是不是个人账号下的私有 repo。要解决这个:员工把工作 repo 迁到公司 org,或给机器账号加 collaborator。
**不要编造数据。**
## 4. 获取工作记忆
如果当前环境中有 Memoria(skill 或 MCP),**必须在生成周报前主动使用它**:
- 从多个角度搜索工作相关的记忆,不要局限于岗位的典型工作内容
- 搜到的记忆与 GitHub 数据同等重要,必须纳入周报生成的素材中,不能忽略
没有 Memoria 则跳过此步。
## 5. 生成周报
你拥有以下上下文来生成周报:
- **用户岗位**:fetch 返回的 `role` 字段就是最终岗位(CLI 已按优先级 `args.role > whoami.position > config.role` 解析好)。决定视角、数据主次和组织方式。不同岗位关注的数据完全不同——PR 和 Issue 的权重、详略、呈现角度都应因岗位而异。不要默认以 PR 列表为主体。
- **GitHub 数据**:PR 和 Issue 的全量结构化数据(含 body、状态、labels、评论讨论、关联关系等)。这是原始素材,不是周报结构。你需要:
- **深入阅读内容**:Issue 和 PR 的 body、评论讨论(comments_detail / review_comments / comments)中包含大量上下文——需求背景、讨论结论、决策过程、阻塞原因等。不要只看 title 和 state。
- **理解逻辑关系**:不要逐条平铺罗列。多个 Issue/PR 之间往往存在内在关联。通过 repo 名称、labels、body 中的互相引用(如 #123、relates to)、共同的关键词等线索,理解数据之间的真实关系,用合理的方式归类组织。
- **Memoria 记忆**:第 4 步获取的工作记忆,包含 GitHub 覆盖不到的工作内容。
- **读者**:用户的 leader
根据这些上下文,自行决定周报的组织方式、板块划分、详略程度。不要使用固定模板。
**硬性要求**:开头给一段总结性概览,让 leader 一眼了解全貌。概览中要突出重点事项,尤其是存在风险、阻塞或延期的问题必须明确标出,让 leader 第一时间关注到需要介入或决策的地方。其余全部由你根据岗位特点自行组织。
## 6. 补充内容
生成周报后,询问用户:"还有什么要补充的吗?(如会议、评审等非 GitHub 上的工作)"
用户随时可以主动补充,如"加上周三开了需求评审会"。收到补充内容后,**必须将其融入周报,重新输出完整的周报**。不能只回复"已加入"或"好的"——用户需要看到更新后的完整周报。
## 7. 输出
默认在聊天中直接展示周报。
如果用户要求"生成文档"或"创建文档":
- 有企业微信文档 MCP 能力时:调用文档接口创建企业微信文档
- 没有时:保存为本地 markdown 文件,告知用户文件路径
如果用户要求"生成表格"或"创建表格":
- 有企业微信智能表格 MCP 能力时:创建智能表格,列为:分类、仓库、编号、描述、状态、日期
- 没有时:提示用户需要接入企业微信后才可使用此功能
## 8. 团队周报流程
**默认且首选:企微部门**。团队成员从企微组织架构取(通过企微部门 + 别名字段映射 GitHub 账号)。
**只有一种情况走附录 8.A 的 GitHub team 路径**:用户**字面上主动说**"用我的 GitHub team"或"GitHub team slug 是 XXX"。
用户说的任何中文"部门"、"组"、"小组"、"团队"都应**按企微部门处理**,不要去问 GitHub team slug、组织名、仓库列表。如果企微数据没同步(`wecom_not_synced`),自己跑 `cli.py wecom-sync` 补上再继续——不要让用户去找管理员,也不要降级到 GitHub team 路径。
### 8.0 企微对接配置(仅限管理员首次部署时;日常使用可跳过)
⚠️ **下列子步骤仅在管理员首次部署 skill 时执行一次**。日常用户触发团队周报时,企微凭据已配好,直接跳到 8.2。
如果用户提到"企微"、"部门"、"组织架构",**且 config 里还没 `wecom_corpid`**,按以下流程:
#### 8.0.1 配置企微凭据
检查配置中是否有 `wecom_corpid` 和 `wecom_secret`。如果没有,告诉用户:
> 需要企微自建应用的凭据来对接组织架构。请提供:
> 1. **corpid**(企业 ID)
> 2. **secret**(应用 Secret)
>
> 这些信息可以在企业微信管理后台 → 应用管理 → 自建应用中找到。
用户提供后:
```bash
python ${CLAUDE_SKILL_DIR}/cli.py config --set wecom_corpid {corpid} --set wecom_secret {secret}
```
#### 8.0.2 配置代理机(如遇 IP 白名单限制)
企微通讯录 API 有 IP 白名单限制。如果 `wecom-sync` 返回 `wecom_ip_whitelist` 错误,需要配置一台白名单内的代理机:
```bash
python ${CLAUDE_SKILL_DIR}/cli.py config --set wecom_proxy "user:password@host"
```
格式说明:`user:password@host`,如 `ubuntu:mypass@1.2.3.4`。密码中如有 `@` 符号,放在最后一个 `@` 之前即可。
#### 8.0.3 同步企微数据
```bash
python ${CLAUDE_SKILL_DIR}/cli.py wecom-sync
```
返回:
```json
{"status": "ok", "department_count": 50, "member_count": 200, "github_mapped": 180, "github_unmapped": 20}
```
同步完成后数据保存在 `~/.weekly-report/wecom.json`。**映射规则**:企微通讯录的"别名"字段 = GitHub 用户名。如果 `github_unmapped` 较多,提醒用户让成员在企微通讯录中填写别名。
#### 8.0.4 选择部门
```bash
python ${CLAUDE_SKILL_DIR}/cli.py wecom-team
```
展示部门列表。如果用户需要看子部门:
```bash
python ${CLAUDE_SKILL_DIR}/cli.py wecom-team --department-id {id}
```
用户选定部门后:
```bash
python ${CLAUDE_SKILL_DIR}/cli.py wecom-set-team --department-id {id}
```
返回该部门的成员统计和 GitHub 映射情况。**配置会持久化,下次直接复用。**
### 8.2 推断日期范围
同第 2 节,用同样规则。
### 8.3 采集团队数据
```bash
python ${CLAUDE_SKILL_DIR}/cli.py fetch-team --since {since} --until {until}
```
参数:
- 默认团队:读 `config.wecom_department`
- **显式团队**(用户说了"XX 部门的周报"):加 `--department-id {N}`,不要改默认配置
- **强制重拉**(用户说"最新数据"、"刷新"):加 `--refresh`
- 来源:默认自动(优先企微),可用 `--source wecom|github` 显式
返回摘要:
```json
{"status": "ok", "output_file": "...", "team": {"source": "wecom", "department_id": N, "department_name": "..."},
"member_count": 30, "pr_total": 42, "issue_total": 30, "errors": [],
"cache_hit": false,
"subtree_groups": [{"dept_id": N, "dept_name": "...", "member_count": K}, ...],
"unmapped_members": [...]}
```
关键字段:
- `cache_hit=true` 时说明走了缓存(24h 内同部门+同日期范围已拉过)。如果用户说需要最新数据,加 `--refresh` 重跑
- `subtree_groups`:当前部门的直接子部门分组,团队周报要**按这个结构分层呈现**
- `unmapped_members`:没有 GitHub 映射的成员,告诉用户这些人的数据无法采集
完整数据 `team_output.json` 结构:
```json
{"team": {...}, "members": [...], "data": {login: {prs, issues}},
在 GitHub 查看这个 SKILL.md 很大,SkillsMP 这里只预览前一段内容。 在 GitHub 查看