工具 · 2026.10.04 · 5 min · 更新於 2026.10.26
Claude Code mods 做可點擊的 band:API 限制決定設計,leftovers 看不到的殘留
Claude Code mod 上線後把 band 改成能直接操作,設計多半被 Button 不能上色、hover 會點錯這些限制決定;leftovers 也補上絕對路徑與變數代入,並列出比對指令看不到的殘留。
閱讀設定
leftovers 的 band 只寫「● 2 項沒收」,看不出是哪兩項,要處理還得另外打 /leftovers。
想把 band 做成能直接點的按鈕,會先碰到這版 API 的限制:Button 不能上色、hover 展開會讓列位移,很多設計是被這些限制決定的。
另一個收穫是 leftovers 的盲點。它靠比對 Bash 指令判斷殘留,包在 script 或工具裡的動作它看不到,只能靠事後檢查補。
翻一個月 session log 做出的五個 Claude Code mod,初版上線當天我就開始改 band。band 是 prompt 輸入框正上方的一條區域,所有 mod 共用,畫法見 mod 的介面文件。
用起來遇到的問題很具體。除了看不出是哪幾項,your-turn 掛著好幾件時只顯示第一件,leftovers 的帳本也留著已經不存在的 worktree。
band 直接操作,限制決定設計
初版的 leftovers 有一個 pane 放清單,但 pane 放在哪是 Claude Code 決定的,mod 自己指定不了。fullscreen 而且視窗 110 欄以上就停靠右邊,否則嵌在 prompt 上方。
我試過之後放棄 pane,清單改畫在 /leftovers 的輸出列。
pane 有焦點時按 1 就等於按第一項的「收掉」,太容易誤觸,數字熱鍵也一起拿掉。
新版直接把第一項和它的按鈕畫在 band 上:
● 留著 2 項 ▾ repo <repo>/.claude/worktrees/a 本機 [ 收掉 ] [ 完成 ]
等你 2 件 ▾ 到後台撤銷舊的 OAuth 授權 5m [ 完成 ]
「收掉」送一句 prompt 叫 Claude 去清,「完成」只從帳本拿掉。
超過一項時,總數那段字變成一顆沒有外框的 Button,點一下往下展開,每項一列、各自帶按鈕。

幾個取捨:
- 展開用點的,不用 hover。展開會讓下面的列位移,滑鼠停的位置底下換成另一項,很容易點錯。
- 黃點不能點。這版 API 只有 Button 能點,Button 又沒有顏色 prop,我選擇保留黃色,可點的是緊接在右邊的字。
- band 文字從「2 項沒收」改成「留著 2 項」,因為「沒收」第一眼會讀成「被沒收」。
your-turn的熱鍵只給最上面那一件。多列共用同一個熱鍵會互搶,後畫的贏。
顏色也只能繞路。Button 沒有顏色 prop,只能指定「所在那一列被滑鼠指到時」的樣式。
所以等你的件數用 aqua 一直看得到,「完成」的綠和「收掉」的黃只在滑鼠移到那一列時出現。收掉會動到東西,所以用黃。
件數要上色就不能放在 Button 裡,只好拆成兩顆 Button 夾一個 Text。副作用是點數字本身沒有作用。
還有一個使用前提:這些按鈕只有在 fullscreen 模式才點得到,預設畫面不會開滑鼠回報。
維持預設畫面的話,要按 ctrl+x 再按 tab 把焦點移到 band,再用 tab 選按鈕、Enter 按下。
your-turn:回話當下就劃掉
your-turn 原本只有兩條路會劃掉一件事:只掛一件時我回「好了」這類話,或回合結束時的抽取。
掛著三件時,我一句話回了好幾件,兩條路都不會中,band 會一直掛到回合結束。
改法是送出 prompt 時,只要有掛著的事,就在背景打一次 haiku,判斷這段話回了哪幾件,結果回來就劃掉。mod 本來就能自己呼叫模型做這種分類的小工作。
這個判斷不擋送出,/ 開頭的指令也不判斷。
代價是有掛著的事時,每次回話多一次 haiku 呼叫。

leftovers 記錯的兩種情況
帳本裡卡著兩個 worktree(同一個 repo 另外開出來的工作目錄),對應的 PR 已經合併、目錄也清掉了,band 上還掛著。
原因有兩個。worktree 是我合併 PR 的 script 最後清掉的,leftovers 只認 Bash 指令裡直接出現的 git worktree remove。
帳本記的又是指令裡的相對路徑。帳本跨 session 共用,事後查不出是哪個 repo 底下的。
所以 git worktree add/remove 的路徑改成接上指令執行前的工作目錄再記,cd 和 git -C 都算進去。
工作目錄一定要在指令跑之前讀,跑完可能已經換了。
另外每回合結束和 session 開始時,用 $.fs.exists 看目錄還在不在,不在就從帳本拿掉。
這也順便處理了誤記:測試字串裡的 git worktree add 被當成真的指令記下來時,回合結束就會因為目錄不存在自己消失。
第二種是 shell 變數。Claude 先把 plist 路徑存進變數 P,再下 launchctl bootstrap gui/$(id -u) $P,band 就顯示「留著 1 項 launchd $P 本機」,連帶建議的清理指令也是錯的。
改法是偵測指令時,每段先代入目前已知的變數。整段都是 NAME=value(可以帶 export)就記進變數表,不當成指令。
這個判斷放在剝掉 ssh host 之後,所以遠端設的變數也吃得到。
環境裡本來就有的變數,例如 $HOME,刻意不代。遠端和本機的 $HOME 不一樣,猜錯比留原樣更糟。
這版推上了公開 repo(3c7b247)。
比對指令看不到的殘留
到這裡,leftovers 還有兩個已知的盲點。
備份檔(*.bak)被 script 裡的 rm 刪掉時,帳本不會知道。有些工具會自己註冊 launchd agent,不是在 Bash 裡直接下 launchctl,leftovers 也看不到。
這跟 script 裡清 worktree 是同一類問題。比對 Bash 指令只看得到直接打出來的東西,包在 script 或工具裡的動作都看不到。
worktree 靠「目錄不在就拿掉」補了事後檢查,備份檔還沒做,遇到再說。


工程
React 數字輸入框的坑:清空存成 0、type=number 按 e 變空字串
放貸設定頁的保留額清空後會靜靜存成 0,等於把資金全部放出去。整理修這張表單時遇到的數字輸入框問題:草稿存字串、上下限分開擋、type=number 的 e 鍵,以及 jsdom 測不到的逐字輸入。
留言
載入留言中…