fernandomoraes/loose-ends

一個 Claude Code 外掛,在提示列上方顯示對話中懸而未決事項的即時清單:尚未回答的問題、順帶提到的重點、注意事項與延後的工作,由小型模型在每回合後更新。
fernandomoraes/loose-ends

loose-ends 是一個 Claude Code 外掛(Claude Mod),在提示列上方的狀態列顯示對話中尚未解決的事項:沒人回答的問題、順口提到的重點、沒人回應的警告,以及被延後或略過的事情。它透過 turn.complete hook 讀取新訊息,呼叫 Haiku 判斷哪些被遺漏、哪些已解決;每回合最多新增 3 項,最新一輪對話會延後一回合再判斷。清單用 ui.render 繪製在 AbovePrompt,可用 ctrl+x ctrl+a 收合,項目可以點選或按 Enter 勾選。每個工作階段的清單儲存在 $.store,支援 --resume,保留最近 30 個工作階段。項目未完成時,/exit 會先詢問。每回合呼叫 Haiku 一次,只在互動式工作階段執行,claude -p 下不會啟動。提供 /loose-ends 系列命令管理清單。開發需要 Claude Code 2.1.278 以上,並設定 CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1。
請先查看作者 README,確認 marketplace 與外掛名稱;指令可能隨儲存庫結構而變動。
claude plugin marketplace add fernandomoraes/loose-ends claude plugin install loose-ends
A live checklist above the Claude Code prompt of the conversation's loose ends: what was raised and then left behind when it moved on. An unanswered question, a point made in passing, a caveat nobody replied to, something deferred to "later" or skipped. Not the work in progress: that one you won't forget.

<sub>The demo is a recreation of the band, with the layout, colors and flow the plugin draws.</sub>
It is a Claude Mod: a plugin whose hooks are TypeScript functions running inside Claude Code.
turn.complete), it reads the messages the checklist has not seen yet ($.session.messages()) and asks Haiku ($.model.complete) which of them were left behind and which open items the conversation settled. The latest exchange is held back one turn: something raised there is not a loose end yet, so it is judged once the next exchange shows whether it was picked up. At most 3 items are added per turn. The call runs outside the main context: the conversation's model never sees it.ui.render on AbovePrompt). Collapse it with ctrl+x ctrl+a.○ is a button that checks it off (and ✓ reopens it): click it in the fullscreen layout, or press ctrl+x tab to focus the band, walk with Tab or the arrows and press Enter.$.store, so --resume brings it back. The last 30 sessions are kept./exit with open items asks first, from a command.run hook that runs the exit only when the dialog says so. It covers /exit alone: ctrl+c and ctrl+d raise no event a plugin can see, and session.end only observes. Turn it off with /loose-ends exit off.Cost: one Haiku call per turn with the new messages (capped at about 40k characters) and the current list. It only runs in interactive sessions, never under claude -p.
/loose-ends| Command | What it does |
|---|---|
| /loose-ends | The whole list |
| /loose-ends add <text> | Add an item by hand |
| /loose-ends done 2 5 | Mark items done |
| /loose-ends undo 2 | Reopen an item |
| /loose-ends rm 3 | Drop an item |
| /loose-ends clear | Empty the list |
| /loose-ends scan | Read the whole conversation again |
| /loose-ends on / off | Show or hide the band (off also pauses the model calls) |
| /loose-ends rows 12 | Rows the band may take |
| /loose-ends exit on / off | Ask before /exit while items are open |
Needs Claude Code 2.1.278 or later (the build its types were generated from) with CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 in the settings env.
claude --plugin-dir . # loads from disk, hot-reloads on save
bun test
claude plugin validate .claude-plugin/plugin.json
For type checking, run /plugin-types in a session, then bunx -p typescript tsc -p ..
To install it for every session:
claude plugin marketplace add fernandomoraes/loose-ends
claude plugin install loose-ends@loose-ends