Claude Code 在 10 月 1 日的 2.1.287 版本里加入了 Claude Mods,插件从此可以深入修改 Claude Code 的行为:开一块自己绘制的面板、注册斜杠命令、通过宿主发 HTTP 请求、在会话间保存数据。我用它写了一个行情面板 market-pane,在对话右侧实时显示 A股、港股、美股指数、自选股、当日走势和板块热力图。本文以这个 mod 为例,讲一个 mod 由哪几部分组成、刷新节奏怎么定、怎么在不连网的情况下测试,以及目前的限制。
做这个的起因很直接:agent 跑长任务时,人只能等。切到行情软件看一眼盘,注意力就离开了终端,Claude 停下来等确认也看不到。把行情放进 Claude Code 自己的面板里,看盘和盯 agent 在同一块屏幕上完成,输入焦点始终留在 prompt。
market-pane 在面板里显示什么
面板按市场分成四组:A股三大指数、港股两个恒生指数、美股三大指数、最多 20 只自选股。每个标的占两行,第一行是现价、涨跌额、涨跌幅,第二行是当日走势线和一根按涨跌幅比例画的条形,每格代表 1%,涨跌 4% 以上画满。最下面是申万二级行业的涨跌幅前 6 名热力图。
几处为「瞄一眼」做的设计:
- 红涨绿跌之外再加 ▲/▼,不显示颜色的终端也能分辨方向。
- 现价比上次刷新有变化时,该行反色显示一个刷新周期,变动一眼可见。
- 面板不抢输入焦点,没有弹窗和声音;拉取失败时保留旧数据,状态行标「过期」。
一个 mod 由哪几部分组成
mod 就是一个插件目录,比普通插件多一个 hooks 模块。market-pane 的入口只有两个文件:
// hooks/hooks.json
{ "modules": ["./register.tsx"] }
register.tsx 导出一个 register 函数,在里面用 on(事件, 处理函数) 挂 hook。market-pane 一共挂了三个:
| 事件 | 做什么 |
|---|---|
session.start | 读出保存的自选股,注册 /market 命令,启动 10 秒一次的定时器,打开面板 |
command.run(/market) | 解析 add / remove / list 子命令,或开关面板 |
ui.render(Pane) | 每次重绘时,从状态里取报价、走势、板块,返回要画的元素树 |
处理函数拿到的 $ 是引擎提供的全部能力。market-pane 用到的有:$.ui.open 开面板,$.http.fetch 经宿主发请求,$.clock.every 定时,$.store 跨会话保存自选股,$.state 存本次会话的报价和走势。面板绘制用的 Box、Text 不是全局变量,要通过 $.ui.resolve(e) 按当前界面取,同一份代码可以画在终端、桌面版和 VS Code 里。
claude plugin validate . 会静态读一遍 hooks 模块,列出它挂了哪些事件、调用了哪些 $ 能力、读写了哪些状态,在会话加载之前就能发现引擎会拒绝的写法。
10 秒一跳,按交易时段降频
定时器每 10 秒触发一次,但只在面板实际显示时才干活,面板关着时不发任何请求。每次触发后再按交易时段判断这一轮是否到期:盘中报价 10 秒一拉,走势和板块 60 秒;休市后分别放宽到 5 分钟和 30 分钟。任一市场处于盘中,报价就按盘中节奏刷新。
报价一次请求拿全部标的;分时接口一次只能查一个代码,所以按 5 个一批并发。美股接口没有分时数据,走势线改用面板打开期间每次报价的价格采样。交易时段按北京时间计算,美股自动处理夏令时,节假日不处理,按交易日算,最多多刷几次。
所有数据都来自腾讯行情的公开接口,不需要 key。这些接口是非官方的,没有可用性保证,所以每一类数据都单独容错:哪一类没取到,就保留它上一次的结果,不影响其他数据,也不打断用户。
$ 只留在一个文件里
引擎规定 $ 只能传给 hooks 模块自己声明的函数,market-pane 顺势做了分层:所有碰 $ 的代码集中在 register.tsx,其余九个文件都是纯函数,输入数据、输出结果,不接触引擎。
这样测试就简单了。claude plugin test . 在和 hooks 相同的隔离环境里运行测试(没有文件系统、网络和进程),测试代码用 mock 的时钟、存储和 HTTP 喂数据,再用 $.ui.mount 把面板挂到指定界面上读结果。market-pane 的测试数据是 10 月 9 日 A股收盘后从接口抓下来的真实响应,目前 14 个测试文件、85 个用例全部通过。
安装与限制
git clone https://github.com/androidZzT/claude-trading-mods.git
claude --plugin-dir ./claude-trading-mods/mods/market-pane
终端宽度达到 144 列时,会话启动后面板自动出现在右侧;更窄的终端里 Claude Code 不会自动放置,需要输入 /market 打开。自选股用 /market add sh600519 茅台 这样的格式添加,A股是 sh/sz/bj 加 6 位数字,港股 hk 加 5 位,美股 us 加代码。
目前的限制:
- Claude Mods 仍是 early access,引擎生成的类型文件开头写明接口可能在版本之间变化,没有预先通知。
- 接口返回的中文名是 GBK 编码,mod 读不了,自选股显示的是你自己填的名称。
- 美股走势只覆盖面板打开的那段时间,刚打开时是空的。
行情仅供参考,不构成投资建议。仓库地址:androidZzT/claude-trading-mods。