Claude Code Buddy 수정 가이드: 어떻게 반짝이는 전설급 애완동물을 얻을 수 있을까
Claude Code Buddy 수정 가이드: 어떻게 반짝이는 전설급 애완동물을 얻을 수 있을까
2026년 4월 1일, Anthropic은 Claude Code 2.1.89 버전에서 조용히 이스터 에그 기능인 /buddy 애완동물 시스템을 출시했습니다. 터미널에 /buddy를 입력하면 ASCII 스타일의 작은 동물이 당신의 입력 창 옆에서 "부화"되어 코드를 작성하고 버그에 대해 불평하는 데 동행합니다.
각 Buddy는 계정 ID를 통해 결정론적 알고리즘으로 생성되며, 이는 동일한 계정이 항상 같은 애완동물을 얻는다는 것을 의미합니다. 그러나 구성 파일의 userID를 수정함으로써 우리는 원하는 애완동물을 "재롤"할 수 있습니다. 본문에서는 알고리즘 원리와 완전한 수정 스크립트를 자세히 설명합니다.
1. Buddy 시스템 개요
18종의 생물종
현재 시스템에는 18종의 귀여운 생물종이 포함되어 있습니다:
- duck - 오리 (고전적인 Rubber Duck Debugging)
- 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% 확률, 최고급 장식
2. 알고리즘 원리 심층 분석
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; }; }
멀베리32는 게임 개발에서 자주 사용되는 경량 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; }
// 멀베리32 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"]; const RARITYWEIGHTS = { common: 60, uncommon: 25, rare: 10, epic: 4, legendary: 1 }; const SALT = "friend-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 "common"; }
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; }
// 반짝이 전설 검색 console.log("반짝이 전설 Buddy... "); const targetSpecies = process.argv[2] || null;
while (true) { const userId = randomUserId(); const result = testUserId(userId);
if (result.rarity === "legendary" && result.shiny) { if (!targetSpecies || result.species === targetSpecies) { console.log("찾았다!"); console.log("종: ", result.species); console.log("희귀도: 전설"); console.log("반짝이: 예!"); console.log("userID: ", userId); break; } } }
네, 사용 단계
- 스크립트 저장: 위 코드를
buddy-reroll.js로 저장합니다.
- 스크립트 실행:
node buddy-reroll.js(종을 지정할 수 있습니다:node buddy-reroll.js dragon)
- 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(영혼):이름, 성격 설명——로컬 config에 영구 저장됨
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: 클로드 코드 소스 코드를 분해했습니다

