Guía de modificación de Claude Code Buddy: Cómo obtener mascotas legendarias brillantes
Guía de modificación de Claude Code Buddy: Cómo obtener mascotas legendarias brillantes
El 1 de abril de 2026, Anthropic lanzó silenciosamente una función oculta en la versión 2.1.89 de Claude Code: sistema de mascotas /buddy. Al ingresar /buddy en la terminal, un pequeño animal de estilo ASCII "eclosionará" al lado de tu cuadro de entrada, acompañándote mientras escribes código y comentas sobre errores.
Cada Buddy se genera a partir del ID de cuenta mediante un algoritmo determinista, lo que significa que la misma cuenta siempre obtendrá la misma mascota. Pero al modificar el userID en el archivo de configuración, podemos "re-roll" para obtener la mascota deseada. Este artículo detallará el principio del algoritmo y el script completo de modificación.
I. Visión general del sistema Buddy
18 especies de mascotas
El sistema actualmente incluye 18 adorables especies:
- duck - pato (el clásico Rubber Duck Debugging)
- goose - ganso (travieso)
- blob - gelatina (suave y amorfa)
- cat - gato (frío y orgulloso)
- dragon - dragón (imponente guardián)
- octopus - pulpo (pensamiento multihilo)
- owl - búho (mentor sabio)
- penguin - pingüino (vestido formal)
- turtle - tortuga (estable y confiable)
- snail - caracol (trabajo lento pero detallado)
- ghost - fantasma (apareciendo y desapareciendo)
- axolotl - axolote (adorable y curativo)
- capybara - capibara (maestro zen)
- cactus - cactus (planta reconfortante)
- robot - robot (racionalidad ante todo)
- rabbit - conejo (salta y corre)
- mushroom - hongo (observador silencioso)
- chonk - gordito (redondito)
5 niveles de rareza
- Común - 60% de probabilidad, sin decoración de sombrero
- Poco Común - 25% de probabilidad, desbloquea sombreros
- Raro - 10% de probabilidad, más decoraciones
- Épico - 4% de probabilidad, decoraciones exclusivas
- Legendario - 1% de probabilidad, decoraciones de primer nivel
II. Análisis profundo del principio del algoritmo
La generación de Buddy utiliza un algoritmo de aleatoriedad determinista, el flujo central es el siguiente:
1. Concatenación de la cadena semilla
const SALT = "friend-2026-401"; // Huevo de Pascua del 1 de abril const key = userId + SALT;
El valor de sal friend-2026-401 contiene el 401 que representa el 1 de abril, ¡un huevo de Pascua cuidadosamente diseñado para el Día de los Inocentes!
2. Hash FNV-1a de 32 bits
Convierte la cadena semilla en un entero de 32 bits:
function hashString(s) { let h = 2166136261; // Base de desplazamiento 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
Inicializa el generador de números pseudoaleatorios con el valor hash: 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 es un generador de números aleatorios ligero comúnmente utilizado en el desarrollo de juegos, adecuado para la generación programática y las tablas de botín.
4. Extracción de Rareza (¡Clave!)
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; }
// Generador de Números Aleatorios 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 = ["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// Buscar Buddy legendarios brillantes\nconsole.log("Buscando Buddy legendarios brillantes...\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("¡Encontrado!");\n console.log("Especie:", result.species);\n console.log("Rareza: Legendario");\n console.log("Brillante: ¡Sí!");\n console.log("userID:", userId);\n break;\n }\n }\n}\n\n## Cuatro, Pasos a seguir\n\n- Guardar el script: Guarda el código anterior como buddy-reroll.js\n\n- Ejecutar el script: node buddy-reroll.js (puedes especificar la especie: node buddy-reroll.js dragon)\n\n- Copiar userID: El script generará un userID para un Buddy legendario brillante.- Modificar configuración: # Editar ~/.claude.json cat ~/.claude.json | jq '.userID = "tu nuevo userID" | del(.companion)' > /tmp/claude-new.json && mv /tmp/claude-new.json ~/.claude.json
- Reiniciar Claude Code, ingresa
/buddyy podrás ver tu nueva mascota!
Cinco, Principios de diseño anti-trampa
El diseño de Claude Code es muy ingenioso, utiliza una arquitectura de separación de Esqueleto (Bones) y Alma (Soul):
- Bones (Esqueleto): especie, rareza, apariencia, atributos——se recalcula cada vez desde userID, nunca se persiste
- Soul (Alma): nombre, descripción de personalidad——persistente en la configuración local
roll(userID) al leerlo. El comentario es muy claro: editing config.companion can't fake a rarity.
Pero el userID en sí puede ser modificado, esta es la base del método de este artículo.
Seis, Resumen
Claude Code Buddy es una función de huevo de pascua cuidadosamente diseñada, que combina:
- Aleatoriedad determinista: combinación clásica de FNV-1a + Mulberry32
- Mecanismo de cartas: rareza de nivel 5 + 1% brillante, la esencia de los juegos Gacha
- Diseño anti-trampa: separación de esqueleto/alma, asegurando la equidad
- Huevo de pascua de April Fool's: el valor de salt oculta una marca de tiempo del 1 de abril
Referencias:
- Filtración del código fuente de Claude Code 2.1.89 (incidente del mapa de origen de npm)
- Juegolandia: "Profundizando en el modo Claude Code Buddy: el algoritmo de aleatoriedad determinista detrás de un cactus"- DEV.to: Desgarré el Código Fuente de Claude

