diff --git a/release/md-todo-extractor.zip b/release/md-todo-extractor.zip new file mode 100644 index 0000000..14c1f85 Binary files /dev/null and b/release/md-todo-extractor.zip differ diff --git a/release/obsidian-plugin.html b/release/obsidian-plugin.html index b49b56f..29cdb8c 100644 --- a/release/obsidian-plugin.html +++ b/release/obsidian-plugin.html @@ -3,7 +3,7 @@ -SonicNote Sync — Obsidian 插件 +SonicNote for Obsidian — 插件 & Skills
-
v1.1.4
-

SonicNote Sync

-

将 SonicNote 妙记的录音、转录、总结同步到 Obsidian,以 Markdown 文件管理。

- - - 下载插件 - +
+ v1.1.4 + Obsidian 插件 + 2 个 Skills +
+

SonicNote for Obsidian

+

录音同步、待办提取、工作总结 — 让 Obsidian 成为你的智能笔记中心

+
+ + + SonicNote Sync 插件 + + + + MD 待办提取器 + + + + 工作总结生成器 + +
+ + + + + + +
+ +
+

🔌 SonicNote Sync 插件

+

将 SonicNote 妙记的录音、转录、AI 总结同步到 Obsidian,以 Markdown 文件管理。每条录音对应一个文件,包含完整的元数据和内容。

+ +
+
+
录音同步
+
一键拉取全部录音,自动生成 Markdown
+
+
+
AI 转录
+
含说话人识别和时间戳的逐字转录
+
+
+
智能总结
+
AI 自动生成的要点和行动项
+
+
+
自定义属性
+
灵活配置 Frontmatter 字段
+
+
+
+

更新记录

v1.1.4

@@ -158,14 +351,13 @@

v1.1.2

v1.1.0

@@ -210,7 +402,7 @@
  1. 进入 设置 → SonicNote Sync
  2. 点击"登录"按钮
  3. -
  4. 输入 SonicNote 妙记的手机号和密码(使用 APP 验证码或者申领长期密码)
  5. +
  6. 输入 SonicNote 妙记的手机号和密码(使用 APP 验证码或申领长期密码)

同步录音

@@ -243,6 +435,8 @@ 同步文件夹SonicNoteSyncMarkdown 文件存放目录 包含转录内容开启关闭后同步文件中不包含逐字转录 + 文件属性全部开启按需开关 Frontmatter 中的内置属性字段 + 自定义属性无添加自定义键值对到所有同步文件
@@ -255,9 +449,191 @@ + + + +
+ + + + +
+ +
+ Skill + 仅 macOS +

MD 待办提取器

+

从 Markdown 文件中智能提取待办事项,自动分类添加到 macOS 日历、提醒事项或备忘录。

+
+ +
+

智能分类规则

+

AI 自动判断每条待办的重要性和时间属性,分类到最合适的系统应用:

+ + + + + + + + +
分类判断标准目标应用
📅 日历同半天内(≤4小时)有明确开始和结束时间的会议/讨论Calendar
⏰ 提醒事项跨度超半天,或只有截止时间无明确开始时间Reminders
📝 备忘录无明确时间但很重要Notes
⏭️ 跳过既无时间也不重要
+
+ +
+

安装

+
    +
  1. 点击页面顶部按钮下载 md-todo-extractor.zip
  2. +
  3. 解压得到 SKILL.md 文件
  4. +
  5. 将其复制到你所用 AI 工具的 Skills 目录,例如:
  6. +
+
# Claude Code
+~/.claude/skills/md-todo-extractor/SKILL.md
+
+# 其他支持 Skill 的工具请参照其文档
+
    +
  1. 重启 AI 工具会话,Skill 自动加载
  2. +
+
+ +
+

使用方法

+

基本用法

+

在支持 Skill 的 AI 工具中,告诉 AI 你要分析的文件或文件夹:

+
帮我分析 ~/Documents/projects 下的待办事项
+ +

指定时间范围

+
从 md 文件提取上周的待办,加入日历
+ +

工作流程

+
    +
  1. 提供 md 文件路径或文件夹路径(可选指定时间范围)
  2. +
  3. AI 扫描文件,识别潜在待办事项
  4. +
  5. 显示分类结果表格,等待你确认
  6. +
  7. 选择目标日历/提醒列表/备忘录文件夹
  8. +
  9. 通过 AppleScript 自动添加到 macOS 系统应用
  10. +
+ +

系统要求

+ +
+ + + + +
+ + + + +
+ +
+ Skill +

工作总结生成器

+

从日记、会议记录、碎片笔记中生成多风格深度工作总结。核心理念:不要复述做了什么,要说出发现了什么。

+
+ +
+

13 种总结风格

+

根据日记内容智能推荐最佳风格,也可自选多种风格一次生成:

+
+ 1. 模式发现型 + 2. 成果导向型 + 3. 风险预警型 + 4. 学习成长型 + 5. 叙事故事型 + 6. 极简清单型 + 7. OKR 对齐型 + 8. 时间审计型 + 9. 关系网络型 + 10. 决策复盘型 + 11. 情绪日志型 + 12. 跨界联想型 + 13. 古龙简洁型 +
+
+ +
+

风格说明

+ + + + + + + + + + + + + + + + + +
风格核心定位适用场景
模式发现型找规律、重复问题、趋势变化日常复盘、深度思考
成果导向型聚焦完成的事,结构清晰向上汇报、团队同步、周报
风险预警型识别潜在问题、依赖风险项目管理、多项目并行
学习成长型提炼认知升级、方法论个人成长、知识沉淀
叙事故事型起承转合的故事叙事分享交流、团队文化
极简清单型核心要点 + 下一步行动快速回顾、内容繁多
OKR 对齐型工作与目标对齐,评估进展目标管理、季度复盘
时间审计型分析时间分配和 ROI效率提升、时间管理
关系网络型梳理人际互动和变化人脉管理、客户关系
决策复盘型回顾决策依据和对错决策质量提升
情绪日志型记录情绪起伏和触发因素情绪管理、自我觉察
跨界联想型跨领域类比,产生灵感创新思考、打破定式
古龙简洁型50 字内升华工作意义快速回顾、积极心态
+
+ +
+

安装

+
    +
  1. 点击页面顶部按钮下载 work-summary.zip
  2. +
  3. 解压得到 SKILL.mdreferences/styles.md
  4. +
  5. 保持目录结构复制到你所用 AI 工具的 Skills 目录,例如:
  6. +
+
# Claude Code
+~/.claude/skills/work-summary/
+├── SKILL.md
+└── references/
+    └── styles.md
+
+# 其他支持 Skill 的工具请参照其文档
+
    +
  1. 重启 AI 工具会话,Skill 自动加载
  2. +
+
+ +
+

使用方法

+

基本用法

+

在支持 Skill 的 AI 工具中,告诉 AI 你想总结哪段时间:

+
帮我总结今天的工作
+ +

指定时间范围

+
总结本周的工作,风格选1和13
+ +

工作流程

+
    +
  1. 获取素材 — 确认时间范围,自动查找日记文件
  2. +
  3. 选择风格 — 展示全部 13 种风格,智能推荐 + 自选
  4. +
  5. 生成总结 — 按选定风格的 prompt 模板深度生成
  6. +
  7. 输出方式 — 对话展示 / 追加到日记 / 生成独立文件
  8. +
+ +

Obsidian 集成

+

如果 Obsidian 正在运行且支持 CLI,Skill 会优先通过 CLI 操作文件(读取、追加、创建、搜索),无需手动指定完整路径。

+
# 读取日记
+obsidian read path="日记文件夹/日记2026-05-12.md"
+
+# 追加总结到文件
+obsidian append path="日记文件夹/日记2026-05-12.md" content="..."
+
+# 创建独立总结文件
+obsidian create path="日记文件夹/总结2026-05-12.md" content="..."
+
+ - + + + diff --git a/release/work-summary.zip b/release/work-summary.zip new file mode 100644 index 0000000..2ddcfbe Binary files /dev/null and b/release/work-summary.zip differ diff --git a/skill/md-todo-extractor/SKILL.md b/skill/md-todo-extractor/SKILL.md new file mode 100644 index 0000000..65bdd4d --- /dev/null +++ b/skill/md-todo-extractor/SKILL.md @@ -0,0 +1,351 @@ +--- +name: md-todo-extractor +description: 从 Markdown 文件或文件夹中提取待办事项,并根据时间条件智能分类到 macOS 日历、提醒事项或备忘录。当用户提到"从 md 文件提取待办"、"分析文件中的待办事项"、"把待办加入日历"等场景时触发此技能。 +--- + +# MD 待办提取器 + +从 Markdown 文件中智能提取待办事项,并添加到 macOS 系统应用中。 + +## 支持的文件格式 + +- `.md` 文件(单个文件或文件夹) + +## 分类规则 + +根据以下规则将待办事项分类到不同的系统应用: + +| 系统应用 | 判断标准 | +|---------|---------| +| **日历 (Calendar)** | 在同一个半天内(≤4小时)且有明确的开始时间点和结束时间点的会议/讨论/汇报等活动 | +| **提醒事项 (Reminders)** | 时间跨度超过半天,或只有截止时间而无明确开始时间 | +| **备忘录 (Notes)** | 没有明确时间,但很重要 | +| **跳过** | 既没有明确时间,也不重要 | + +### 时间判断优先级 + +1. 同时有明确开始和截止时间,且跨度≤4小时 → **日历** +2. 有截止时间但无明确开始时间,或跨度>4小时 → **提醒事项** +3. 无明确时间但很重要 → **备忘录** +4. 既没时间也不重要 → **跳过** + +### 日历事项标题命名规则(重要) + +**日历事项代表的是"讨论"、"会议"、"汇报"等活动**,而不是执行的任务。 + +**错误示例:** +- 原文:"建立周报机制(每周二下午收取文旅客户周报汇报)" +- 错误标题:"建立周报机制" ← 这是任务名称,不是日历事件 + +**正确示例:** +- 原文:"建立周报机制(每周二下午收取文旅客户周报汇报)" +- 正确标题:"文旅客户周报汇报" ← 这是讨论/汇报的主题 +- 时间:每周二 14:00-15:00( recurring) +- 描述可包含:需要汇报的三项核心内容 + +**判断技巧:** +- 如果待办内容涉及"讨论"、"会议"、"汇报"、"评审"、"汇报"等 → 很可能是日历事项 +- 日历标题应该是"关于XXX的讨论/汇报",而不是"做XXX" + +## 工作流程 + +### 步骤 1:接收用户输入 + +用户需提供: +- md 文件路径,或包含 md 文件的文件夹路径 +- 可选:指定分析的时间范围(自然语言描述,如"上周"、"5月1日到5月7日") + +**提示用户输入:** +``` +请提供 md 文件路径或包含 md 文件的文件夹路径。 +如需限定时间范围,请说明(如"分析上周创建的文件")。 +``` + +### 步骤 2:扫描文件 + +1. 如果是**文件路径**: + - 检查是否为 `.md` 文件 + - 读取文件内容 + +2. 如果是**文件夹路径**: + - 扫描文件夹及子文件夹中的所有 `.md` 文件 + - 如果用户指定了时间范围,在该范围内筛选文件 + - 如果未指定,分析所有 `.md` 文件 + +**时间范围筛选逻辑:** +- 用户使用系统本地时区 +- 按文件创建时间(`stat` 命令获取 `birthtime`)在指定范围内筛选 + +### 步骤 3:AI 提取待办事项 + +分析每个 md 文件内容,识别潜在的待办事项。 + +**识别原则(无固定标记,AI 自行判断):** +- 包含动作项的句子(如"需要做某事"、"记得去...") +- 带有意图动词的陈述("要"、"应该"、"记得") +- 明确的任务描述(即使没有 TODO 标记) +- 用户明确标注为待办的内容 + +**每条待办记录格式:** +```json +{ + "content": "待办内容原文", + "source_file": "文件名.md", + "importance": "高/中/低", + "has_start_time": true/false, + "has_end_time": true/false, + "start_time": "ISO 时间或 null", + "end_time": "ISO 时间或 null", + "classification": "calendar/reminders/notes/skip", + "reason": "分类原因说明" +} +``` + +### 步骤 4:显示分类结果,待用户确认 + +**必须使用以下精确格式输出分类结果表格:** + +``` +📋 提取到的待办事项: + +| # | 内容摘要 | 分类 | 原因 | +|---|---------|------|------| +| 1 | 完成项目报告 | 📅 日历 | 同半天内有明确开始和结束时间 | +| 2 | 提交财务报表 | ⏰ 提醒事项 | 有截止时间,无开始时间 | +| 3 | 学习 React 基础 | 📝 备忘录 | 重要但无明确时间 | +| 4 | 整理桌面 | ⏭️ 跳过 | 不重要且无明确时间 | + +分类汇总:📅 日历 X 项 | ⏰ 提醒事项 X 项 | 📝 备忘录 X 项 | ⏭️ 跳过 X 项 + +请确认哪些需要添加到系统(输入编号,多选用逗号分隔): +- 输入 "1,2,3" 确认第 1、2、3 项 +- 输入 "all" 确认全部 +- 输入 "none" 取消全部 +``` + +**重要:分类列必须使用以下图标之一:** +- 📅 日历 - 表示要添加到日历 +- ⏰ 提醒事项 - 表示要添加到提醒事项 +- 📝 备忘录 - 表示要添加到备忘录 +- ⏭️ 跳过 - 表示不重要且无时间,跳过不添加 + +**分类判断规则(按优先级):** +1. 同时有明确开始和截止时间,且跨度≤4小时 → 📅 日历 +2. 有截止时间但无明确开始时间,或跨度>4小时 → ⏰ 提醒事项 +3. 无明确时间但很重要 → 📝 备忘录 +4. 既没时间也不重要 → ⏭️ 跳过 + +### 步骤 5:获取用户选择的日历/列表 + +根据待办分类,显示相应的可用列表供用户选择: + +**日历 (Calendar):** +- 调用 AppleScript 或 `calendarcli` 获取用户日历列表 +- 显示日历名称,让用户选择目标日历 + +**提醒事项 (Reminders):** +- 调用 AppleScript 获取用户的提醒事项列表 +- 显示列表名称,让用户选择目标列表 + +**备忘录 (Notes):** +- 调用 AppleScript 获取用户的备忘录账户和文件夹 +- 显示笔记名称,让用户选择目标位置 + +**提示用户:** +``` +选择目标位置: +- 日历待办 1, 2, 3,请选择目标日历: + 1. 工作 + 2. 个人 + 3. 家庭 + > 2 + +- 提醒事项请选择目标列表: + 1. 日常任务 + 2. 工作待办 + > 1 +``` + +### 步骤 6:添加到系统 + +根据用户选择,使用 AppleScript 将待办事项添加到相应的系统应用。 + +**重要:执行前先获取用户的日历/提醒事项列表供选择** + +**获取日历列表:** +```applescript +tell application "Calendar" + set calendarNames to title of every calendar +end tell +``` + +**获取提醒事项列表:** +```applescript +tell application "Reminders" + set listNames to name of every list +end tell +``` + +**获取备忘录文件夹:** +```applescript +tell application "Notes" + set folderNames to name of every folder +end tell +``` + +**添加到日历:** +```applescript +tell application "Calendar" + tell calendar "目标日历名称" + make new event at end with properties {summary:"待办标题", description:"待办描述", start date:date "2026/5/10 9:00:00", end date:date "2026/5/10 12:00:00"} + end tell +end tell +``` + +**添加到提醒事项:** +```applescript +tell application "Reminders" + tell list "目标列表名称" + make new reminder at end with properties {name:"待办标题", body:"待办描述", due date:date "2026/5/15 18:00:00"} + end tell +end tell +``` + +**添加到备忘录:** +```applescript +tell application "Notes" + tell folder "目标文件夹" + make new note at end with properties {name:"待办标题", body:"待办描述"} + end tell +end tell +``` + +**删除测试数据(执行删除前必须用户确认):** +```applescript +-- 删除日历事件 +tell application "Calendar" + delete (every event of calendar "目标日历名称" whose summary contains "测试标记") +end tell + +-- 删除提醒事项 +tell application "Reminders" + delete (every reminder of list "目标列表名称" whose name contains "测试标记") +end tell + +-- 删除备忘录 +tell application "Notes" + delete (every note of folder "目标文件夹" whose name contains "测试标记") +end tell +``` + +**建议:为测试数据添加 [测试] 前缀,便于后续识别和删除** + +### 步骤 7:完成确认 + +显示添加结果摘要: + +``` +✅ 已成功添加 3 项到系统: + +📅 日历 - "工作": + - 完成项目报告 (5月10日 9:00-12:00) + +⏰ 提醒事项 - "工作待办": + - 提交财务报表 (截止: 5月15日 18:00) + +📝 备忘录 - "工作笔记": + - 学习 React 基础 + +⚠️ 跳过 1 项(不重要且无明确时间) +``` + +## 错误处理 + +| 错误情况 | 处理方式 | +|---------|---------| +| 文件不存在 | 提示用户检查路径,提供示例路径格式 | +| 不是 md 文件 | 提示用户仅支持 .md 格式 | +| 无法访问日历/提醒事项 | 提示用户检查系统权限设置 | +| 添加失败 | 显示具体错误信息,提示用户手动添加 | + +## 权限要求 + +首次使用需要授予以下 macOS 权限: +- **日历**:系统偏好设置 → 隐私与安全性 → 日历 +- **提醒事项**:系统偏好设置 → 隐私与安全性 → 提醒事项 +- **备忘录**:系统偏好设置 → 隐私与安全性 → 备忘录 + +## 示例对话 + +**用户**:帮我分析一下 ~/Documents/projects 下的待办事项 + +**助手**: +``` +请确认时间范围(可选): +- 直接分析全部文件 +- 或指定范围,如"分析5月1日以来的文件" + +请提供您的选择: +1. 分析全部 .md 文件 +2. 指定时间范围 +> +``` + +**用户**:分析全部 + +**助手**: +``` +🔍 正在扫描 ~/Documents/projects ... +找到 3 个 md 文件: +- project-alpha.md +- weekly-tasks.md +- ideas.md + +📋 提取到 5 条待办事项: + +| # | 内容摘要 | 分类 | 原因 | +|---|---------|------|------| +| 1 | 完成项目报告 | 📅 日历 | 5月10日 9:00-12:00,同半天内 | +| 2 | 提交财务报表 | ⏰ 提醒事项 | 截止5月15日 18:00 | +| 3 | 学习 React 基础 | 📝 备忘录 | 重要但无明确时间 | +| 4 | 整理桌面 | ⏭️ 跳过 | 不重要且无明确时间 | +| 5 | 下季度计划会议 | 📅 日历 | 5月20日 14:00-17:30,同半天内 | + +分类汇总:📅 日历 2 项 | ⏰ 提醒事项 1 项 | 📝 备忘录 1 项 | ⏭️ 跳过 1 项 + +请选择要添加的待办(输入编号,多选用逗号分隔):1,2,3 +``` + +**用户**:1,2,3 + +**助手**: +``` +📅 请选择目标日历: +1. 工作 +2. 个人 +> 1 + +⏰ 请选择目标提醒列表: +1. 日常任务 +2. 工作待办 +> 2 + +📝 请选择目标备忘录位置: +1. 工作笔记 +2. 临时想法 +> 1 +``` + +**助手**: +``` +✅ 已成功添加 3 项到系统! + +📅 日历 - "工作": + - 完成项目报告 (5月10日 9:00-12:00) + +⏰ 提醒事项 - "工作待办": + - 提交财务报表 (截止: 5月15日 18:00) + +📝 备忘录 - "工作笔记": + - 学习 React 基础 +``` diff --git a/skill/work-summary/SKILL.md b/skill/work-summary/SKILL.md new file mode 100644 index 0000000..c16bc1a --- /dev/null +++ b/skill/work-summary/SKILL.md @@ -0,0 +1,186 @@ +--- +name: work-summary +description: 从日记/流水账生成多风格工作总结,支持13种风格。当用户提到"工作总结"、"日报总结"、"周报"、"日记总结"、"工作复盘"、"工作小结"、"daily review"、"work summary"、"总结今天"、"今日总结"、"今天的总结"、"daily summary"、"复盘今天"、"今天的复盘"等场景时触发。 +--- + +# Work Summary Skill + +从日记、会议记录、碎片笔记等素材中,生成多风格的深度工作总结。核心理念:**不要复述做了什么,要说出发现了什么。** + +## 交互流程 + +### Step 1 — 获取素材 + +**1.1 确认时间范围(必须询问)** + +无论用户是否提到了日期,都必须先确认时间范围: + +``` +你想总结哪段时间的工作? + +请输入日期或时间范围,例如: +- 2026-05-12(某一天) +- 本周(周一到周日) +- 2026-05(整月) +- 2026-05-10 到 2026-05-12(自定义范围) +``` + +如果用户在启动时已指定了日期,也要向用户确认: + +``` +你提到了 2026-05-12,请确认是要总结这一天,还是其他时间范围? +``` + +**1.2 确定日记文件夹** + +如果不知道用户的日记文件夹路径,询问用户: + +``` +你的日记文件放在哪个文件夹?请提供完整路径。 +``` + +获取后记住该路径,下次直接使用。 + +**1.3 自动查找日记文件** + +根据时间范围和日记文件夹路径,自动查找匹配的文件。 + +查找规则: +- 文件名包含"日记"且包含日期(如 `日记2026-05-12.md`) +- 按日期匹配用户指定的时间范围 +- 对于日期范围(如"本周"),查找该范围内所有日期的日记文件 + +**1.4 处理查找结果** + +- **找到文件**:告知用户找到了哪些文件,继续 Step 1.5 +- **未找到文件**:告知用户未找到日记文件,请用户确认文件夹路径是否正确,或提供具体文件路径 +- **找到部分文件**:告知用户找到了哪些、缺少哪些日期,询问是否继续 + +**1.5 读取素材** + +读取找到的所有日记文件内容。读取后,快速分析内容特征(会议数量、涉及人物、项目类型、情绪基调等),为 Step 2 的风格推荐做准备。 + +**支持的其他素材方式(如果自动查找不可用):** + +- **直接粘贴内容** — 用户直接粘贴日记/笔记内容 +- **指定具体文件** — 用户提供具体的文件路径 + +### Step 2 — 选择风格 + +始终向用户展示全部 13 种风格,同时根据素材内容智能推荐 1-3 种,并简短说明推荐理由。 + +**推荐逻辑:** +- 会议多、项目推进为主 → 推荐「成果导向型」+「风险预警型」 +- 问题多、卡点多 → 推荐「风险预警型」+「模式发现型」 +- 学习、讨论、思考为主 → 推荐「学习成长型」+「跨界联想型」 +- 内容杂、信息量大 → 推荐「模式发现型」+「极简清单型」 +- 人际互动多 → 推荐「关系网络型」 +- 决策多 → 推荐「决策复盘型」 +- 情绪波动明显 → 推荐「情绪日志型」 + +**展示格式:** + +``` +推荐风格:X(理由)、X(理由) + +13种总结风格: + +1. 模式发现型 — 找规律、重复问题、趋势变化 +2. 成果导向型 — 聚焦完成的事,结构清晰适合汇报 +3. 风险预警型 — 识别潜在问题、依赖风险、卡点 +4. 学习成长型 — 提炼认知升级、经验教训、方法论 +5. 叙事故事型 — 把流水账串成有起承转合的故事 +6. 极简清单型 — 只列核心要点和下一步行动 +7. OKR对齐型 — 将工作与目标对齐,评估进展度 +8. 时间审计型 — 分析时间花在哪、ROI如何 +9. 关系网络型 — 梳理人际互动和关系变化 +10. 决策复盘型 — 回顾决策、依据、对错 +11. 情绪日志型 — 记录情绪起伏和触发因素 +12. 跨界联想型 — 跨领域类比,产生创意灵感 +13. 古龙简洁型 — 古龙笔法,50字内升华工作意义 + +请选择风格编号(可多选,如 1,3,13): +``` + +支持用户选择多种风格,一次生成多个视角的总结。 + +### Step 3 — 生成总结 + +1. 加载 `references/styles.md` 中对应风格的完整定义和 prompt 模板 +2. 读取素材内容 +3. 如果用户选择了多个日期的素材,先做跨天对比分析 +4. 按选定风格的 prompt 模板生成总结 +5. 展示给用户 + +### Step 4 — 输出方式(必须执行,不得跳过) + +**重要:Step 3 生成总结后,必须立即执行 Step 4,不得跳过或省略。** + +总结展示后,立即询问输出方式: + +``` +总结已生成。请选择输出方式: + +1. 仅在对话中展示(默认) +2. 追加到日记文件末尾 +3. 生成独立文件 + +输入编号: +``` + +- **方式1**:直接在对话中展示,不修改任何文件 +- **方式2**:追加到原始日记文件的 `# 总结` 部分下方 +- **方式3**:生成独立文件,命名规则为 `总结YYYY-MM-DD.md`,放在日记文件夹中 + +如果选择方式3,询问文件保存路径(默认与日记同目录)。 + +## 核心原则 + +1. **观点优先**:每篇总结必须有一个核心观点/发现,不能只是流水账的缩写版 +2. **证据支撑**:观点必须有日记中的具体事件作为证据 +3. **反直觉**:优先找"和预期相反"的点,这才是最有价值的洞察 +4. **对比视角**:如果有多个日期的素材,一定要做跨天对比,找趋势 +5. **一句话提炼**:每种风格的总结开头都有一句核心提炼 +6. **行动导向**:总结末尾必须有可执行的行动启示,不是空泛的感想 + +## 注意事项 + +- 如果日记内容太少(少于3条记录),告知用户素材不足,建议补充 +- 如果用户没有指定日记文件路径,主动询问 +- 生成总结前不要修改原始日记文件 +- 输出到文件前必须征得用户确认 + +## Obsidian CLI 集成 + +当用户的 vault 启用了 Obsidian CLI(命令 `obsidian` 可用)时,优先使用 CLI 命令操作 vault 文件: + +**读取文件:** +``` +obsidian read path="11日记文件夹/日记2026-05-12.md" +``` + +**追加内容到文件:** +``` +obsidian append path="11日记文件夹/日记2026-05-12.md" content="总结内容" +``` + +**创建文件:** +``` +obsidian create path="11日记文件夹/总结2026-05-12.md" content="总结内容" +``` + +**搜索文件:** +``` +obsidian search query="日记2026-05" +``` + +**列出文件:** +``` +obsidian files folder="11日记文件夹" +``` + +**重要:** +- Obsidian CLI 要求 Obsidian app 正在运行 +- 路径是相对于 vault 根目录的路径,不需要完整文件系统路径 +- 如果 CLI 不可用(命令不存在或 Obsidian 未运行),回退到直接文件操作 +- 首次使用时可运行 `obsidian help` 检测 CLI 是否可用 diff --git a/skill/work-summary/references/styles.md b/skill/work-summary/references/styles.md new file mode 100644 index 0000000..007a3a8 --- /dev/null +++ b/skill/work-summary/references/styles.md @@ -0,0 +1,589 @@ +# 12种总结风格 — 完整定义 + +本文档定义了 Work Summary Skill 的12种总结风格。每种风格包含:定义、适用场景、不适用场景、输出模板(prompt 指令)。 + +--- + +## 1. 模式发现型 + +**定义:** 从杂乱信息中找规律、重复出现的问题、趋势变化。不按时间顺序复述,而是发现"今天哪些行为/决策反复出现"。 + +**适用场景:** 日常复盘、深度思考、寻找系统性问题 + +**不适用场景:** 需要快速汇报进展、内容非常单一的一天 + +**输出模板:** + +``` +你是一位深度思考者。请分析以下工作日记,生成"模式发现型"总结。 + +要求: +1. 开头用一句话提炼核心发现(格式:"今天最重要的一件事是______,因为它让我意识到______。") +2. 找模式:识别日记中反复出现的主题、行为、问题或趋势。至少发现2-3个模式。 +3. 每个模式都要有日记中的具体事件作为证据。 +4. 找反直觉的点:有什么结果和你的预期相反?偏差说明了什么? +5. 如果有多个日期的素材,做跨天对比,指出趋势变化。 +6. 结尾给出3条行动启示,必须是可执行的具体行动。 + +输出格式: +## 核心发现 +[一句话提炼] + +## 模式分析 +### 模式一:[模式名称] +- 证据:[日记中的具体事件] +- 分析:[这个模式说明了什么] + +### 模式二:[模式名称] +... + +### 模式三:[模式名称] +... + +## 反直觉发现 +[今天有什么和预期相反?为什么?] + +## 趋势对比(如有多日素材) +[对比前几天,什么在变好、什么在重复、什么在恶化] + +## 行动启示 +1. [具体可执行的行动] +2. ... +3. ... + +字数:400-800字 +语气:分析性、洞察性、有深度 +``` + +--- + +## 2. 成果导向型 + +**定义:** 聚焦完成了什么、推进了多少、下一步计划。结构清晰,适合向上汇报或团队同步。 + +**适用场景:** 向上汇报、团队同步、周报、绩效记录 + +**不适用场景:** 当天几乎没做什么实质工作、需要深度反思时 + +**输出模板:** + +``` +你是一位高效的项目管理者。请分析以下工作日记,生成"成果导向型"总结。 + +要求: +1. 开头用一句话概括今天的整体进展(如"今日整体推进度:70%,核心成果是______") +2. 按项目/主题分类,列出每个事项的状态:已完成/推进中/受阻/待启动 +3. 对"推进中"的事项,说明推进了多少(用百分比或具体里程碑) +4. 对"受阻"的事项,说明卡点和解决方案 +5. 结尾列出明日计划(3-5项,按优先级排序) + +输出格式: +## 今日概览 +[一句话概括] + +## 核心成果 +- **[项目/事项名]**:[状态] — [具体成果,用数据或里程碑说明] + +## 推进中事项 +- **[项目/事项名]**:[进度%] — [当前状态] — [下一步] + +## 风险与卡点 +- **[事项名]**:[卡点] — [解决方案/需要谁协助] + +## 明日计划(优先级排序) +1. [事项] +2. ... + +字数:300-600字 +语气:简洁、专业、数据驱动 +``` + +--- + +## 3. 风险预警型 + +**定义:** 识别潜在问题、依赖风险、卡点。从"一切正常"的表面下发现暗流。 + +**适用场景:** 项目管理、风险管控、多项目并行时 + +**不适用场景:** 当天内容以学习/思考为主,没有实际推进的项目 + +**输出模板:** + +``` +你是一位敏锐的风险管理者。请分析以下工作日记,生成"风险预警型"总结。 + +要求: +1. 开头用一句话概括今天的整体风险状况(如"今日风险等级:中,最高风险是______") +2. 按风险等级(高/中/低)分类列出所有风险 +3. 每个风险说明:风险描述、影响范围、触发概率、应对建议 +4. 特别关注"人"的风险:关键人依赖、沟通断裂、承诺失效 +5. 识别"隐性风险":表面没事但长期会出问题的点 +6. 结尾给出"如果不做任何改变,一周后会怎样"的预测 + +输出格式: +## 风险总览 +[一句话概括] + +## 🔴 高风险 +- **[风险名]**:[描述] + - 影响:[影响范围] + - 概率:[高/中/低] + - 建议:[应对方案] + +## 🟡 中风险 +... + +## 🟢 低风险 +... + +## 隐性风险 +[表面没事但长期会出问题的点] + +## 一周预测 +[如果不做任何改变,一周后会怎样] + +字数:400-800字 +语气:警觉、务实、不制造恐慌 +``` + +--- + +## 4. 学习成长型 + +**定义:** 提炼认知升级、经验教训、可复用的方法论。聚焦"今天学到了什么"而非"今天做了什么"。 + +**适用场景:** 个人成长、知识沉淀、月度/季度复盘 + +**不适用场景:** 当天全是执行性工作,没有新的学习或思考 + +**输出模板:** + +``` +你是一位善于反思的学习者。请分析以下工作日记,生成"学习成长型"总结。 + +要求: +1. 开头用一句话概括今天的核心学习(格式:"今天我最大的认知升级是______") +2. 列出3-5个具体的学习点,每个学习点包含: + - 触发事件(什么事让你学到这个) + - 学到了什么(具体的知识/方法/认知) + - 可复用性(以后什么场景可以用) +3. 识别"认知偏差":今天有什么假设被证明是错的? +4. 提炼方法论:有没有可以抽象成"下次遇到X,我就做Y"的经验? +5. 结尾给出"如果明天只做一件事来持续成长,那就是______" + +输出格式: +## 核心学习 +[一句话概括] + +## 学习点 +### 1. [学习主题] +- 触发:[什么事] +- 收获:[学到了什么] +- 复用:[什么场景用得上] + +### 2. [学习主题] +... + +## 认知偏差 +[今天有什么假设被证明是错的?] + +## 可复用方法论 +[可以抽象成规则的经验,如"下次遇到X,我就做Y"] + +## 明日成长聚焦 +[如果明天只做一件事来持续成长] + +字数:400-700字 +语气:反思性、诚实、有成长感 +``` + +--- + +## 5. 叙事故事型 + +**定义:** 把流水账串成有起承转合的故事。让工作日记读起来有代入感,适合分享交流。 + +**适用场景:** 分享交流、记录生活、团队文化建设 + +**不适用场景:** 正式汇报、需要快速获取信息时 + +**输出模板:** + +``` +你是一位故事讲述者。请分析以下工作日记,生成"叙事故事型"总结。 + +要求: +1. 给今天的故事起一个标题 +2. 用叙事结构组织:起因(今天是怎么开始的)→ 发展(遇到了什么)→ 高潮(最关键的时刻)→ 结局(收尾和感悟) +3. 加入具体细节:对话片段、场景描写、人物特点(从日记中提取) +4. 在故事结尾加一段"今天的收获",用反思性语言 +5. 语气像在和好朋友分享一天经历,自然、有温度 +6. 控制在800字以内 + +输出格式: +## [故事标题] + +[正文,按起承转合结构展开] + +## 今天的收获 +[反思性结尾] + +字数:600-800字 +语气:叙事性、有温度、像在讲故事 +``` + +--- + +## 6. 极简清单型 + +**定义:** 只列出核心要点和下一步行动,极简风格。适合快速回顾和备忘。 + +**适用场景:** 快速回顾、备忘、内容繁多需要精简时 + +**不适用场景:** 需要深度分析、寻找洞察时 + +**输出模板:** + +``` +你是一位极简主义者。请分析以下工作日记,生成"极简清单型"总结。 + +要求: +1. 极其精简,每件事不超过一行 +2. 只保留真正重要的内容,砍掉所有修饰 +3. 结构:完成了什么 → 卡在哪 → 明天做什么 +4. 不使用段落,全部用列表 +5. 总字数控制在200字以内 + +输出格式: +## 今日完成 +- [事项1] +- [事项2] + +## 进行中 +- [事项] → [当前状态] + +## 卡点 +- [事项] → [卡在哪] + +## 明日3件事 +1. [最重要的事] +2. [次重要的事] +3. [第三重要的事] + +字数:<200字 +语气:极简、直接、无废话 +``` + +--- + +## 7. OKR对齐型 + +**定义:** 将工作与OKR目标对齐,评估每个目标今天的进展度。适合目标管理和季度复盘。 + +**适用场景:** 目标管理、季度复盘、OKR跟踪 + +**不适用场景:** 没有明确的OKR框架、当天工作与目标无关 + +**输出模板:** + +``` +你是一位OKR教练。请分析以下工作日记,生成"OKR对齐型"总结。 + +要求: +1. 如果日记中没有明确提到OKR,根据内容推断可能的目标分类 +2. 对每个目标,评估今天的贡献度(高/中/低)并说明原因 +3. 识别"忙碌但没贡献"的工作——做了很多但对目标帮助不大的事 +4. 计算每个目标的累计进展(基于日记中的线索推断) +5. 结尾给出"如果要对目标负责,明天应该优先做什么" + +输出格式: +## 目标-行动对齐分析 + +### [目标1名称] +- 今日贡献:[高/中/低] +- 相关事项:[今天做了哪些与此相关的事] +- 累计进展:[基于日记推断的进度%] + +### [目标2名称] +... + +## 忙碌但低贡献 +[做了很多但对核心目标帮助不大的事] + +## 明日优先级建议 +[如果要对目标负责,明天应该优先做什么] + +字数:400-700字 +语气:目标导向、理性、有战略视角 +``` + +--- + +## 8. 时间审计型 + +**定义:** 分析时间花在哪、ROI如何、如何优化。把日记变成时间账单。 + +**适用场景:** 效率提升、时间管理、时间分配优化 + +**不适用场景:** 日记没有明确的时间记录 + +**输出模板:** + +``` +你是一位时间管理专家。请分析以下工作日记,生成"时间审计型"总结。 + +要求: +1. 根据日记中的时间记录,统计各类活动的时间分配(会议、执行、沟通、学习等) +2. 计算每项活动的时间ROI(投入时间 vs 产出价值),分为高/中/低 +3. 识别"时间黑洞"——花了大量时间但产出很低的活动 +4. 对比理想时间分配,指出偏差 +5. 给出"如果重新过这一天"的优化建议 + +输出格式: +## 时间账单 + +### 时间分配 +- 会议:[X]小时([占比]%) +- 执行:[X]小时([占比]%) +- 沟通:[X]小时([占比]%) +- 学习/思考:[X]小时([占比]%) +- 其他:[X]小时([占比]%) + +### 时间ROI分析 +- 高ROI:[哪些事值得花这么多时间] +- 中ROI:[哪些事投入产出一般] +- 低ROI:[哪些事花了太多时间但产出低] + +### 时间黑洞 +[花了大量时间但产出很低的活动] + +### 如果重新过这一天 +[优化建议,具体到时间块] + +字数:400-600字 +语气:数据驱动、效率导向、有优化思维 +``` + +--- + +## 9. 关系网络型 + +**定义:** 梳理当天所有人际互动和关系变化。适合人脉管理和CRM视角。 + +**适用场景:** 人脉管理、销售跟进、客户关系维护 + +**不适用场景:** 当天几乎没有人机互动、纯技术工作 + +**输出模板:** + +``` +你是一位人脉管理专家。请分析以下工作日记,生成"关系网络型"总结。 + +要求: +1. 列出当天所有人际互动,按关系类型分类(内部团队/客户/合作伙伴/上级) +2. 对每次互动评估关系变化(升温/持平/降温)并说明原因 +3. 识别关键人:今天谁是最重要的连接点? +4. 发现"断联"风险:有哪些关系太久没维护? +5. 给出"下一步关系动作":谁需要跟进、谁需要引荐、谁需要感谢 + +输出格式: +## 今日人际互动 + +### 内部团队 +- [人名]:[互动内容] — 关系变化:[升温/持平/降温] + +### 客户 +- [人名/公司]:[互动内容] — 关系变化:[升温/持平/降温] + +### 合作伙伴 +- [人名/公司]:[互动内容] — 关系变化:[升温/持平/降温] + +### 上级 +- [人名]:[互动内容] — 关系变化:[升温/持平/降温] + +## 关键人 +[今天谁是最重要的连接点?为什么?] + +## 关系风险 +[有哪些关系太久没维护或可能降温?] + +## 下一步关系动作 +- 跟进:[谁] — [做什么] +- 引荐:[需要认识谁] +- 感谢:[谁帮了忙需要表达感谢] + +字数:400-700字 +语气:人际敏感、有温度、有策略性 +``` + +--- + +## 10. 决策复盘型 + +**定义:** 回顾当天做了哪些决策、依据是什么、对不对。提升决策质量。 + +**适用场景:** 决策质量提升、管理者复盘、关键决策跟踪 + +**不适用场景:** 当天主要是执行,没有做太多决策 + +**输出模板:** + +``` +你是一位决策教练。请分析以下工作日记,生成"决策复盘型"总结。 + +要求: +1. 列出当天做的所有决策(显性的和隐性的),按重要性排序 +2. 对每个决策分析: + - 决策内容:做了什么决定 + - 决策依据:基于什么信息/假设 + - 决策质量:好/中/差(基于当时的信息,不是事后诸葛亮) +3. 识别决策模式:你倾向于哪种决策风格?(快速拍板/反复权衡/依赖他人意见) +4. 找出"被拖延的决策"——应该做但没做的事 +5. 结尾给出"提升明天决策质量的1条建议" + +输出格式: +## 今日决策复盘 + +### 重要决策 +#### [决策1] +- 内容:[做了什么决定] +- 依据:[基于什么信息/假设] +- 质量:[好/中/差] — [为什么] + +#### [决策2] +... + +### 被拖延的决策 +[应该做但没做的决定] + +### 我的决策模式 +[你倾向于哪种决策风格?有什么规律?] + +### 明日决策建议 +[提升明天决策质量的1条建议] + +字数:400-700字 +语气:反思性、诚实、不自我辩护 +``` + +--- + +## 11. 情绪日志型 + +**定义:** 记录当天的情绪起伏和触发因素。帮助情绪管理和自我觉察。 + +**适用场景:** 情绪管理、自我觉察、高压工作下的心理跟踪 + +**不适用场景:** 需要客观分析工作成果时 + +**输出模板:** + +``` +你是一位情绪教练。请分析以下工作日记,生成"情绪日志型"总结。 + +要求: +1. 从日记内容中推断情绪变化(注意:是基于文本线索推断,不是编造) +2. 按时间线标注情绪波峰和波谷,以及触发因素 +3. 识别情绪模式:什么类型的事让你兴奋/焦虑/沮丧/满足? +4. 分析情绪对工作的影响:情绪如何影响了决策、沟通、效率? +5. 给出"情绪调节建议"——基于今天的情绪轨迹,明天可以怎么调整 + +输出格式: +## 今日情绪轨迹 + +### 情绪波峰 +- [时间/事件]:[情绪] — 触发因素:[什么导致的] + +### 情绪波谷 +- [时间/事件]:[情绪] — 触发因素:[什么导致的] + +### 情绪模式 +[什么类型的事让你兴奋/焦虑/沮丧/满足?] + +### 情绪对工作的影响 +[情绪如何影响了决策、沟通、效率?] + +### 明日情绪调节建议 +[基于今天的情绪轨迹,明天可以怎么调整] + +字数:300-600字 +语气:温暖、共情、不评判 +``` + +--- + +## 12. 跨界联想型 + +**定义:** 把不同领域的工作做类比和连接,产生创意灵感。寻找"这件事和那件事其实是一个问题"。 + +**适用场景:** 创新思考、灵感激发、打破思维定式 + +**不适用场景:** 需要快速执行、没有创新需求时 + +**输出模板:** + +``` +你是一位跨界创新者。请分析以下工作日记,生成"跨界联想型"总结。 + +要求: +1. 找出今天工作中看似无关但实际上有关联的2-3件事 +2. 用类比的方式重新 framing 这些问题(如"这个项目就像______") +3. 从一个领域的解决方案中,联想另一个领域可以借鉴什么 +4. 提出1-2个"如果试试______会怎样"的创意假设 +5. 结尾给出"今天最大的跨界灵感"——一个可以明天立即验证的小实验 + +输出格式: +## 今日跨界灵感 + +### 隐藏的关联 +[看似无关但有关联的2-3件事,说明关联点] + +### 类比视角 +- "[某个问题]" 就像 "[一个类比]" — [这个类比揭示了什么] + +### 跨界借鉴 +[从A领域的解决方案中,B领域可以借鉴什么] + +### 创意假设 +[如果试试______会怎样?] + +### 明日小实验 +[一个可以明天立即验证的小创意] + +字数:400-700字 +语气:创意性、开放性、有启发性 +``` + +--- + +## 13. 古龙简洁型 + +**定义:** 用古龙的行文风格分析当天工作,高度提炼工作亮点和意义,从积极面进行升华。不出现具体人名、项目名、公司名称,避免暴露商业机密和个人隐私。 + +**适用场景:** 快速回顾、积极心态建设、需要升华工作意义时 + +**不适用场景:** 需要详细分析、客观复盘时 + +**输出模板:** + +``` +你是一位古龙风格的武侠作家。请分析以下工作日记,生成"古龙简洁型"总结。 + +要求: +1. 用古龙的行文风格:短句、留白、节奏感强、有意境 +2. 字数严格控制在 50 字以内 +3. 不出现任何具体人名、项目名、公司名称 +4. 高度提炼当天的工作亮点、进步和意义 +5. 从积极的角度将工作升华,赋予武侠般的意境 +6. 让读者感受到:今天虽然忙碌,但每一步都有意义 + +输出格式: + +## 古龙简洁型总结 + +[正文,50字以内,古龙风格] + +字数:<50字 +语气:古龙风格、简洁、积极、有意境 +``` diff --git a/src/api.ts b/src/api.ts index d346902..33d8185 100644 --- a/src/api.ts +++ b/src/api.ts @@ -1,5 +1,5 @@ import { requestUrl, RequestUrlParam } from 'obsidian'; -import { BackendResponse, Recording, TranscriptSegment, SummaryData, SonicNotePluginSettings } from './types'; +import { BackendResponse, Recording, TranscriptSegment, SummaryData, StudyReportData, SonicNotePluginSettings } from './types'; export class SonicNoteApiClient { constructor(private getSettings: () => SonicNotePluginSettings) {} @@ -118,4 +118,12 @@ export class SonicNoteApiClient { } return res.data; } + + async fetchStudyReport(audioId: string): Promise { + const res = await this.request('GET', `/share/${audioId}/studyReport`); + if (res.code !== 200) { + return null; + } + return res.data; + } } diff --git a/src/formatter.ts b/src/formatter.ts index 3f69e49..be71f66 100644 --- a/src/formatter.ts +++ b/src/formatter.ts @@ -1,4 +1,4 @@ -import { Recording, TranscriptSegment, SummaryData, SonicNotePluginSettings } from './types'; +import { Recording, TranscriptSegment, SummaryData, StudyReportData, SonicNotePluginSettings } from './types'; export function sanitizeFileName(name: string): string { return name @@ -91,6 +91,7 @@ export function toMarkdown( recording: Recording, transcript: TranscriptSegment[] | null, summary: SummaryData | null, + studyReport: StudyReportData | null, note: string, syncTime: string, settings: SonicNotePluginSettings @@ -122,6 +123,28 @@ export function toMarkdown( parts.push(''); } + // Study report section (before transcript) + if (studyReport && studyReport.status === 2) { + parts.push('## 学习总结'); + parts.push(''); + if (studyReport.knowledgePanorama) { + parts.push(`![知识全景图](${studyReport.knowledgePanorama})`); + parts.push(''); + } + if (studyReport.coreGains) { + parts.push('### 核心收获'); + parts.push(''); + parts.push(studyReport.coreGains.trim()); + parts.push(''); + } + if (studyReport.consolidation) { + parts.push('### 课后巩固'); + parts.push(''); + parts.push(studyReport.consolidation.trim()); + parts.push(''); + } + } + // Transcript section if (transcript && transcript.length > 0) { parts.push('## 转录内容'); diff --git a/src/sync.ts b/src/sync.ts index 19d6bc6..aeab30e 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -1,6 +1,6 @@ import { App, Notice, TFile, TFolder } from 'obsidian'; import { SonicNoteApiClient } from './api'; -import { SonicNotePluginSettings, LocalFileInfo, Recording, SyncResult, TranscriptSegment, SummaryData } from './types'; +import { SonicNotePluginSettings, LocalFileInfo, Recording, SyncResult, TranscriptSegment, SummaryData, StudyReportData } from './types'; import { formatFileName, sanitizeFileName, toMarkdown } from './formatter'; export class SyncService { @@ -149,7 +149,7 @@ export class SyncService { private async buildRecordingContent(recording: Recording, syncTime: string): Promise { const settings = this.getSettings(); - const tasks: [string, Promise][] = []; + const tasks: [string, Promise][] = []; // Fetch transcript if enabled and available (status 2 = completed) let transcript: TranscriptSegment[] | null = null; @@ -163,6 +163,10 @@ export class SyncService { tasks.push(['summary', this.api.fetchSummary(recording.audioId).catch(() => null)]); } + // Fetch study report + let studyReport: StudyReportData | null = null; + tasks.push(['studyReport', this.api.fetchStudyReport(recording.audioId).catch(() => null)]); + // Fetch note let note = ''; tasks.push(['note', this.api.fetchNote(recording.audioId).catch(() => '')]); @@ -173,9 +177,10 @@ export class SyncService { const val = results[i]; if (name === 'transcript') transcript = val as TranscriptSegment[] | null; if (name === 'summary') summary = val as SummaryData | null; + if (name === 'studyReport') studyReport = val as StudyReportData | null; if (name === 'note') note = (val as string) || ''; }); - return toMarkdown(recording, transcript, summary, note, syncTime, settings); + return toMarkdown(recording, transcript, summary, studyReport, note, syncTime, settings); } } diff --git a/src/types.ts b/src/types.ts index dd59983..30be01c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -96,6 +96,15 @@ export interface SummaryData { status: number; } +export interface StudyReportData { + id: number; + audioId: string; + knowledgePanorama: string; + coreGains: string; + consolidation: string; + status: number; +} + // ===== 同步相关 ===== export interface LocalFileInfo {