混合语言仓库的 Treefmt 格式化计划
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/run-one-formatter-plan-across-a-mixed-language-repo-and-keep-generated-edits-predictable-with-treefmt。
技能介绍
你要解决的问题
混合语言仓库里,格式化这件事很容易变成一团乱麻。一个仓库同时包含 Python、Go、TypeScript 和 Rust 代码时,你通常得按语言分别跑 black、gofmt、prettier、rustfmt,再在脚本里把它们拼起来。这种做法有两个老问题:一是顺序不可控,某个格式化器改动过的文件又被另一个顺手重排,最终 diff 里混进大量与本次改动无关的噪声;二是范围不可控,脚本里的格式化命令往往无差别处理所有文件,而不是只碰真正发生变更的部分,于是一次小改动能带出整仓库的重写。
这个技能如何工作
这个技能的做法不是发明新工具,而是把 treefmt 作为仓库级的单一编排层:
- 一份计划,多种语言:在仓库根目录维护一个
treefmt配置文件,把所有要参与的格式化器登记进去,由一个命令统一调度,而不是按语言临时拼脚本。 - 并行执行:
treefmt以流水线方式并行驱动各格式化器,文件在语言匹配后直接交给对应的格式化器处理,不必为每种语言串行等待。 - 只碰变更文件:只有自上一次运行以来发生变化的文件才会被送入格式化器,避免无关重排,让生成的编辑变得可预测。
- 单一入口:对 agent 或 CI 来说,只需要发起同一个命令,即可覆盖整个仓库的格式化策略,结果由配置文件决定,而不是由某次临时拼凑的命令行决定。
典型步骤是:安装 treefmt 本体和你计划使用的各种底层格式化器,在仓库中放好配置文件,然后在 shell 中调用该命令。前置条件就是这四样:treefmt、各语言格式化器、仓库级配置、shell 访问权限。
适用边界与注意点
- 配置要随仓库演进:格式化规则完全来自那份配置文件,新增语言或升级格式化器时需要同步更新,否则新语言的文件会被直接跳过。
- 底层格式化器必须自己装好:
treefmt是编排层,不会替你安装black、rustfmt这些工具,缺失的语言格式化器意味着对应文件得不到处理。 - 增量行为依赖运行历史:只处理变更文件的能力建立在上一次运行的状态之上,CI 的干净 checkout 与本地缓存场景下观察到的格式化范围可能不一致。
- 不替代语言自身的格式化约定:它保证的是执行层面的统一和可预测,具体风格仍由各格式化器及其参数决定。
参考文档见 treefmt 官方站点,上游说明来自 numtide/treefmt。
使用场景
- 混合语言仓库里,手动拼接多个格式化器命令太混乱,需要一个统一命令替代,避免重复处理文件。
- CI 流水线里格式化步骤耗时久,希望能并行运行各格式化器,并且只检查有变更的文件。
- 团队维护混合语言仓库时,新人容易遗漏格式化步骤,需要一个单一命令入口保证所有人格式化结果一致。
- 本地开发时,每次提交前手动跑多个格式化命令太繁琐,需要用一个命令统一处理,只格式化改动的文件。
适合人员
- 全栈工程师,维护包含 Python、Go、TypeScript 的混合语言仓库,需要统一管理多格式化器避免混乱。
- 后端工程师,负责 CI 流水线的格式化步骤,需要缩短耗时并只检查变更文件。
- DevOps 工程师,需要让 CI 中的格式化步骤与本地保持一致,避免合并冲突。
- 前端工程师,维护 TypeScript 和 Rust 混合的仓库,需要简化提交前的格式化流程,减少手动操作。