# Cw Workspace Briefing

> 生成坚果云工作台每日任务简报。使用 workspace.jianguoyun.com 的 WebMCP 工具拉取今日待办，两级过滤（1月+非系统提醒），检测 @mention，紧急度评分，输出带超链接的 Markdown 简报。当用户说"今日简报""每日任务""任务简报""坚果云简报""今天的任务"时触发。

- Skill: `nutstore/cw-workspace-briefing` (Agent Skill)
- Install (CLI): `npx skillmds@latest add nutstore/cw-workspace-briefing`
- Raw SKILL.md: https://api.skillmd.com/api/skills/nutstore/cw-workspace-briefing/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: nutstore (https://skillmd.com/u/nutstore)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/nutstore/cw-workspace-briefing

---

# 坚果云工作台每日任务简报
使用 workspace.jianguoyun.com WebMCP 工具生成今日任务简报。
## 核心数据源
| 工具 | 用途 | 优先级 |
|------|------|--------|
| `get_today_todos` | 今日待办任务列表 | **主数据源** |
| `get_unread_messages` | 未读消息（检测新的 @mention） | 辅助 |
| `get_recent_updates` | 最近更新任务 | 辅助 |
## 执行流程
```
① get_today_todos (page_size=50)
   ↓
② 两级过滤
   ↓
③ fetch_ticket_timeline × N (message_count=200, 只对保留项)
   ↓
④ Python: 时间戳解析 → 过滤今日消息 → @mention 检测 → 评分
   ↓
⑤ 生成 Markdown 简报（含摘要、行动建议、紧急度）
   ↓
⑥ 如适用，询问用户是否代发消息 → message_send_text
```
## 两级过滤规则
```
Level 1: update_time > 1个月前           ← 过滤真正僵尸任务
Level 2: latest_msg_type ≠ "SystemMessage" ← 过滤仅靠系统提醒续命的旧任务
```
⚠️ 只靠 Level 1 不够——「工作台小助手」的系统提醒会虚增 `update_time`。
应用的逻辑：只对两级过滤后**保留**的任务拉取时间线，避免浪费请求。
## 当前用户
从 `MEMORY.md` 或对话上下文获取当前用户信息。需提取以下字段用于 @mention 检测和消息发送：
- **用户 ID**：`MEMORY.md` 中的 `AaBbCcDd1234...` 格式 base64 字符串
- **昵称**：`MEMORY.md` 中的 `nickname:` 或中文显示名

示例值（纯 mock）：
- 用户 ID: `AbCdEf1234567890abcdef1234567890abcdef12=`
- 昵称: `张三`

## @mention 检测
使用当前用户的 ID 和昵称进行匹配。两种格式都要检测：
1. **GeneralMessage HTML**: `<span data-type="MentionNode" data-id="<USER_ID>" data-display-name="<NICKNAME>">`
2. **GeneralMessage plain text**: `[@~<USER_ID>]`
SystemMessage 中的 `[@~id=]` 不计入真人 @mention（那是系统提醒）。
## 今日消息过滤
在 Python 中计算今日起始时间戳（CST, UTC+8）：
```python
from datetime import datetime, timezone, timedelta
cst = timezone(timedelta(hours=8))
today_start = int(datetime.now(cst).replace(hour=0, minute=0, second=0, microsecond=0).timestamp())
```
只统计 `message.time >= today_start` 的消息。
## 紧急度评分
| 条件 | 加分 | 说明 |
|------|------|------|
| 今日有新消息 | +3 | 消息时间戳在今日范围内 |
| 真人 @mention 当前用户 | +3 | GeneralMessage 中检测到 MentionNode 指向当前用户 |
| 你是 handler | +2 | `handler_user_id` == 当前用户 ID |
| 系统催促 ≥ 3 次 | +1 | SystemMessage 中"近期没有更新"次数 |
| 推迟已到期 | +3 | 最新 SystemMessage 为"推迟已到期"且到期日 ≤ 今天 |
| 评分 | 等级 |
|------|------|
| ≥ 6 | 🔴 紧急 |
| 3-5 | 🟡 需要关注 |
| < 3 | 🟢 例行跟进 |
## 信号展示格式
每条信号独立成行，全中文、带 emoji，不用英文缩略语：
| 含义 | 展示格式 |
|------|----------|
| 你是处理人 | 👤 你是处理人 |
| 推迟已到期 | ⏰ 推迟已到期 |
| 今日有新消息 | 🆕 今日有新消息 |
| 真人 @了你 | 💬 张三、李四 @了你 |
| 系统多次催促 | 🔔 系统已催促 N 次 |
| 近期有讨论 | 📨 近期有讨论 |
## URL 拼接规则
`ticket_id` 和 `msg_id` 从 `fetch_ticket_timeline` 返回值获取：
- **任务链接**: `https://workspace.jianguoyun.com/task/tickets/{ticket_id}`
- **消息链接**: `https://workspace.jianguoyun.com/task/tickets/{ticket_id}?msgId={msg_id}`
## 简报输出模板
### 整体结构
```markdown
# 📊 今日任务简报 — YYYY-MM-DD (周X)
> 过滤规则: 1个月内 + 非系统提醒 | 原始 N 条 → M 条 真实活跃
## 🔴 紧急
[每个紧急任务一条，含标题链接、评分、信号、摘要、行动建议]
## 🟡 需要关注
[同上]
## 🟢 例行跟进 (K 条)
| # | 任务 | 行动建议 |
|---|------|----------|
| N | [{subject}]({ticket_url}) | {1 句话行动建议} |
---
### 📬 可代发消息
[如有任务需要你在群聊中发声推进，列出拟发送的消息，询问用户是否发送]
```
### 单条任务模板
```markdown
### [#{public_id} {subject}]({ticket_url})
**评分: X/12** | 更新: {update_date}
👤 你是处理人 · ⏰ 推迟已到期（{expire_date}）
💬 {mentioner_names} @了你
🆕 今日有新消息
> **摘要**：{2-4 句话的中文摘要，描述最近动态和关键进展}
> 🎯 **行动建议**：{必填！具体可执行的下一步行动，分析阻塞点并给出明确指令}
```
## 行动建议与卡点分析（每条任务必填）

每条任务都必须包含一段行动建议，以 `> 🎯 **行动建议**:` 开头。

### 分析维度
阅读任务时间线的全部消息后，从以下维度分析：

| 维度 | 问自己 | 信号 |
|------|--------|------|
| **阻塞点** | 任务卡在哪里？ | 最后一条消息是谁发的？是否有未回复的问题？ |
| **责任人** | 下一步该谁动？ | 你在等别人回复，还是别人在等你动手？ |
| **时效性** | 是否已过期/即将过期？ | 推迟到期日、创建日期距今多久 |
| **可行动性** | 你能做什么？ | 是代码修复、排查日志、回复确认、还是协调他人？ |

### 常见模式与建议模板

| 模式 | 特征 | 行动建议模板 |
|------|------|-------------|
| **等你动手** | 别人已提供信息/确认，等你执行 | `尽快处理：{具体做什么}。已有 {谁} 提供了 {什么信息}，可以开始执行。` |
| **等别人回复** | 你已提问/请求，对方未回 | `需要催促 {谁} 回复关于 {什么问题}。如超过{X}天未回，可考虑升级或自行决策。` |
| **长期静默** | 超过2周无任何更新 | `任务已停滞 {X} 天。建议：①确认是否仍需处理；②如需处理，明确下一步并@相关人；③如已不重要，可关闭。` |
| **系统反复催促** | 被催促 ≥ 3 次 | `已被系统催促 {X} 次，需排优先级。如无法近期处理，建议标记推迟并写明原因。` |
| **技术排查中** | 有日志/调试/部署类讨论 | `继续跟进 {排查方向}。关注 {什么指标/日志}，确认后回复 {谁}。` |
| **等待外部条件** | 等部署、等日志、等第三方 | `当前阻塞于 {外部条件}。预计 {何时} 可就绪。就绪后需 {做什么}。` |
| **决策待定** | 讨论方案但未定论 | `需要推动决策：{方案A vs 方案B}。建议 {你的倾向}，@相关人确认。` |

### 输出格式
每条任务摘要后紧接着行动建议，不可以省略：

```markdown
> **摘要**：{2-4 句话描述最近动态，提到关键人名和具体事件}
> 🎯 **行动建议**：{具体、可执行的下一步行动，1-2 句话}
```

**摘要要点**：根据 `fetch_ticket_timeline` 返回的消息内容直接用中文生成。覆盖最近动态，提到关键人名和具体事件（如"张三将任务移交给你"）。

### 注意事项
- 建议必须**具体可执行**，不要说"继续跟进"这种空话，要说明跟进什么
- 如果任务实际上是别人在等你，明确指出
- 对于长期静默任务，给出明确的「关闭 or 推进」二选一建议，不要模棱两可
- 如果任务有多人参与讨论但无定论，建议推动决策而非继续讨论

### 代发消息

如果行动建议涉及需要你在任务群聊中发声推进，**在简报末尾询问用户是否需要代发消息**。使用 `message_send_text` 工具。

**触发条件**：行动建议涉及需要你在任务群聊中发声推进的任何场景（催促回复、确认状态、推动决策等）。

**工具参数**：
| 参数 | 必填 | 说明 |
|------|------|------|
| `data` | ✅ | 消息正文，可以是纯文本，也支持 JSON: `{"content":"...","content_type":"plain"}` |
| `public_id` | ✅（群聊时） | 任务数字 ID（从 `get_today_todos` 返回的 ticket 对象或 `fetch_ticket_timeline` 响应中提取），如 `"123456"`。本 skill 只用 `public_id` 发到任务群聊；`nickname`/`email` 用于私信场景，此处不用 |

**交互流程**：
```
简报输出完毕
  ↓
询问用户：「需要我帮你在以下任务中发送消息吗？」
  - 列出可代发的任务和拟发送的消息内容
  - 用户选择要发送的任务（可多选）
  - 依次调用 message_send_text 发送
```

**消息内容要求**：
- 以当前用户的口吻（即你的口吻），用中文自然语言
- 简洁直接，说明当前状况和需要对方做什么
- 示例：「@李四 这个任务上次讨论的方案A vs 方案B，你这边倾向哪个？我们定一下方向我好推进。」

## 时间戳转换
所有时间戳为 Unix 秒，转 CST 需 +8 小时：
```python
dt = datetime.fromtimestamp(ts, tz=timezone.utc) + timedelta(hours=8)
```

