hearthstone-cli 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OstrichHermit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,234 @@
1
+ Metadata-Version: 2.4
2
+ Name: hearthstone-cli
3
+ Version: 0.1.0
4
+ Summary: Hearthstone toolbox for AI agents — two cores: deck building (validate, encode, filter, deck images) and match analysis (board parsing from game logs, action replay, AI advisor watcher)
5
+ Author: OstrichHermit
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/OstrichHermit/hearthstone-cli
8
+ Project-URL: Repository, https://github.com/OstrichHermit/hearthstone-cli
9
+ Project-URL: Issues, https://github.com/OstrichHermit/hearthstone-cli/issues
10
+ Keywords: hearthstone,deck,deckstring,cli,agent,card,log-parser,board
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Games/Entertainment
21
+ Requires-Python: >=3.10
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Dynamic: license-file
25
+
26
+ # hearthstone-cli — Hearthstone CLI Toolbox for AI Agents
27
+
28
+ **面向 AI Agent 的炉石传说命令行工具箱,双核心:组卡(校验 / 编解码 / 筛卡 / 卡组库存档 / 版本体检 / 长图)+ 对局分析(解析客户端日志输出实时对局面板与战况回放,监听对局触发 AI 军师)。**
29
+
30
+ A command-line toolbox for Hearthstone designed for AI agents, with two cores: deck building (validation, encoding, decoding, filtering, archiving, deck images) and match analysis (real-time board state & action replay parsed from client logs, plus an AI-counselor watcher).
31
+
32
+ [English](README_EN.md) | [简体中文](README.md)
33
+
34
+ ---
35
+
36
+ 人类的组卡模拟器解决的是"可视化拖卡",而 Agent 组卡需要的是秒级试错:列 30 张卡 → 校验 → 出卡组代码 → 按报错修正 → 再来一轮。对局中 Agent 需要的则是结构化的完整战况:不是看一张截图,而是拿到双方状态、场面、手牌与逐回合行动的可解析文本。这两个问题,这个工具各给了一个答案。
37
+
38
+ ## 功能特性
39
+
40
+ - **卡组代码编解码** — 完整支持炉石 deckstring 格式(含副牌库三元组),并对营地等平台在标准代码后附加的扩展字节做了容错
41
+ - **构筑规则校验** — 数量、同名限量(普通 2 张 / 传说 1 张)、职业限定、标准池白名单
42
+ - **动态卡组容量** — 裂魂者阿扎莉娜(套牌 20 张)、时空大盗拉法姆(40 张且恰含 10 张拉法姆)、常规 30 张
43
+ - **副牌库** — 乐队经理精英牛头人酋长的 3 张乐队,编码为 sideboard 三元组
44
+ - **多职业与游客机制** — 按 `classes` 数组识别多职业卡(如六职业共用的灭世者死亡之翼),并完整实现胜地历险记游客三条规则:游客仅解锁目的地职业的该扩展卡牌、每套限一名游客、不可嵌套
45
+ - **卡组库与版本体检** — 卡组本地存档,版本更新后一键体检,退环境卡逐条列出
46
+ - **卡组长图** — 一条命令把卡组渲染成可分享的卡组长图(中/英版各自独立):法力曲线、稀有度配色(默认逐张列出,`--merge` 合并同名卡)、职业徽记、英雄与卡组代码,2x 渲染输出 1520px 宽,调用本地无头 Chrome/Edge
47
+ - **对局面板** — 解析炉石客户端日志 Power.log 全量重放,输出结构化实时面板:对局模式、总手数/回合/当前行动方、双方法力(含过载锁定)与先后手(后手标注硬币)、双方英雄血甲武器技能(含灌注/变形后的技能变更)、场面随从与地标(嘲讽/圣盾/风怒/冻结/休眠/金卡等状态标注)、我方手牌费用攻血(含兆示预览与已强化/不可打出标注)、双方牌库剩余/疲劳/尸体数、任务进度(与奥秘分流显示)、终局胜负与结束方式(斩杀/投降/疲劳)
48
+ - **战况回放** — 行动回顾事件流按回合重放双方每一步:出牌(附效果描述与战吼目标)、攻击(附目标与实际伤害)、英雄技能、抽弃牌、换牌保留替换、开局触发效果(如复制传说洗入牌库列全卡名)、亡语与触发结算(召唤带来源、伤害标致命、复生、治疗带来源)、发现/灾变类选择、预备减费、休眠囚禁与苏醒、亡语亮牌(区分已施放/仅亮出)、回合结束获得(带来源)、手牌满烧牌(报卡名),同名合并防刷屏;AI 无需查库即可理解新卡
49
+ - **军师监听** — `hs watch` 后台监听 Power.log,换牌阶段和轮到我方回合时向自建 IM 桥接器推送固定提示词,触发 AI 军师分析对局
50
+ - **对 Agent 友好** — 纯 JSON 输入、报错逐条列出便于自我修正、无任何交互式提示
51
+ - **本地双语卡牌库** — 中英双语卡牌数据源自 [HearthstoneJSON](https://hearthstonejson.com/),补丁日一条命令刷新
52
+
53
+ ## 持续维护
54
+
55
+ 本项目处于活跃维护状态:炉石每个新版本(扩展包 / 平衡补丁)上线后,会同步更新本地标准卡牌库与标准池白名单,卡组体检随版本跟进。若数据源变更导致问题,欢迎提 issue。
56
+
57
+ ## 安装
58
+
59
+ 要求:Python 3.10+(Windows / macOS / Linux)
60
+
61
+ `hs image` 另需本机安装 Chrome 或 Edge(自动探测,可用环境变量 `CHROME_PATH` 指定)。
62
+
63
+ ```bash
64
+ git clone https://github.com/OstrichHermit/hearthstone-cli.git
65
+ cd hearthstone-cli
66
+ pip install .
67
+ ```
68
+
69
+ 开发模式用 `pip install -e .`(改动源码即时生效)。PyPI 发布:Coming soon。
70
+
71
+ 数据目录默认 `~/.hearthstone-cli/`(卡牌库、卡组库、卡组图都存这里),可用环境变量 `HS_DECK_HOME` 覆盖。装好后先跑一次 `hs update` 下载卡牌库。
72
+
73
+ ### 安装为 Agent Skill(可选)
74
+
75
+ 仓库内附带 Agent Skill(`skills/hs-deck/SKILL.md`),把它复制到你所用 AI Agent 的 skills 目录,Agent 即可自动掌握本工具的用法。以 Claude Code 为例:
76
+
77
+ ```bash
78
+ cp -r skills/hs-deck ~/.claude/skills/hs-deck
79
+ ```
80
+
81
+ ## 用法
82
+
83
+ ```bash
84
+ # 刷新卡牌库(自动下载最新中文+英文 collectible 卡及中文全量库,全量库含英雄技能/token 供对局面板查名与描述)
85
+ hs update
86
+
87
+ # 筛卡
88
+ hs filter --class=战士 --set=CORE --cost=<=3 --text=嘲讽
89
+
90
+ # 解码卡组代码
91
+ hs decode AAECAQcGo6AE...
92
+
93
+ # 校验并输出卡组代码
94
+ hs validate deck.json
95
+
96
+ # 卡组入库(支持代码或网页 URL)
97
+ hs save my-deck AAECAQcGo6AE...
98
+ hs save from-web https://example.com/deck-page
99
+
100
+ # 查看卡组库
101
+ hs list
102
+ hs show my-deck
103
+
104
+ # 版本更新后体检(省略名字 = 检查全部)
105
+ hs check
106
+
107
+ # 生成卡组长图
108
+ hs image my-deck # 按卡组库名字
109
+ hs image AAECAQcGo6AE... --name=Turtle # 直接给代码
110
+ hs image my-deck --lang=en # 英文版(--lang=both 一次出中英两版)
111
+ hs image my-deck --merge # 同名卡合并为一行
112
+ hs image my-deck --name=龟甲防战 --name-en=Turtle Warrior
113
+
114
+ # 解析当前对局面板(默认自动发现最新日志:游戏目录 Logs 下 Hearthstone_* 子目录及标准目录)
115
+ hs board
116
+ hs board --log=D:\games\Hearthstone\Logs\Power.log # 指定日志路径(也可指向日志目录自动发现)
117
+ hs board --player=鸵鸟居士 # 自动判定我方不准时手动指定
118
+
119
+ # 军师监听:换牌阶段/轮到我方回合时,向 IM 桥接器 POST 提示词触发 AI 分析
120
+ hs watch start --channel=<Discord频道ID> --token=<桥接器token> # 默认 --log=auto 自动发现
121
+ hs watch status # 查看运行状态与最近触发事件
122
+ hs watch stop
123
+ ```
124
+
125
+ 标准卡组含非标准池卡时默认拦截不出图,`--force` 可强制渲染。
126
+
127
+ `deck.json` 格式:
128
+
129
+ ```json
130
+ {
131
+ "format": "standard",
132
+ "hero": "加尔鲁什·地狱咆哮",
133
+ "cards": { "斩杀": 2, "#69535": 1 },
134
+ "sideboard": { "owner": "乐队经理精英牛头人酋长", "cards": { "蓝鳃战士": 2 } }
135
+ }
136
+ ```
137
+
138
+ 卡名或 `#dbfId` 均可,副牌库可选。
139
+
140
+ 报错逐条输出,Agent 可以按条机械修正:
141
+
142
+ ```
143
+ 校验失败:
144
+ - 套牌必须30张, 当前27张
145
+ - 奇利亚斯豪华版3000型 的系列 WHIZBANGS_WORKSHOP 不在当前标准池
146
+ ```
147
+
148
+ `hs board` 输出的对局面板长这样(真实对局快照,对手昵称已脱敏):
149
+
150
+ ```
151
+ === 炉石对局面板 ===
152
+ 休闲·标准 | 构建号 253216
153
+ 总第 17 手 | 我方第 9 回合 | 我的回合 | 我的法力 9/9(已用 0)
154
+ 对方:遛弯的树懒(牧师)[后手+硬币] 手牌 10 奥秘 0 牌库 17 尸体 5 疲劳 0 法力 3/8(已用 5)
155
+ 英雄:情报掮客拉祖尔 血 28/30 护甲 0 武器 无 技能 月亮的祝福(已用)
156
+ 对方场面(2):
157
+ 1. 逐月幼龙 3/6 [金]
158
+ 2. 凯洛斯的蛋 0/3
159
+ 我方:鸵鸟居士(战士)[先手] 奥秘 0 牌库 23 尸体 4 疲劳 0
160
+ 英雄:麦格尼·铜须 血 30/30 护甲 5 武器 无 技能 全副武装!(未用)
161
+ 任务 走进失落之城 8/10
162
+ 我方场面(3):
163
+ 1. 破链灾星霍格 10/10 [嘲讽]
164
+ 2. 奥卓克希昂 6/4
165
+ 3. 拉格纳罗斯的士兵 2/1
166
+ 我方手牌(6):
167
+ 1. 屠灭 6费 法术
168
+ 2. 龟甲旋风 4费 法术
169
+ 3. 拉格纳罗斯,绝世烈火 8费 8/8 随从 <兆示:拉格纳罗斯之手>
170
+ 4. 放出鳄鱼 2费 法术
171
+ 5. 强固 3费 法术
172
+ 6. 为了荣耀! 3费 法术
173
+ === 行动回顾 ===
174
+ [第 14 回合·对方] 抽牌 1 张
175
+ [第 14 回合·对方] 英雄技能 月亮的祝福<选择一张可用的牧师随从牌或法术牌置入你的手牌,其法力值消耗减少(>
176
+ [第 14 回合·对方] 选择:受伤的侍者
177
+ [第 14 回合·对方] 获得 受伤的侍者
178
+ [第 14 回合·对方] 打出 随从「受伤的侍者」 [金] 3/8<吸血。战吼:对本随从造成4点伤害。>
179
+ [第 14 回合·对方] 受伤的侍者效果 治疗 对方英雄 血28→30
180
+ [第 14 回合·对方] 打出 随从「凯洛斯的蛋」 0/3<亡语:召唤一枚轻微开裂的蛋。(破壳5次即可孵化为一只20/20并具有嘲讽的野兽!)>
181
+ [第 15 回合·我方] 抽牌 强固<获得3点护甲值。对一个敌方随从造成等同于你护甲值的伤害。>
182
+ [第 15 回合·我方] 打出 随从「破链灾星霍格」 10/10<嘲讽。对战开始时:复制你套牌中所有其他传说卡牌。>
183
+ [第 15 回合·我方] 攻击:奥卓克希昂 6/7 → 受伤的侍者 3/4
184
+ [第 15 回合·我方] 死亡:受伤的侍者 3/0
185
+ [第 15 回合·我方] 攻击:拉格纳罗斯的士兵 2/1 → 对方英雄
186
+ [第 16 回合·对方] 抽牌 1 张
187
+ [第 16 回合·对方] 英雄技能 月亮的祝福<选择一张可用的牧师随从牌或法术牌置入你的手牌,其法力值消耗减少(>
188
+ [第 16 回合·对方] 选择:逐月幼龙
189
+ [第 16 回合·对方] 获得 逐月幼龙
190
+ [第 16 回合·对方] 打出 随从「逐月幼龙」 [金] 3/6<扰魔。在你的回合结束时,随机获取一张龙牌。>
191
+ [第 16 回合·对方] 获得 1 张牌(逐月幼龙效果获得)
192
+ [第 17 回合·我方] 抽牌 为了荣耀!<抽两张牌。你的对手每控制一个随从,本牌的法力值消耗便减少(1)点。>
193
+ # 实体总数 103 | 解析起始行 2 | 日志总行 12200
194
+ ```
195
+
196
+ ## 对局面板与军师监听(board / watch)
197
+
198
+ > **质量保障**:board 的解析覆盖经过多轮真实对局的全量审计与逐项回归验收(数值对账、事件溯源、特殊局样本如秒投/截断/英雄牌变形)。炉石日志格式随版本变动,若新版出现解析问题,欢迎提 [issue](https://github.com/OstrichHermit/hearthstone-cli/issues) 或直接 PR。
199
+
200
+ `hs board` 从日志里最后一个 `CREATE_GAME` 起全量重放 packet,输出当前时刻的完整面板,适合直接喂给 AI 分析。我方默认按"手牌可见方"自动判定(只有客户端本人能看到手牌内容),判不准时用 `--player=玩家名` 手动指定;也支持 `--stdin` 从管道读日志,方便测试。
201
+
202
+ **面板层**:对局模式与构建号、总手数/回合/当前行动方、双方法力(`可用/总(已用 N)`,过载锁定单独标注)与先后手(后手标注+硬币)、双方英雄血/甲/武器/技能(技能被替换或灌注时显示新技能)、场面随从与地标(攻血 + 嘲讽/圣盾/风怒/冻结/休眠/潜行/扰魔/金卡等状态标注)、我方手牌费用攻血(含兆示预览 `<兆示:卡名>`、已强化/不可打出标注)、双方牌库剩余/疲劳/尸体数、任务进度槽(`任务名 x/y`,与奥秘分流计数,完成报奖励)、终局胜负行(斩杀/投降/疲劳;日志被游戏客户端截断时明确提示且不误报胜负)。换牌阶段面板同样输出开局发牌,可直接给留牌建议。
203
+
204
+ **行动回顾**:按回合边界自动带最近三个回合——我方上回合全部、对方上回合全部、我方本回合已发生(`--events=N` 调整带过的回合数,`--events=0` 关闭),事件按日志原始顺序稳定排序:
205
+
206
+ - 出牌/召唤附卡牌效果描述(全量不截断,AI 无需查库)与事件时刻攻血快照、战吼目标;攻击附目标与实际伤害(含光环增幅后的真实数值);英雄技能附效果与自带护甲;死亡附复生信息
207
+ - 开局段带换牌语义(起手 → 保留/换掉/换入 → 后手硬币)与 START_OF_GAME 触发效果(如"对战开始时复制传说"列全卡名洗入牌库)
208
+ - 引擎自动结算完整入流:亡语/触发的召唤带来源(同名合并 ×N 防刷屏)、亡语/触发伤害(致命标(致命))、治疗带来源、复生、休眠囚禁与苏醒、预备减费、发现/灾变类选择、洗入牌库汇总、回合结束获得(带来源)、亡语亮牌(区分已施放/仅亮出)、手牌满烧牌(报卡名)
209
+ - 隐私设计:对方抽牌只报张数不报卡名
210
+
211
+ `hs watch start` 启动一个后台守护进程 tail Power.log,检测到换牌阶段或轮到我方回合时,向自建 IM 桥接器 `POST /api/external/message`(Bearer token 鉴权)注入固定提示词,由桥接器触发 Discord 军师频道的 AI 分析。说明:
212
+
213
+
214
+ `hs watch start` 启动一个后台守护进程 tail Power.log,检测到换牌阶段或轮到我方回合时,向自建 IM 桥接器 `POST /api/external/message`(Bearer token 鉴权)注入固定提示词,由桥接器触发 Discord 军师频道的 AI 分析。说明:
215
+
216
+ - **桥接器是私有组件,不在本仓库内**(默认 `http://127.0.0.1:8088`)。不配置或连不上桥接器时,`hs watch` 单独使用只监听不发送——POST 失败自动重试 3 次后继续监听,不会崩溃,触发事件可用 `hs watch status --events=N` 查看
217
+ - 配置 merge 存于 `~/.hearthstone-cli/watch_config.json`,再次 `start` 不带参数沿用上次配置;`--force` 可在残留进程时强制重启
218
+ - 提示词可用 `--mulligan-prompt=` / `--turn-prompt=` 自定义,token 也可用环境变量 `HS_WATCH_TOKEN` 传入
219
+
220
+ ## 标准池维护
221
+
222
+ 标准池白名单在源码 `src/hearthstone_cli/deck.py` 里的 `STANDARD_SETS`。新版本上线后:跑 `hs update`,把新系列代码加进去,再 `hs check` 体检卡组库。
223
+
224
+ ## 数据源
225
+
226
+ 卡牌数据来自社区项目 [HearthstoneJSON](https://hearthstonejson.com/)(本地化文本遵循 CC BY 4.0)。构建提取自游戏文件,官方补丁上线当天或次日即可获取;预览季爆料的新卡要等补丁正式部署后才会入库。
227
+
228
+ ## 免责声明
229
+
230
+ 炉石传说是暴雪娱乐的商标。本项目与暴雪官方无关,仅供个人学习研究使用。
231
+
232
+ ## 许可
233
+
234
+ [MIT](LICENSE)
@@ -0,0 +1,209 @@
1
+ # hearthstone-cli — Hearthstone CLI Toolbox for AI Agents
2
+
3
+ **面向 AI Agent 的炉石传说命令行工具箱,双核心:组卡(校验 / 编解码 / 筛卡 / 卡组库存档 / 版本体检 / 长图)+ 对局分析(解析客户端日志输出实时对局面板与战况回放,监听对局触发 AI 军师)。**
4
+
5
+ A command-line toolbox for Hearthstone designed for AI agents, with two cores: deck building (validation, encoding, decoding, filtering, archiving, deck images) and match analysis (real-time board state & action replay parsed from client logs, plus an AI-counselor watcher).
6
+
7
+ [English](README_EN.md) | [简体中文](README.md)
8
+
9
+ ---
10
+
11
+ 人类的组卡模拟器解决的是"可视化拖卡",而 Agent 组卡需要的是秒级试错:列 30 张卡 → 校验 → 出卡组代码 → 按报错修正 → 再来一轮。对局中 Agent 需要的则是结构化的完整战况:不是看一张截图,而是拿到双方状态、场面、手牌与逐回合行动的可解析文本。这两个问题,这个工具各给了一个答案。
12
+
13
+ ## 功能特性
14
+
15
+ - **卡组代码编解码** — 完整支持炉石 deckstring 格式(含副牌库三元组),并对营地等平台在标准代码后附加的扩展字节做了容错
16
+ - **构筑规则校验** — 数量、同名限量(普通 2 张 / 传说 1 张)、职业限定、标准池白名单
17
+ - **动态卡组容量** — 裂魂者阿扎莉娜(套牌 20 张)、时空大盗拉法姆(40 张且恰含 10 张拉法姆)、常规 30 张
18
+ - **副牌库** — 乐队经理精英牛头人酋长的 3 张乐队,编码为 sideboard 三元组
19
+ - **多职业与游客机制** — 按 `classes` 数组识别多职业卡(如六职业共用的灭世者死亡之翼),并完整实现胜地历险记游客三条规则:游客仅解锁目的地职业的该扩展卡牌、每套限一名游客、不可嵌套
20
+ - **卡组库与版本体检** — 卡组本地存档,版本更新后一键体检,退环境卡逐条列出
21
+ - **卡组长图** — 一条命令把卡组渲染成可分享的卡组长图(中/英版各自独立):法力曲线、稀有度配色(默认逐张列出,`--merge` 合并同名卡)、职业徽记、英雄与卡组代码,2x 渲染输出 1520px 宽,调用本地无头 Chrome/Edge
22
+ - **对局面板** — 解析炉石客户端日志 Power.log 全量重放,输出结构化实时面板:对局模式、总手数/回合/当前行动方、双方法力(含过载锁定)与先后手(后手标注硬币)、双方英雄血甲武器技能(含灌注/变形后的技能变更)、场面随从与地标(嘲讽/圣盾/风怒/冻结/休眠/金卡等状态标注)、我方手牌费用攻血(含兆示预览与已强化/不可打出标注)、双方牌库剩余/疲劳/尸体数、任务进度(与奥秘分流显示)、终局胜负与结束方式(斩杀/投降/疲劳)
23
+ - **战况回放** — 行动回顾事件流按回合重放双方每一步:出牌(附效果描述与战吼目标)、攻击(附目标与实际伤害)、英雄技能、抽弃牌、换牌保留替换、开局触发效果(如复制传说洗入牌库列全卡名)、亡语与触发结算(召唤带来源、伤害标致命、复生、治疗带来源)、发现/灾变类选择、预备减费、休眠囚禁与苏醒、亡语亮牌(区分已施放/仅亮出)、回合结束获得(带来源)、手牌满烧牌(报卡名),同名合并防刷屏;AI 无需查库即可理解新卡
24
+ - **军师监听** — `hs watch` 后台监听 Power.log,换牌阶段和轮到我方回合时向自建 IM 桥接器推送固定提示词,触发 AI 军师分析对局
25
+ - **对 Agent 友好** — 纯 JSON 输入、报错逐条列出便于自我修正、无任何交互式提示
26
+ - **本地双语卡牌库** — 中英双语卡牌数据源自 [HearthstoneJSON](https://hearthstonejson.com/),补丁日一条命令刷新
27
+
28
+ ## 持续维护
29
+
30
+ 本项目处于活跃维护状态:炉石每个新版本(扩展包 / 平衡补丁)上线后,会同步更新本地标准卡牌库与标准池白名单,卡组体检随版本跟进。若数据源变更导致问题,欢迎提 issue。
31
+
32
+ ## 安装
33
+
34
+ 要求:Python 3.10+(Windows / macOS / Linux)
35
+
36
+ `hs image` 另需本机安装 Chrome 或 Edge(自动探测,可用环境变量 `CHROME_PATH` 指定)。
37
+
38
+ ```bash
39
+ git clone https://github.com/OstrichHermit/hearthstone-cli.git
40
+ cd hearthstone-cli
41
+ pip install .
42
+ ```
43
+
44
+ 开发模式用 `pip install -e .`(改动源码即时生效)。PyPI 发布:Coming soon。
45
+
46
+ 数据目录默认 `~/.hearthstone-cli/`(卡牌库、卡组库、卡组图都存这里),可用环境变量 `HS_DECK_HOME` 覆盖。装好后先跑一次 `hs update` 下载卡牌库。
47
+
48
+ ### 安装为 Agent Skill(可选)
49
+
50
+ 仓库内附带 Agent Skill(`skills/hs-deck/SKILL.md`),把它复制到你所用 AI Agent 的 skills 目录,Agent 即可自动掌握本工具的用法。以 Claude Code 为例:
51
+
52
+ ```bash
53
+ cp -r skills/hs-deck ~/.claude/skills/hs-deck
54
+ ```
55
+
56
+ ## 用法
57
+
58
+ ```bash
59
+ # 刷新卡牌库(自动下载最新中文+英文 collectible 卡及中文全量库,全量库含英雄技能/token 供对局面板查名与描述)
60
+ hs update
61
+
62
+ # 筛卡
63
+ hs filter --class=战士 --set=CORE --cost=<=3 --text=嘲讽
64
+
65
+ # 解码卡组代码
66
+ hs decode AAECAQcGo6AE...
67
+
68
+ # 校验并输出卡组代码
69
+ hs validate deck.json
70
+
71
+ # 卡组入库(支持代码或网页 URL)
72
+ hs save my-deck AAECAQcGo6AE...
73
+ hs save from-web https://example.com/deck-page
74
+
75
+ # 查看卡组库
76
+ hs list
77
+ hs show my-deck
78
+
79
+ # 版本更新后体检(省略名字 = 检查全部)
80
+ hs check
81
+
82
+ # 生成卡组长图
83
+ hs image my-deck # 按卡组库名字
84
+ hs image AAECAQcGo6AE... --name=Turtle # 直接给代码
85
+ hs image my-deck --lang=en # 英文版(--lang=both 一次出中英两版)
86
+ hs image my-deck --merge # 同名卡合并为一行
87
+ hs image my-deck --name=龟甲防战 --name-en=Turtle Warrior
88
+
89
+ # 解析当前对局面板(默认自动发现最新日志:游戏目录 Logs 下 Hearthstone_* 子目录及标准目录)
90
+ hs board
91
+ hs board --log=D:\games\Hearthstone\Logs\Power.log # 指定日志路径(也可指向日志目录自动发现)
92
+ hs board --player=鸵鸟居士 # 自动判定我方不准时手动指定
93
+
94
+ # 军师监听:换牌阶段/轮到我方回合时,向 IM 桥接器 POST 提示词触发 AI 分析
95
+ hs watch start --channel=<Discord频道ID> --token=<桥接器token> # 默认 --log=auto 自动发现
96
+ hs watch status # 查看运行状态与最近触发事件
97
+ hs watch stop
98
+ ```
99
+
100
+ 标准卡组含非标准池卡时默认拦截不出图,`--force` 可强制渲染。
101
+
102
+ `deck.json` 格式:
103
+
104
+ ```json
105
+ {
106
+ "format": "standard",
107
+ "hero": "加尔鲁什·地狱咆哮",
108
+ "cards": { "斩杀": 2, "#69535": 1 },
109
+ "sideboard": { "owner": "乐队经理精英牛头人酋长", "cards": { "蓝鳃战士": 2 } }
110
+ }
111
+ ```
112
+
113
+ 卡名或 `#dbfId` 均可,副牌库可选。
114
+
115
+ 报错逐条输出,Agent 可以按条机械修正:
116
+
117
+ ```
118
+ 校验失败:
119
+ - 套牌必须30张, 当前27张
120
+ - 奇利亚斯豪华版3000型 的系列 WHIZBANGS_WORKSHOP 不在当前标准池
121
+ ```
122
+
123
+ `hs board` 输出的对局面板长这样(真实对局快照,对手昵称已脱敏):
124
+
125
+ ```
126
+ === 炉石对局面板 ===
127
+ 休闲·标准 | 构建号 253216
128
+ 总第 17 手 | 我方第 9 回合 | 我的回合 | 我的法力 9/9(已用 0)
129
+ 对方:遛弯的树懒(牧师)[后手+硬币] 手牌 10 奥秘 0 牌库 17 尸体 5 疲劳 0 法力 3/8(已用 5)
130
+ 英雄:情报掮客拉祖尔 血 28/30 护甲 0 武器 无 技能 月亮的祝福(已用)
131
+ 对方场面(2):
132
+ 1. 逐月幼龙 3/6 [金]
133
+ 2. 凯洛斯的蛋 0/3
134
+ 我方:鸵鸟居士(战士)[先手] 奥秘 0 牌库 23 尸体 4 疲劳 0
135
+ 英雄:麦格尼·铜须 血 30/30 护甲 5 武器 无 技能 全副武装!(未用)
136
+ 任务 走进失落之城 8/10
137
+ 我方场面(3):
138
+ 1. 破链灾星霍格 10/10 [嘲讽]
139
+ 2. 奥卓克希昂 6/4
140
+ 3. 拉格纳罗斯的士兵 2/1
141
+ 我方手牌(6):
142
+ 1. 屠灭 6费 法术
143
+ 2. 龟甲旋风 4费 法术
144
+ 3. 拉格纳罗斯,绝世烈火 8费 8/8 随从 <兆示:拉格纳罗斯之手>
145
+ 4. 放出鳄鱼 2费 法术
146
+ 5. 强固 3费 法术
147
+ 6. 为了荣耀! 3费 法术
148
+ === 行动回顾 ===
149
+ [第 14 回合·对方] 抽牌 1 张
150
+ [第 14 回合·对方] 英雄技能 月亮的祝福<选择一张可用的牧师随从牌或法术牌置入你的手牌,其法力值消耗减少(>
151
+ [第 14 回合·对方] 选择:受伤的侍者
152
+ [第 14 回合·对方] 获得 受伤的侍者
153
+ [第 14 回合·对方] 打出 随从「受伤的侍者」 [金] 3/8<吸血。战吼:对本随从造成4点伤害。>
154
+ [第 14 回合·对方] 受伤的侍者效果 治疗 对方英雄 血28→30
155
+ [第 14 回合·对方] 打出 随从「凯洛斯的蛋」 0/3<亡语:召唤一枚轻微开裂的蛋。(破壳5次即可孵化为一只20/20并具有嘲讽的野兽!)>
156
+ [第 15 回合·我方] 抽牌 强固<获得3点护甲值。对一个敌方随从造成等同于你护甲值的伤害。>
157
+ [第 15 回合·我方] 打出 随从「破链灾星霍格」 10/10<嘲讽。对战开始时:复制你套牌中所有其他传说卡牌。>
158
+ [第 15 回合·我方] 攻击:奥卓克希昂 6/7 → 受伤的侍者 3/4
159
+ [第 15 回合·我方] 死亡:受伤的侍者 3/0
160
+ [第 15 回合·我方] 攻击:拉格纳罗斯的士兵 2/1 → 对方英雄
161
+ [第 16 回合·对方] 抽牌 1 张
162
+ [第 16 回合·对方] 英雄技能 月亮的祝福<选择一张可用的牧师随从牌或法术牌置入你的手牌,其法力值消耗减少(>
163
+ [第 16 回合·对方] 选择:逐月幼龙
164
+ [第 16 回合·对方] 获得 逐月幼龙
165
+ [第 16 回合·对方] 打出 随从「逐月幼龙」 [金] 3/6<扰魔。在你的回合结束时,随机获取一张龙牌。>
166
+ [第 16 回合·对方] 获得 1 张牌(逐月幼龙效果获得)
167
+ [第 17 回合·我方] 抽牌 为了荣耀!<抽两张牌。你的对手每控制一个随从,本牌的法力值消耗便减少(1)点。>
168
+ # 实体总数 103 | 解析起始行 2 | 日志总行 12200
169
+ ```
170
+
171
+ ## 对局面板与军师监听(board / watch)
172
+
173
+ > **质量保障**:board 的解析覆盖经过多轮真实对局的全量审计与逐项回归验收(数值对账、事件溯源、特殊局样本如秒投/截断/英雄牌变形)。炉石日志格式随版本变动,若新版出现解析问题,欢迎提 [issue](https://github.com/OstrichHermit/hearthstone-cli/issues) 或直接 PR。
174
+
175
+ `hs board` 从日志里最后一个 `CREATE_GAME` 起全量重放 packet,输出当前时刻的完整面板,适合直接喂给 AI 分析。我方默认按"手牌可见方"自动判定(只有客户端本人能看到手牌内容),判不准时用 `--player=玩家名` 手动指定;也支持 `--stdin` 从管道读日志,方便测试。
176
+
177
+ **面板层**:对局模式与构建号、总手数/回合/当前行动方、双方法力(`可用/总(已用 N)`,过载锁定单独标注)与先后手(后手标注+硬币)、双方英雄血/甲/武器/技能(技能被替换或灌注时显示新技能)、场面随从与地标(攻血 + 嘲讽/圣盾/风怒/冻结/休眠/潜行/扰魔/金卡等状态标注)、我方手牌费用攻血(含兆示预览 `<兆示:卡名>`、已强化/不可打出标注)、双方牌库剩余/疲劳/尸体数、任务进度槽(`任务名 x/y`,与奥秘分流计数,完成报奖励)、终局胜负行(斩杀/投降/疲劳;日志被游戏客户端截断时明确提示且不误报胜负)。换牌阶段面板同样输出开局发牌,可直接给留牌建议。
178
+
179
+ **行动回顾**:按回合边界自动带最近三个回合——我方上回合全部、对方上回合全部、我方本回合已发生(`--events=N` 调整带过的回合数,`--events=0` 关闭),事件按日志原始顺序稳定排序:
180
+
181
+ - 出牌/召唤附卡牌效果描述(全量不截断,AI 无需查库)与事件时刻攻血快照、战吼目标;攻击附目标与实际伤害(含光环增幅后的真实数值);英雄技能附效果与自带护甲;死亡附复生信息
182
+ - 开局段带换牌语义(起手 → 保留/换掉/换入 → 后手硬币)与 START_OF_GAME 触发效果(如"对战开始时复制传说"列全卡名洗入牌库)
183
+ - 引擎自动结算完整入流:亡语/触发的召唤带来源(同名合并 ×N 防刷屏)、亡语/触发伤害(致命标(致命))、治疗带来源、复生、休眠囚禁与苏醒、预备减费、发现/灾变类选择、洗入牌库汇总、回合结束获得(带来源)、亡语亮牌(区分已施放/仅亮出)、手牌满烧牌(报卡名)
184
+ - 隐私设计:对方抽牌只报张数不报卡名
185
+
186
+ `hs watch start` 启动一个后台守护进程 tail Power.log,检测到换牌阶段或轮到我方回合时,向自建 IM 桥接器 `POST /api/external/message`(Bearer token 鉴权)注入固定提示词,由桥接器触发 Discord 军师频道的 AI 分析。说明:
187
+
188
+
189
+ `hs watch start` 启动一个后台守护进程 tail Power.log,检测到换牌阶段或轮到我方回合时,向自建 IM 桥接器 `POST /api/external/message`(Bearer token 鉴权)注入固定提示词,由桥接器触发 Discord 军师频道的 AI 分析。说明:
190
+
191
+ - **桥接器是私有组件,不在本仓库内**(默认 `http://127.0.0.1:8088`)。不配置或连不上桥接器时,`hs watch` 单独使用只监听不发送——POST 失败自动重试 3 次后继续监听,不会崩溃,触发事件可用 `hs watch status --events=N` 查看
192
+ - 配置 merge 存于 `~/.hearthstone-cli/watch_config.json`,再次 `start` 不带参数沿用上次配置;`--force` 可在残留进程时强制重启
193
+ - 提示词可用 `--mulligan-prompt=` / `--turn-prompt=` 自定义,token 也可用环境变量 `HS_WATCH_TOKEN` 传入
194
+
195
+ ## 标准池维护
196
+
197
+ 标准池白名单在源码 `src/hearthstone_cli/deck.py` 里的 `STANDARD_SETS`。新版本上线后:跑 `hs update`,把新系列代码加进去,再 `hs check` 体检卡组库。
198
+
199
+ ## 数据源
200
+
201
+ 卡牌数据来自社区项目 [HearthstoneJSON](https://hearthstonejson.com/)(本地化文本遵循 CC BY 4.0)。构建提取自游戏文件,官方补丁上线当天或次日即可获取;预览季爆料的新卡要等补丁正式部署后才会入库。
202
+
203
+ ## 免责声明
204
+
205
+ 炉石传说是暴雪娱乐的商标。本项目与暴雪官方无关,仅供个人学习研究使用。
206
+
207
+ ## 许可
208
+
209
+ [MIT](LICENSE)
@@ -0,0 +1,40 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "hearthstone-cli"
7
+ version = "0.1.0"
8
+ description = "Hearthstone toolbox for AI agents — two cores: deck building (validate, encode, filter, deck images) and match analysis (board parsing from game logs, action replay, AI advisor watcher)"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = "MIT"
12
+ license-files = ["LICENSE"]
13
+ authors = [{ name = "OstrichHermit" }]
14
+ keywords = ["hearthstone", "deck", "deckstring", "cli", "agent", "card", "log-parser", "board"]
15
+ classifiers = [
16
+ "Environment :: Console",
17
+ "Intended Audience :: Developers",
18
+ "Operating System :: OS Independent",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3.10",
21
+ "Programming Language :: Python :: 3.11",
22
+ "Programming Language :: Python :: 3.12",
23
+ "Programming Language :: Python :: 3.13",
24
+ "Programming Language :: Python :: 3.14",
25
+ "Topic :: Games/Entertainment",
26
+ ]
27
+
28
+ [project.urls]
29
+ Homepage = "https://github.com/OstrichHermit/hearthstone-cli"
30
+ Repository = "https://github.com/OstrichHermit/hearthstone-cli"
31
+ Issues = "https://github.com/OstrichHermit/hearthstone-cli/issues"
32
+
33
+ [project.scripts]
34
+ hs = "hearthstone_cli.deck:main"
35
+
36
+ [tool.setuptools]
37
+ package-dir = { "" = "src" }
38
+
39
+ [tool.setuptools.packages.find]
40
+ where = ["src"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ """hs-deck-cli — Hearthstone deck building CLI for AI agents."""
2
+
3
+ __version__ = "0.1.0"