Community生产力与协作github.com

priscilarwagner/meeting-digest

消化指定日期的所有会议——以日历为真实来源,从配置的会议笔记来源获取内容。提取决策、行动事项和阻碍,将结构化笔记写入 Context/Meeting Notes/。

meeting-digest 是什么?

该技能用于自动消化每日会议,从日历获取会议列表,从配置的笔记来源(如原始笔记、文档附件、日历事件描述)获取内容,并生成结构化摘要,包括摘要、决策、行动事项和待定问题。它支持通过步骤调用角色操作(如 `calendar.*`、`docs.*`、`files.*`),并读取 `Context/agent-config.md` 中的配置(如时区、基础目录、排除规则)以及 `GOALS.md` 和 `Context/Memory/brain.md` 以增强上下文理解。输出文件保存为 Markdown 格式,并自动添加 Obsidian 的 `[[wiki-links]]`。该技能还支持将决策更新到 PRD 文档的决策日志中,并提供聊天内汇总。它适用于 Claude Code 等 AI Agent 平台,确保会议笔记的完整性和可追溯性。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/priscilarwagner/pmshipping/tree/HEAD/.claude/skills/meeting-digest

Installed? Explore more 生产力与协作 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

会议摘要

工具: 步骤调用角色操作(pm.*、email.*、calendar.*、docs.*、files.*、comms.*)。通过 Context/agent-config.md → 工具栈 及其指定的适配器(.claude/adapters/README.md)解析每个操作。角色设为 none 则跳过该步骤。

获取指定日期的所有会议,查找每个会议的笔记或转录,生成结构化摘要,并保存在本地。目标日期默认为今天;传入 "yesterday" 则处理前一天。

配置

在开始时读取 Context/agent-config.md。使用以下配置项:

  • timezone — 用于所有日期计算
  • base_directory — 用于文件路径构建和幂等性检查
  • calendar_exclusions — 要跳过的会议标题模式列表
  • 工具栈 → 会议笔记 — 会议内容的来源

读取目标文件(路径在 agent-config 中),用于在第 4 步识别项目和里程碑名称。


说明

按顺序运行所有步骤。除非明确告知暂停,否则不要在步骤之间请求确认。


第 1 步 — 获取目标日期的所有未摘要会议

阶段 A — 日历:获取会议列表

  1. 在用户的时区中计算目标日期。默认 = 今天;如果用户传入了 "yesterday",则减去一天。

  2. calendar.events(目标日期开始, 目标日期结束)(在用户的时区中)。

  3. 过滤为仅真实会议。 移除满足以下条件的事件:

    • summary 匹配 calendar_exclusions 中的某个模式
    • 是专注时间或工作地点块
    • attendees 列表为空或仅包含用户(单人块)
  4. 按时间顺序排序(最早的在前)。这是要处理的会议的有序列表。

阶段 B — 幂等性检查

对于每个会议:

  1. 推导预期的笔记文件名:YYYY-MM-DD - [会议名称].md,使用日历事件的 summary。清理名称:将 /、\、: 和 | 替换为 -,去除表情符号,合并重复空格。
  2. 检查 [base_directory]/Context/Meeting Notes/ 中是否已存在该名称的文件。
  3. 如果存在且已有 ## Summary 部分 → 跳过该会议。输出:"[会议名称] 的笔记已存在 — 跳过。"
  4. 如果存在但为原始笔记(无 ## Summary)→ 将其内容用作来源并继续。
  5. 如果不存在 → 进入阶段 C。

阶段 C — 查找会议内容

按此顺序检查来源,使用第一个有内容的:

  1. 原始笔记文件 — 来自阶段 B 第 4 步。
  2. 已配置的来源 — agent-config 中的每个条目 → 会议笔记来源,按顺序排列。常见的有:
    • 日历附件 — 附加到事件的笔记文档 → 使用其文件 ID 调用 files.read。"未找到"表示未与用户共享 — 静默跳过
    • docs.meeting_notes(日期) — 按标题或时间窗口(±30 分钟)匹配;通过 docs.read 读取
  3. 日历事件描述 — 仅当包含实际笔记时才使用,而不是仅议程或视频链接。
  4. 询问用户 — 将仍未获取到内容的会议列在一条消息中:"未找到以下会议的笔记:[列表]。粘贴任何希望摘要的会议的笔记或转录,或输入跳过。"

如果某个会议仍无内容 → 标记为 "无可用笔记" 并跳过。

阶段 D — 报告

处理完所有会议后,报告:

  • 已摘要的数量
  • 跳过的数量(附原因:已存在 / 无笔记)

第 2 步 — 读取上下文

在处理任何笔记内容之前,读取:

  • GOALS.md — 了解当前项目和目标
  • Context/Memory/brain.md — 了解用户的思维方式、词汇以及他们对决策与讨论的区分

第 3 步 — 分析笔记内容

对于每个有内容的会议,提取四项内容:

A. 摘要 2–3 句话。结果优先:会议内容是什么,关键结果或转变是什么。不是讨论话题的列表——而是一个连贯的结果陈述。使用用户的语气:直接,无努力框架,以结果开头。

B. 决策 明确改变了方向、确定了某些事项或解决了未决问题的承诺。只有真正的决策——不是建议,不是可能性。格式:做了什么决定,谁做的(如可归因)。

C. 行动事项 具有指定负责人的具体后续步骤。对每个事项应用以下逻辑:

  • 如果笔记高度确信指定了特定人为负责人 → 分配给他们
  • 如果所有权不明确或共享 → 分配给用户
  • 仅在会议中明确提到了项目管理事项或项目时(通过键、名称或清晰引用)才包含。不要推断或猜测——如果未提及,则项目列留空(—)
  • 如果会议中提到了建议截止日期则注明,否则留空

D. 待定问题 / 阻碍 未解决的问题、提出的阻碍或推迟到未来会议讨论的话题。这些仅放入笔记文件中。


第 4 步 — 项目引用

仅在会议中明确提到了事项键或项目名称时才记录——通过键(例如 ENG-123)、名称(例如“入职改版里程碑”)或明确引用。

不要根据会议上下文推断、查找或猜测项目。空着比分配错误的好。


第 5 步 — 写入会议笔记文件

将摘要保存到 Context/Meeting Notes/,文件名格式为: YYYY-MM-DD - [会议名称].md

使用日历事件的 summary 作为会议名称。

文件格式:

# [会议名称]
*[YYYY-MM-DD] | [时长(如有)] | [来自日历的参会者(如有)]*

## 摘要
[2–3 句结果优先的摘要。发生了什么以及改变了什么。]

## 决策
- [决策 1 — 如已知谁做出的]
- [决策 2]

## 行动事项
| # | 任务 | 负责人 | 项目 | 截止日期 |
|---|------|-------|------|----------|
| 1 | [任务描述] | [姓名 / 我] | [项目名称 (KEY-123) 或 —] | [日期 或 —] |
| 2 | ... | ... | ... | ... |

## 待定问题与阻碍
- [问题或阻碍 — 未解决的问题及其重要性]

## 上下文
[任何来自会议的背景、链接或框架,对未来参考有用。最多保留 3–5 条。]

如果来源是原始笔记(阶段 B 第 4 步),则将其保留在底部的 ## 原始笔记 部分下——永远不要删除用户的笔记。

在保存之前,为笔记添加 [[wiki-links]] 以实现 Obsidian 图谱连接:

  • 所有提名的个人 → [[姓名]]
  • 所有事项键 → [[KEY-123]]
  • 关键概念、项目和跨笔记重复出现的主题 → [[概念]]
  • 仅链接有意义的提及——不是每个单词,不在代码块或 URL 内部

向用户确认:"会议笔记已保存到 Context/Meeting Notes/[文件名].md"


第 6 步 — 接触点联动

保存后:

  1. 检查本次会议的任何决策或阻碍是否与 Tasks/ 中的开放任务相关——如果是,则内联注明。
  2. 如果提出的阻碍已经存在于 GOALS.md 中作为已知阻碍,则标记:"此阻碍([名称])也曾在 [先前上下文] 中被提出。考虑它是否为系统性问题。"
  3. 如果会议是与某位有文档在 Context/121s/ 中的指定人员进行的定期一对一会议,则在其文档中追加一条会议记录条目:日期、1 行摘要、新增的任何开放循环。

会议笔记包含个人数据,不应提交或推送。


第 7 步 — 在聊天中显示摘要

在本地保存所有笔记后,显示当天摘要的整体汇总。

结构:会议 → 主题 → 每个主题下的决策 + 行动。

📝 **会议摘要完成 — [YYYY-MM-DD]** | [N] 已摘要 | [N] 已跳过

*[会议名称]*
  [主题 / 目标或里程碑]
    决策
      - [决策]
      - [决策]
    行动事项
      - [任务] → [负责人] [截止日期(如已知)]

  [主题 2]
    决策
      - [决策]
    行动事项
      - [任务] → [负责人]

笔记已保存到 `Context/Meeting Notes/`

分组规则:

  • 第一级:会议名称
  • 第二级:该会议中讨论的主题、目标或里程碑——使用纯名称,绝不使用裸事项键
  • 第三级:决策和行动事项作为每个主题下的标量子部分
  • 如果某个主题没有决策,则省略决策子部分。如果没有行动事项,则省略行动事项子部分。
  • 如果会议只有一个主题,仍显示主题名称——不要折叠
  • 在聊天摘要中省略行动事项中的项目列——它只应存在于笔记文件中

第 8 步 — 提供决策日志更新

仅当在所有摘要会议中提取了至少一个决策时才执行此步骤。

在一次消息中询问:

"是否要将这些决策中的任何一个记录到 PRD 的决策日志中?

今天的决策:

[会议名称] [主题] 1. [决策] 2. [决策]

如果是,请告诉我哪个文档(Context/Document Hub/ 中的本地文件或 docs 工具中的页面)以及要添加哪些决策编号。"

跨所有会议按顺序编号决策,以便用户可以通过编号引用。

等待用户响应。

  • 如果不 / 跳过:结束技能。
  • 如果是:对他们指定的每个文档执行以下步骤。

对于每个提供的文档:

A. 获取文档

  • 本地文件 → 读取。
  • Docs 工具页面 → docs.read。

B. 定位决策日志

扫描标题包含 "Decision Log"、"Decisions Log" 或 "Decisions"(不区分大小写)的部分。

  • 如果存在包含表格的决策日志部分:将新行追加到其中。
  • 如果存在决策日志部分但无表格:在标题下立即插入表格。
  • 如果没有决策日志部分:在文档底部插入新的 ## Decision Log 部分和表格。

C. 构建行

对于用户选择的每个决策,创建一行表格:

| [YYYY-MM-DD] | [决策文本] | [状态] |
  • 日期:会议日期。
  • 决策:来自摘要的确切文本——不要转述。
  • 状态:如果明确且最终则为 Decided。如果文本包含 "TBD"、"to be confirmed"、"pending"、"waiting on" 或标记为未解决,则为 Pending。

如果表格尚不存在,先用以下表头行创建:

| 日期 | 决策 | 备注/状态 |
|-----|------|-----------|

D. 预览,然后更新

显示要添加的行。对于本地文件,直接写入。对于 docs 工具页面,等待用户明确确认,然后 docs.update(引用, "Decision Log", 行)——仅更改该部分。

E. 确认

"决策日志已更新至 [文档标题] — 已添加 [N] 条决策。"


边缘情况

  • 未找到决策:写入 "未做出任何决策——讨论/更新会议。" 不要捏造决策。
  • 未找到行动事项:写入 "无行动事项。"
  • 会议是站会或小于 5 分钟:仍然运行摘要,但摘要保持 1 句话。
  • 多个笔记匹配同一事件:使用最接近事件开始时间的笔记。
  • 来源不可用:静默跳过并转到阶段 C 中的下一个来源。
  • Docs 页面未找到(第 8 步):报告错误,要求用户再次检查 URL,并提供重试。
  • 决策日志部分不明确(第 8 步):如果多个标题可能匹配(例如 "Key Decisions" 和 "Decision Log"),显示两者并询问追加到哪个。
  • 重复决策(第 8 步):在插入前,扫描现有行。如果相同决策文本已存在,跳过并注明跳过。

相关技能