JasonWarrenUK/goblin-mode/tree/main/marketplace/goblin-util
goblin-util
Two Claude Code mods for the machine you run sessions on: /pain logs friction with the tool itself without a turn, and /fleet shows every session on the machine and lets you message one.
About this mod
goblin-util 提供兩個立即執行的 Claude Code 指令,執行時不會啟動新的回合。/pain 將使用 Claude Code 本身的摩擦點記錄到 ~/.claude/library/state/cc-pain-points.json,並自動填入 repo、branch 與最後失敗的工具呼叫,重複項目不會重複寫入。/fleet 讀取本機每個 session 寫入的心跳資料(repo、branch、是否執行中、最後呼叫的工具與時間),以面板列出並可用 1–9 選取、Enter 傳送訊息給該 session。選項包含 enabled、heartbeat_seconds(預設 15)與 stale_minutes(預設 10)。安裝方式為 claude plugin marketplace add JasonWarrenUK/goblin-mode 與 claude plugin install goblin-util@goblin-mode,需 Claude Code 2.1.287 以上。
Installation
Check the author's README for the marketplace and plugin name first. Commands may change as the repository evolves.
claude plugin marketplace add JasonWarrenUK/goblin-mode claude plugin install goblin-util
Original text / README
goblin-util
[!NOTE] Two Claude Code mods from goblin-mode for the machine you run sessions on. Both are immediate commands: they work while Claude is busy, and neither starts a turn.
1. Install
claude plugin marketplace add JasonWarrenUK/goblin-mode
claude plugin install goblin-util@goblin-mode
Needs Claude Code 2.1.287 or later. The panes draw in the terminal; the heartbeat and /pain <text> work everywhere.
2. /pain
Logs friction with Claude Code itself (the tool, never your project) into ~/.claude/library/state/cc-pain-points.json, the file hud-cc_releases reads to recognise a fix in the changelog later. The track-cc_pain skill does the same by inferring your mood mid-turn; this is the direct channel.
| Form | What happens |
|---|---|
| /pain the status line ate my prompt | Appends the entry at once and prints logged the-status-line-ate-my-prompt. |
| /pain | Opens a small pane with the context line and an input. Enter logs it and closes the pane. Esc closes it. |
The entry carries the schema library/state/README.md documents. sourceSession is pre-filled with the repo, the branch and the last failed tool call's first line, so the record says where it bit. An open entry with the same description is not duplicated; you are told its id instead. Marking an entry resolved stays with the skill.
3. /fleet
Every session on this machine writes a heartbeat row to the plugin's shared store: repo, branch, whether a turn is running, the last tool it called and when. /fleet opens a pane listing them, this session first.
| Key | Does |
|---|---|
| 1 to 9 | Picks a row. A picked session that is not this one gets an input under the table. |
| Enter in the input | Sends the line to that session as a message, the same delivery as the SendMessage tool. The toast says whether it landed. |
| Esc | Closes the pane. |
A row that has not written for a minute reads quiet. Opening /fleet never writes: a row past the stale limit is dropped by the next heartbeat any running session writes, within heartbeat_seconds (15 by default). A session that ends cleanly removes its own row.
4. Options
| Option | Default | What it does |
|---|---|---|
| enabled | true | The one switch for all of it. Off, the heartbeat stops and /pain and /fleet are not registered. |
| heartbeat_seconds | 15 | How often this session writes its row. |
| stale_minutes | 10 | A session silent for this long is forgotten. |
5. Files
| File | Holds |
|---|---|
| hooks/register.tsx | Both commands, the heartbeat, the two panes |
| hooks/util.test.tsx | Tests for the helpers, both forms of /pain, the fleet pane and the heartbeat |
| types/index.d.ts | The $.state contract: the picked session, the last failed tool, the branch |
Check it with claude plugin validate marketplace/goblin-util --strict and claude plugin test marketplace/goblin-util.