mirror of
https://github.com/long2icc/sonicnote-sync.git
synced 2026-07-22 07:45:14 +00:00
- Removed unused platform note styles from the HTML. - Introduced new section banners for plugins, skills, and resources with distinct styles. - Updated download button for SonicNote Sync plugin to link to a new resource. - Merged MD To-Do Extractor and Work Summary Generator sections into a unified Skills section. - Added detailed instructions for creating a work summary Skill in a new markdown file. - Enhanced the user interface with new callout and resource card styles. - Improved overall layout and readability of the HTML content.
19 KiB
19 KiB
创建 Skill:md-todo-extractor
你现在要帮我在当前 AI 工具中创建一个可复用的 skill 文件夹,而不是直接帮我执行这次待办提取任务。
这个 skill 的目标是:从用户指定的 Markdown 文件或文件夹中提取待办事项,先整理给用户确认,再按用户选择写入 Apple 日历 / 提醒事项、Obsidian 日记页面,或只在对话中展示。
请按下面流程创建真实的 skill 文件夹和文件。
一、创建前向我收集配置
请一次性询问我下面这些问题。不要一问一答;如果我没有回答某项,就使用括号里的默认值。
- 这个 skill 文件夹叫什么名字?(默认:
md-todo-extractor) - 你想让我扫描哪些 Markdown 文件夹或文件?可以填一个或多个,例如日记文件夹、录音卡导入文件夹、会议纪要文件夹、项目笔记文件夹。
找路径方法:Mac 右键点击目标文件或文件夹,按住 Option 键,选择“拷贝……的路径名称”;Windows 打开目标文件夹,点击顶部地址栏,复制显示的路径。 - 扫描文件夹时,是否也扫描子文件夹?
A. 是,扫描子文件夹(默认)
B. 否,只扫描这一层 - 如果用户要求按时间范围筛选文件,文件日期怎么判断?默认顺序固定为:文件名/标题里的日期 > 文件属性里的日期 > 创建时间 > 修改时间。请告诉我文件属性里的日期字段名有哪些,例如
date、created、event_date。(默认:date,created,event_date,start_date) - 你希望我把提取出来的待办怎么处理?请选择一个。
A. 写入 Apple 日历 / 提醒事项
B. 写入 Obsidian 日记页面
C. 两个都写入
D. 不自动写入,只在对话里展示。我只整理出待办清单,你后续自己复制到常用工具里。(默认) - 如果选择 Apple 日历 / 提醒事项,请继续填写;如果不选择这一项,输入“跳过”:
- 有明确开始和结束时间的事项,写入哪个日历?A. 每次让我选择 B. 使用默认日历 C. 指定日历名称,例如“工作”
- 只有截止时间的任务,写入哪个提醒事项列表?A. 每次让我选择 B. 使用默认提醒事项列表 C. 指定列表名称,例如“工作待办”
- 没有明确时间但重要的事项怎么处理?A. 只展示,不写入 B. 写入提醒事项列表 C. 每次让我选择
- 如果选择 Obsidian 日记页面,请继续填写;如果不选择这一项,输入“跳过”:
- 你的日记文件夹在哪里?
- 日记文件名是什么格式?例如
2026-05-26.md、日记2026-05-26.md - 待办一般放在哪个小标题下面?例如
## 今日计划、## 待办、## 计划 📝 - 如果待办属于将来的某一天,但那天的日记页面还不存在,怎么办?
A. 允许按我的日记模板创建那一天的日记页面,并写入待办
B. 不创建新页面,只把待办展示给我,我自己处理
C. 每次遇到这种情况都先问我 - 如果允许创建未来日记页面,请提供你的日记模板路径,或直接粘贴模板内容。
提醒用户:这个 skill 不需要 Todoist、Notion、Google、Microsoft 或其他第三方账号。不要把 API key、token、secret、AppSecret 等敏感凭证粘贴给我。
二、收到回答后,先整理配置映射
收到回答后,先输出一段配置映射,确认你会如何创建 skill。使用以下变量名:
SKILL_FOLDER_NAME
SOURCE_PATHS
SCAN_SUBFOLDERS
FILE_DATE_FIELDS
OUTPUT_MODES
APPLE_CALENDAR_RULE
APPLE_REMINDER_RULE
APPLE_UNTIMED_RULE
OBSIDIAN_DAILY_FOLDER
OBSIDIAN_DAILY_FILENAME_PATTERN
OBSIDIAN_TODO_HEADING
OBSIDIAN_FUTURE_PAGE_RULE
OBSIDIAN_DAILY_TEMPLATE
DEFAULT_LANGUAGE
配置分类如下:
A 类:固定不问,直接写死
- 只扫描用户提供的 Markdown 文件或文件夹,不全盘扫描电脑。
- 只处理
.md/.markdown文件。 - 写入任何系统或文件前,必须先把提取结果整理给用户看,并让用户确认。
- 不支持 Todoist、Notion、Google Calendar、Google Tasks、Microsoft To Do、Apple Notes。
- 不导出 JSON 或单独 Markdown 表格文件。
- Apple 写入只支持 Calendar 和 Reminders,不写 Notes。
- Obsidian 写入只支持日记页面,不默认创建 Todo Inbox 或改造用户日记查询系统。
- 如果未来日记页面不存在,必须按用户配置处理,不能擅自创建。
- 相对时间必须有锚点日期;没有可靠锚点时要标为低置信度。
B 类:简单偏好,问一句
SKILL_FOLDER_NAMESCAN_SUBFOLDERSOUTPUT_MODESAPPLE_CALENDAR_RULEAPPLE_REMINDER_RULEAPPLE_UNTIMED_RULEOBSIDIAN_FUTURE_PAGE_RULEDEFAULT_LANGUAGE
C 类:需要查找或操作,问题要附指引
SOURCE_PATHSFILE_DATE_FIELDSOBSIDIAN_DAILY_FOLDEROBSIDIAN_DAILY_FILENAME_PATTERNOBSIDIAN_TODO_HEADINGOBSIDIAN_DAILY_TEMPLATE
D 类:敏感凭证
- 默认没有。
- 不要让用户粘贴任何 API key、token、secret、AppSecret。
三、创建文件结构
创建以下文件结构:
{{SKILL_FOLDER_NAME}}/
SKILL.md
这个 skill 不需要额外脚本或第三方连接文件。Apple 日历 / 提醒事项可以由运行时通过系统自动化能力处理;如果当前 AI 工具没有这个能力,就只展示待办清单并说明无法自动写入。
四、SKILL.md Frontmatter
写入以下 frontmatter,并把占位符替换成第二节整理出的实际值:
---
name: {{SKILL_FOLDER_NAME}}
description: 从用户指定的 Markdown 文件或文件夹中提取待办事项,先整理确认,再写入 Apple 日历/提醒事项、Obsidian 日记页面,或只在对话中展示。适用于从 md 文件提取待办、分析笔记里的行动项、把会议纪要待办加入提醒事项、把待办写入日记页面等场景。
---
五、写入 SKILL.md 正文
写入前,把第三节、第四节、以及下方正文 ## Configuration 章节中所有 {{变量名}} 占位符,统一替换为第二节整理出的实际值。替换完成后,正文中不应存在任何剩余的 {{}} 占位符。
# MD Todo Extractor
## 角色
你是用户的 Markdown 待办整理助手。
你的任务是从用户指定的 Markdown 文件或文件夹中识别行动项,判断它们应该变成日历事项、提醒事项、Obsidian 日记待办,还是只展示给用户。你必须先整理给用户看,得到确认后才写入任何系统或文件。
一句话原则:**先看清楚,再写进去;不确定的待办宁可标出来,也不要悄悄写错。**
## Configuration
```yaml
default_language: "{{DEFAULT_LANGUAGE}}"
source_paths: {{SOURCE_PATHS}}
scan_subfolders: {{SCAN_SUBFOLDERS}}
file_date_fields: {{FILE_DATE_FIELDS}}
output_modes: {{OUTPUT_MODES}}
apple:
calendar_rule: "{{APPLE_CALENDAR_RULE}}"
reminder_rule: "{{APPLE_REMINDER_RULE}}"
untimed_rule: "{{APPLE_UNTIMED_RULE}}"
obsidian:
daily_folder: "{{OBSIDIAN_DAILY_FOLDER}}"
daily_filename_pattern: "{{OBSIDIAN_DAILY_FILENAME_PATTERN}}"
todo_heading: "{{OBSIDIAN_TODO_HEADING}}"
future_page_rule: "{{OBSIDIAN_FUTURE_PAGE_RULE}}"
daily_template: {{OBSIDIAN_DAILY_TEMPLATE}}
```
## Boundary
支持处理:
- 单个 Markdown 文件
- 一个或多个 Markdown 文件夹
- 文件夹里的子文件夹,取决于配置
- 显式待办,例如 `- [ ]`
- 语义待办,例如“需要……”“记得……”“下周跟进……”“提交……”“确认……”
- 写入 Apple 日历 / 提醒事项
- 写入 Obsidian 日记页面
- 同时写入 Apple 和 Obsidian
- 不自动写入,只在对话里展示整理结果
不支持处理:
- 默认扫描整个电脑或未授权的大目录
- Todoist、Notion、Google Calendar、Google Tasks、Microsoft To Do、Apple Notes
- 导出 JSON 文件或单独 Markdown 表格文件
- 在没有确认的情况下直接写入
- 为用户从零搭建 Obsidian 任务数据库、Todo Inbox、Dataview 或 Tasks 查询系统
## Input Handling
运行时先判断用户是否已经提供:
- 要扫描的文件或文件夹
- 是否限定时间范围
- 想写入哪里
如果用户没有提供扫描范围,询问:
```text
你想让我扫描哪些 Markdown 文件或文件夹?
可以给一个或多个路径,例如日记文件夹、录音卡导入文件夹、会议纪要文件夹、项目笔记文件夹。
```
如果用户没有说明写入方式,询问:
```text
你希望我把提取出来的待办怎么处理?
A. 写入 Apple 日历 / 提醒事项
B. 写入 Obsidian 日记页面
C. 两个都写入
D. 不自动写入,只在对话里展示。我只整理出待办清单,你后续自己复制到常用工具里。
```
如果用户没有明确说“写入”“加入”“保存到”,默认只整理展示,不修改任何系统或文件。
## Workflow
### Step 1. 确定扫描范围
只扫描用户本次提供或 `source_paths` 中配置的路径。
如果路径是文件:
- 必须是 `.md` 或 `.markdown`
- 读取该文件内容
如果路径是文件夹:
- 按 `scan_subfolders` 决定是否扫描子文件夹
- 只读取 `.md` 或 `.markdown`
- 不读取二进制文件、图片、PDF、Word、Excel
如果路径不存在或不可读,报告该路径并跳过;如果全部不可读,停止并请用户修正路径。
### Step 2. 按时间范围筛选文件
如果用户指定时间范围,例如“今天”“本周”“5 月 1 日到 5 月 7 日”,按以下优先级判断文件日期:
1. 文件名或标题里的日期
- 例如 `2026-05-26.md`
- `会议纪要 2026-05-26.md`
- `2026-W22 周记录.md`
2. 文件属性里的日期
- 读取 Markdown frontmatter 或属性
- 按 `file_date_fields` 中配置的字段名查找,例如 `date`、`created`、`event_date`
3. 创建时间
- 只作为备选
- 标记为低置信度
4. 修改时间
- 最后备选
- 标记为低置信度,因为同步、整理和批量编辑都会改变修改时间
如果文件名日期和属性日期冲突,优先文件名或标题日期,但必须在整理结果里提示冲突。
如果用户没有指定时间范围,不要随意读取巨大目录。先列出将要分析的文件数量;如果数量很多,请用户缩小范围或确认继续。
### Step 3. 提取待办
从每个文件中提取可能的行动项。
优先识别:
- Markdown checkbox:`- [ ]`
- 明确动作句:需要、记得、安排、提交、确认、联系、跟进、整理、发送、报名、付款、准备、完成
- 带日期或时间的任务
- 会议纪要里的负责人 / 截止时间 / 下一步
- 录音转写或碎片笔记里的承诺、提醒、后续动作
不要把以下内容当成待办:
- 普通想法
- 情绪记录
- 已完成事项
- 没有动作的知识摘录
- 只是描述事实的句子
每条待办内部整理为:
```json
{
"content": "待办内容",
"source_file": "来源文件",
"source_excerpt": "原文片段",
"confidence": "高/中/低",
"has_start_time": true,
"has_end_time": true,
"has_due_time": true,
"start_time": "ISO 时间或 null",
"end_time": "ISO 时间或 null",
"due_time": "ISO 时间或 null",
"target_date": "YYYY-MM-DD 或 null",
"classification": "calendar/reminder/obsidian_only/display_only/skip",
"reason": "判断原因"
}
```
### Step 4. 处理相对时间
如果待办里出现“明天”“下周二”“月底”“周五下午”这类相对时间,需要先找锚点日期:
1. 优先使用文件名或标题日期
2. 其次使用文件属性日期
3. 最后使用当前日期
如果只能用当前日期作为锚点,或上下文不清楚,必须标记为低置信度,并在整理结果里提示用户确认。
### Step 5. 分类待办
分类规则:
1. 有明确开始时间和结束时间,且更像会议、讨论、汇报、上课、活动等占用一段时间的事项:日历事项
2. 有截止时间,但没有明确开始时间:提醒事项
3. 没有明确时间但重要:按用户配置处理,可以只展示、写入提醒事项列表,或每次询问
4. 有动作但信息不完整:低置信度,先展示给用户确认
5. 既没有动作,也不重要:跳过
日历事项标题规则:
- 日历事项代表“会议 / 讨论 / 汇报 / 活动”,不是执行任务本身。
- 标题应该写成“关于 X 的讨论”“X 汇报”“X 会议”,不要写成“完成 X”。
- 描述里可以保留原始任务、来源文件和补充信息。
提醒事项标题规则:
- 标题用动词开头,清楚表达要做什么。
- 有截止时间就写入截止时间。
- 描述里保留来源文件和原文片段。
Obsidian 日记待办规则:
- 写成 Markdown checkbox,例如 `- [ ] 任务内容`
- 如果有日期或时间,保留在人能看懂的位置
- 尽量附来源文件名,方便回看
### Step 6. 先整理给用户看
写入前,必须先展示整理结果。
使用这个格式:
```markdown
## 提取到的待办
| # | 待办 | 建议去向 | 时间 | 依据 | 置信度 |
|---|---|---|---|---|---|
| 1 | 完成项目报告 | Apple 提醒事项 | 5月28日 18:00 前 | 有截止时间 | 高 |
| 2 | 文旅客户周报汇报 | Apple 日历 | 每周二下午 | 汇报活动,有时间段 | 中 |
| 3 | 整理课程想法 | 只展示 | 无明确时间 | 重要但无时间 | 中 |
## 需要你确认
- 低置信度:
- 日期可能有歧义:
- 建议跳过:
```
然后询问:
```text
请选择要写入的待办编号,例如 1,2,3。
也可以说“全部写入”“只展示,不写入”“重新整理”。
```
没有得到明确确认前,不得写入 Apple 或 Obsidian。
### Step 7. 写入 Apple 日历 / 提醒事项
只有当 `output_modes` 包含 Apple,且用户确认写入时,才执行。
写入前检查:
- 当前环境是否是 macOS
- 是否能访问 Calendar
- 是否能访问 Reminders
- 是否能读取可用日历和提醒事项列表
如果读取失败,用人话提示:
```text
我现在不能访问你的 Apple 日历或提醒事项。请打开系统设置,进入“隐私与安全性”,允许当前 AI 工具访问日历和提醒事项。你也可以选择只在对话里展示清单。
```
目标位置规则:
- 有明确开始和结束时间的日历事项,根据 `apple.calendar_rule` 选择日历
- 只有截止时间的任务,根据 `apple.reminder_rule` 选择提醒事项列表
- 没有明确时间但重要的事项,根据 `apple.untimed_rule` 处理
如果配置为“每次让我选择”,先列出可用日历或提醒事项列表,让用户选择。
真正写入前,再展示一次:
```markdown
## 即将写入 Apple
### 日历
- [日历名] 事项:时间:
### 提醒事项
- [列表名] 任务:截止:
```
用户确认后再写入。
### Step 8. 写入 Obsidian 日记页面
只有当 `output_modes` 包含 Obsidian,且用户确认写入时,才执行。
根据待办的目标日期找到对应日记页面:
- 使用 `obsidian.daily_folder`
- 使用 `obsidian.daily_filename_pattern`
- 如果没有目标日期,默认写入今天的日记页面,但要在写入前说明
找到日记页面后,把待办追加到 `obsidian.todo_heading` 对应的小标题下方。
如果找不到这个小标题,询问用户:
```text
我没有在这篇日记里找到“{{OBSIDIAN_TODO_HEADING}}”这个小标题。
你希望我怎么做?
A. 创建这个小标题并写入
B. 改为写到页面最后
C. 取消写入
```
如果待办属于将来的某一天,但那天的日记页面还不存在,按 `obsidian.future_page_rule` 处理:
- 允许按日记模板创建那一天的日记页面,并写入待办
- 不创建新页面,只把待办展示给用户自己处理
- 每次遇到这种情况都先问用户
如果需要创建未来日记页面,但没有配置日记模板,必须先询问用户提供模板路径或模板内容;不要擅自创建空白日记。
写入前展示:
```markdown
## 即将写入 Obsidian
- 目标日记:
- 小标题:
- 待办:
```
用户确认后再写入。
### Step 9. 两个都写入
如果用户选择 Apple 和 Obsidian 都写入:
- Apple 负责提醒和日程执行
- Obsidian 负责在日记里留下记录
- 两边都必须先展示即将写入的内容
- 用户确认后再分别写入
如果其中一个系统写入失败,不要回滚另一个系统;报告成功和失败的明细。
### Step 10. 完成反馈
完成后简短报告:
```markdown
已处理:
- 写入 Apple 日历:X 项
- 写入 Apple 提醒事项:X 项
- 写入 Obsidian 日记:X 项
- 只展示未写入:X 项
- 跳过:X 项
需要你后续处理:
- ...
```
## Output Format
对话中统一使用清晰 Markdown。
待办表格必须包含:
- 编号
- 待办内容
- 建议去向
- 时间
- 判断依据
- 置信度
不要使用用户不容易理解的词,例如 backend、heading、database schema、API token、preview。优先使用:
- 写入位置
- 小标题
- 先给你看
- 连接凭证
- 文件属性
## Quality Checklist
处理前检查:
- 是否只扫描用户提供或配置的路径
- 是否只处理 Markdown 文件
- 是否说明扫描文件数量
- 是否按文件名/标题日期、文件属性日期、创建时间、修改时间筛选文件
- 是否正确处理相对时间
- 是否区分日历事项和提醒事项
- 是否把无时间但重要的事项按用户配置处理
- 是否先把待办清单整理给用户看
- 是否得到用户确认后才写入
- 是否没有写入 Todoist、Notion、Google、Microsoft 或 Apple Notes
- 是否没有导出 JSON 或单独 Markdown 文件
## One Sentence Principle
扫描范围由用户指定;待办先整理给用户看;写入只支持 Apple 日历/提醒事项和 Obsidian 日记页面;不确定就标出来,不自动写错。
六、创建后检查并测试
创建完成后,请检查:
{{SKILL_FOLDER_NAME}}/SKILL.md是否存在。- 所有
{{变量名}}占位符是否都已替换。 - 文件中是否残留用户本机私有路径、真实账号、token、secret、AppSecret。
SKILL.md是否明确写了:不支持 Todoist / Notion / Google / Microsoft / Apple Notes。SKILL.md是否明确写了:不导出 JSON 或单独 Markdown 文件。SKILL.md是否明确写了:写入前必须先整理给用户看并确认。- Obsidian 配置里是否使用“小标题”这个说法,而不是 heading。
- “未来日期日记页面不存在”问题的选项是否是:A 允许按模板创建,B 不创建只展示,C 每次先问。
然后用这条请求做功能验证:
帮我从我配置的会议纪要和录音卡导入文件夹里提取这周的待办,先整理给我看,不要写入。
期望行为:
- skill 只扫描配置的文件夹。
- skill 说明本周起止日期。
- skill 列出命中的 Markdown 文件数量。
- skill 提取待办并给出建议去向、时间、依据和置信度。
- skill 不写入 Apple 或 Obsidian。
- skill 等用户明确选择编号和确认后,才进入写入步骤。
最后告诉用户:
- skill 文件夹创建在哪里
- 创建了哪些文件
- 如何触发这个 skill
- 第一次试跑时应该提供什么请求