Guide de modification de Claude Code Buddy : Comment obtenir un animal de compagnie légendaire brillant
Guide de modification de Claude Code Buddy : Comment obtenir un animal de compagnie légendaire brillant
Le 1er avril 2026, Anthropic a discrètement lancé une fonctionnalité œuf de Pâques dans la version 2.1.89 de Claude Code — système de compagnie /buddy. En entrant /buddy dans le terminal, un petit animal de style ASCII "éclora" à côté de votre zone de saisie, vous accompagnant dans l'écriture de code et les commentaires sur les bugs.
Chaque Buddy est généré par l'ID de compte via un algorithme déterministe, ce qui signifie qu'un même compte obtiendra toujours le même animal de compagnie. Mais en modifiant le userID dans le fichier de configuration, nous pouvons "re-rouler" pour obtenir l'animal de compagnie souhaité. Cet article expliquera en détail le principe de l'algorithme et le script de modification complet.
I. Aperçu du système Buddy
18 espèces d'animaux
Le système comprend actuellement 18 espèces adorables :
- canard - canard (débogage classique du canard en caoutchouc)
- oie - oie (espiègle)
- blob - gelée (mignonne et indéfinie)
- chat - chat (froid et fier)
- dragon - dragon (protecteur imposant)
- pieuvre - pieuvre (pensée multithread)
- hibou - hibou (mentor sage)
- pingouin - pingouin (présence en costume)
- tortue - tortue (fiable et stable)
- escargot - escargot (travail minutieux)
- fantôme - fantôme (insaisissable)
- axolotl - axolotl (mignon et guérisseur)
- capybara - capybara (maître zen)
- cactus - cactus (plante réconfortante)
- robot - robot (rationnel avant tout)
- lapin - lapin (plein de vie)
- champignon - champignon (observateur silencieux)
- chonk - gros (rondeur)
5 niveaux de rareté
- Commun - 60% de probabilité, sans décoration de chapeau
- Peu commun - 25% de probabilité, déverrouille le chapeau
- Rare - 10% de probabilité, plus de décorations
- Épique - 4% de probabilité, décorations exclusives
- Légendaire - 1% de probabilité, décorations de premier ordre
II. Analyse approfondie du principe de l'algorithme
La génération de Buddy utilise un algorithme de randomisation déterministe, le processus central est le suivant :
1. Concaténation de chaînes de graines
const SALT = "friend-2026-401"; // Œuf de Pâques du 1er avril const key = userId + SALT;
La valeur de sel friend-2026-401 où 401 représente le 1er avril — un œuf de Pâques soigneusement conçu.
2. Hachage FNV-1a 32 bits
Convertir la chaîne de graines en entier 32 bits :
function hashString(s) { let h = 2166136261; // Base de décalage FNV for (let i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); h = Math.imul(h, 16777619); // FNV prime } return h >>> 0; }
3. PRNG Mulberry32
Initialiser le générateur de nombres pseudo-aléatoires avec la valeur de hachage : 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 est un PRNG léger couramment utilisé dans le développement de jeux, adapté à la génération procédurale et aux tables de butin.
4. Extraction de rareté (clé !)
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; }
// PRNG Mulberry32 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 = ["commun", "peu commun", "rare", "épique", "légendaire"]; const RARITYWEIGHTS = { commun: 60, peu commun: 25, rare: 10, épique: 4, légendaire: 1 }; const SALT = "ami-2026-401";
function pick(rng, arr) { return arr[Math.floor(rng() arr.length)]; }
function rollRarity(rng) { const total = Object.values(RARITYWEIGHTS).reduce((a, b) => a + b, 0); let roll = rng() total; for (const rarity of RARITIES) { roll -= RARITY_WEIGHTS[rarity]; if (roll < 0) return rarity; } return "commun"; }
function testUserId(userId) { const key = userId + SALT; const seed = hashString(key); const rng = mulberry32(seed); const rarity = rollRarity(rng); const species = pick(rng, SPECIES); const shiny = rng() < 0.01; return { rarity, species, shiny }; }
function randomUserId() { let id = ""; for (let i = 0; i < 64; i++) { id += Math.floor(Math.random() 16).toString(16); } return id; }
// Recherche de légende brillante console.log("Recherche de légende brillante Buddy...\n"); const targetSpecies = process.argv[2] || null;
while (true) { const userId = randomUserId(); const result = testUserId(userId);
if (result.rarity === "légendaire" && result.shiny) { if (!targetSpecies || result.species === targetSpecies) { console.log("Trouvé !"); console.log("Espèce:", result.species); console.log("Rareté: légendaire"); console.log("Brillant: Oui !"); console.log("userID:", userId); break; } } }
Quatre, étapes d'utilisation
- Enregistrer le script : Enregistrez le code ci-dessus sous
buddy-reroll.js
- Exécuter le script :
node buddy-reroll.js(vous pouvez spécifier l'espèce :node buddy-reroll.js dragon)
- Copier userID : Le script affichera un userID de Buddy de niveau légendaire brillant.- Modifier la configuration :
# Éditez ~/.claude.json cat ~/.claude.json | jq '.userID = "votre nouvel userID" | del(.companion)' > /tmp/claude-new.json && mv /tmp/claude-new.json ~/.claude.json
- Redémarrez Claude Code, tapez
/buddypour voir votre nouvel animal de compagnie !
V. Principe de conception anti-triche
La conception de Claude Code est très astucieuse, utilisant une architecture de séparation des os (Bones) et de l'âme (Soul) :
- Bones (os) : espèce, rareté, apparence, attributs — recalculés à chaque fois à partir de userID, jamais persistés
- Soul (âme) : nom, description de caractère — persistés dans la configuration locale
roll(userID) lors de la lecture. Le commentaire est très clair : editing config.companion can't fake a rarity.
Mais le userID lui-même peut être modifié, c'est là que réside le principe de la méthode de cet article.
VI. Conclusion
Claude Code Buddy est une fonctionnalité de Pâques soigneusement conçue, qui combine :
- Aléatoire déterministe : combinaison classique de FNV-1a + Mulberry32
- Mécanisme de tirage : rareté de niveau 5 + 1% de brillance, l'essence des jeux Gacha
- Conception anti-triche : séparation des os/âme, garantissant l'équité
- Easter egg du poisson d'avril : la valeur salt cache un horodatage du 1er avril
Références :
- Fuite du code source de Claude Code 2.1.89 (incident de carte source npm)
- Juejin : "Analyse approfondie du mode Claude Code Buddy : l'algorithme aléatoire déterministe derrière un cactus"- DEV.to : J'ai Déchiré le Code Source de Claude

