mirror of
https://github.com/long2icc/sonicnote-sync.git
synced 2026-07-22 07:45:14 +00:00
feat: 支持同步学习战报
This commit is contained in:
parent
e322bea2c2
commit
ea31420849
10 changed files with 1590 additions and 34 deletions
BIN
release/md-todo-extractor.zip
Normal file
BIN
release/md-todo-extractor.zip
Normal file
Binary file not shown.
|
|
@ -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 — 插件 & 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 正在运行且支持 CLI,Skill 会优先通过 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 © 2026</footer>
|
||||
<footer>SonicNote for Obsidian © 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
BIN
release/work-summary.zip
Normal file
Binary file not shown.
351
skill/md-todo-extractor/SKILL.md
Normal file
351
skill/md-todo-extractor/SKILL.md
Normal 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`)在指定范围内筛选
|
||||
|
||||
### 步骤 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 基础
|
||||
```
|
||||
186
skill/work-summary/SKILL.md
Normal file
186
skill/work-summary/SKILL.md
Normal 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 是否可用
|
||||
589
skill/work-summary/references/styles.md
Normal file
589
skill/work-summary/references/styles.md
Normal 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字
|
||||
语气:古龙风格、简洁、积极、有意境
|
||||
```
|
||||
10
src/api.ts
10
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<StudyReportData | null> {
|
||||
const res = await this.request('GET', `/share/${audioId}/studyReport`);
|
||||
if (res.code !== 200) {
|
||||
return null;
|
||||
}
|
||||
return res.data;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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('## 转录内容');
|
||||
|
|
|
|||
11
src/sync.ts
11
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<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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in a new issue