spire-ctl:給 agent 用的《殺戮尖塔 2》可覈對控制面

前言

用智能體驅動本地遊戲時,常見做法是截圖加視覺識別,或腳本模擬點擊。這兩種方式在狀態漂移、動作是否合法、失敗後是否重發上很難給出穩定契約。DeepSeek Harness(DSH)社區裏把工作流類插件當作可複用的「控制面」;若你的 harness 能跑命令、讀 JSON,又需要驅動《殺戮尖塔 2》(Slay the Spire 2,下文 STS2),下面介紹維護者 enderzcx 的 spire-ctl:同一包既是 CLI,也可作爲 DSH 插件掛載原生工具。

這是什麼

spire-ctl 是面向 agent harness 的 STS2 控制面:提供 JSON 狀態契約、合法動作清單,以及不重放的執行層。它不截圖、不做視覺識別、不模擬點擊,而是通過本地 Mod 讀取結構化狀態,再調用遊戲原有的動作隊列。

數據流可以概括爲:

你的 agent(任何 harness)
        ↓  state / act / seq
   spire-ctl:合法動作枚舉 → 校驗發送 → 結算覈對
        ↓  遊戲原有動作隊列
    STS2 本地橋接(Mod)

倉庫:GitHub — enderzcx/spire-ctl。社區目錄頁:skillhub.cn/plugins/enderzcx/spire-ctl。分類爲工作流;當前 package 版本 0.3.0,許可證 MIT,運行時要求 Node.js >= 22。核心實現零 npm 生產依賴;@deepseek-ai/dsh-tools 爲可選 peer 依賴,不裝 DSH 也可單獨用 CLI。

它保證什麼、不承諾什麼

價值重點在出錯時的行爲,而不是「能不能自動贏」:

保證 含義
拒絕舊狀態 狀態一變,舊標識立即失效,不能沿用上一輪的手牌索引
單寫者鎖 同一端口只允許一個操作者;兩個 agent 不會同時出牌
不自動重試 發送失敗或結果無法確認 → 持久停止,等人覈實,絕不重發
結算覈對 每個動作讀回確認;沒確認就不算完成
非法動作發不出去 動作只來自遊戲自己廣告的選項,不自造 ID
算不清就停 未知機制、空意圖、無法覆蓋的致命攻擊 → 交回調用方,不猜

不是自動通關機器人。 決策歸調用方(或可選的快速決策模型);spire-ctl 只保證「決定下來的動作被合法、可覈對地執行」。默認沒有取勝策略,也沒有勝率保證。

程序與調用方分工:等待動畫結算、合法性校驗、基於遊戲意圖的算術由程序負責;出哪張牌、路線、構築等由調用方負責;陌生意圖或結果無法確認時程序停下並交回。

安裝與啓用

1. DSH 插件(可選但省事)

同一包一條命令安裝控制器(同時是 CLI 和 DSH 插件):

dsh plugin --profile web add github:enderzcx/spire-ctl

裝完後可直接調用 spire_state、spire_act、spire_seq、spire_advance 等原生工具,不必拼 shell。package.json 中 DSH 引擎要求爲 >=0.1.0-rc.1 <0.2.0-0。

安裝後建議體檢:找不到遊戲、Mod 未裝、橋接未起時會說明原因。

node bin/spire.mjs doctor

Mod 是唯一需要寫進遊戲目錄的步驟;doctor --install-mod 會先給計劃、校驗 SHA256,並在遊戲運行時拒絕寫入。

README 還提到:把倉庫內 安裝提示詞 整段複製給 agent,由 agent 自行安裝並驗證。

2. STS2 橋接 Mod(必需)

從 sts2-bridge Releases 下載對應平臺包,按包內 INSTALL.txt 放入 Mod 目錄。先關閉遊戲並備份存檔。

驗證橋接是否監聽本機:

curl --noproxy '*' http://127.0.0.1:15526/
# {"message":"Hello from STS2 MCP v0.4.0","status":"ok"}

Mod 只綁定迴環地址;不要把端口轉發到公網。

3. 權限與安全

插件與 CLI 以當前 DSH / shell 進程權限運行,會讀寫本地遊戲橋接與運行時文件。安裝前應閱讀源碼與 MIT 許可證;倉庫聲明不包含遊戲程序集、素材、個人存檔或憑據,日誌不含 API key。

典型用法

只讀狀態

state 不改變遊戲,返回當前局面、可選動作與狀態標識。操作細節見倉庫 docs/AGENT.md。

node bin/spire.mjs state

單步與序列執行

node bin/spire.mjs act STATE_ID OPTION_ID
node bin/spire.mjs seq STEPS.json

CLI 命令概覽:

命令 用途
state 讀狀態、合法動作、路由原因、本次狀態標識
act STATE_ID OPTION_ID 執行一個動作
seq STEPS.json 執行一串已決定的動作,逐步重讀逐步校驗
plan PLAN.json 帶預測的多卡前綴(預測不符即停)
battle [MAX] [STRATEGY.json] 可選快速決策模型連續打
advance [MAX] 機械推進(領金幣、對話、固定按鈕)
clear-halt STATE_ID 覈實局面後清除停止標記
strategy / save-strategy 查看/保存顯式續行條件

逐張 act 時,手牌 card_index 是位置,打掉一張後面索引會漂移。seq 可一次提交整回合,並按卡牌 id 指定,例如:

{
  "expected_state_id": "…",
  "steps": [
    {"card": "FLAME_BARRIER"},
    {"card": "TOXIC"},
    {"card": "DEFEND_IRONCLAD"},
    {"action": "end_turn"}
  ]
}

每一步從新結算狀態重新匹配遊戲廣告的動作,事務與 act 相同;任一步不再被廣告則序列在打出任何東西之前停下,並返回當時可用動作。非戰鬥界面同樣適用(例如一次買齊商店)。

從終局開新局

不碰存檔、設置與多人;menu 只廣告安全動作,abandon_run、quit、multiplayer 等不會出現。

node bin/spire.mjs state          # game_over → 只有 main_menu
node bin/spire.mjs act STATE 0    # 回主菜單
# 依次 singleplayer → standard → 選角色 → embark

其他 harness 不裝 DSH 時,照舊使用 node bin/spire.mjs state 等命令;bin/ 與 src/ 不 import DSH 適配器,邊界由 test/boundary.test.mjs 測試守住。

適用場景與注意

適合: 已在 DSH 或其他 harness 裏編排 agent,需要 STS2 的結構化狀態與可覈對執行;希望用 seq 減少索引漂移;需要單寫者鎖與失敗即停,而不是靜默重試。

兼容與驗證: README 記錄在 macOS arm64、遊戲 v0.107.1 上驗證。遊戲或上游 Mod API 變化可能導致字段改名,控制器會明確報錯而非靜默繼續;範圍見 docs/VALIDATION.md。離線 npm test 不能代替對着運行中游戲的驗證。

併發: 多處可併發讀,但只能有一個操作者;鎖僅防本項目自身,擋不住手動出牌或其他工具直接操作遊戲。

卸載: 關閉遊戲,移走 Mod,從 Steam 重啓;不要用舊存檔覆蓋新進度。

結尾

spire-ctl 把 STS2 收成 JSON 狀態契約加合法動作執行層,讓任意能跑 Node CLI 的 harness 都能驅動同一套覈對流程;在 DSH 裏則多一層原生工具調用。決策仍在你或你的模型,控制面負責合法性與失敗時的可預期停止。

  • 目錄頁:https://www.skillhub.cn/plugins/enderzcx/spire-ctl
  • 源碼與文檔:https://github.com/enderzcx/spire-ctl
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜