Claude Code Buddy 修正ガイド:どのようにしてシャイニングレジェンド級ペットを手に入れるか
Claude Code Buddy 修正ガイド:どのようにしてシャイニングレジェンド級ペットを手に入れるか
2026年4月1日、Anthropic は Claude Code 2.1.89 バージョンでひっそりとエッグ機能を追加しました——/buddy ペットシステム。ターミナルに /buddy と入力すると、ASCIIスタイルの小動物があなたの入力ボックスの横で"孵化"し、コードを書くのを手伝ったり、バグについて文句を言ったりします。
各BuddyはアカウントIDを通じて決定論的アルゴリズムによって生成されるため、同じアカウントは常に同じペットを得ることになります。しかし、設定ファイル内のuserIDを変更することで、好みのペットを"再ROLL"することができます。本記事ではアルゴリズムの原理と完全な修正スクリプトについて詳しく説明します。
一、Buddy システムの概要
18 種類の種
システムには現在18種類の可愛い種が含まれています:
- duck - アヒル(クラシックなラバーダックデバッグ)
- goose - ガチョウ(いたずら好き)
- blob - ゼリー(柔らかくて不定形)
- cat - 猫(クールでツンデレ)
- dragon - ドラゴン(威厳ある守護者)
- octopus - タコ(マルチスレッド思考)
- owl - フクロウ(知恵の師)
- penguin - ペンギン(正装で出席)
- turtle - カメ(堅実で信頼できる)
- snail - カタツムリ(遅い工夫で細かい仕事)
- ghost - 幽霊(神出鬼没)
- axolotl - アホロートル(可愛く癒し系)
- capybara - カピバラ(仏系の達人)
- cactus - サボテン(心温まる植物)
- robot - ロボット(理性至上)
- rabbit - ウサギ(元気いっぱい)
- mushroom - キノコ(静かに観察)
- chonk - 太っちょ(丸々とした)
5 レベルのレアリティ
- Common(普通) - 60% の確率、帽子の装飾なし
- Uncommon(珍しい) - 25% の確率、帽子をアンロック
- Rare(稀少) - 10% の確率、より多くの装飾
- Epic(エピック) - 4% の確率、専用の装飾
- Legendary(伝説) - 1% の確率、最高の装飾
二、アルゴリズム原理の深層解析
Buddy の生成には決定論的ランダムアルゴリズムが使用されており、核心プロセスは以下の通りです:
1. シード文字列の結合
const SALT = "friend-2026-401"; // 4月1日エイプリルフールのエッグ const key = userId + SALT;
Salt 値 friend-2026-401 の 401 は 4月1日を表しており——精巧に設計されたエイプリルフールのエッグです。
2. FNV-1a 32ビットハッシュ
シード文字列を32ビット整数に変換します:
function hashString(s) { let h = 2166136261; // FNVオフセット基準 for (let i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); h = Math.imul(h, 16777619); // FNV prime } return h >>> 0; }
3. Mulberry32 PRNG
ハッシュ値を使って擬似乱数生成器を初期化します:function mulberry32(seed) { let a = seed >>> 0; return function() { a |= 0; a = (a + 0x6d2b79f5) | 0; let t = Math.imul(a ^ (a >>> 15), 1 | a); t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; }
// Mulberry32はゲーム開発でよく使われる軽量PRNGで、プログラム生成や戦利品ドロップ表に適しています。
4. レアリティ抽出(重要!)
const RARITIES = ["common", "uncommon", "rare", "epic", "legendary"]; const RARITYWEIGHTS = { common: 60, uncommon: 25, rare: 10, epic: 4, legendary: 1 };
function rollRarity(rng) { const total = 60 + 25 + 10 + 4 + 1; // = 100 let roll = rng() total; for (const rarity of RARITIES) { roll -= RARITYWEIGHTS[rarity]; if (roll < 0) return rarity; } return "common"; }
重要:RARITIES 数组的顺序必须是从低到高,这是加权随机选择的标准实现。
三、完整 Reroll 脚本
以下脚本可以搜索并生成闪光传说级 Buddy 的 userID:
// Claude Code Buddy Reroll 脚本 // 基于 Claude Code 源码逆向分析
// FNV-1a 32-bit hash function hashString(s) { let h = 2166136261; for (let i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); h = Math.imul(h, 16777619); } return h >>> 0; }
// Mulberry32 PRNG function mulberry32(seed) { let a = seed >>> 0; return function() { a |= 0; a = (a + 0x6d2b79f5) | 0; let t = Math.imul(a ^ (a >>> 15), 1 | a); t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; }
const SPECIES = [ "duck", "goose", "blob", "cat", "dragon", "octopus", "owl", "penguin", "turtle", "snail", "ghost", "axolotl", "capybara", "cactus", "robot", "rabbit", "mushroom", "chonk" ];const RARITIES = ["common", "uncommon", "rare", "epic", "legendary"];\nconst RARITYWEIGHTS = { common: 60, uncommon: 25, rare: 10, epic: 4, legendary: 1 };\nconst SALT = "friend-2026-401";\n\nfunction pick(rng, arr) {\n return arr[Math.floor(rng() arr.length)];\n}\n\nfunction rollRarity(rng) {\n const total = Object.values(RARITYWEIGHTS).reduce((a, b) => a + b, 0);\n let roll = rng() total;\n for (const rarity of RARITIES) {\n roll -= RARITY_WEIGHTS[rarity];\n if (roll < 0) return rarity;\n }\n return "common";\n}\n\nfunction testUserId(userId) {\n const key = userId + SALT;\n const seed = hashString(key);\n const rng = mulberry32(seed);\n const rarity = rollRarity(rng);\n const species = pick(rng, SPECIES);\n const shiny = rng() < 0.01;\n return { rarity, species, shiny };\n}\n\nfunction randomUserId() {\n let id = "";\n for (let i = 0; i < 64; i++) {\n id += Math.floor(Math.random() 16).toString(16);\n }\n return id;\n}\n\n// 輝く伝説を検索\nconsole.log("輝く伝説 Buddy...\n");\nconst targetSpecies = process.argv[2] || null;\n\nwhile (true) {\n const userId = randomUserId();\n const result = testUserId(userId);\n\n if (result.rarity === "legendary" && result.shiny) {\n if (!targetSpecies || result.species === targetSpecies) {\n console.log("見つかりました!");\n console.log("種: ", result.species);\n console.log("レアリティ: 伝説");\n console.log("輝く: はい!");\n console.log("userID: ", userId);\n break;\n }\n }\n}\n\n## 四、使用手順\n\n- スクリプトを保存:上記のコードを buddy-reroll.js として保存します。\n\n- スクリプトを実行:node buddy-reroll.js(種を指定することもできます:node buddy-reroll.js dragon)\n\n- userIDをコピー:スクリプトは輝く伝説レベルの Buddy の userID を出力します。- 設定の変更: # ~/.claude.jsonを編集 cat ~/.claude.json | jq '.userID = "あなたの新しいuserID" | del(.companion)' > /tmp/claude-new.json && mv /tmp/claude-new.json ~/.claude.json
- Claude Codeを再起動し、
/buddyと入力すると新しいペットが見られます!
五、防止不正行為の設計原理
Claude Codeの設計は非常に巧妙で、骨格(Bones)と魂(Soul)の分離というアーキテクチャを採用しています:
- Bones(骨格):種、レアリティ、外観、属性——毎回userIDから再計算され、永続化されない
- Soul(魂):名前、性格の説明——ローカル設定に永続化される
roll(userID)の結果で上書きすることを意味します。注釈は非常に明確です:editing config.companion can't fake a rarity。
しかし、userID自体は変更可能であり、これがこの記事の方法の原理です。
六、まとめ
Claude Code Buddyは、以下を融合させた精巧に設計されたイースターエッグ機能です:
- 決定論的ランダム:FNV-1a + Mulberry32のクラシックな組み合わせ
- カード引きメカニズム:5レベルのレアリティ + 1%の光り輝く、Gachaゲームの本質
- 不正防止設計:骨格/魂の分離により、公平性を確保
- エイプリルフールのイースターエッグ:salt値に4月1日のタイムスタンプが隠されている
参考資料:
- Claude Code 2.1.89のソースコード漏洩(npmソースマップ事故)
- 掘金:《Claude Code Buddyモードの深掘り:サボテンの背後にある決定論的ランダムアルゴリズム》- DEV.to: 私はクローズのソースコードを徹底的に解析しました

