卡片笔记工作流(WorkBuddy 生产 × Obsidian 存储)
> ⛔ 访问禁令(2026-09-14 主人定,最高优先级):2026 年内禁止访问整个 <受限盘符>与 <受限工作目录>。
> 本技能落点已迁至 <项目根目录>\知识库(本地磁盘),不再写 <受限盘符>;旧 <受限盘符>同步桥接与落盘脚本一并停用。
分工:WorkBuddy 负责生产笔记,Obsidian 负责存储与织网。
本技能把三个环节固化成可复用的动作,织网/检索用脚本,落盘用 Write 直写。
环境固定路径
PYTHON = <用户主目录>\.workbuddy\binaries\python\envs\default\Scripts\python.exe
SCRIPTS = <用户主目录>\.workbuddy\skills\obsidian-card-notes\scripts
VAULT = <项目根目录>\知识库 # Obsidian 库根(本地磁盘,PARA 八目录)
卡片落点 = <项目根目录>\知识库\00-灵感库 # 卡片:灵感卡|读书:<主题>.md
随笔落点 = <项目根目录>\知识库\00-灵感库 # 随笔:随笔|<主题>.md
旧桥接 = <用户主目录>\WorkBuddy\ObsidianBridge # <受限盘符>同步桥接,2026-09-14 停用(勿再依赖)
- 脚本与 config:
note_lib.py的load_config()读的是旧桥接配置(库根指向 <受限盘符>)。调用时必须显式把 root 传成 本地库根(all_note_paths(cfg, [r"<项目根目录>\知识库"])),否则会在旧库上空跑。 card_note.py/link_notes.py/note_search.py的默认落点同样来自该配置 → 落盘改用 Write 直写 本地库,织网/检索改用note_lib在 本地库范围内自算(示例见bookpage-card-essay技能)。
第零步|书页照片 → 零确认自动执行
用户发来书页/划线/摘录照片(哪怕只有图、没有一句话)时,跳过所有确认环节,直接跑完整链路:
1. Read 读取图片 → 图片横置/旋转时按旋转后方向识别转录;识别不确定处在最终汇报里标注,不阻塞建卡
2. 按内容提炼 1-3 张卡片(一页一金句可一卡,整篇叙事文一卡,避免碎片化)
3. 写草稿 → 按 本地库体例用 Write 直写 00-灵感库\灵感卡|读书:<主题>.md
4. Get-ChildItem <项目根目录>\知识库\00-灵感库 验证落盘
5. 最后一次性向用户汇报:卡片标题清单 + 落盘路径 + 织网情况 + 识别不确定处
中途不询问、不展示草稿求确认、不逐步汇报。临时草稿和日志文件在验证后即清理。
第一步|把书页/划线/语音/念头 → 卡片笔记
输入形态与处理:
- 拍照/截图:用 Read 工具读取图片 → 识别划线文字 → 提炼成卡
- 语音输入:客户端已转写为文字,直接按文字处理
- 零碎念头:用户口述一句话也要补全成完整卡片(核心观点可基于原话合理延展,但不虚构书中没有的原文)
卡片结构(缺一不可,除"马上可做"):
1. ## 核心观点 — 一句话说清主张
2. ## 触发思考 — 2-3 个能勾出个人经历的问题(不是"你怎么看"这类空问)
3. ## 联想经历 — 结合用户实际生活(家庭、个人项目、学习成长)给出代入;默认避开工作业务场景(与用户内容红线一致)
4. ## 马上可做 — 具体小动作;纯认知观点无法落地时整节省略
执行: 卡片正文由模型直接 Write 到 本地库(草稿可先落工作区再搬)。标题要提炼成主张句,不要写"读书笔记 001"——标题就是 Obsidian 里的链接名。
> 历史脚本 card_note.py --content/--file 只用于生成旧库格式正文,其落盘通道已停用(落点绑旧桥接)。
第二步|自动织网(双向链接)
在 本地库范围内算相关度后写链(≥0.10 的前 5-8 篇):
import sys
sys.path.insert(0, r"<用户主目录>\.workbuddy\skills\obsidian-card-notes\scripts")
from note_lib import load_config, all_note_paths, build_index, search, parse_note
cfg = load_config(); root = r"<项目根目录>\知识库"
idx = build_index(all_note_paths(cfg, [root]))
src = r"<项目根目录>\知识库\00-灵感库\灵感卡|读书:<主题>.md"
n = parse_note(src)
for s, p in search(idx, n["title"] + "\n" + n["body"], exclude=src, topk=12):
print("%.3f %s" % (s, p.replace(root + "\\", "")))
- 在双方笔记末尾的
## 相关笔记/## 关联知识段落各加一条[[笔记名]] - 相关度算法:中文 bigram + TF-IDF + 余弦,已剔除卡片模板词;库越小判定越宽松
- 若链接质量不理想:调高阈值(如 0.15 只保留强相关)
- 输出常被控制台吞掉:脚本里落
check.txt(utf-8)后 Read
第三步|写作时调用笔记
用 note_lib.search 在 本地库范围内检索(note_search.py 默认库根是旧库,须显式改指 本地库再用):
for s, p in search(idx, "文章主题", topk=8): print("%.3f %s" % (s, p))
读到相关卡片后,输出 3 个切入角度 + 文章大纲,并标注每个部分调用了哪张卡片
(用 [[卡片名]] 标注,方便用户回 Obsidian 溯源)。
卡片落盘格式
---
title: 灵感卡|读书:课题分离
目录: 00-灵感库
created: 2026-09-14 10:40
type: 卡片笔记
tags: [WorkBuddy, 卡片笔记]
theme: 课题分离
source: 《被讨厌的勇气》P42
---
## 核心观点
...
## 关联知识
- [[灵感卡|读书:人生是刹那的连续]]
用户在 Obsidian 里搜 tag:#卡片笔记 可筛出全部卡片;打开关系图谱即可看到知识网络。
注意事项
- 只写 Markdown 进 vault:库内归档文档(docx/xls 等)不要改动
- 落点是 本地库:
<项目根目录>\知识库,不是<受限盘符>\;<受限盘符>已列入年度访问禁令,禁止再写 - 临时文件清理:工作区
Remove-Item可能被 safe-delete 钩子拦截(FAIL_CLOSED)→ 用Move-Item归拢 - 文件名即链接名:中英文冒号等字符会被替换,重命名笔记后旧
[[链接]]会断,需重新织网 - 同名重复链接:同一篇里同一
[[目标]]出现两次要合并,否则 Obsidian 关系图上重复计边 - 提示词原文与变体见
references/prompts.md
执行环境坑(2026-09-14 实测,必读)
- Bash 工具可能 PATH 损坏(
dirname/lsnot found):全程改用 PowerShell 工具执行脚本 - PowerShell 控制台输出可能被吞(exit 0 但无 stdout):把输出重定向到文件再 Read
- python 脚本输出为 GBK 编码,日志文件会被 Read 判为二进制:不读日志,改用
Get-ChildItem检查落点文件是否生成来验证成功 - 验证成功后立即删除临时草稿、日志、check 文件
--source/标题参数含中文弯引号(“ ”)会致脚本退出码 2 失败:书名号《》可用,弯引号须去掉或换成直引号- PowerShell
>重定向日志实为 UTF-16:Read 会判为 binary;改用[System.IO.File]::WriteAllLines(..., UTF8Encoding(false))由脚本落 UTF-8 文件
版本记录
| 版本 | 日期 | 变更 |
|---|---|---|
| v1.0.0 | 2026-09-07 | 初版:三环节固化(建卡/织网/调用)+ 固定路径 |
| v1.1.0 | 2026-09-14 | 新增第零步「书页照片零确认自动执行」;联想经历改为生活场景优先;记录执行环境坑;首次实战归档(三页书页照片→3 张卡片→自动织网) |
| v1.2.0 | 2026-09-14 | 落点迁至 <项目根目录>\知识库(原默认落点 <受限盘符>,因年度访问禁令停用):卡片→00-灵感库\灵感卡|读书:<主题>.md,随笔→00-灵感库\随笔|<主题>.md;card_note.py 落盘停用、改 Write 直写;织网/检索改用 note_lib 显式传 本地库根;补同名重复链接与临时文件清理两条注意事项 |