From ea31420849759b06b87ca3ae949fcc5ec2df23ec Mon Sep 17 00:00:00 2001 From: huojl Date: Wed, 20 May 2026 20:56:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E6=88=98=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- release/md-todo-extractor.zip | Bin 0 -> 4748 bytes release/obsidian-plugin.html | 443 ++++++++++++++++-- release/work-summary.zip | Bin 0 -> 11234 bytes skill/md-todo-extractor/SKILL.md | 351 ++++++++++++++ skill/work-summary/SKILL.md | 186 ++++++++ skill/work-summary/references/styles.md | 589 ++++++++++++++++++++++++ src/api.ts | 10 +- src/formatter.ts | 25 +- src/sync.ts | 11 +- src/types.ts | 9 + 10 files changed, 1590 insertions(+), 34 deletions(-) create mode 100644 release/md-todo-extractor.zip create mode 100644 release/work-summary.zip create mode 100644 skill/md-todo-extractor/SKILL.md create mode 100644 skill/work-summary/SKILL.md create mode 100644 skill/work-summary/references/styles.md diff --git a/release/md-todo-extractor.zip b/release/md-todo-extractor.zip new file mode 100644 index 0000000000000000000000000000000000000000..14c1f85aac2082c9a871be9584ee4ba367607cf6 GIT binary patch literal 4748 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 KS=@IZ0PsK2QdZ9Z literal 0 HcmV?d00001 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 插件

+

将 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 @@
  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. +
+ +

系统要求

+
    +
  • 仅支持 macOS(依赖 AppleScript 操作日历、提醒事项、备忘录)
  • +
  • 首次使用需在 系统偏好设置 → 隐私与安全性 中授予日历、提醒事项、备忘录权限
  • +
+
+ + + + +
+ + + + +
+ +
+ 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="..."
+
+ -
SonicNote Sync © 2026
+
SonicNote for Obsidian © 2026
+ + diff --git a/release/work-summary.zip b/release/work-summary.zip new file mode 100644 index 0000000000000000000000000000000000000000..2ddcfbe991e4b5e0ea43e624b220c1cf83732c12 GIT binary patch literal 11234 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 literal 0 HcmV?d00001 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 {