1. 为什么我要给 AI 编程 CLI 造一个统一工作台
1.1 从三个终端窗口来回切换到忍无可忍
我日常的工作流里,AI 编程工具已经占了很大比重。写业务代码的时候开一个 CLI 助手,查文档和搜索的时候开另一个,跑测试和构建的时候又得切回系统终端。最夸张的一次,我同时开了四个终端标签页,一个在跟 AI 对话生成代码,一个在跑单元测试,一个在看日志输出,还有一个在手动执行 git 操作。切来切去,脑子里的上下文也跟着断来断去。
这种体验很像你厨房里同时摆了四口锅,每口锅都在煮不同的东西,但你只有一个灶台,得不停地端锅换位置。问题不在于锅多,而在于没有一个统一的台面把这些锅安排好。kshell 就是在这个背景下诞生的——我想给 AI 编程 CLI 造一个统一工作台,把对话、执行、文件操作、任务管理这些高频动作收拢到一个界面里。
kshell 是一个开源项目,定位很明确:它不是要替代某个具体的 AI 编程工具,而是做一个中间层,把不同 CLI 工具的交互统一起来。你可以把它理解成一个“终端里的 IDE 面板”,左边是会话列表,中间是对话和输出流,右边是文件树和任务状态。所有操作都在一个窗口里完成,不用再来回切换。
这个项目适合几类人:一是每天跟 AI 编程工具打交道、觉得切换成本高的开发者;二是想自己定制工作流、把多个 CLI 工具串起来用的效率爱好者;三是对终端 UI 和 CLI 工具集成感兴趣、想学习怎么做一个统一工作台的技术同学。哪怕你只是偶尔用 AI 辅助写代码,看完这篇也能理解统一工作台的设计思路,自己动手搭一个简化版。
1.2 统一工作台到底统一了什么
很多人听到“统一工作台”第一反应是“不就是个终端复用器吗”。我一开始也这么想,但实际做下来发现,终端复用只是最表层的东西。kshell 真正要统一的是四件事:会话上下文、执行环境、文件视图和任务状态。
会话上下文指的是你跟 AI 的对话历史。不同 CLI 工具各有各的会话管理方式,有的存在本地文件,有的存在内存里,切换工具就意味着上下文丢失。kshell 的做法是抽象出一层会话管理层,把对话历史标准化成统一格式,这样你在不同工具之间切换时,上下文可以延续。
执行环境指的是命令运行的地方。AI 生成的代码需要跑起来验证,但跑在哪里、用什么环境、输出怎么捕获,这些在不同工具里处理方式不一样。kshell 统一了执行接口,所有命令都通过一个执行器来调度,输出统一格式化后展示。
文件视图是很多人忽略的一点。AI 编程经常涉及读写文件,但 CLI 工具本身对文件系统的展示很弱。kshell 内置了一个轻量文件树,能实时反映工作目录的变化,AI 改了哪个文件、新增了什么内容,一眼就能看到。
任务状态则是把长时间运行的操作(比如跑测试、构建、安装依赖)抽象成任务,有独立的状态管理和输出缓冲。这样你可以在等任务完成的同时继续跟 AI 对话,不用干等。
提示:统一工作台的核心价值不是“把东西放一起”,而是“让放一起的东西能互相感知”。如果只是并排显示但互不通信,那跟开多个终端窗口没有本质区别。
2. 核心架构拆解:kshell 是怎么搭起来的
2.1 整体分层设计与选型考量
kshell 的架构分成四层:接入层、会话层、执行层和展示层。这个分层不是拍脑袋定的,而是根据实际使用中暴露的问题逐步调整出来的。
接入层负责对接不同的 AI 编程 CLI 工具。这里的关键决策是“适配器模式”而不是“统一协议”。我试过定义一个统一协议让所有工具来实现,但现实是每个工具的交互方式差异太大,有的基于标准输入输出,有的走本地 socket,有的干脆是交互式 TUI。强行统一协议会导致适配器变得极其复杂。最后改成适配器模式,每个工具一个适配器,适配器负责把工具的输入输出转换成 kshell 内部的标准事件。
会话层管理对话历史和上下文。这里用了一个事件溯源的设计:所有对话和操作都记录成事件流,当前状态由事件流重放得到。这样做的好处是上下文可以精确回溯,也方便做会话导出和分享。存储用的是 SQLite,单文件、零配置、支持全文搜索,对于本地工具来说是最合适的选择。
执行层负责任务调度和命令执行。这里没有用现成的任务队列库,而是自己实现了一个轻量调度器。原因是 AI 编程场景下的任务有特殊性:任务之间可能有依赖关系(比如先生成代码再跑测试),任务输出需要实时流式展示,任务可能需要中途取消。现成库要么太重,要么不支持这些特性。
展示层是终端 UI,用的是 ratatui 这个 Rust 终端 UI 库。选 Rust 是因为性能要求——终端 UI 对渲染延迟很敏感,而且执行层需要频繁做进程管理和 IO 操作,Rust 在这方面的控制力更强。ratatui 的组件化设计也方便做布局管理。
| 层级 | 职责 | 关键技术选型 | 选型理由 |
|---|---|---|---|
| 接入层 | 对接不同 CLI 工具 | 适配器模式 | 工具差异大,统一协议不现实 |
| 会话层 | 管理对话历史和上下文 | 事件溯源 + SQLite | 可回溯、易导出、零配置 |
| 执行层 | 任务调度和命令执行 | 自研轻量调度器 | 需要依赖管理、流式输出、可取消 |
| 展示层 | 终端界面渲染 | ratatui + Rust | 低延迟、强控制力、组件化 |
2.2 适配器模式的具体实现细节
适配器模式听起来简单,但实际写的时候有几个坑。第一个坑是输出解析。不同 CLI 工具的输出格式差异很大,有的输出纯文本,有的输出带 ANSI 转义序列,有的输出 JSON 但字段命名不统一。我的做法是在适配器里做一层“输出规范化”,把各种格式统一转换成内部的事件对象。
第二个坑是交互模式。有些工具是纯命令行式的,你发一条命令它回一条结果;有些工具是交互式的,需要维持一个长连接,随时可能推送消息。kshell 的适配器接口设计成支持两种模式:请求-响应模式和流式模式。适配器自己决定用哪种模式,上层不用关心。
第三个坑是错误处理。CLI 工具出错的方式五花八门:有的返回非零退出码,有的在标准输出里打印错误信息但退出码是零,有的直接崩溃。适配器需要把这些错误统一成内部错误类型,并且保留原始错误信息方便排查。
// 适配器接口的简化定义 trait CliAdapter { // 工具名称 fn name(&self) -> &str; // 发送输入,返回事件流 fn send(&mut self, input: &str) -> Result<EventStream>; // 取消当前操作 fn cancel(&mut self) -> Result<()>; // 健康检查 fn health_check(&self) -> Result<AdapterStatus>; }注意:写适配器的时候一定要保留原始输出。我一开始为了“干净”把原始输出丢掉了,结果排查问题时完全不知道工具到底输出了什么。后来改成原始输出和规范化输出都保留,排查效率高了很多。
2.3 会话层的事件溯源设计
事件溯源这个概念在业务系统里很常见,但用在 CLI 工具里需要做一些调整。核心思路是:不存储“当前对话状态”,而是存储“发生了什么事件”。比如用户发了一条消息、AI 回复了一条消息、执行了一个命令、命令输出了结果,这些都是事件。
这样做的好处有几个。第一,上下文可以精确回溯。你想回到三轮对话之前的状态,只需要重放到那个时间点的事件就行。第二,会话可以导出和导入。导出就是导出事件流,导入就是重放事件流。第三,方便做审计和调试。出了问题时,看事件流就能知道每一步发生了什么。
事件存储用 SQLite,表结构很简单:一个 events 表,字段包括 id、session_id、event_type、payload、created_at。payload 是 JSON 格式,存储事件的具体内容。查询的时候按 session_id 和 created_at 排序就行。
这里有个性能考量:如果事件很多,每次重放会不会很慢?实测下来,一万条事件的会话重放时间在毫秒级,完全可接受。而且实际使用中,单个会话的事件数量很少超过几千条。如果真的大到影响性能,可以加快照机制,定期把当前状态存下来,重放时从最近的快照开始。
2.4 执行层的任务调度逻辑
执行层的核心是把“命令执行”抽象成“任务”。一个任务有生命周期:创建、排队、运行、完成、失败、取消。任务之间可以有依赖关系,比如任务 B 依赖任务 A 的输出。
调度器用了一个简单的有向无环图来管理依赖。每个任务是一个节点,依赖关系是边。调度器每次找出所有依赖已满足的任务,按优先级排序后执行。执行时用异步 IO,不阻塞主线程。
输出处理是执行层比较麻烦的部分。命令的输出是流式的,可能持续很长时间。kshell 的做法是把输出分成块,每块带上时间戳和来源标识,然后推送到展示层。展示层按需渲染,不需要一次性加载全部输出。
取消操作也需要特别处理。有些命令收到取消信号后会优雅退出,有些会直接被杀掉。kshell 先发取消信号,等一段时间(默认 3 秒),如果还没退出就强制杀掉。这个超时时间可以配置,因为有些编译任务确实需要更长时间来清理。
3. 实操过程:从零把 kshell 跑起来
3.1 环境准备与依赖安装
kshell 是用 Rust 写的,所以第一步是装 Rust 工具链。如果你还没装,用 rustup 是最省事的方式。装完之后确认一下版本,kshell 需要 Rust 1.75 以上。
# 安装 Rust 工具链 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 确认版本 rustc --version cargo --version除了 Rust,还需要一个 SQLite 开发库,因为会话存储依赖它。在常见的 Linux 发行版上,包名一般是 libsqlite3-dev 或 sqlite-devel。macOS 上系统自带了 SQLite,不用额外装。
# Debian/Ubuntu 系 sudo apt install libsqlite3-dev # Fedora/RHEL 系 sudo dnf install sqlite-devel然后克隆 kshell 仓库并编译。第一次编译会比较慢,因为要下载和编译依赖。我实测在普通开发机上大概需要三到五分钟。
git clone https://github.com/example/kshell.git cd kshell cargo build --release编译完成后,二进制文件在 target/release/kshell。你可以把它加到 PATH 里,或者直接指定路径运行。
提示:如果你在国内网络环境,cargo 下载依赖可能比较慢。可以配置镜像源加速,具体方法搜一下“cargo 镜像配置”就有,这里不展开。
3.2 配置文件详解与参数调优
kshell 的配置文件默认在 ~/.config/kshell/config.toml。第一次运行会自动生成一份默认配置。配置文件分成几个区块:general、adapters、session、executor。
general 区块是通用设置,包括主题、语言、日志级别。主题支持 dark 和 light 两种,日志级别建议日常用 info,排查问题时改成 debug。
[general] theme = "dark" language = "zh-CN" log_level = "info"adapters 区块配置各个 CLI 工具的适配器。每个适配器有 name、command、args、mode 几个字段。mode 可以是 request-response 或 streaming。
[adapters.example-cli] name = "Example CLI" command = "example-cli" args = ["--interactive"] mode = "streaming" timeout = 30session 区块配置会话存储。db_path 是 SQLite 文件路径,max_events 是单个会话最大事件数,超过后会触发快照。
[session] db_path = "~/.local/share/kshell/sessions.db" max_events = 10000 snapshot_interval = 1000executor 区块配置执行器。max_concurrent 是最大并发任务数,cancel_timeout 是取消超时时间(秒),output_buffer_size 是输出缓冲区大小(行数)。
[executor] max_concurrent = 4 cancel_timeout = 3 output_buffer_size = 5000参数调优这块,我踩过的坑主要是 max_concurrent 和 output_buffer_size。max_concurrent 设太大,机器负载高,反而拖慢整体速度;设太小,任务排队等太久。一般设成 CPU 核心数就行。output_buffer_size 设太小,长输出会被截断;设太大,内存占用高。5000 行是个比较平衡的值。
3.3 第一次运行与界面导航
配置好之后,直接运行 kshell 就能看到主界面。界面分成三个区域:左侧是会话列表和文件树,中间是主工作区,右侧是任务面板。
左侧会话列表显示所有历史会话,按最后活动时间排序。用 Tab 键可以在会话列表和文件树之间切换。文件树显示当前工作目录,支持展开和折叠。
中间主工作区是对话和输出的展示区域。你跟 AI 的对话、命令的执行输出都在这里显示。底部有一个输入框,用来输入消息或命令。输入框支持多行编辑,Shift+Enter 换行,Enter 发送。
右侧任务面板显示当前运行的任务和最近完成的任务。每个任务显示名称、状态、耗时和输出摘要。按数字键可以快速切换到对应的任务输出。
快捷键方面,Ctrl+N 新建会话,Ctrl+W 关闭当前会话,Ctrl+P 打开命令面板,Ctrl+Q 退出。这些快捷键都可以在配置里改。
注意:第一次运行时,kshell 会尝试自动检测系统里已安装的 CLI 工具。如果检测不到,需要手动在配置里添加适配器。检测逻辑不是万能的,有些工具装在非标准路径就检测不到。
3.4 接入第一个 CLI 工具的完整流程
接入一个新 CLI 工具,分三步:确认工具可用、写适配器配置、测试连通性。
第一步,确认工具可用。在系统终端里直接运行一下,确认能正常启动和交互。记下启动命令和常用参数。
第二步,写适配器配置。在 config.toml 的 adapters 区块添加一段配置。关键是 mode 的选择:如果工具是发一条命令回一条结果,用 request-response;如果工具启动后维持一个交互会话,用 streaming。
[adapters.my-tool] name = "My Tool" command = "/usr/local/bin/my-tool" args = ["--no-color"] mode = "request-response" timeout = 60第三步,测试连通性。在 kshell 里按 Ctrl+P 打开命令面板,输入 “adapter test my-tool”,回车。kshell 会发送一个测试消息给工具,看是否能正常收到回复。如果失败,看日志里的错误信息,一般是命令路径不对或者参数不对。
我接入第一个工具的时候,卡在参数上很久。那个工具默认输出带颜色,但 kshell 的解析器不认颜色代码,导致输出乱码。后来加了 --no-color 参数就好了。所以接入新工具时,建议先关掉所有格式化输出,用最朴素的文本模式。
3.5 会话管理与上下文切换实操
会话管理是 kshell 用得最多的功能。新建会话很简单,Ctrl+N 就行。但怎么组织会话,有一些经验可以分享。
我的做法是按项目分会话。每个项目一个主会话,项目里的不同任务开子会话。比如“项目 A 主会话”下面有“项目 A - 重构用户模块”、“项目 A - 修 bug”等子会话。这样上下文不会混,找历史记录也方便。
会话切换用 Ctrl+P 打开命令面板,输入会话名搜索。或者用 Tab 切到左侧会话列表,用方向键选择。切换会话时,kshell 会自动保存当前会话状态,加载目标会话状态。
上下文延续是很多人关心的。kshell 支持把一个会话的上下文导入到另一个会话。命令是 “session import
但要注意,上下文导入不是无脑全导。如果两个会话的工作目录不同,导入后可能会有路径不一致的问题。我的建议是只导入对话历史,不导入文件操作记录。kshell 支持按事件类型过滤导入。
4. 常见问题与排查技巧实录
4.1 适配器连接失败的排查思路
适配器连不上是最常见的问题。排查顺序是:先确认工具本身能跑,再确认路径和参数对,最后看权限和网络。
工具本身能不能跑,直接在系统终端里试。如果系统终端里都跑不起来,那跟 kshell 没关系,先解决工具本身的问题。
路径和参数问题,检查配置文件里的 command 和 args。command 建议用绝对路径,避免 PATH 问题。args 要注意转义,特别是带空格或特殊字符的参数。
权限问题在 Linux 上比较常见。如果工具需要访问某些设备或文件,而 kshell 运行的用户没有权限,就会失败。用 ls -l 看一下工具和它需要访问的文件的权限。
网络问题主要出现在工具需要访问外部服务时。如果工具本身需要网络,而 kshell 运行环境网络不通,也会失败。这个用 curl 或 ping 测一下就知道。
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 启动即失败 | 命令路径错误 | 检查 command 字段 | 改用绝对路径 |
| 启动后无响应 | 参数不兼容 | 对比系统终端运行参数 | 调整 args 配置 |
| 输出乱码 | 格式化输出未关闭 | 查看原始输出 | 加 --no-color 等参数 |
| 权限拒绝 | 用户权限不足 | ls -l 检查权限 | 调整权限或换用户 |
| 连接超时 | 网络不通 | curl 测试连通性 | 检查网络配置 |
4.2 输出截断与乱码的处理方法
输出截断一般是 output_buffer_size 设太小。默认 5000 行,如果任务输出超过这个数,前面的会被丢弃。解决办法是调大这个值,或者把输出重定向到文件。
乱码问题分两种:一种是编码问题,工具输出的是非 UTF-8 编码;另一种是转义序列问题,工具输出带 ANSI 转义序列但解析器不认。
编码问题,先确认工具的输出编码。用 file 命令或者 hexdump 看一下。如果是 GBK 之类的编码,需要在适配器配置里指定编码转换。
转义序列问题,最简单的办法是关掉工具的格式化输出。大部分工具都有 --no-color 或 --plain 之类的参数。如果关不掉,可以在适配器里加一层转义序列过滤,把 ANSI 代码去掉。
// 简单的 ANSI 转义序列过滤 fn strip_ansi(input: &str) -> String { let re = Regex::new(r"\x1b\[[0-9;]*[a-zA-Z]").unwrap(); re.replace_all(input, "").to_string() }提示:过滤转义序列会丢失颜色信息,但换来的是稳定的解析。如果你确实需要颜色,可以在展示层重新着色,而不是依赖工具的原始输出。
4.3 任务卡死与资源占用的应对
任务卡死通常有几个原因:命令本身死循环、等待输入但输入没送到、资源竞争导致死锁。
命令死循环的话,看输出是不是在重复同样的内容。如果是,直接取消任务。kshell 的取消是先发信号再强杀,一般能解决。
等待输入的情况比较隐蔽。有些命令会等待用户输入,但 kshell 没有自动送输入,导致命令一直等。解决办法是在适配器里配置自动输入,或者用 echo 管道把输入送进去。
资源竞争导致死锁,一般出现在并发任务多的时候。表现是任务都卡住不动,CPU 占用低。解决办法是降低 max_concurrent,或者给任务加超时。
资源占用高的话,看是 CPU 高还是内存高。CPU 高一般是计算密集型任务,正常。内存高可能是输出缓冲太大,调小 output_buffer_size。如果内存持续增长不释放,可能是内存泄漏,需要看代码排查。
4.4 会话数据损坏的恢复技巧
会话数据存在 SQLite 里,一般不会损坏。但如果进程异常退出或者磁盘满,可能会损坏。表现是打开会话时报错,或者会话内容显示不全。
恢复的第一步是备份当前数据库文件。然后尝试用 SQLite 的修复命令。
# 备份 cp ~/.local/share/kshell/sessions.db ~/.local/share/kshell/sessions.db.bak # 尝试修复 sqlite3 ~/.local/share/kshell/sessions.db ".recover" | sqlite3 ~/.local/share/kshell/sessions_recovered.db如果修复不了,可以用事件导出功能。kshell 支持把会话导出成 JSON 文件,即使数据库损坏,只要事件表还能读,就能导出。导出后新建一个数据库,再导入。
预防措施是定期备份。可以写个 cron 任务,每天备份一次数据库。另外,kshell 默认开启了 WAL 模式,这个模式对异常退出的容忍度更高,建议保持开启。
4.5 性能调优的实测经验
性能调优这块,我做了几组对比测试。测试环境是一台普通开发机,8 核 CPU,16G 内存。
第一组测试是 max_concurrent 的影响。跑 20 个中等耗时的任务,分别设 max_concurrent 为 1、2、4、8。结果是 4 的时候总耗时最短,1 和 2 因为并发不足导致排队,8 因为上下文切换开销导致反而变慢。
第二组测试是 output_buffer_size 的影响。跑一个输出 10 万行的任务,分别设 buffer 为 1000、5000、10000、50000。结果是 5000 和 10000 表现最好,1000 导致频繁截断和重读,50000 导致内存占用明显上升。
第三组测试是 SQLite 的 WAL 模式。开启 WAL 后,会话写入的延迟明显降低,特别是在频繁保存会话状态时。建议保持开启。
| 调优项 | 测试值 | 最优值 | 说明 |
|---|---|---|---|
| max_concurrent | 1/2/4/8 | 4 | 匹配 CPU 核心数 |
| output_buffer_size | 1000/5000/10000/50000 | 5000-10000 | 平衡内存和截断 |
| WAL 模式 | 开/关 | 开 | 降低写入延迟 |
| snapshot_interval | 500/1000/5000 | 1000 | 平衡重放速度和存储 |
4.6 我踩过的三个典型坑
第一个坑是适配器的超时设置。我一开始把所有适配器的 timeout 都设成 30 秒,结果有些需要长时间运行的任务(比如跑完整测试套件)总是被超时中断。后来改成按适配器分别设置,长任务设 300 秒,短任务设 30 秒。
第二个坑是会话切换时的状态保存。早期版本切换会话时,如果当前有任务在运行,任务会被中断。后来改成切换会话不中断任务,任务在后台继续跑,输出缓存起来,切回来时再展示。
第三个坑是配置文件的热加载。我一开始以为改了配置需要重启 kshell,后来发现支持热加载,但热加载有延迟,大概几秒钟。如果改了配置没生效,等几秒或者手动触发重载。
这三个坑的共同点是:文档里没写,只有实际用的时候才会遇到。所以我的建议是,拿到一个新工具,先花半小时把各种边界情况试一遍,比看文档管用。
5. 扩展玩法:把 kshell 改造成自己的工作流中枢
5.1 自定义适配器开发入门
kshell 的适配器是用 Rust 写的,但如果你不想写 Rust,也可以用脚本语言写一个中间层。kshell 支持通过标准输入输出跟外部程序通信,所以你可以用 Python、Node.js 等任何语言写适配器。
自定义适配器的核心是实现三个动作:接收输入、处理、返回输出。kshell 会把用户输入通过标准输入传给适配器,适配器处理后把结果通过标准输出返回。中间可以用 JSON 格式传递结构化数据。
#!/usr/bin/env python3 import sys import json def main(): for line in sys.stdin: try: request = json.loads(line) # 处理请求 response = { "type": "response", "content": f"Echo: {request.get('content', '')}" } print(json.dumps(response), flush=True) except json.JSONDecodeError: print(json.dumps({"type": "error", "message": "Invalid JSON"}), flush=True) if __name__ == "__main__": main()写完之后,在配置里把 command 指向这个脚本就行。这种方式的灵活性很高,你可以用任何熟悉的语言来实现复杂的逻辑。
5.2 多工具协同的工作流设计
kshell 真正强大的地方在于可以把多个工具串起来用。比如一个典型的工作流:用工具 A 生成代码,用工具 B 做代码审查,用工具 C 跑测试。
实现方式是用任务依赖。先创建一个任务调用工具 A,任务完成后自动触发工具 B 的任务,再触发工具 C 的任务。kshell 的任务调度器支持这种链式依赖。
配置方式是在任务定义里加 depends_on 字段。比如:
[[workflows.code-review]] name = "生成并审查代码" steps = [ { adapter = "code-gen", input = "生成用户模块", output = "generated_code" }, { adapter = "code-review", input = "{{generated_code}}", output = "review_result" }, { adapter = "test-runner", input = "{{generated_code}}", output = "test_result" } ]这种工作流的好处是标准化。团队里每个人用同样的工作流,产出质量更稳定。而且每一步的输出都留痕,方便追溯。
5.3 把 kshell 嵌入现有开发流程
kshell 不一定要单独用,也可以嵌入现有的开发流程。比如在 CI 里用 kshell 跑自动化任务,或者在编辑器里通过插件调用 kshell。
嵌入 CI 的方式是用 kshell 的无头模式。加 --headless 参数启动,kshell 不渲染界面,只执行任务并输出结果。这样可以在 CI 脚本里调用。
kshell --headless --workflow code-review --output json > result.json嵌入编辑器的方式是通过本地 socket。kshell 启动时会监听一个本地 socket,编辑器插件可以通过这个 socket 发送命令和接收结果。协议是 JSON-RPC,比较简单。
这两种嵌入方式我都试过,CI 嵌入比较成熟,编辑器嵌入还在完善中。如果你有编辑器插件开发经验,欢迎贡献代码。
5.4 后续可以扩展的方向
kshell 目前还是一个比较早期的项目,有很多可以扩展的方向。我列几个我觉得比较有价值的:
第一个是团队协作。现在会话数据是本地存储的,如果能把会话同步到团队共享的存储,就可以做协作编辑和知识沉淀。这个需要设计一套同步协议和权限模型。
第二个是智能推荐。根据你的历史操作,推荐可能需要的工具或工作流。比如你经常在写完代码后跑测试,kshell 可以在检测到代码变更后主动提示是否跑测试。
第三个是可视化。现在都是终端界面,如果能有一个 Web 界面,展示任务依赖图、会话时间线等,会更直观。这个可以用 kshell 作为后端,前端单独做。
第四个是插件市场。让社区贡献适配器和工作流模板,用户一键安装。这个需要设计插件格式和分发机制。
这些方向我都在探索,但一个人的精力有限。如果你对其中某个方向感兴趣,欢迎一起讨论。开源项目的乐趣就在于,你永远不知道下一个贡献者会带来什么惊喜。
我个人在实际操作中的体会是,工具的价值不在于功能多,而在于能不能真正融入你的工作流。kshell 解决的是我自己的痛点,但每个人的痛点不一样。如果你用了觉得哪里不顺手,最好的办法是直接改代码。开源项目最大的好处就是,你可以把它改成完全适合自己的样子。