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é cachée dans la version 2.1.89 de Claude Code — système de compagnon /buddy. En entrant /buddy dans le terminal, un petit animal de style ASCII "éclos" à côté de votre champ 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 l'ID utilisateur dans le fichier de configuration, nous pouvons "re-rouler" pour obtenir l'animal de compagnie souhaité. Cet article détaillera 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 (classique Rubber Duck Debugging)
- oie - oie (espiègle)
- blob - gelée (mignonne et amorphe)
- chat - chat (froid et fier)
- dragon - dragon (protecteur imposant)
- pieuvre - pieuvre (pensée multithread)
- hibou - hibou (mentor sage)
- pingouin - pingouin (en tenue formelle)
- tortue - tortue (stable et fiable)
- 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 un 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 la chaîne de graines
const SALT = "friend-2026-401"; // 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", "incommun", "rare", "épique", "légendaire"]; const RARITYWEIGHTS = { commun: 60, incommun: 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 d'un Buddy légendaire brillant console.log("Recherche d'un Buddy légendaire brillant... "); 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
- Sauvegarder 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.- Modification de la configuration :
# Éditez ~/.claude.json cat ~/.claude.json | jq '.userID = "votre nouveau userID" | del(.companion)' > /tmp/claude-new.json && mv /tmp/claude-new.json ~/.claude.json
- Redémarrez Claude Code, entrez
/buddypour voir votre nouvel animal de compagnie !
Cinq, Principes 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é 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.
Six, Résumé
Claude Code Buddy est une fonctionnalité de Pâques soigneusement conçue, combinant :
- 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é
- Pâques 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

