feat: 支持同步学习战报

This commit is contained in:
huojl 2026-05-20 20:56:37 +08:00
parent e322bea2c2
commit ea31420849
10 changed files with 1590 additions and 34 deletions

Binary file not shown.

View file

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SonicNote Sync — Obsidian 插件</title>
<title>SonicNote for Obsidian — 插件 &amp; Skills</title>
<style>
:root {
--bg: #f7f8fa;
@ -16,6 +16,13 @@
--code-bg: #1e1e2e;
--code-text: #cdd6f4;
--radius: 8px;
--tag-blue: #e8f4fd;
--tag-blue-text: #1a73e8;
--tag-green: #e6f4ea;
--tag-green-text: #137333;
--tag-purple: #f3e8fd;
--tag-purple-text: #7c3aed;
--divider: linear-gradient(90deg, transparent, var(--border), transparent);
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
@ -28,36 +35,79 @@
.header {
background: var(--surface);
border-bottom: 1px solid var(--border);
padding: 36px 24px 28px;
padding: 40px 24px 32px;
text-align: center;
}
.header .version {
.header .badges { display: flex; justify-content: center; gap: 8px; margin-bottom: 14px; flex-wrap: wrap; }
.badge {
display: inline-block;
background: var(--accent-light);
padding: 2px 10px;
border-radius: 4px;
font-size: 0.78rem;
color: var(--text-secondary);
margin-bottom: 10px;
font-weight: 500;
}
.header h1 { font-size: 1.6rem; font-weight: 700; letter-spacing: -0.3px; margin-bottom: 6px; }
.header p { font-size: 0.92rem; color: var(--text-secondary); margin-bottom: 18px; }
.badge-version { background: var(--accent-light); color: var(--text-secondary); }
.badge-plugin { background: var(--tag-blue); color: var(--tag-blue-text); }
.badge-skill { background: var(--tag-purple); color: var(--tag-purple-text); }
.header h1 { font-size: 1.7rem; font-weight: 700; letter-spacing: -0.3px; margin-bottom: 6px; }
.header p { font-size: 0.92rem; color: var(--text-secondary); max-width: 520px; margin: 0 auto 20px; }
.header-actions { display: flex; justify-content: center; gap: 10px; flex-wrap: wrap; }
.download-btn {
display: inline-flex;
align-items: center;
gap: 6px;
background: var(--accent);
color: #fff;
padding: 9px 28px;
padding: 9px 22px;
border-radius: 6px;
font-size: 0.92rem;
font-size: 0.88rem;
font-weight: 500;
text-decoration: none;
transition: opacity 0.15s;
white-space: nowrap;
}
.download-btn:hover { opacity: 0.82; }
.download-btn svg { width: 16px; height: 16px; }
.download-btn svg { width: 15px; height: 15px; }
.download-btn.outline {
background: transparent;
color: var(--accent);
border: 1px solid var(--border);
}
.download-btn.outline:hover { background: var(--accent-light); }
.platform-note {
display: inline-block;
font-size: 0.72rem;
color: var(--text-secondary);
margin-top: 2px;
font-weight: 400;
}
.container { max-width: 700px; margin: 0 auto; padding: 24px 20px 60px; }
/* Nav */
.nav {
display: flex;
gap: 0;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
margin-bottom: 14px;
overflow: hidden;
}
.nav a {
flex: 1;
text-align: center;
padding: 10px 12px;
font-size: 0.88rem;
font-weight: 500;
text-decoration: none;
color: var(--text-secondary);
transition: background 0.15s, color 0.15s;
border-right: 1px solid var(--border);
}
.nav a:last-child { border-right: none; }
.nav a:hover { background: var(--accent-light); color: var(--text); }
/* Cards */
.card {
background: var(--surface);
border: 1px solid var(--border);
@ -70,15 +120,49 @@
margin-bottom: 14px;
padding-bottom: 10px;
border-bottom: 1px solid var(--border);
display: flex;
align-items: center;
gap: 8px;
}
.card h3 { font-size: 0.92rem; margin: 16px 0 6px; font-weight: 600; }
.card h2 .icon { font-size: 1.1rem; }
.card h3 { font-size: 0.95rem; margin: 18px 0 6px; font-weight: 600; }
.card h4 { font-size: 0.9rem; margin: 12px 0 4px; font-weight: 600; color: var(--text); }
.card p, .card li { color: var(--text-secondary); font-size: 0.9rem; }
.card ol, .card ul { padding-left: 18px; margin: 4px 0; }
.card li { margin-bottom: 2px; }
.code-wrap {
position: relative;
margin: 8px 0;
.card li { margin-bottom: 3px; }
/* Section divider */
.section-divider {
height: 1px;
background: var(--divider);
margin: 28px 0;
}
/* Skill hero */
.skill-hero {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 24px 26px 20px;
margin-bottom: 14px;
border-left: 4px solid var(--tag-purple);
}
.skill-hero .skill-tag {
display: inline-block;
background: var(--tag-purple);
color: var(--tag-purple-text);
padding: 2px 10px;
border-radius: 4px;
font-size: 0.78rem;
font-weight: 500;
margin-bottom: 10px;
}
.skill-hero h2 { font-size: 1.15rem; margin-bottom: 6px; border: none; padding: 0; }
.skill-hero p { color: var(--text-secondary); font-size: 0.9rem; margin-bottom: 14px; }
.skill-hero .skill-actions { display: flex; gap: 10px; flex-wrap: wrap; }
/* Code */
.code-wrap { position: relative; margin: 8px 0; }
.code-wrap pre {
background: var(--code-bg);
color: var(--code-text);
@ -91,8 +175,7 @@
}
.copy-btn {
position: absolute;
top: 6px;
right: 6px;
top: 6px; right: 6px;
background: rgba(255,255,255,0.1);
border: none;
border-radius: 4px;
@ -114,36 +197,146 @@
font-size: 0.85em;
color: var(--text);
}
/* Tables */
table { width: 100%; border-collapse: collapse; margin: 8px 0; }
th { text-align: left; padding: 7px 12px; background: var(--accent-light); font-weight: 600; font-size: 0.85rem; }
td { padding: 7px 12px; border-bottom: 1px solid var(--border); font-size: 0.88rem; }
/* Feature grid */
.feature-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
margin: 10px 0;
}
.feature-item {
background: var(--accent-light);
border-radius: 6px;
padding: 12px 14px;
}
.feature-item .fi-title { font-size: 0.88rem; font-weight: 600; margin-bottom: 2px; }
.feature-item .fi-desc { font-size: 0.82rem; color: var(--text-secondary); }
/* Style chips */
.style-chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }
.style-chip {
display: inline-block;
background: var(--accent-light);
padding: 4px 10px;
border-radius: 12px;
font-size: 0.8rem;
color: var(--text);
}
/* Classification table */
.cls-table td:first-child { font-weight: 500; white-space: nowrap; }
footer {
text-align: center;
padding: 20px;
color: var(--text-secondary);
font-size: 0.8rem;
}
/* Back to top */
.back-to-top {
position: fixed;
bottom: 32px;
right: 32px;
width: 40px;
height: 40px;
background: var(--accent);
color: #fff;
border: none;
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
visibility: hidden;
transition: opacity 0.25s, visibility 0.25s, transform 0.25s;
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
z-index: 100;
}
.back-to-top.visible { opacity: 1; visibility: visible; }
.back-to-top:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,0.2); }
.back-to-top svg { width: 20px; height: 20px; }
@media (max-width: 640px) {
.header { padding: 28px 16px 22px; }
.header h1 { font-size: 1.35rem; }
.card { padding: 18px 16px; }
.feature-grid { grid-template-columns: 1fr; }
.nav a { font-size: 0.8rem; padding: 8px 6px; }
}
</style>
</head>
<body>
<header class="header">
<div class="version">v1.1.4</div>
<h1>SonicNote Sync</h1>
<p>将 SonicNote 妙记的录音、转录、总结同步到 Obsidian以 Markdown 文件管理。</p>
<a class="download-btn" href="sonicnote-sync-v1.1.4.zip" download>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
下载插件
</a>
<div class="badges">
<span class="badge badge-version">v1.1.4</span>
<span class="badge badge-plugin">Obsidian 插件</span>
<span class="badge badge-skill">2 个 Skills</span>
</div>
<h1>SonicNote for Obsidian</h1>
<p>录音同步、待办提取、工作总结 — 让 Obsidian 成为你的智能笔记中心</p>
<div class="header-actions">
<a class="download-btn" href="sonicnote-sync-v1.1.4.zip" download>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
SonicNote Sync 插件
</a>
<a class="download-btn outline" href="md-todo-extractor.zip" download>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
MD 待办提取器
</a>
<a class="download-btn outline" href="work-summary.zip" download>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
工作总结生成器
</a>
</div>
</header>
<div class="container">
<!-- Quick Nav -->
<nav class="nav">
<a href="#plugin">SonicNote Sync 插件</a>
<a href="#skill-todo">MD 待办提取器</a>
<a href="#skill-summary">工作总结生成器</a>
</nav>
<!-- ============================================================ -->
<!-- SECTION: Obsidian Plugin -->
<!-- ============================================================ -->
<div id="plugin"></div>
<div class="card">
<h2><span class="icon">🔌</span> SonicNote Sync 插件</h2>
<p>将 SonicNote 妙记的录音、转录、AI 总结同步到 Obsidian以 Markdown 文件管理。每条录音对应一个文件,包含完整的元数据和内容。</p>
<div class="feature-grid">
<div class="feature-item">
<div class="fi-title">录音同步</div>
<div class="fi-desc">一键拉取全部录音,自动生成 Markdown</div>
</div>
<div class="feature-item">
<div class="fi-title">AI 转录</div>
<div class="fi-desc">含说话人识别和时间戳的逐字转录</div>
</div>
<div class="feature-item">
<div class="fi-title">智能总结</div>
<div class="fi-desc">AI 自动生成的要点和行动项</div>
</div>
<div class="feature-item">
<div class="fi-title">自定义属性</div>
<div class="fi-desc">灵活配置 Frontmatter 字段</div>
</div>
</div>
</div>
<div class="card">
<h2>更新记录</h2>
<h3>v1.1.4</h3>
@ -158,14 +351,13 @@
<h3>v1.1.2</h3>
<ul>
<li>已同步的录音不会被覆盖更新,删除文件后重新同步即可获取最新内容</li>
<li>唯一例外:录音尚未生成总结时文件名为原始名称(如 Note-xxx.mp3,生成总结标题后再次同步会自动覆盖并重命名为总结标题</li>
<li>唯一例外:录音尚未生成总结时文件名为原始名称,生成总结标题后再次同步会自动覆盖并重命名</li>
</ul>
<h3>v1.1.0</h3>
<ul>
<li>修复录音进行中重复创建文件的问题</li>
<li>AI 总结移至转录内容之前,优先阅读</li>
<li>新增"包含转录内容"开关,可按需关闭</li>
<li>文件名去除日期前缀,直接使用录音原始名称</li>
<li>切换为 HTTPS 接口</li>
</ul>
</div>
@ -210,7 +402,7 @@
<ol>
<li>进入 <strong>设置 → SonicNote Sync</strong></li>
<li>点击"登录"按钮</li>
<li>输入 SonicNote 妙记的手机号和密码(使用 APP 验证码或申领长期密码)</li>
<li>输入 SonicNote 妙记的手机号和密码(使用 APP 验证码或申领长期密码)</li>
</ol>
<h3>同步录音</h3>
@ -243,6 +435,8 @@
<tbody>
<tr><td>同步文件夹</td><td><span class="inline-code">SonicNoteSync</span></td><td>Markdown 文件存放目录</td></tr>
<tr><td>包含转录内容</td><td>开启</td><td>关闭后同步文件中不包含逐字转录</td></tr>
<tr><td>文件属性</td><td>全部开启</td><td>按需开关 Frontmatter 中的内置属性字段</td></tr>
<tr><td>自定义属性</td><td></td><td>添加自定义键值对到所有同步文件</td></tr>
</tbody>
</table>
</div>
@ -255,9 +449,191 @@
</ol>
</div>
<!-- ============================================================ -->
<!-- DIVIDER -->
<!-- ============================================================ -->
<div class="section-divider"></div>
<!-- ============================================================ -->
<!-- SECTION: Skill — MD 待办提取器 -->
<!-- ============================================================ -->
<div id="skill-todo"></div>
<div class="skill-hero">
<span class="skill-tag">Skill</span>
<span class="badge" style="background: var(--tag-blue); color: var(--tag-blue-text); margin-left:4px; vertical-align:middle;">仅 macOS</span>
<h2>MD 待办提取器</h2>
<p>从 Markdown 文件中智能提取待办事项,自动分类添加到 macOS 日历、提醒事项或备忘录。</p>
</div>
<div class="card">
<h2>智能分类规则</h2>
<p>AI 自动判断每条待办的重要性和时间属性,分类到最合适的系统应用:</p>
<table class="cls-table">
<thead><tr><th>分类</th><th>判断标准</th><th>目标应用</th></tr></thead>
<tbody>
<tr><td>📅 日历</td><td>同半天内≤4小时有明确开始和结束时间的会议/讨论</td><td>Calendar</td></tr>
<tr><td>⏰ 提醒事项</td><td>跨度超半天,或只有截止时间无明确开始时间</td><td>Reminders</td></tr>
<tr><td>📝 备忘录</td><td>无明确时间但很重要</td><td>Notes</td></tr>
<tr><td>⏭️ 跳过</td><td>既无时间也不重要</td><td></td></tr>
</tbody>
</table>
</div>
<div class="card">
<h2>安装</h2>
<ol>
<li>点击页面顶部按钮下载 <span class="inline-code">md-todo-extractor.zip</span></li>
<li>解压得到 <span class="inline-code">SKILL.md</span> 文件</li>
<li>将其复制到你所用 AI 工具的 Skills 目录,例如:</li>
</ol>
<div class="code-wrap"><button class="copy-btn" title="复制"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></button><pre><code># Claude Code
~/.claude/skills/md-todo-extractor/SKILL.md
# 其他支持 Skill 的工具请参照其文档</code></pre></div>
<ol start="4">
<li>重启 AI 工具会话Skill 自动加载</li>
</ol>
</div>
<div class="card">
<h2>使用方法</h2>
<h3>基本用法</h3>
<p>在支持 Skill 的 AI 工具中,告诉 AI 你要分析的文件或文件夹:</p>
<div class="code-wrap"><button class="copy-btn" title="复制"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></button><pre><code>帮我分析 ~/Documents/projects 下的待办事项</code></pre></div>
<h3>指定时间范围</h3>
<div class="code-wrap"><button class="copy-btn" title="复制"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></button><pre><code>从 md 文件提取上周的待办,加入日历</code></pre></div>
<h3>工作流程</h3>
<ol>
<li>提供 md 文件路径或文件夹路径(可选指定时间范围)</li>
<li>AI 扫描文件,识别潜在待办事项</li>
<li>显示分类结果表格,等待你确认</li>
<li>选择目标日历/提醒列表/备忘录文件夹</li>
<li>通过 AppleScript 自动添加到 macOS 系统应用</li>
</ol>
<h3>系统要求</h3>
<ul>
<li><strong>仅支持 macOS</strong>(依赖 AppleScript 操作日历、提醒事项、备忘录)</li>
<li>首次使用需在 <strong>系统偏好设置 → 隐私与安全性</strong> 中授予日历、提醒事项、备忘录权限</li>
</ul>
</div>
<!-- ============================================================ -->
<!-- DIVIDER -->
<!-- ============================================================ -->
<div class="section-divider"></div>
<!-- ============================================================ -->
<!-- SECTION: Skill — 工作总结生成器 -->
<!-- ============================================================ -->
<div id="skill-summary"></div>
<div class="skill-hero" style="border-left-color: var(--tag-green);">
<span class="skill-tag" style="background: var(--tag-green); color: var(--tag-green-text);">Skill</span>
<h2>工作总结生成器</h2>
<p>从日记、会议记录、碎片笔记中生成多风格深度工作总结。核心理念:不要复述做了什么,要说出发现了什么。</p>
</div>
<div class="card">
<h2>13 种总结风格</h2>
<p>根据日记内容智能推荐最佳风格,也可自选多种风格一次生成:</p>
<div class="style-chips">
<span class="style-chip">1. 模式发现型</span>
<span class="style-chip">2. 成果导向型</span>
<span class="style-chip">3. 风险预警型</span>
<span class="style-chip">4. 学习成长型</span>
<span class="style-chip">5. 叙事故事型</span>
<span class="style-chip">6. 极简清单型</span>
<span class="style-chip">7. OKR 对齐型</span>
<span class="style-chip">8. 时间审计型</span>
<span class="style-chip">9. 关系网络型</span>
<span class="style-chip">10. 决策复盘型</span>
<span class="style-chip">11. 情绪日志型</span>
<span class="style-chip">12. 跨界联想型</span>
<span class="style-chip">13. 古龙简洁型</span>
</div>
</div>
<div class="card">
<h2>风格说明</h2>
<table>
<thead><tr><th style="width:130px">风格</th><th>核心定位</th><th>适用场景</th></tr></thead>
<tbody>
<tr><td>模式发现型</td><td>找规律、重复问题、趋势变化</td><td>日常复盘、深度思考</td></tr>
<tr><td>成果导向型</td><td>聚焦完成的事,结构清晰</td><td>向上汇报、团队同步、周报</td></tr>
<tr><td>风险预警型</td><td>识别潜在问题、依赖风险</td><td>项目管理、多项目并行</td></tr>
<tr><td>学习成长型</td><td>提炼认知升级、方法论</td><td>个人成长、知识沉淀</td></tr>
<tr><td>叙事故事型</td><td>起承转合的故事叙事</td><td>分享交流、团队文化</td></tr>
<tr><td>极简清单型</td><td>核心要点 + 下一步行动</td><td>快速回顾、内容繁多</td></tr>
<tr><td>OKR 对齐型</td><td>工作与目标对齐,评估进展</td><td>目标管理、季度复盘</td></tr>
<tr><td>时间审计型</td><td>分析时间分配和 ROI</td><td>效率提升、时间管理</td></tr>
<tr><td>关系网络型</td><td>梳理人际互动和变化</td><td>人脉管理、客户关系</td></tr>
<tr><td>决策复盘型</td><td>回顾决策依据和对错</td><td>决策质量提升</td></tr>
<tr><td>情绪日志型</td><td>记录情绪起伏和触发因素</td><td>情绪管理、自我觉察</td></tr>
<tr><td>跨界联想型</td><td>跨领域类比,产生灵感</td><td>创新思考、打破定式</td></tr>
<tr><td>古龙简洁型</td><td>50 字内升华工作意义</td><td>快速回顾、积极心态</td></tr>
</tbody>
</table>
</div>
<div class="card">
<h2>安装</h2>
<ol>
<li>点击页面顶部按钮下载 <span class="inline-code">work-summary.zip</span></li>
<li>解压得到 <span class="inline-code">SKILL.md</span><span class="inline-code">references/styles.md</span></li>
<li>保持目录结构复制到你所用 AI 工具的 Skills 目录,例如:</li>
</ol>
<div class="code-wrap"><button class="copy-btn" title="复制"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></button><pre><code># Claude Code
~/.claude/skills/work-summary/
├── SKILL.md
└── references/
└── styles.md
# 其他支持 Skill 的工具请参照其文档</code></pre></div>
<ol start="4">
<li>重启 AI 工具会话Skill 自动加载</li>
</ol>
</div>
<div class="card">
<h2>使用方法</h2>
<h3>基本用法</h3>
<p>在支持 Skill 的 AI 工具中,告诉 AI 你想总结哪段时间:</p>
<div class="code-wrap"><button class="copy-btn" title="复制"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></button><pre><code>帮我总结今天的工作</code></pre></div>
<h3>指定时间范围</h3>
<div class="code-wrap"><button class="copy-btn" title="复制"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></button><pre><code>总结本周的工作风格选1和13</code></pre></div>
<h3>工作流程</h3>
<ol>
<li><strong>获取素材</strong> — 确认时间范围,自动查找日记文件</li>
<li><strong>选择风格</strong> — 展示全部 13 种风格,智能推荐 + 自选</li>
<li><strong>生成总结</strong> — 按选定风格的 prompt 模板深度生成</li>
<li><strong>输出方式</strong> — 对话展示 / 追加到日记 / 生成独立文件</li>
</ol>
<h3>Obsidian 集成</h3>
<p>如果 Obsidian 正在运行且支持 CLISkill 会优先通过 CLI 操作文件(读取、追加、创建、搜索),无需手动指定完整路径。</p>
<div class="code-wrap"><button class="copy-btn" title="复制"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></button><pre><code># 读取日记
obsidian read path="日记文件夹/日记2026-05-12.md"
# 追加总结到文件
obsidian append path="日记文件夹/日记2026-05-12.md" content="..."
# 创建独立总结文件
obsidian create path="日记文件夹/总结2026-05-12.md" content="..."</code></pre></div>
</div>
</div>
<footer>SonicNote Sync &copy; 2026</footer>
<footer>SonicNote for Obsidian &copy; 2026</footer>
<button class="back-to-top" id="backToTop" title="返回顶部">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="18 15 12 9 6 15"/></svg>
</button>
<script>
document.querySelectorAll('.copy-btn').forEach(btn => {
@ -273,6 +649,15 @@ document.querySelectorAll('.copy-btn').forEach(btn => {
});
});
});
// Back to top
const backToTop = document.getElementById('backToTop');
window.addEventListener('scroll', () => {
backToTop.classList.toggle('visible', window.scrollY > 400);
});
backToTop.addEventListener('click', () => {
window.scrollTo({ top: 0, behavior: 'smooth' });
});
</script>
</body>

BIN
release/work-summary.zip Normal file

Binary file not shown.

View file

@ -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`)在指定范围内筛选
### 步骤 3AI 提取待办事项
分析每个 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 基础
```

186
skill/work-summary/SKILL.md Normal file
View file

@ -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 是否可用

View file

@ -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字
语气:古龙风格、简洁、积极、有意境
```

View file

@ -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<StudyReportData | null> {
const res = await this.request('GET', `/share/${audioId}/studyReport`);
if (res.code !== 200) {
return null;
}
return res.data;
}
}

View file

@ -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('## 转录内容');

View file

@ -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<string> {
const settings = this.getSettings();
const tasks: [string, Promise<TranscriptSegment[] | SummaryData | string | null>][] = [];
const tasks: [string, Promise<TranscriptSegment[] | SummaryData | StudyReportData | string | null>][] = [];
// 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);
}
}

View file

@ -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 {