Gheat1/ltui

GitHub: Gheat1/ltui

一个快速且美观的 Linear 终端客户端,通过本地缓存实现即时启动并支持完整的工单读写操作。

Stars: 34 | Forks: 1

# ◐ ltui **一个快得离谱、且真正美观的 [Linear](https://linear.app) TUI。** 你的整个工作区,按照实际进行分类的方式来分组 — `In Review` 在顶部,`Done` 在底部,你的工单优先显示。 [![python](https://img.shields.io/badge/python-3.11+-89b4fa?style=flat-square&logo=python&logoColor=white)](https://www.python.org) [![built with textual](https://img.shields.io/badge/built%20with-textual-b4befe?style=flat-square)](https://github.com/Textualize/textual) [![license](https://img.shields.io/badge/license-MIT-a6e3a1?style=flat-square)](LICENSE) [![linear api](https://img.shields.io/badge/linear-graphql%20api-5e6ad2?style=flat-square&logo=linear&logoColor=white)](https://developers.linear.app) ltui — issue list with detail panel 本 README 中的所有屏幕截图均由 tools/screenshots.py 基于模拟演示数据生成 — 没有任何真实的工单受到伤害
## 为什么还要另一个 Linear TUI? 因为我尝试过的每一个 Linear TUI 都有两个同样的问题:**慢**和**丑**。 速度慢甚至不是它们的错 — Linear 的 GraphQL API 需要 2–5 秒 才能返回一个规模可观的团队数据。大多数 TUI 只是让你在每次 启动时都默默忍受这种等待。ltui 不会: - 📦 **即时启动** — 你上次查看的 issue 会从本地缓存中在 ~50ms 内渲染出来,同时新数据在后台加载。在 API 还没来得及“打招呼”之前,你就可以开始滚动了。 - 🎨 **真正美观** — 圆角边框,五种主题, Linear 自带的状态颜色,nerd font 图标,像真实应用一样的优先级条, 以及面板和模态框上细腻的淡入淡出动画。 - ⌨️ **键盘优先,欢迎鼠标** — 到处都是 vim 按键,但所有 东西也都可以点击:工单、团队,甚至是提示栏。面板分隔线 **可拖拽调整大小**(双击重置),并且你的布局会保持不变。 ## 功能 | | | | --- | ----------------------------------------------------------------------------------- | | 🗂️ | **智能分组** — `In Review` → `In Progress` → `Todo` → `Backlog` → `Done` — 根据工作距离交付的远近排序,每组内最新的工单排在前面 | | 👤 | **我的优先** — 你的工单会浮到每组的顶部;按 `m` 键可以完全隐藏其他所有人的工单 | | 🌿 | **`y` 复制 git 分支** — 将 Linear 生成的分支名直接复制到剪贴板(或者是 URL / 标识符);几秒钟内完成从工单到 `git checkout -b` 的操作 | | 👥 | **无需离开即可指派** — `a` 重新指派给团队中的任何人、你自己,或者取消指派 | | 🌳 | **感知层级** — 详情面板会显示父工单和带有已完成计数的所有子 issue,旁边是受阻塞/阻塞的关系 | | 🔄 | **永不失效** — 看板每 3 分钟静默重新同步一次 | | 📖 | **丰富的详情面板** — 完整的 Markdown 描述(代码块、清单、引用),标签、评论 — 支持使用方向键、vim 按键或鼠标滚轮滚动 | | ✏️ | **不只是阅读,还能编写** — 无需离开终端即可创建工单、更改状态和优先级、添加评论 | | 🚧 | **一目了然的阻塞与被阻塞** — 被阻塞的工单上会有红色的徽章,阻塞其他工单的会有橙色的徽章;详情面板会显示具体的工单名称 | | 🔍 | **即时过滤** — 输入时按 `/` 即可根据标题、标识符或指派人进行模糊过滤 | | 🌚 | **五种主题** — `mocha`,纯黑 `void`,单色 `onyx`,`clear`(无背景 — 你可以透出终端的透明度/模糊效果),以及 `system`(使用你终端自身的 ANSI 调色板绘制:你的 kitty 主题*就是* ltui 的主题)— 按 `t` 循环切换 | | ⚙️ | **个人资料与设置** — 左下角显示你是谁,按 `,` 打开设置面板,包含实时的主题预览、偏好设置和缓存控制 | | 🧠 | **记住一切** — 上次的团队、主题、过滤器在不同会话间保持不变 | | 🔌 | **零配置** — 复用你的 [linear-cli](https://github.com/Finesssee/linear-cli) API 密钥,或者设置 `LINEAR_API_KEY` | ## 安装 可以在任何 linux · macOS · windows 上运行,直接从本仓库获取。 获取 [uv](https://docs.astral.sh/uv/) 或 [pipx](https://pipx.pypa.io) 然后: ``` uv tool install git+https://github.com/Gheat1/ltui # 或 pipx install git+https://github.com/Gheat1/ltui ``` 或者从源码自行构建: ``` git clone https://github.com/Gheat1/ltui && cd ltui pip install . ``` 无论哪种方式,你现在都有了以下命令: ``` ltui ``` 以后升级:`uv tool upgrade ltui-linear` / `pipx reinstall ltui-linear` (*包*名为 `ltui-linear`;命令为 `ltui`)。
平台说明 - **linux** — 任何不是 1985 年出产的终端都可以工作:kitty, alacritty, ghostty, wezterm, foot… - **macOS** — 如果你没有安装,请先执行 `brew install pipx`。推荐使用 iTerm2, ghostty, kitty 或 WezTerm,而不是自带的 Terminal.app。 - **windows** — Python 3.11+ (`winget install Python.Python.3.12`),然后安装 pipx。 在 **Windows Terminal** 中运行 — 传统的 conhost 无法展现它的魅力。 - 所有平台:需要 **python ≥ 3.11**。
## 认证 **无需任何设置。** 启动 `ltui`,如果没有找到密钥,它会 引导你完成:点击链接进入 Linear 的 API 密钥页面,粘贴 密钥,搞定 — ltui 会实时验证并将其存储在 `~/.config/ltui/config.toml`(权限为 `600`)。
first-run onboarding
已经在其他地方设置过了?ltui 会按以下顺序检查: 1. `LINEAR_API_KEY` 环境变量 2. 它自己的 `~/.config/ltui/config.toml` 3. 你的 [linear-cli](https://github.com/Finesssee/linear-cli) 配置 — 如果你 已经使用了 linear-cli,ltui 可以实现零配置登录 你的密钥永远不会离开你的设备 — ltui 直接与 `api.linear.app` 通信,不涉及其他任何东西。 首次启动还会展示一个 20 秒的引导卡片(仅此一次,下不为例), 随时按 `?` 即可打开完整的快捷键速查表。
first-run welcome
## 按键 | 按键 | 动作 | | -------- | --------------------------------------------- | | `↑↓` `jk` | 移动(列表*和*详情面板) | | `enter` / 点击 | 打开工单详情面板 | | `esc` | 关闭面板 / 取消模态框 / 清除过滤器 | | `n` | 在当前团队中创建**新工单** | | `s` | 更改**状态** | | `p` | 更改**优先级** | | `a` | 更改**指派人**(或取消指派) | | `c` | 添加**评论**(`ctrl+s` 发送) | | `o` | 在**浏览器**中打开工单 | | `y` | **复制** — 复制分支名 / url / id | | `/` | 过滤 issue | | `m` | 切换**仅显示我的** | | `t` | 循环切换**主题** | | `,` | 打开**设置** | | `r` | 刷新 | | `g` `G` | 跳转到顶部 / 底部 | | `?` | **帮助** — 快捷键速查表 | | `q` | 退出 | ## 详情面板 按 `enter`(或点击)会在侧边面板中打开任何工单 — Markdown 描述 被正确渲染,评论在下方形成线索,并且每个操作只需一键即可完成。 底部的提示也是可以点击的。
status picker
## 创建工单 按 `n` 会打开一个简约的编辑器:标题,可选的 Markdown 描述,`ctrl+s`。 工单将出现在你的列表中并处于高亮状态,随时准备按 `s` / `p` 将其放入正确的列中。
new ticket modal
## 设置 你的个人资料位于左下角 — 显示姓名、组织,以及一键切换主题 和“仅显示我的”开关。按 `,`(或点击 `设置`)打开面板: 切换偏好设置,清除缓存。
settings panel
## 主题 按 `t` 循环切换。你的选择会保持不变。 | `mocha` — catppuccin 暖色调 | `void` — 纯黑,OLED 的最爱 | `onyx` — 单色钢铁风 | | --- | --- | --- | | ![mocha](https://static.pigsec.cn/wp-content/uploads/repos/cas/ae/ae72a782892c29a9c5ad8c27bcb49da6194f062ae24a7c289326921a06bb23d6.png) | ![void](https://static.pigsec.cn/wp-content/uploads/repos/cas/4d/4d20d531c749f633d0db2d852893bd8cd80b7939cc1d8b1ca717fa44bd20da2b.png) | ![onyx](https://static.pigsec.cn/wp-content/uploads/repos/cas/6d/6d0e1eab20086551b35723b36e3d28a5f4bf9d149a325d0718405602a74af190.png) | 其中有两个无法如实地截图展示: - **`clear`** 完全**不绘制背景** — ltui 运行在你终端 自身的背景之上,所以如果你的终端是透明或带有模糊效果的,ltui 也会如此。 - **`system`** 走得更远:整个 UI 框架是用你终端的 **ANSI 调色板**(加上透明背景)绘制的 — 无论你的 kitty/alacritty/ghostty 正在运行什么主题,ltui 都会自动匹配。工单 数据(状态颜色、标签)则忠实于 Linear。 专为美化(rice)而生。 还不够?按 `ctrl+p` → *Change theme* 打开主题选择器,包含**所有 内置的 Textual 主题** — nord, gruvbox, dracula, tokyo-night, rose-pine, 整个 catppuccin 家族等等。当你在列表中**滚动时,整个应用会实时改变样式**; 按 `enter` 保留它,按 `esc` 恢复原样。按 `t` 则继续循环切换 四个 ltui 主题。
theme picker with live preview
## 为什么它这么快 Linear 的 API 是瓶颈所在 — 一个包含 250 个 issue 的团队需要 **2.5–4.5 秒** 才能获取完毕, 没有客户端能改变这一点。所以 ltui 不再假装网络很快: ``` launch ──▶ render cached issues (~50ms) ──▶ you're already working │ └──▶ background refresh ──▶ rows swap in silently ``` - issue 列表按团队缓存到 `~/.cache/ltui/` - 变更(状态、优先级、新工单)会立即更新缓存 — 你所见即你所为 - 边框上的 `↻ refreshing` 徽章会告诉你何时有新数据传入 - 看板每 3 分钟静默重新同步一次,因此永远不会过时 ## 数据与隐私 - **读取**:团队、issue、工作流状态、评论 — 限于你查看的团队 - **写入**:仅限于你明确触发的变更(创建 / 状态 / 优先级 / 评论) - **通信对象**:`api.linear.app` — 没有其他任何东西,没有遥测,没有数据分析 - **本地存储**:缓存在 `~/.cache/ltui/`,UI 状态在 `~/.local/state/ltui/state.json` ## 常见问题
每个团队只显示约 250 个 issue? ltui 会获取每个团队中最近更新的 250 个 issue。对于分类处理来说,这实际上 涵盖了所有活跃的内容;古老的 `Done` 工单会从底部掉出, 这也是它们应该在的地方。
为什么屏幕截图看起来很假? 因为它们确实是假的!它们是由 tools/screenshots.py 通过 模拟 API 生成的 — 假的组织,假的工单,假的人员。你自己运行试试吧;它永远不会 触碰网络。
有些图标显示为方框 安装一个 nerd font 并将其设置为你的 终端字体。其他所有内容都能优雅降级显示。
它支持多个工作区吗? 它一次只使用一个 API 密钥(linear-cli 的“当前”工作区,或者 LINEAR_API_KEY)。像你使用 linear-cli 切换工作区那样去切换即可。
## 许可证 [MIT](LICENSE)
标签:CLI, Linear, Linux 内核安全, Python, SOC Prime, Textual, TUI, WiFi技术, 开发工具, 无后门, 生产力工具, 逆向工具, 项目管理