← 所有文章

工具 · 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,點一下往下展開,每項一列、各自帶按鈕。

示意圖:leftovers 的 band 收合時只有一列「● 留著 2 項 ▾」,後面接第一項和「收掉」「完成」兩顆按鈕,點總數會往下展開成每項一列、各自帶按鈕。黃點不能點,收掉是送 prompt 叫 Claude 去清,完成只從帳本拿掉。

幾個取捨:

  • 展開用點的,不用 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 呼叫。

示意圖:原本掛著三件事時一句話回了好幾件,band 要等回合結束才劃掉;現在送出 prompt 時在背景打一次 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 靠「目錄不在就拿掉」補了事後檢查,備份檔還沒做,遇到再說。

表格圖:leftovers 只看得到 Bash 裡直接打的指令,包在 script 或工具裡的動作看不到。合併 PR 的 script 清掉 worktree 時帳本還掛著,已補上目錄不在就拿掉的事後檢查;script 裡的 rm 刪掉備份檔,帳本不會知道,還沒處理;工具自己註冊的 launchd agent 也看不到。

#Claude Code mods#TUI#git worktree#Claude Code

留言

載入留言中…

下一篇

工程

React 數字輸入框的坑:清空存成 0、type=number 按 e 變空字串

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