| name | ob-bridge |
| description | 终端 Claude Code ⇄ Obsidian 的上下文桥。① 卸货:把工作产物(md/html/图片)+可选完整会话 transcript 落到 vault 的 _inbox 暂存区;② 接手:在新会话/新 AI 里查询 _inbox、列出可恢复的会话与文件结构、读 transcript 恢复全量上下文继续。触发词:ob-bridge、落地到 obsidian、卸货到 inbox、从 obsidian 恢复、继续之前的工作、接手 inbox。 |
终端 Claude Code 与 Obsidian 之间的双向上下文桥。卸货端:把会话产物原样写入 vault 的 _inbox/{日期}-{话题}/,可选连完整 transcript 一起带;接手端:在新会话里从 _inbox 发现并读回之前的上下文继续干。
解决"终端结论易逝 + 换环境续不上":① 把探索/实现产物(及完整上下文)沉淀进本地 Obsidian 暂存区;② 让任何新会话/新 AI(尤其 Obsidian 内的 Claudian)能发现并读回这些内容接着干。不进 wiki、无 ceremony。
触发词:
- 卸货:ob-bridge、落地到 obsidian、卸货到 inbox、沉淀到暂存区、连上下文带过去
- 接手:从 obsidian 恢复、继续之前的工作、接手 inbox、ob-bridge list、ob-bridge resume、读桥接
示例:
- "ob-bridge web-access-vs-opencli"(卸货)
- "把刚才的工作连完整上下文带过去"(卸货 + 桥接 transcript)
- "从 obsidian 恢复之前的工作"(接手)
- "ob-bridge list"(列出 _inbox 里可恢复的会话)
Obsidian 上下文桥 (ob-bridge)
⚠️ 给「维护本 skill 的人」的硬约束(动手前先读):
- 绝不在本 SKILL.md、示例、或生成的产物里写任何真实的本地绝对路径、用户名、vault 名、token/密钥。一律用变量(
$OBSIDIAN_REPO)或 <占位符>。真实值只在运行时解析。
- 所有外部依赖(ob-router、Obsidian 插件、Claudian)都前置探测 + 缺失降级,不假设用户环境。
- 路径、vault 名、日期等运行时解析,不写字面量。
一、本质与边界
本质:vault 的 _inbox/ 是「终端 ⇄ Obsidian」的中转区。卸货把会话产物(及可选完整 transcript)写进去;接手从里面把上下文读回来继续。
明确不做(硬边界):
- ❌ 不提升进
wiki/(那是 ob-topic / ob-compile / Claudian 的事)
- ❌ 不写 README / 状态 / manifest / 交接文件(无 ceremony,就一个日期+话题文件夹)
- ❌ 不转换格式(html 直接产出 .html)
- ❌ 不擅自触发 Remotely Save 同步(除非用户要求)
- ❌ 接手模式只读
_inbox/,不改不删里面的东西
二、前置检查(新用户视角:缺什么提示什么,能降级就降级)
1. 解析 vault 路径 $OBSIDIAN_REPO(绝不写死)
优先级解析,存入变量,全程用变量、不打印写死的绝对路径:
- 有 ob-router skill → 委托它解析
- 否则读环境变量
$OBSIDIAN_REPO
- 否则读项目/全局
CLAUDE.md 的 OBSIDIAN_REPO 配置
- 都没有 → 询问用户路径,建议持久化
校验 [ -d "$OBSIDIAN_REPO" ],不存在则停下提示。
2. 运行时派生
VAULT_NAME="$(basename "$OBSIDIAN_REPO")"
INBOX="$OBSIDIAN_REPO/_inbox"
DATE="$(date +%F)"
3. 深链能力 / Claudian 探测(仅卸货用)
obsidian://open 是核心协议,无需插件 → 默认用它。
- 读
$OBSIDIAN_REPO/.obsidian/community-plugins.json:含 obsidian-advanced-uri 可选增强;含 claudian → 正常引导,否则降级为「仅暂存供阅读」。
三、卸货流程(dump,默认无摩擦)
- 话题 slug:带参数则规整用之;否则从当前工作推断一个简短 slug。
- 目标文件夹:
$INBOX/$DATE-<slug>/(同会话复用追加 / 用户点名已存在则用它 / 否则新建)。
- 写入产物:
mkdir -p "$INBOX/$DATE-<slug>"
- 文本/Markdown → Write
.md;HTML → Write 直接产出 .html(不转 md);图片/二进制 → cp 进去。原样保真。
- 生成交接信息:
- 选主产物(优先主
.md;只有 html/图片时深链降级为打开 vault)。
- 拼核心深链:
obsidian://open?vault=<VAULT_NAME>&file=<主产物相对 vault 路径>(file 保留原样 /,不要 %2F;编码用 python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1]))" "<相对路径>")。
- 输出:文件夹路径 + 主产物深链 + 一行引导「产物已落
_inbox/$DATE-<slug>/,去 Obsidian 用 Claudian 接着干」。
四、产出示例(全部占位符)
✅ 已卸货 3 个产物到 _inbox:
📁 $OBSIDIAN_REPO/_inbox/2026-06-14-<topic-slug>/
├── 对比分析.md
├── demo.html
└── 截图.png
🔗 obsidian://open?vault=<vault-name>&file=_inbox/2026-06-14-<topic-slug>/对比分析.md
👉 去 Obsidian 用 Claudian 接着干,vault 即其工作目录,直接读上面这个文件夹即可。
五、桥接模式(可选:连完整 transcript 一起卸)
用途:要断终端、换 Claudian/新 AI 接着干。摘要是有损的(常 < 完整上下文的 1%)。本模式额外把本会话完整 transcript 卸进同一文件夹,让接手方读全量上下文。默认不开,用户说「连完整上下文带过去」「完整迁移」时开启。
⚠️ 安全(transcript 几乎必然含密钥:启动注入的 CLAUDE.md、命令里的 token):
- 是否上云?——先问清/按用户既定偏好:
- 默认(最稳):往
.remotely-save-ignore 追加 _inbox/**/*.jsonl → transcript 只本机读、不同步上云/手机。
- 例外(用户明确接受上云,如个人单用户/私有云):跳过 sync-ignore,transcript 随 vault 同步;此时安全只剩打码,务必告知残留风险。
- best-effort 打码(始终做):运行时从用户
CLAUDE.md/配置读取已知密钥值,sed 替换为 <REDACTED-*> 再拷。skill 绝不内置真实密钥值;打码追不干净,仅纵深防御。
- 拷贝(当前会话 transcript = 项目目录里最新的 .jsonl):
PROJ="$HOME/.claude/projects/$(pwd | sed 's#/#-#g')"
SRC="$(ls -t "$PROJ"/*.jsonl | head -1)"
- 摘要留指针:主产物 md 顶部加一句「完整上下文在
transcript-*.jsonl,接手的 AI 直接读它」。
六、接手/恢复模式(resume:新会话从 _inbox 捡起上下文)
用途:在新会话 / 新 AI(尤其 Obsidian 内的 Claudian)里,从 _inbox/ 发现并读回之前卸下的上下文接着干。这是桥的另一端,回答「没有上下文的新 AI 怎么知道去哪读」。
触发:用户说「从 obsidian 恢复」「继续之前的工作」「接手 inbox」「ob-bridge list/resume」。
- 解析
$OBSIDIAN_REPO(同前置检查第 1 步)。
- 列出可恢复的会话(扫
_inbox/,按日期倒序):
ls -dt "$OBSIDIAN_REPO/_inbox"/*/ 2>/dev/null
- 空 → 提示「
_inbox/ 暂无内容,可能还没卸过货」,结束。
- 报告每个候选的文件结构(让用户/AI 一眼知道有啥、去哪读):
ls -la "$OBSIDIAN_REPO/_inbox/<选中文件夹>/"
文件角色约定:
| 文件 | 角色 | 怎么用 |
|---|
transcript-*.jsonl | 完整逐字上下文 | 读它恢复全量(首选) |
*.md | 摘要 / 产物 | 快速概览、导航 |
*.html / 图片 | 富产物 | 按需查看 |
- 恢复并继续:
- 用户要「完整接着干」→ 读
transcript-*.jsonl 拿全量上下文(含决策来龙去脉),再继续。
- 只要概览 → 读摘要
.md。
- 默认挑最新的文件夹;用户点名某话题则用对应文件夹。
- 多个候选时先把列表给用户挑,不擅自假设。
七、Check List(执行后自检)
卸货:
桥接 transcript(如开启):
接手(如使用):
通用: