开源工具 sloth-alias 从用户指定的 Shell 历史文件提取重复命令,由 Ollama 本地模型生成别名名称和说明。命令主体仅由历史记录组装,结果写入文件供用户审阅后加载,模型不能直接生成待执行命令。
Hacktoberfest 开源 AI 挑战赛第 3 周:“慢而稳”参赛作品 🦥
这是我提交给 Hacktoberfest 开源 AI 挑战赛第 3 周(慢而稳)的作品。
sloth-alias 会读取 shell 历史记录文件,找出你反复输入的命令和命令序列,再把它们变成 alias。本地运行的开放权重模型(支持任意 Ollama 模型,默认使用 gemma3:4b)只负责一件事:给每个快捷命令起名,再用几个词说明它的用途。
$ python3 sloth_alias.py sample_history.txt # gemma3:4b via Ollama
deploy x3 saves 228 keystrokes <- git push origin main && docker compose up -d --build && ...
commit x4 saves 196 keystrokes <- git add -A && git commit -m wip && git push origin main
commit2 x4 saves 152 keystrokes <- git status && git add -A && git commit -m wip
Total lazy payoff: 576 keystrokes (~2.9 min at 40 wpm).
只有一个文件,仅使用 Python 标准库,零依赖。
模型只负责起名,绝不编写命令。alias 的命令内容始终由你自己的命令用 && 连接而成。模型只返回 {"name", "why"}。即使模型遭到 prompt 注入或产生幻觉,也无法把命令夹带进你的 shell。
不会自动安装任何东西。输出会写入 sloth-aliases.sh。你先检查文件,再用 source 加载。
不会擅自读取历史记录。你必须明确传入文件。你的历史记录始终留在自己的机器上。
名称会经过校验:用正则表达式检查,禁止使用 shell 关键字,也不能与 PATH 上已有的任何命令重名。
出问题时也能平稳降级:模型不可用、返回的 JSON 有误,或者名称不符合长度要求时,都会回退到确定性的首字母命名方式。(我最初的 prompt 让一个 4B 模型返回了 statusaddcommit。)在 prompt 中加入一个示例后,大部分问题都解决了。使用 --no-llm 可以完全离线运行。
shell 历史记录是开发者机器上最敏感的文本之一:里面有主机名、路径,还有不小心粘贴进去的 token。这正是你不该发送给托管 API 的数据。在 localhost 上运行开放权重模型,历史记录就能留在本地磁盘上,每次运行也没有费用,而且只需一个参数(--model)就能切换模型。
对随项目附带的 26 行示例历史记录运行一次,就能找出可节省 576 次按键的快捷方式,相当于约 3 分钟的输入时间。这个示例是合成的;换成真实历史记录,重复操作带来的节省会不断累积。
项目地址:https://github.com/Tinhomagri/sloth-alias
后续要处理命令序列之间的重叠问题(目前,status && add && commit 和 add && commit && push 可能同时被推荐,上面的 commit2 名称就体现了这一点),还要加入 --explain 模式,让模型能够标记危险的 alias,例如包含 rm -rf 的那些。
如果需要进一步采取措施,你可以考虑屏蔽此人,和/或举报滥用行为。