跳到正文
claudemods

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
显示位置
输入框上方、弹出通知

在 Claude Code 中安装:

/plugin install cc-arcade --marketplace sezaakgun/cc-arcade
全部安装方式 ↓

这个插件能做什么?

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. 1.在 Claude Code 中一行安装

    /plugin install cc-arcade --marketplace sezaakgun/cc-arcade

    粘贴到正在运行的会话中(v2.1.275+)。Claude Code 会先询问是否添加该插件市场。

  2. 2.从终端安装

    claude plugin marketplace add sezaakgun/cc-arcade
    claude plugin install cc-arcade@cc-arcade

    然后在所有已打开的会话中运行 /reload-plugins。

  3. 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 是否编辑了文件。插件自己的存储中只保存计数,不保留命令文本、路径和提示。
工具调用计数器 在 Claude Code 中运行

工具调用计数器

统计 Claude 每轮和每个会话的工具调用次数,在加载指示器旁显示计数,并新增 /tally 查看明细。

  • 加载动画
  • 对话记录
  • 状态栏
  • 拦截工具调用
  • 修改界面
  • 添加命令/工具

已在 v2.1.291 实测

完成提示 在 Claude Code 中运行

完成提示

Claude 较长的一轮结束时弹出「Done in 2m 14s」提示并播放短促提示音,还可选发送桌面通知。

  • 弹出通知
  • 执行命令
  • 修改界面
  • 播放声音

已在 v2.1.291 实测

更多 计时、待办与站会、斜杠命令。