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
+
+
+
+
+
+
+
+
+
+
🔌 SonicNote Sync 插件
+
将 SonicNote 妙记的录音、转录、AI 总结同步到 Obsidian,以 Markdown 文件管理。每条录音对应一个文件,包含完整的元数据和内容。
+
+
+
+
录音同步
+
一键拉取全部录音,自动生成 Markdown
+
+
+
AI 转录
+
含说话人识别和时间戳的逐字转录
+
+
+
智能总结
+
AI 自动生成的要点和行动项
+
+
+
自定义属性
+
灵活配置 Frontmatter 字段
+
+
+
+
更新记录
v1.1.4
@@ -158,14 +351,13 @@
v1.1.2
- 已同步的录音不会被覆盖更新,删除文件后重新同步即可获取最新内容
- - 唯一例外:录音尚未生成总结时文件名为原始名称(如 Note-xxx.mp3),生成总结标题后再次同步会自动覆盖并重命名为总结标题
+ - 唯一例外:录音尚未生成总结时文件名为原始名称,生成总结标题后再次同步会自动覆盖并重命名
v1.1.0
- 修复录音进行中重复创建文件的问题
- AI 总结移至转录内容之前,优先阅读
- 新增"包含转录内容"开关,可按需关闭
- - 文件名去除日期前缀,直接使用录音原始名称
- 切换为 HTTPS 接口
@@ -210,7 +402,7 @@
- 进入 设置 → SonicNote Sync
- 点击"登录"按钮
- - 输入 SonicNote 妙记的手机号和密码(使用 APP 验证码或者申领长期密码)
+ - 输入 SonicNote 妙记的手机号和密码(使用 APP 验证码或申领长期密码)
同步录音
@@ -243,6 +435,8 @@
| 同步文件夹 | SonicNoteSync | Markdown 文件存放目录 |
| 包含转录内容 | 开启 | 关闭后同步文件中不包含逐字转录 |
+ | 文件属性 | 全部开启 | 按需开关 Frontmatter 中的内置属性字段 |
+ | 自定义属性 | 无 | 添加自定义键值对到所有同步文件 |
@@ -255,9 +449,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
Skill
+
仅 macOS
+
MD 待办提取器
+
从 Markdown 文件中智能提取待办事项,自动分类添加到 macOS 日历、提醒事项或备忘录。
+
+
+
+
智能分类规则
+
AI 自动判断每条待办的重要性和时间属性,分类到最合适的系统应用:
+
+ | 分类 | 判断标准 | 目标应用 |
+
+ | 📅 日历 | 同半天内(≤4小时)有明确开始和结束时间的会议/讨论 | Calendar |
+ | ⏰ 提醒事项 | 跨度超半天,或只有截止时间无明确开始时间 | Reminders |
+ | 📝 备忘录 | 无明确时间但很重要 | Notes |
+ | ⏭️ 跳过 | 既无时间也不重要 | — |
+
+
+
+
+
+
安装
+
+ - 点击页面顶部按钮下载 md-todo-extractor.zip
+ - 解压得到 SKILL.md 文件
+ - 将其复制到你所用 AI 工具的 Skills 目录,例如:
+
+
# Claude Code
+~/.claude/skills/md-todo-extractor/SKILL.md
+
+# 其他支持 Skill 的工具请参照其文档
+
+ - 重启 AI 工具会话,Skill 自动加载
+
+
+
+
+
使用方法
+
基本用法
+
在支持 Skill 的 AI 工具中,告诉 AI 你要分析的文件或文件夹:
+
帮我分析 ~/Documents/projects 下的待办事项
+
+
指定时间范围
+
+
+
工作流程
+
+ - 提供 md 文件路径或文件夹路径(可选指定时间范围)
+ - AI 扫描文件,识别潜在待办事项
+ - 显示分类结果表格,等待你确认
+ - 选择目标日历/提醒列表/备忘录文件夹
+ - 通过 AppleScript 自动添加到 macOS 系统应用
+
+
+
系统要求
+
+ - 仅支持 macOS(依赖 AppleScript 操作日历、提醒事项、备忘录)
+ - 首次使用需在 系统偏好设置 → 隐私与安全性 中授予日历、提醒事项、备忘录权限
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Skill
+
工作总结生成器
+
从日记、会议记录、碎片笔记中生成多风格深度工作总结。核心理念:不要复述做了什么,要说出发现了什么。
+
+
+
+
13 种总结风格
+
根据日记内容智能推荐最佳风格,也可自选多种风格一次生成:
+
+ 1. 模式发现型
+ 2. 成果导向型
+ 3. 风险预警型
+ 4. 学习成长型
+ 5. 叙事故事型
+ 6. 极简清单型
+ 7. OKR 对齐型
+ 8. 时间审计型
+ 9. 关系网络型
+ 10. 决策复盘型
+ 11. 情绪日志型
+ 12. 跨界联想型
+ 13. 古龙简洁型
+
+
+
+
+
风格说明
+
+ | 风格 | 核心定位 | 适用场景 |
+
+ | 模式发现型 | 找规律、重复问题、趋势变化 | 日常复盘、深度思考 |
+ | 成果导向型 | 聚焦完成的事,结构清晰 | 向上汇报、团队同步、周报 |
+ | 风险预警型 | 识别潜在问题、依赖风险 | 项目管理、多项目并行 |
+ | 学习成长型 | 提炼认知升级、方法论 | 个人成长、知识沉淀 |
+ | 叙事故事型 | 起承转合的故事叙事 | 分享交流、团队文化 |
+ | 极简清单型 | 核心要点 + 下一步行动 | 快速回顾、内容繁多 |
+ | OKR 对齐型 | 工作与目标对齐,评估进展 | 目标管理、季度复盘 |
+ | 时间审计型 | 分析时间分配和 ROI | 效率提升、时间管理 |
+ | 关系网络型 | 梳理人际互动和变化 | 人脉管理、客户关系 |
+ | 决策复盘型 | 回顾决策依据和对错 | 决策质量提升 |
+ | 情绪日志型 | 记录情绪起伏和触发因素 | 情绪管理、自我觉察 |
+ | 跨界联想型 | 跨领域类比,产生灵感 | 创新思考、打破定式 |
+ | 古龙简洁型 | 50 字内升华工作意义 | 快速回顾、积极心态 |
+
+
+
+
+
+
安装
+
+ - 点击页面顶部按钮下载 work-summary.zip
+ - 解压得到 SKILL.md 和 references/styles.md
+ - 保持目录结构复制到你所用 AI 工具的 Skills 目录,例如:
+
+
# Claude Code
+~/.claude/skills/work-summary/
+├── SKILL.md
+└── references/
+ └── styles.md
+
+# 其他支持 Skill 的工具请参照其文档
+
+ - 重启 AI 工具会话,Skill 自动加载
+
+
+
+
+
使用方法
+
基本用法
+
在支持 Skill 的 AI 工具中,告诉 AI 你想总结哪段时间:
+
+
+
指定时间范围
+
+
+
工作流程
+
+ - 获取素材 — 确认时间范围,自动查找日记文件
+ - 选择风格 — 展示全部 13 种风格,智能推荐 + 自选
+ - 生成总结 — 按选定风格的 prompt 模板深度生成
+ - 输出方式 — 对话展示 / 追加到日记 / 生成独立文件
+
+
+
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(``);
+ 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 {