我给 Claude Code 的终端伙伴换了个皮肤,还做了个工具

5 阅读3分钟

你知道 Claude Code 里藏了一只 ASCII 小动物吗?

如果你用过 Claude Code(Anthropic 官方的命令行 AI 助手),你可能注意到终端里有一只小小的 ASCII 伙伴 —— 它可能是只鸭子、猫、龙、水豚,甚至是只蘑菇。

这个伙伴不是随机的。它是由你的 userId 和一个叫 salt 的字符串通过哈希函数确定性生成的:

Buddy = hash(userId + salt)

不同的组合会产生完全不同的物种、稀有度(普通/不凡/稀有/史诗/传说)、眼睛样式、帽子装饰,甚至还有 1% 概率的闪光版本。

问题是:这个 salt(friend-2026-401,15 个字符)是硬编码在 Claude Code 的二进制文件里的。你没法通过配置文件改它。

所以我做了 Claude Buddy Lab

一个可视化的 Web 工具,让你:

  1. 暴力搜索 —— 遍历数百万个 salt 组合,按物种、稀有度、帽子等条件筛选
  2. 实时预览 —— 在网页上看到 ASCII 精灵图、属性面板、稀有度标签
  3. 一键应用 —— 直接修补 Claude Code 的二进制文件,把新 salt 写进去
  4. 随时恢复 —— 原始 salt 会被自动记录,一键就能恢复

技术细节

为什么不能改配置文件?

一开始我也试过往 ~/.claude/.config.json 里写 buddy.salt,API 返回成功,但伙伴纹丝不动。

翻了源码才发现:Claude Code 根本不从配置文件读这个值。salt 是在构建时就写死在二进制里的,运行时直接从内存读取。

怎么修补二进制?

原理很简单:

# 1. 在二进制中搜索当前 salt 的字节
data = Path(binary_path).read_bytes()
idx = data.find(b"friend-2026-401")
​
# 2. 等长替换为新 salt
data[idx:idx+15] = b"lab-00000294809"# 3. macOS 上需要重新签名
subprocess.run(["codesign", "--force", "--sign", "-", binary_path])

关键点:

  • 等长替换:新旧 salt 必须一样长(15 字符),否则会破坏二进制结构
  • 重新签名:macOS 对修改过的二进制会拒绝执行,需要 ad-hoc 签名
  • 记录原始值:修补前把原始 salt 存到 ~/.claude-buddy-lab.json,方便恢复

Buddy 生成算法

Claude Code 用的是 Mulberry32 PRNG + FNV-1a 哈希:

seed = FNV1a(userId + salt)
rng = Mulberry32(seed)
species = pick(rng, SPECIES_LIST)   // 18 种物种
rarity = weightedRoll(rng)          // 60% 普通, 25% 不凡, 10% 稀有, 4% 史诗, 1% 传说
eye = pick(rng, EYES)               // 6 种眼睛
hat = pick(rng, HATS)               // 普通无帽,其他稀有度随机帽子
shiny = rng() < 0.01                // 1% 闪光概率
stats = rollStats(rng, rarity)      // 5 项属性,稀有度越高基础值越高

这意味着:同一个 userId + salt 永远产生同一个 buddy,所以我们可以提前暴力搜索。

搜索结果示例

比如我想要一只传说级蝾螈(Axolotl),搜索 50 万个 salt 后:

找到了 20 个匹配结果,每个都有不同的眼睛和帽子组合。点击"应用"就能直接修补到二进制里。

应用后在 Claude Code 里的效果:

使用方式

git clone https://github.com/anYuJia/claude-buddy-lab.git
cd claude-buddy-lab
pip3 install flask
python3 cli.py --open

浏览器会自动打开 http://127.0.0.1:8080,选好条件搜索,预览满意后一键应用。

项目地址github.com/anYuJia/cla…


如果你也在用 Claude Code,不妨试试换一只你喜欢的伙伴。毕竟每天对着终端写代码,有只好看的小动物陪着心情也会好一点。