为 AI 时代打造的桌面终端管理器
基于 Tauri v2 · 多项目 · 多标签 · 分屏布局 · AI 进程感知
- 重量级工具多余 — All In AI 的用户只需要终端跑 Agent,却不得不打开 VS Code / IDEA 等重型 IDE,大且占内存
- 多 Agent 并发无感知 — 同时开多个 Claude / Codex 会话,某个 Agent 跑完了无法直观看到
- 项目切换不便 — 系统终端缺少多项目组织、标签页和分屏管理能力
Mini-Term 用一个轻量桌面应用解决以上所有问题。
- 多标签管理 — 每个项目独立标签页,拖拽排序,状态图标一目了然
- 递归分屏 — 横向 / 纵向任意嵌套分屏,Allotment 拖拽调整比例
- 高性能渲染 — xterm.js v6 + WebGL 加速,自动降级为 Canvas
- 10 万行滚动缓冲 — 拦截 CSI 3J(ED3)指令,Claude / Codex / OpenCode 等 TUI 清屏时保留上滚历史;拦截 alternate screen 切换,TUI 程序输出留在主缓冲区,滚动条和 scrollback 始终可用
- 终端缓存 — 切换项目 / 标签 / 分屏不重建 xterm 实例,已有内容不丢失;启动按需懒加载,仅当前可见 pane 创建 PTY,避免历史项目终端越多启动越卡
- 项目切换缓存 — FileTree / GitHistory 数据按项目缓存,切回已访问项目零延迟渲染;目录加载与 Git 状态并行执行,Git 仓库扫描结果缓存 30 秒
- 复制粘贴 —
Ctrl+Shift+C/V(macOS⌘+Shift+C/V)快捷键 + 右键菜单,未选中时"复制"自动置灰;Windows 大段多行粘贴自动分块写入,防止 ConPTY 丢行 - 长文本粘贴 — 剪贴板文本 ≥10 行或 ≥2000 字符时自动转存为临时
.txt并粘贴带引号的文件路径,避免 AI 工具直接处理超长内容引发性能与 paste bracket 问题 - 图片粘贴 — 剪贴板含截图时自动检测,通过 Win32 API 保存为临时 PNG 并粘贴带引号的路径,兼容 PinPix 等非标准格式
- 文件拖拽 — 文件树或系统资源管理器拖文件到终端自动插入带引号的绝对路径,精准定位目标分屏 pane,兼容含空格的路径
- 多 Shell 配置 — Windows(cmd / powershell / pwsh)、macOS(zsh / bash)、Linux(bash / sh)等,可自由增删
- 全局搜索 —
Ctrl+Shift+F(macOS⌘+Shift+F)快捷键或文件树工具栏按钮唤起,支持文件名搜索和文件内容搜索两种模式 - 正则匹配 — 可切换子串 / 正则模式,结果关键词高亮显示
- 流式推送 — 后端使用 ignore crate 遍历文件树,每 50 条或 100ms 批量推送结果,支持随时取消
- 内容分组 — 内容搜索模式按文件分组展示匹配行号,点击结果直接预览并定位到匹配行
- Hook 事件系统 — 接入 Claude Code / Codex 官方 Hook API,接收 AI 工具事件(SessionStart / End、ToolUse 等),比进程轮询更精准及时;内置
miniterm-hookCLI 工具供 Hook 系统调用,自动 POST 事件到本地服务器;设置界面一键注册 / 卸载 Hook 配置,合并而非覆盖用户已有 hook - 实时状态检测 — Hook 优先 + 500ms 进程轮询降级,自动识别 Claude / Codex / OpenCode,显示 idle / working / error 状态
- 状态聚合 — 面板 → 标签页 → 项目逐层聚合,优先级
error > ai-working > ai-idle > idle - 完成提醒三件套 — AI 任务从 working → idle 时立刻触发:
- 右下角 Toast 桌面通知(仅非活跃项目弹出,同项目去重)
- 项目列表 DONE 徽章,点击清除
- 任务栏闪烁(Windows)/ Dock 跳动(macOS),窗口失焦时才触发
- 提示音播放(Web Audio API 合成默认音,支持自定义音频文件)
- 所有通知开关独立可配,设置中心单独「AI 完成通知」页面管理
- 会话进出检测 — 命令 echo 识别进入 AI;双击
Ctrl+C/Ctrl+D或exit/quit/:quit//logout识别退出 - 会话历史 — 读取本地 Claude / Codex 历史会话记录,右键复制恢复命令快速续接;首屏仅渲染 20 条,滚动到底部自动加载更多
- 会话查看 — 右键「查看」展示完整对话内容,User 纯文本 / Assistant Markdown 渲染,支持
Ctrl+F搜索高亮和 User 消息快速导航 - AI 任务标记 — AI 会话内每次用户按 Enter 自动在 xterm 打点,标签右上角 ⚑ 按钮下拉展示历史提交列表,点击或
Ctrl+Shift+↑/↓(macOS⌘+Shift+↑/↓)在标记间跳转,目标行短暂高亮提示
- 项目列表 — 左侧边栏管理多个项目目录,一键切换工作区,重启自动恢复上次激活项目
- 拖拽添加项目 — 从资源管理器拖拽文件夹到项目列表即可快速添加,自动识别文件 / 文件夹 / 重复项目并给出视觉反馈
- 嵌套分组 — 最多 3 级项目分组,拖拽排序,折叠 / 展开
- 文件树 — 集成目录浏览器,嵌套
.gitignore置灰(每层子目录的忽略规则与!pattern白名单都会生效,与 git 行为一致),notify文件监听实时刷新 - 文件操作 — 文件树内新建文件 / 文件夹、重命名、删除、查看内容(Markdown 渲染支持 HTML 标签和外部图片,二进制与超大文件友好提示)
- 外部编辑器打开 — 文件树右上角按钮一键用配置的编辑器(默认 VS Code)打开当前项目,路径可在「设置 → 系统设置 → 外部编辑器」自定义;文件可用系统默认应用打开
- 文件状态 — 文件树显示 Git 状态颜色(修改 / 新增 / 删除 / 冲突)
- 变更 Diff — 工作区文件变更的详细 Diff,Hunk 行级解析,并排 / 内联双视图,并排模式支持拖拽调节分隔比例,字号跟随终端字体设置
- 提交历史 — 浏览仓库提交记录,游标分页加载(默认 30 条)
- 提交 Diff — 查看任意提交的文件变更,逐文件切换
- 分支信息 — 本地 / 远程分支列表
- 源码控制面板 — VS Code 风格 Changes 面板,Staged / Changes / Untracked 分组展示,支持单文件和全量 stage / unstage / discard,
Ctrl+Enter快速提交,列表与树形视图切换 - Pull / Push — 仓库行内按钮一键同步远端,支持刷新按钮重新加载提交记录与分支信息
- 多仓库发现 — 自动扫描项目目录下所有 Git 仓库(递归 5 层,跳过
node_modules等)
- Activity Bar 侧边栏 — 最左侧常驻 40px 图标栏,含 Projects / Sessions / Files / Git 四个面板开关,独立控制显隐,激活态蓝色竖条指示,状态持久化
- 三种主题模式 — Auto(跟随系统)/ Light / Dark,深色基于 Warm Carbon 暖炭色调,自定义 CSS 变量体系
- Blueprint 蓝图皮肤 — 可选科幻风蓝图皮肤,网格背景 + 角标记 + 光晕效果,支持深色 / 日间两种模式,终端配色同步切换
- 字体独立调节 — UI 与终端字号分别可调(10-20px),终端可选是否跟随 UI 主题
- 布局持久化 — 分屏比例、标签页、窗口大小 / 位置自动保存,重启恢复(
tauri-plugin-window-state) - 关闭确认 — 关闭窗口前二次确认,并 flush 所有项目布局,避免误操作
- 版本检查 — 启动时拉取 GitHub Release,标题栏显示新版本提示
- 设置中心 — 统一的 SettingsModal 管理主题、字体、Shell、AI 通知等所有开关
| 层 | 技术 |
|---|---|
| 框架 | Tauri v2(Rust 后端 + WebView 前端) |
| 前端 | React 19 + TypeScript 5.8 + Tailwind CSS v4 + Vite 7 |
| 终端 | xterm.js v6(WebGL addon,Canvas 降级) |
| 状态 | Zustand(全局单一 Store) |
| 布局 | Allotment(三栏主布局 + 递归 SplitNode 分屏树) |
| PTY | portable-pty 0.8 |
| Git | git2 0.19 |
| 文件监听 | notify 7 + ignore 0.4(.gitignore 过滤) |
| Tauri 插件 | window-state · clipboard-manager · dialog · opener |
| 测试覆盖 | 81 个 Rust 单元测试(pty / fs / config / hook) |
前往 Releases 页面下载最新安装包。
平台支持说明
- Windows — 主要支持平台,保证可用性,日常开发与测试均在 Windows 上进行
- macOS / Linux — 代码层面已支持(Tauri bundle targets =
all),但可用性欠佳,未经充分打磨,欢迎提 Issue 反馈
下载 .dmg 后双击打开,如果系统弹出 "Mini-Term" is damaged and can't be opened. You should move it to the Bin(已损坏,移到废纸篓),这并不是文件真的损坏 —— 而是 Release 产物没有 Apple Developer ID 签名,被 Gatekeeper 因 quarantine 标记拒绝。
把 .app 拖入 /Applications 后,在终端执行一次即可解除限制:
xattr -cr /Applications/Mini-Term.app之后正常双击启动。每次升级新版本都需要再执行一次。
- Node.js >= 18
- Rust >= 1.70
- Tauri v2 CLI
# 克隆仓库
git clone https://github.com/dreamlonglll/mini-term.git
cd mini-term
# 安装依赖
npm install
# 启动完整 Tauri 开发环境(前端 + 后端)
npm run tauri dev
# 构建发布包
npm run tauri buildmini-term/
├── src/ # 前端源码
│ ├── App.tsx # 三栏主布局入口 + 窗口事件
│ ├── store.ts # Zustand 全局状态 + 持久化
│ ├── types.ts # 类型定义(Pane / Tab / Project / SplitNode ...)
│ ├── styles.css # 全局样式 + CSS 变量(Warm Carbon)
│ ├── components/
│ │ ├── ProjectList.tsx # 项目列表 + 嵌套分组 + DONE 徽章
│ │ ├── SessionList.tsx # AI 会话历史列表(Claude / Codex)
│ │ ├── FileTree.tsx # 文件目录树 + Git 状态 + 新建 / 重命名
│ │ ├── TerminalArea.tsx # 标签管理 + 分屏树操作
│ │ ├── SplitLayout.tsx # 递归渲染 SplitNode 分屏树
│ │ ├── TerminalInstance.tsx # xterm.js 实例 + 右键菜单 + 文件拖拽
│ │ ├── PaneGroup.tsx # 分屏分组容器
│ │ ├── MarkerList.tsx # AI 任务标记下拉列表
│ │ ├── GitHistory.tsx # Git 仓库树 + 提交历史 + Pull / Push
│ │ ├── GitHistoryContent.tsx # Git 提交历史内容渲染
│ │ ├── GitChanges.tsx # 源码控制面板(stage / unstage / commit)
│ │ ├── CommitDiffModal.tsx # 提交 Diff 查看器
│ │ ├── DiffModal.tsx # 工作区文件 Diff 查看器
│ │ ├── SearchModal.tsx # 全局文件搜索弹窗
│ │ ├── FileViewerModal.tsx # 文件内容查看器
│ │ ├── SessionViewerModal.tsx # AI 会话内容查看器(Markdown 渲染)
│ │ ├── SettingsModal.tsx # 设置弹窗(主题 / 字体 / Shell / AI 通知 / Hook)
│ │ ├── ToastContainer.tsx # AI 完成 Toast 通知
│ │ ├── ActivityBar.tsx # Activity Bar 侧边栏(面板显隐 + AI 状态角标)
│ │ ├── DoneTag.tsx # 项目列表 DONE 徽章
│ │ └── StatusDot.tsx # 状态指示点
│ ├── hooks/
│ │ ├── useTauriEvent.ts # Tauri 事件订阅封装
│ │ ├── useAiSubmitMarker.ts # AI 会话 Enter 打点
│ │ ├── useExternalFileDrop.ts # 系统资源管理器拖拽文件到终端
│ │ └── useMarkerHotkeys.ts # 标记间跳转快捷键
│ └── utils/
│ ├── contextMenu.ts # 右键菜单 DOM 实现
│ ├── dragState.ts # 项目树拖拽状态
│ ├── fileDragState.ts # 文件拖拽到终端状态管理
│ ├── projectTree.ts # 项目树递归操作
│ ├── terminalCache.ts # xterm 缓存 + 复制粘贴
│ ├── projectDataCache.ts # FileTree / GitHistory 项目级数据缓存
│ ├── themeManager.ts # 主题切换 + 系统配色监听
│ └── updateChecker.ts # GitHub Release 版本检查
├── src-tauri/ # Rust 后端
│ ├── src/
│ │ ├── lib.rs # Tauri 初始化与命令 / 插件注册
│ │ ├── pty.rs # PTY 生命周期 + AI 会话识别
│ │ ├── process_monitor.rs # 子进程状态轮询(500ms)+ Hook 优先
│ │ ├── config.rs # 配置持久化 + 版本迁移
│ │ ├── fs.rs # 目录列表 / 监听 / 新建 / 重命名 / 删除
│ │ ├── git.rs # Git 操作(状态 / Diff / Log / Pull / Push)
│ │ ├── search.rs # 全局文件搜索(文件名 + 内容,流式推送)
│ │ ├── ai_sessions.rs # Claude / Codex 会话记录读取
│ │ ├── hook_server.rs # Hook HTTP 服务器(接收 AI 工具事件)
│ │ └── hook_registry.rs # Hook 注册 / 卸载(Claude Code + Codex)
│ └── src/bin/
│ └── miniterm-hook.rs # Hook CLI 小工具(被 AI 工具 hook 调用)
└── package.json
用户键入 → xterm.onData → invoke('write_pty') → Rust PTY writer
Rust PTY reader → 16ms 批量缓冲 → emit('pty-output') → term.write()
进程退出 → emit('pty-exit') → store.updatePaneStatusByPty('error')
进程监控 500ms → emit('pty-status-change') → StatusDot 更新
文件变更 notify → emit('fs-change') → FileTree 刷新
ai-working → ai-idle → Toast + DONE Tag + requestUserAttention
- Commands(44 个) — PTY:
create_pty·write_pty·resize_pty·kill_pty;FS:list_directory·read_file_content·watch_directory·unwatch_directory·create_file·create_directory·rename_entry·delete_entry·filter_directories;Search:start_search·cancel_search;Git:get_git_status·get_git_diff·discover_git_repos·get_git_log·get_repo_branches·get_commit_files·get_commit_file_diff·git_pull·git_push·get_changes_status·git_stage·git_unstage·git_stage_all·git_unstage_all·git_commit·git_discard_file;Config:load_config·save_config;Editor:open_in_editor·open_path_with_default_app;Clipboard:read_clipboard_image·save_clipboard_text;AI:get_ai_sessions·get_ai_session_content;Hook:register_ai_hooks·unregister_ai_hooks·get_hook_config_snippet·get_hook_status·toggle_hook_server - Events(后端 → 前端) —
pty-output·pty-exit·pty-status-change·fs-change·search-results·search-complete
终端面板状态从叶节点聚合到标签页和项目级别:
error > ai-working > ai-idle > idle
App
├── ActivityBar(常驻最左侧,面板显隐开关 + AI 状态角标)
├── Allotment 三栏
│ ├── 左栏:ProjectList(项目 + 分组 + 会话 + DONE 徽章)
│ ├── 中栏:FileTree(目录浏览 + Git 状态 + 文件操作)
│ └── 右栏
├── TabBar(标签管理)
├── SplitLayout(递归 SplitNode 分屏树)
│ └── TerminalInstance × N(xterm.js + 右键菜单)
└── GitHistory(仓库树 + 提交历史 + Pull/Push)
ToastContainer 悬浮于右下角,SettingsModal 覆盖全局。
欢迎提交 Issue 和 PR。外部贡献会经过功能验证和安全审查后合并。
提交代码前请运行:
# 前端类型检查
npm run build
# Rust 测试与构建
cd src-tauri && cargo test && cargo build学 AI,上 L 站 — LinuxDO


