sezaakgun/cc-arcade는 왜 Claude Code 위에 게임을 띄우면서도 ‘토큰 0’이라고 말할까?
요약 듣기
요약 보기 
이 글의 핵심은 단순히 ‘재밌는 플러그인 하나 나왔다’가 아니에요. sezaakgun은 자기 플러그인이 Claude Code의 프롬프트 위쪽에 상호작용 화면을 띄우고, Claude가 일하는 동안 그 자리에서 게임을 돌릴 수 있다고 보여 주면서, 이게 새 플러그인 구조가 실제로 어디까지 가능한지 보여 주는 사례라고 올렸어요. 다만 표현을 보면 ‘내가 알기로는 첫 사례’라고 했지, 확정적으로 최초라고 선언한 건 아니에요. 그러니까 이건 기록용 자랑이라기보다, 새로운 기능이 실제로 이런 식으로도 버틴다는 현장 보고에 가깝다고 보면 돼요.
배경을 먼저 잡아야 이해가 쉬워요. 부모 이슈에서 Anthropic 쪽 설명은, Claude Code를 TypeScript 함수로 깊게 건드릴 수 있게 하자는 제안이었고, 처음엔 이걸 function hooks라고 불렀어요. 나중에는 제품 이름을 Claude Mods라고 부르기로 했지만, 구현의 기본 부품 이름은 여전히 function hooks라고 설명해요. 그래서 ‘모드’는 완전히 다른 물건이 아니라, function hooks를 써서 만든 플러그인이라고 이해하면 됩니다. 낯선 말을 쉬운 감각으로 바꾸면, 바깥에서 명령만 던지는 고리가 아니라 Claude Code 내부 동작 사이사이에 함수를 끼워 넣는 방식에 더 가까워요. 마치 건물 밖 인터폰으로 요청하는 게 아니라, 건물 안 전기실에 들어가 특정 스위치와 배선을 만질 수 있게 해 주는 셈인데, 원문은 그 대신 부작용 추적과 등록 순서 기반의 이어달리기 모델로 안전성과 조합성을 잡겠다고 말해요.
그럼 cc-arcade가 왜 눈에 띄느냐 하면, 이 구조를 ‘화면을 위에 그리는 일’까지 끌고 갔기 때문이에요. 작성자는 `ui.render`의 `AbovePrompt`를 써서 프롬프트 위쪽 공간에 보드를 그리고, 게임판마다 `Client` 모듈을 하나씩 붙였다고 말해요. 또 Claude의 한 턴이 끝나면 `turn.complete`로 게임을 멈추게 하고, `tool.call`은 펫 먹이 주기에 쓰고, 점수는 `$.store`에 저장했다고 설명해요. README를 보면 사용자가 요청을 보내고 게임을 열어 두면, Claude가 응답을 마친 순간 열린 게임이 멈추고 상태 줄이 바뀌어서 답장을 놓치지 않게 되어 있어요. 이 연결이 중요한 이유는, function hooks가 단순히 명령 추가 정도가 아니라 화면 렌더링, 입력 처리, Claude의 작업 완료 신호, 상태 저장까지 서로 엮을 수 있다는 걸 보여 주기 때문이에요.
‘토큰 0’이라는 표현도 여기서 풀려요. 이 플러그인은 클릭과 게임 명령에 모델을 다시 부르지 않고, 플러그인 쪽에서 직접 응답한다고 README가 분명히 말해요. 그러니까 사용자가 테트리스를 한 칸 움직일 때마다 Claude에게 매번 물어보는 구조가 아니라, 이미 Claude Code 안에서 돌아가는 코드가 그 입력을 처리하는 거예요. 계산기를 두드릴 때마다 상담원에게 전화를 거는 게 아니라, 손안의 계산기가 바로 반응하는 느낌에 더 가까워요. 그래서 ‘Claude가 일하는 동안 위에서 따로 논다’는 말이 성립하는 거고, 작성자는 이 점을 데이터 포인트처럼 강조한 거예요.
다만 이게 누구에게나 그냥 되는 건 아니에요. function hooks 자체가 아직 이른 접근 단계라서 환경 변수를 켜야 하고, README는 특정 버전 이상이면서 프롬프트 위에 그리기를 지원하는 빌드가 필요하다고 적어요. 또 대화형 터미널 세션이어야 하고, `claude -p`, 데스크톱 앱, 모바일에서는 그려지지 않는다고 못 박아요. 마우스를 보고하는 터미널이 필요하고, 클릭 한 번으로 게임판이 키보드 입력을 가져가는 방식이라, 클릭 전에는 키 입력이 프롬프트로 간다는 점도 알아야 해요. 화면 문자도 박스 그리기 문자를 써서 표현하니 오래된 콘솔에서는 깨질 수 있어요. 즉, 이건 ‘Claude 어디서나 동일하게 되는 미니게임’이 아니라, 꽤 구체적인 실행 조건 위에서 돌아가는 터미널 인터페이스예요.
작성자가 API 자체는 버텼다고 평가하면서도 시간을 잡아먹은 부분을 따로 적어 놓은 것도 중요해요. 표면 모듈에서 `h`라는 로컬 변수 규칙, `Client` 모듈 경로가 문자열 리터럴이어야 하는 점, 그리고 게임이 그려지는 띠가 터미널의 절반 정도이고 초당 열 번쯤 다시 그려진다는 사실을 나중에 알게 됐다고 해요. 그는 이것들이 ‘못 쓸 정도’라고 하진 않고, 전부 우회 가능하지만 지금은 문서화가 안 됐다고 말해요. 이 대목은 기능이 강력하다는 이야기와 동시에, 개발자 경험은 아직 다듬는 중이라는 뜻이에요. 부모 이슈에서도 Anthropic은 몇 주 단위 출시를 목표로 하지만 인터페이스와 설계를 여전히 빠르게 다듬고 있고, 의미론은 많이 정해졌어도 커뮤니티의 비판적 피드백이 더 중요하다고 말해요. 그러니 이 사례는 안정판 완성품 소개라기보다, 방향이 보이는 실험이자 검증 사례로 읽는 편이 맞아요.
README를 함께 보면, 이 플러그인이 단순 데모를 넘어 사용 경험까지 설계하려고 했다는 점도 보입니다. `/arcade`로 게임을 열고, 하나의 게임만 동시에 띄우며, Claude가 답변을 끝내면 게임을 멈춰 사용자가 응답을 놓치지 않게 해요. 게임판은 플러그인에게 허용된 프롬프트 위쪽 행을 차지하고, 대략 터미널 높이의 절반 정도를 쓴다고 해요. 그래서 화면이 큰 터미널일수록 어떤 게임들은 판이 더 커져요. 이런 설명은 단지 ‘게임이 된다’보다 더 구체적이에요. function hooks가 사용자 입력, 상태, 렌더링 공간, Claude의 작업 흐름을 한 인터페이스 안에서 조절할 수 있다는 뜻이니까요. Anthropic 쪽이 말한 ‘깊게 수정할 수 있다’는 약속이, 적어도 이 사례에서는 실제 촉감이 있는 UI로 나타난 셈이에요.