SuperAPI AI 工具集

shell-history-hygiene

部署与运维

查看项目

更新于 10-15 09:42

技能介绍

shell-history-hygiene 是一个针对 shell 命令历史的审计与定向清理技能,当前以 atuin 作为后端实现。

用途

当用户明确要求审计、清理、去重或修剪其 shell 历史(atuin 或其他)时使用;当用户粘贴了临时的 atuin stats / prune / dedup 一行命令并请求审查或改进时使用;在任何历史存储迁移(如 atuin → atuin v2、仅 zsh → atuin 等)之前,希望建立干净基线时使用;在机器设置审计中检查历史语料库大小或质量时也可使用。

主要能力

当前后端为 atuin,涉及 atuin stats today、atuin history prune、atuin history dedup。未来计划支持 zsh 原生(.zsh_history 行去重、大小限制)、bash 原生(.bash_history 行去重)以及 mcfly(其自身的修剪功能)。该技能目前随附 atuin 后端脚本 scripts/atuin-audit.sh,后续新增后端时可在 scripts/ 下添加同级脚本。

使用方式(先预览后应用)

审计仅为干跑(dry-run)。它产生三样东西:终端上的标题摘要(atuin stats today 加计数);磁盘上两个带日期的预览产物,每个操作(prune、dedup)一个,供人工检查;末尾回显的 apply 命令,即供人工手动复制粘贴执行的命令形态。该技能自身从不运行 apply 命令,审计与应用分离是刻意设计,作为防止意外破坏历史的“急停开关”。

运行审计:

${CLAUDE_SKILL_ROOT}/scripts/atuin-audit.sh # dedup --before 默认为今天 ${CLAUDE_SKILL_ROOT}/scripts/atuin-audit.sh 2026-05-01 # dedup --before <date>

如果 ${CLAUDE_SKILL_ROOT} 未被 harness 解析,可使用绝对路径:

/Users/4jp/Code/organvm/a-i--skills/skills/tools/shell-history-hygiene/scripts/atuin-audit.sh

预览产物落在脚本旁边:atuin-prune-preview-YYYY-MM-DD.txt 与 atuin-dedup-preview-YYYY-MM-DD.txt。带日期的文件名保留轨迹,重复运行不会覆盖先前的预览。

解读输出

prune entries: N 表示 atuin 自身输出的“Found N entries to prune”,即结构性空操作(空命令、重复 clear、粘贴故障产生的重复项),几乎总是可以安全修剪。dedup duplicates: M 表示 atuin 自身输出的“Found M duplicates to delete”,即早于 --before 的精确字符串重复项;应用前应抽样检查,跨数月历史出现较大的 M(1 万以上)属正常。预览文件的行数可能多于实体计数,因为多行命令(HEREDOC、for 循环)每行各占多行;应信任标题数字,行数仅用于了解文件大小。

应用清理

在人工查看预览并批准后:

atuin history prune # 应用 prune atuin history dedup --before "$BEFORE_DATE" --dupkeep 1 # 应用 dedup(每个重复字符串保留 1 份)

按此顺序运行。先 prune 移除结构性空操作,再 dedup 折叠剩余的精确字符串重复项。反序也可行,但会做冗余扫描。--dupkeep 0 具有破坏性(删除所有副本),绝不应推荐;--dupkeep 1 是正确的默认值。

安全与失败模式

脚本保持干跑保证——使用 set -euo pipefail,从不调用 apply 命令。atuin 不在 PATH 中时,脚本以退出码 1 退出并给出清晰错误,不会产生部分操作。atuin 中的多行命令:脚本的标题解析 atuin 自身的“Found N”行(而非 wc -l),因此即使多行命令使总行数膨胀,计数仍然准确。--before 日期在未来时 atuin 会接受,dedup 只是考虑全部历史;应用前应检查预览。

适用场景与限制

适用于需要安全审计与清理 shell 历史的场景,尤其是使用 atuin 的用户。当前仅提供 atuin 后端,zsh、bash、mcfly 后端暂未提供。该技能不自动执行清理,必须由人工确认后手动运行 apply 命令。