cc-arcade:在输入框上方玩的 Claude Code 游戏插件
Claude 工作时,在输入框上方玩贪吃蛇、俄罗斯方块、Doom、2048 等小游戏;这一轮结束时游戏自动暂停。
权限
- 拦截工具调用能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
- 修改界面在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
- 添加命令/工具注册新的斜杠命令或工具,供你或 Claude 调用($.command.register / $.tool.register)。
- 存储数据在插件的私有存储中跨会话保存数据($.store.*)。
- 实测版本
- v2.1.291
- 最近实测
- 需要
- Claude Code ≥ 2.1.287
- 显示位置
- 输入框上方、弹出通知
这个插件能做什么?
cc-arcade 是一款 Claude Code 游戏插件,属于社区插件,作者是 Seza Akgün(sezaakgun)。它在 Claude 工作的那几分钟里,把小游戏放到 Claude Code 输入框上方。运行 /arcade,输入框上方就会出现一排按钮,每个游戏一个,另外还有 pet、random、auto 和 close。点击其中一个,或者用 /arcade tetris 直接指定,棋盘就会占据输入框上方的空间。点击棋盘让它获得键盘;按 Esc 则把键盘交还给输入框。
共有九款游戏:贪吃蛇、俄罗斯方块、Doom(一款第一人称走廊射击游戏,有四层楼、三种怪物和三种武器,用半格方块进行光线投射渲染)、2048、扫雷、Flappy、Pong、打字测试和太空侵略者。每个游戏都会跨会话保存最高分,刷新纪录时会弹出通知。当 Claude 完成一轮时,打开的游戏会暂停,状态行变黄并显示 ● Claude is done,让你不会错过回复。
另外还有一只宠物。它会随着 Claude 完成的工作而成长:一次通过的测试运行、一次成功的 git commit,以及通过 Edit、Write 或 NotebookEdit 进行的文件编辑都会给它经验值并提升心情,而失败的测试会让它心情变差。作者说明,这些游戏都是同类游戏的仿制品,与原发行商没有任何关联。README 中写明需要 Claude Code 2.1.269 或更高版本、能上报鼠标的交互式终端,以及包含制表符和方块字符的字体。
演示
录屏中,我们先打开 /arcade 选择器,再用 /arcade doom 打开 Doom。棋盘出现在输入框上方,显示光线投射画面和一条 CLICK HERE TO PLAY 横幅;只有在点击棋盘之后游戏才会获得键盘,所以录屏中没有实际游玩。在你点击之前,按键会一直进入输入框。
安装
使用安装区块中的任意一种方式;它们都直接从作者自己的插件市场安装。然后在任意会话中运行 /arcade。如果安装到已经打开的会话中,请先运行 /reload-plugins。
$ install cc-arcade
需要 Claude Code ≥ 2.1.287
从作者自己的 marketplace 安装: sezaakgun/cc-arcade
1.在 Claude Code 中一行安装
/plugin install cc-arcade --marketplace sezaakgun/cc-arcade粘贴到正在运行的会话中(v2.1.275+)。Claude Code 会先询问是否添加该插件市场。
2.从终端安装
claude plugin marketplace add sezaakgun/cc-arcade claude plugin install cc-arcade@cc-arcade然后在所有已打开的会话中运行 /reload-plugins。
3.免安装试用
git clone https://github.com/sezaakgun/cc-arcade claude --plugin-dir ./cc-arcade仅在当前会话中加载该插件,不会写入你的设置。
工作原理
hooks/register.tsx 是钩子模块。它注册 /arcade,在 AbovePrompt 渲染位置上绘制选择器或打开的棋盘,把最高分和宠物保存在 $.store 中,并在 turn.complete 时暂停打开的游戏。hooks/boards/ 下的每个棋盘都是一个以 Client 元素挂载的界面模块,拥有自己的帧时钟、键盘和鼠标。游戏规则以纯函数的形式放在 hooks/games/ 中。下面展示宠物是如何被喂养的,来自 hooks/register.tsx:
on('tool.call', async ($, e, next) => {
const r = await next(e)
const command = (e as { command?: unknown }).command
const event = petEvent(e.tool, typeof command === 'string' ? command : undefined, 'deny' in r ? undefined : !r.isError)
if (!event) return r
const saved = await $.store.get('pet').catch(() => undefined)
const current = isPet(saved) ? saved : pet ?? newPet($.clock.now())
const fed = feed(current, event, $.clock.now())
pet = fed
await $.store.set('pet', fed).catch(err => $.ui.log(`cc-arcade: store write failed: ${err}`))
// ...
return r
})这个钩子先通过 await next(e) 让工具运行,然后原样返回结果,因此它从不阻塞或改动任何调用。hooks/games/pet.ts 中的 petEvent 会把 Bash 命令与一份测试运行器列表(bun test、npm test、pytest、go test、cargo test 等)以及 git commit 进行匹配。每次更新前都会从存储中重新读取宠物,所以并排运行的多个会话喂养的是同一只宠物。一局游戏结束时,棋盘通过 surface.post 发送分数,ui.message 钩子会在分数超过已保存的最高分时把它记下来。
自定义
所有选项都通过 /arcade 设置:
/arcade打开选择器;/arcade <game>直接打开某个游戏。/arcade random随机挑选一个游戏,宠物和你刚玩过的那个除外。/arcade auto根据当下情况挑选:如果最近五分钟内有测试失败,就选宠物;如果 Claude 已经工作了一分钟或更久,就选一个时间较长的游戏;Claude 工作时来一局快的;空闲时则选 2048 或扫雷。/arcade list列出所有游戏及你的最高分。/arcade colorblind把 Doom 切换为不依赖红绿对比的调色板,这个设置会被记住。/arcade stop关闭游戏厅。
权限与安全
在运行之前,我们读过了插件加载的每一个文件。插件不发出网络请求、不运行命令,也不读写文件。修改界面对应的是输入框上方的棋盘和通知。添加命令/工具对应的是 /arcade。存储数据对应的是最高分、宠物和色盲模式设置,全部保存在插件自己的 $.store 中。
之所以会出现拦截工具调用,是因为它在不加匹配条件的情况下挂接了每一次 tool.call,因此能看到每条 Bash 命令的文本以及调用是否失败。它只做观察:等待调用完成后原样返回结果,并且只保存计数,从不保存命令文本。claude plugin validate 没有报告任何警告。
- 拦截工具调用
- 能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
- 修改界面
- 在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
- 添加命令/工具
- 注册新的斜杠命令或工具,供你或 Claude 调用($.command.register / $.tool.register)。
- 存储数据
- 在插件的私有存储中跨会话保存数据($.store.*)。
兼容性与故障排除
我们在 macOS 上使用 Claude Code 2.1.291 完成了验证,作者的 32 个 bun test 单元测试全部通过。claude plugin test 无法加载这些测试,因为它们导入了 bun:test。在 claude -p、桌面应用或移动端中不会绘制任何内容;棋盘需要交互式终端。
/arcade是未知命令。 README 说必须开启函数钩子:在~/.claude/settings.json的env区块中设置CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1,并在/plugin中确认插件已加载。- 按键进了输入框。 先点击棋盘。
- 点击没有反应。 你的终端不上报鼠标。
/arcade <game>仍然可以打开游戏,但不点击的话棋盘无法获得键盘。 - 显示成方框而不是方块。 请使用包含制表符和方块字符的终端字体。
终端越高,棋盘越大;横条大约占终端高度的一半。
常见问题
- cc-arcade 包含哪些游戏?
- 贪吃蛇、俄罗斯方块、Doom(一个小型光线投射走廊射击游戏,不是移植版)、2048、扫雷、Flappy、与电脑对战的 Pong、打字测试和太空侵略者。另外还有一只会随着 Claude 工作而成长的宠物。
- 为什么我的按键进了输入框而不是游戏?
- 只有在你点击棋盘之后,它才会获得键盘。按 Esc 可以把键盘交还给输入框。要让这一点生效,你的终端必须能上报鼠标点击。
- 玩游戏时会错过 Claude 的回复吗?
- 不会。这一轮结束时,打开的游戏会暂停,状态行变黄并以 "● Claude is done" 开头。按任意键继续,或按 Esc 去阅读回复。
- 玩游戏会消耗 token 吗?
- 不会。插件自己响应每一次点击和命令,不调用模型,也不发出任何网络请求。
- 宠物能看到什么?
- 它挂接每一次工具调用,检查某条 Bash 命令是不是一次测试运行或 git commit,或者 Claude 是否编辑了文件。插件自己的存储中只保存计数,不保留命令文本、路径和提示。

