iamrohithrnair/obsidian-tui

GitHub: iamrohithrnair/obsidian-tui

一款运行在终端中的 Obsidian 知识库管理器,直接读写 Markdown 文件,支持实时预览、双向链接、图谱视图和 AI 助手。

Stars: 16 | Forks: 0

# obsidian-tui **最好的 Obsidian TUI。** 你的知识库,还是你熟悉的样子:三 面板布局、实时预览 Markdown、双向链接、力导向图和 18 款主题。只不过它运行在你的终端里,再也不需要你碰鼠标。 将它指向你现有的知识库即可。不需要导入步骤,没有数据库,也没有 锁定:它读取的是和 Obsidian 相同的普通 Markdown 文件文件夹,并且 你可以让 Obsidian 一直开着这个文件夹。关闭这个程序,你的 笔记就会恢复为原先的文件状态。 它还配备了一个 AI 助手,能通过与你完全相同的命令来处理你的笔记,这样你可以亲眼看到它做了什么,而不只是听信它的总结。 ![obsidian-tui:遍历文件树、双向链接、图形视图和主题切换](https://static.pigsec.cn/wp-content/uploads/repos/cas/61/6150728cf7a99a009d3e14dcc6f814871ffab8e1010b3e59894854b1f844b05c.gif) ## 安装 使用单行命令是最简单的方式。它会自动判断适合你机器的构建版本, 下载它,并在执行任何操作之前根据公布的校验和对其进行验证: ``` curl -fsSL https://obsidian-tui.github.io/install.sh | sh ``` 支持 macOS 和 Linux。设置 `OTUI_BIN_DIR` 来选择安装位置,或者使用 `OTUI_VERSION` 来指定某个版本。将脚本直接传递给 shell 执行始终建议先检查一下; [在这里查看完整脚本](https://github.com/iamrohithrnair/obsidian-tui/blob/main/install.sh), 它只有大约 150 行,非常易读。 或者使用你已经信任的任何包管理器。 **Homebrew** (macOS 和 Linux): ``` brew install iamrohithrnair/tap/obsidian-tui ``` **npm**,如果你想在正式安装前先试用一下: ``` npx obsidian-tui ~/Notes # run it once, install nothing npm install -g obsidian-tui # keep it ``` **Cargo** (需要 Rust 1.88 或更高版本): ``` cargo install --git https://github.com/iamrohithrnair/obsidian-tui obsidian-tui ``` **手动下载。** 从 [最新发布版本](https://github.com/iamrohithrnair/obsidian-tui/releases/latest) 中获取一个压缩包: ``` tar -xzf obsidian-tui-.tar.gz shasum -a 256 -c obsidian-tui-.tar.gz.sha256 # optional but cheap sudo mv obsidian-tui-/obsidian-tui /usr/local/bin/ xattr -d com.apple.quarantine /usr/local/bin/obsidian-tui # macOS only ``` 为 `aarch64-apple-darwin` (Apple silicon)、 `x86_64-unknown-linux-gnu`、`aarch64-unknown-linux-gnu` 和 `x86_64-pc-windows-msvc` 提供了预编译版本。Intel Mac 需使用 cargo 从源码构建。 **通过克隆仓库构建:** ``` git clone https://github.com/iamrohithrnair/obsidian-tui cd obsidian-tui cargo install --path crates/otui --locked # installs to ~/.cargo/bin cargo build --release # or just build it ``` ## 运行 ``` obsidian-tui ~/Notes # a specific vault obsidian-tui # the vault Obsidian last had open obsidian-tui --list-vaults # what Obsidian knows about ``` obsidian-tui 接受常规的命令行 flags 以及桌面应用注册的 `obsidian://` URI,因此打开 Obsidian 的链接或脚本同样也可以打开它: ``` obsidian-tui ~/Notes --note "Project Ideas" obsidian-tui ~/Notes --search "quarterly" obsidian-tui ~/Notes --daily obsidian-tui ~/Notes --graph obsidian-tui 'obsidian://open?vault=Notes&file=Ideas' ``` ### 与 Obsidian 自带的 CLI 并存 Obsidian 附带了一个[官方 CLI](https://obsidian.md/cli),可以在 设置 → 通用 → “Command line interface” 中启用。两者负责不同的工作: | | `obsidian` | `obsidian-tui` | |---|---|---| | 本质是 | 应用的遥控器 | 界面本身 | | 交流对象 | 正在运行的桌面应用 | 知识库的文件 | | 需要 Obsidian 实例 | 是的,如果没有运行还会启动一个 | 否 | | 在没有显示器的机器上 | 需要 `--ozone-platform=headless` 或 Xvfb | 直接运行即可 | 因此它们是互补的,而不是竞争关系。当 `obsidian` 二进制文件位于你的 `PATH` 中时,obsidian-tui 会将它用于只有桌面应用能做的那一件事: 即将笔记交给 GUI: - 助手面板中的 `/obsidian` 会报告 CLI 的状态以及应用已知的知识库。 - `/obsidian open`,或者命令面板中的“Open this note in Obsidian”, 会在桌面应用中打开当前笔记。 如果未启用 CLI,或者 Obsidian 没有运行,obsidian-tui 会提示并 继续运行;其他任何功能都不依赖于它。 ## 快捷键 在 Obsidian 有的地方使用它的快捷键,在没有的地方则遵循其他 TUI 的惯例。在应用中按 `?` 可查看完整列表。 | | | |---|---| | `?` | 键盘快捷键 | | `q` | 退出(会先询问;编辑时也可以使用 `Ctrl+Q`) | | `Ctrl+O` | 快速切换 | | `Ctrl+P` | 命令面板 | | `Ctrl+Shift+F` | 搜索所有笔记 | | `Ctrl+E` | 切换 阅读 / 编辑 | | `Ctrl+N` / `Ctrl+D` | 新建笔记 / 今日日记 | | `Ctrl+G` / `Ctrl+Shift+G` | 全局图 / 本地图 | | `Ctrl+L` | 助手面板 | | `Ctrl+\` / `Ctrl+]` | 切换侧边栏 | | `Tab` | 在面板间移动 | | `hjkl`, `g`, `G` | 在面板内移动 | | `Enter` | 打开 / 跟随链接 | 在文件浏览器中:`/` 按名称过滤,`s` 更改排序方式,`Space` 折叠文件夹,而 `H`/`L` 一次性折叠或展开所有文件夹。 在图形视图中:`hjkl` 平移,`+`/`-` 缩放,`f` 将整个图适配到屏幕上, `Tab`/`Shift+Tab` 在节点间切换,`c` 重新以选中项为中心,`L` 切换标签显示,`u` 显示未解析的链接,`t` 显示标签,`r` 重建布局。 `q` 永远不会在你可能正在输入的地方退出:在编辑器、聊天框 或搜索字段中它会输入一个 `q`,而 `Ctrl+Q` 才是退出的方式。 上下文相关的提示栏位于状态栏上方,显示适用于当前所处位置的按键; `Ctrl+P` → “Toggle shortcut hints” 可以将其关闭。 ## 鼠标 侧边栏图标是按钮,并且大部分 UI 都可以点击: | | | |---|---| | 侧边栏图标 | 文件、搜索、图形视图、助手、命令面板 | | 浏览器中的笔记 | 打开它 | | 浏览器中的文件夹 | 折叠它 | | 标签页 | 切换到该标签页 | | 大纲 / 双向链接 / 标签 | 切换面板 | | 图形节点 | 选中它 | | 滚轮 | 滚动指针下方的面板,而不是聚焦的面板 | ## 功能 **笔记。** 支持 Obsidian 语法的实时预览 Markdown:`[[wikilinks]]` (未解析时会变暗)、`#tags`、`- [ ]` 任务、`> [!note]` 标注、表格以及带有语法高亮的代码块。Frontmatter 是 可选的:从任何地方放入的 Markdown 文件都会直接显示。 **浏览器。** 文件树打开时,你最近编辑的笔记会位于 顶部,这通常就是你上次中断的地方。`s` 会切换到其他的排序方式: 修改时间、创建时间和文件名,每种都可以双向排序。文件夹始终保持 字母顺序,并且你的选择会被写入配置文件,因此下次启动时它依然保持原样。 **链接。** 一个包含每个链接所在行的双向链接面板,一个大纲 面板,以及一个标签浏览器。跟随链接打开不存在的笔记时会自动创建它,就像 Obsidian 一样。重命名笔记会重写每一个指向它的 wikilink。 **图形视图。** 一个带有 Barnes-Hut 排斥力的力导向图,因此它在大型知识库中依然保持 流畅,并且在稳定下来后不再消耗 CPU。那些只是被 *链接到*的笔记会显示为空心节点,这通常是屏幕上最实用的信息, 因为它们正是你打算写的笔记。`Ctrl+Shift+G` 会显示 当前打开笔记的邻近结构。 **主题。** 包含 Obsidian 自带的浅色和深色主题,以及 Catppuccin、Tokyo Night、 Gruvbox、Nord、Solarized、Dracula、Rosé Pine、Everforest,还有一个 继承你终端配色的 `terminal` 主题。在主题目录中放入一个 TOML 文件 即可添加你自己的主题;未设置的颜色会继承自它 `extends` 的主题。 **助手。** 一个通过你使用的相同命令 对知识库进行操作的聊天面板。它可以搜索、读取、创建、编辑、重命名、链接和删除 笔记,并可以在你的屏幕上打开它们或图形视图。每一次工具调用都会显示在 记录中,因此你可以看到它做了什么,而不必轻信一个总结。 ## 助手 设置一个 key 并重启: ``` export ANTHROPIC_API_KEY=sk-ant-... ``` 或者完全离线运行,使用本地模型: ``` [agent] provider = "openai" # any OpenAI-compatible server base_url = "http://localhost:11434/v1" # Ollama, LM Studio, vLLM, OpenRouter… model = "llama3.1" ``` 如果未配置 key,面板仍然会打开并解释如何设置; 应用中的其他任何功能都不依赖于它。 脚本化使用,无需 TUI: ``` obsidian-tui ~/Notes --prompt "which notes mention the Q3 migration?" ``` 在 `[agent]` 下设置 `allow_writes = false` 可以仅授予其搜索和读取权限。 ### 斜杠命令 在聊天框中输入 `/` 获取补全列表;`Tab` 补全,`Enter` 运行。 命令在本地处理,永远不会发送给模型:例如 `/model` 会直接更改 模型,而不是要求当前的模型去更改。 | | | |---|---| | `/help` | 列出命令 | | `/new`, `/compact` | 重新开始,或修剪旧对话轮次以释放上下文 | | `/save`, `/resume`, `/sessions` | 保存对话以便稍后继续 | | `/provider`, `/model`, `/base-url` | 将 agent 指向不同的后端 | | `/login`, `/logout`, `/status` | 凭据以及下一轮将要执行的操作 | | `/writes`, `/context`, `/reasoning` | 切换 agent 可以执行和查看的操作 | | `/tools`, `/vault`, `/obsidian` | 可用功能:工具、索引、Obsidian CLI | | `/sort` | 更改浏览器的笔记排序方式(`/sort list` 可查看列表) | | `/config` | 将当前设置写入配置文件 | | `/keys`, `/quit` | 快捷键参考,以及退出 | 会话以 JSON 格式存储在配置文件旁边,而不是在知识库中,因此 知识库依然是一个纯粹的 Markdown 文件夹。 ## 隐私 **除非你使用助手,否则 obsidian-tui 不会建立任何网络连接。** 没有遥测、没有分析,也没有更新检查。只有 `otui-agent` crate 包含 HTTP 依赖;知识库、编辑器和图形视图均无法访问 网络。 当你发送消息时,离开你机器的数据是: - 你输入的消息, - 如果你开启了 `include_active_note`(默认开启),还包括你当前打开的笔记, - 以及助手在回答时通过其工具读取的任何笔记。 这些数据会发送到你配置的提供商,并遵循该提供商自己的 条款。除此之外不会传输任何其他内容,也不会在后台发送任何内容。 为了保持一切本地化,你可以将其指向在你自己机器上运行的模型: ``` [agent] provider = "openai" base_url = "http://localhost:11434/v1" model = "llama3.1" ``` 或者通过设置 `provider = "offline"` 完全关闭助手。为了在使用助手的同时将 知识库排除在消息之外,请设置 `include_active_note = false`; 要阻止其自行读取笔记,请设置 `allow_writes = false`。这样保留的权限是 搜索和读取,但这仍然会读取笔记内容,因此如果这对你很关键,请使用本地模型。 你的 API key 会从环境变量(`ANTHROPIC_API_KEY` 或 `OPENAI_API_KEY`)中读取,并且永远不会被写入配置文件,永远不会被记录, 也永远不会包含在任何错误消息中。 ## 配置 首次运行时写入,并详细列出每一个默认值: - macOS: `~/Library/Application Support/obsidian-tui/config.toml` - Linux: `~/.config/obsidian-tui/config.toml` - Windows: `%APPDATA%\obsidian-tui\config.toml` 自定义主题放在其旁边的 `themes/` 目录中。 ## 架构布局 ``` crates/ otui-core vault discovery, indexing, markdown, search, graph engine otui-theme the theme model and presets otui-agent provider connectors, streaming, and the tool-calling loop otui the terminal application ``` `otui-core` 和 `otui-agent` 不依赖于终端,并且 `otui-agent` 不依赖于知识库:工具由 应用程序提供,这正是让助手和用户对完全 相同的状态进行操作的原因。 ## 开发 ``` cargo test --workspace # 473 tests cargo clippy --workspace --all-targets cargo fmt --all --check ``` 发布版本通过打标签(tagging)来切出。推送一个 `v*` 标签会构建所有目标平台,发布 带有校验和的 GitHub 发布版本,更新 tap 中的 Homebrew formula,并 发布到 npm。`CHANGELOG.md` 会成为发布说明,因此请先更新它。 两个仓库 secret 控制着最后两个步骤;如果没有它们,发布仍然会 成功,那些作业只会报告它们已被跳过。 | Secret | 用于 | |---|---| | `NPM_TOKEN` | 发布到 npm(一个自动化 token) | | `TAP_GITHUB_TOKEN` | 将 formula 推送到 `iamrohithrnair/homebrew-tap` | 打包相关的文件位于 `packaging/` 中。Homebrew formula 由 `packaging/homebrew/update-formula.sh` 生成,该脚本可以手动针对 一个包含 `.sha256` 文件的目录运行。 ``` # 提升 Cargo.toml 中的版本,更新 CHANGELOG.md,然后: git tag -a v0.2.0 -m "v0.2.0" git push origin v0.2.0 ``` ## 许可证 Copyright (C) 6 Rohith Nair. obsidian-tui 是自由软件:你可以根据自由软件基金会发布的 GNU 通用公共许可证条款重新分发或修改它,无论是 许可证的第 3 版,还是(由你选择的)任何更高 版本。参见 [LICENSE](LICENSE)。 分发此软件是希望它能有用,但不含任何保证; 甚至不包含对适销性或特定用途的 隐含保证。 简而言之:你可以将其用于任何事情,包括在工作场合。如果你分发了一个 修改过的版本,其源代码必须在相同的条款下保持可用,因此 无论你做了什么改进,其他人也都可以继续对其进行改进。
标签:Markdown, Obsidian, Rust, TUI, 可视化界面, 笔记软件, 终端应用, 网络流量审计, 通知系统, 防御加固