schreibse/claude-code-mods/tree/main/reminder-log
reminder-log
Claude Code がモデルに対して注入するリマインダーをセッションごとに集計します。トークンカウンターと繰り返される属性ブロックを削除します。 /reminders は過去の 30 日間を出力します
この mod について
Claude Code-mods
Personal Claude Code mods: トランスクリプトのスタイルを変更し、行を追加する関数フックのプラグイン プロンプトを表示し、ツールの呼び出しに反応します。Claude Code 2.1.287+、Linux 上で構築および使用されます。
改造
|モジュール |何をするのか |コマンド |ニーズ |
|---|---|---|---|
| 静かな-bash | One ライン ツール行 (✓ <description>、失敗時は赤色 ✗ exit N、編集時は +N −M、通話時間 ≥10 秒)。すべてのツールの結果ブロック (Bash 出力、差分の編集、WebFetch、MCP およびエージェントの結果、対話型ツール、SendUserFile および画像読み取りはそれらを保持)、終了した読み取り専用行 (Read/Grep/Glob、ls または git status のように読み取り専用で実行されたエンジンを呼び出します)、one が失敗してタイムアウトしない限り、折りたたまれたツール グループを非表示にします。 GitLab パイプライン待機通知。 PNG の読み取り、送信、または書き込みを行った行の下にインライン PNG サムネイルが表示されます (相対パスが含まれます)。 /quiet はすべてを取り戻します。 /thumb [big] <path> は PNG を表示します |サムネイル用の ImageMagick (magick)。キティのグラフィックを備えたターミナル (herdr を参照)
| 静かなスピナー |気まぐれな単語の代わりに、単純なスピナー単語 (thinking、writing、running) と Took 1m 4s を使用します。 – | – |
| 使用率 |プロンプトの下の行: ctx 34% \| 5h 41% \| wk 86%、80 % から黄色、95 % から赤色。 Nx リポジトリでは、中央にメモリ (claude.slice 使用量 + app.slice プレッシャー)、右側にセッション自身の nx serve プロジェクト (▶ admin api) とブランチのパイプライン (ci ⏳ test、手動ジョブを待機している場合の ⏸) も表示されます。 – | gh / glab はパイプラインにログインしました。メモリ用の systemd claude.slice |
| リマインダーログ | Claude Code がモデルに対して注入するリマインダーをセッションごとに集計します。トークン カウンターと繰り返しコミット アトリビューション ブロックを削除します。 /reminders は、過去 30 日間の集計を出力します。 – |
| mr-banner |作成、マージ、承認、またはレビューされた各 MR✗ exit NQ の下にリンクのある色付きのカード | – | gitlab または glab / gh という名前の GitLab MCP サーバー |
| コーデラビットバンド |プロンプトの上のバンドには、開いている CodeRabbit スレッド (重大度別) と現在のブランチの GitLab MR の要点がリンク付きで表示されます。何かが開いている場合にのみ表示されます | /coderabbit はカウントが変わるまで非表示にします。 glab がログインしました。 GitLab リモート |
| 編集 |プロンプトおよびツール出力内のシークレットは、‹secret:…› トークンとしてモデルに到達します。 Write/Edit のみがそれらを実際の値に戻します。 redact を参照してください。 – | PATH の betterleaks || mem-guard |ノード ツールを実行する Bash コマンドは、メモリ制限のある claude-cmd.slice スコープに入ります。メッセージ内の修正により拒否されました: --parallel=1 のない nx affected/QXZKQZXAHQ、:lite ツインを持つ pnpm スクリプト、ワーカー キャップのない jest、括弧で囲まれていないパターンを持つ pkill -f/QXZKQZXALQ、ci:local、スライスが 75 % 以下である間の重い実行プレッシャー。 mem-guard を参照してください。 – | systemd ユーザー claude-cmd.slice、mem-guard を参照してください。
| 引き継ぎ |スキル プラス MOD: handover スキルは、コールド セッションの one センテンス ハンドオーバーを ~/.claude/handover.md に書き込みます。プロンプトの上のバンドがそれを示し、✓ <description>Q (または 14 日以内の同じフォルダー内の新しいセッション) の後、Tab | を使用して提案としてプロンプト内で 1 回待機します。 /handover-copy はそれをコピーし、バンドを非表示にします。 – |
| herdr-notify |Claudeが許可、回答、または新しいプロンプト (プラグインではなく Notification フック) を待っているときの GNOME ポップアップ。そのペインが herdr でフォーカスされている one である間はスキップされます。これをクリックすると Ghostty が表示され、そのセッションの Herdr ペインに焦点が当てられます。フック: "Notification": [{"matcher": "permission_prompt\|idle_prompt\|elicitation_dialog", "hooks": [{"type": "command", "command": "bash \"$HOME/.claude/skills/herdr-notify/notify.sh\""}]}] | – | herdr、Ghostty、notify-send、jq |
モデルは、それらがなければどうなるかを正確に認識します。MOD は描画内容を変更します。
挿入された two 種類のリマインダーをドロップする remember-log、秘密を隠す redact、および mem-guard、
これは systemd スコープ内で Node コマンドを実行し、mem-guard: … エラーで一部を拒否します。
Three MOD は独自に呼び出します:
- mr-banner、GitLab MCP ノートまたは承認が MR のリンクなしで応答すると、呼び出しが行われます。
リンクとタイトルの
gitlabMCP サーバー上のget_merge_request。gh/QXZKQZXBAQ コマンド 余分な費用はかかりません。 - coderabbit-band は GitLab
originリモートのglabをポーリングします。60 のタイマーがブランチをチェックします。 フェッチ (glab mr viewと MR のディスカッションの全ページ) が毎分実行されます。git pushの後は 15 分ごと、バンドが何かを披露している間は 5 分ごと、それ以外の場合は 15 分ごと、 スレッドが解決された後に 5 秒後に 1 回。 - usage-percent (Nx リポジトリ内) は、すべての 10 をポーリングします:
psおよびpwdxのnx serveプロセス、およびdocker inspectは、サーバーが実行されているコンテナごとに 1 回、その構成プロジェクト ディレクトリを読み取ります。 パイプライン (gh run list/glab ci get) は、git pushの後の 15 秒後の HEAD の移動時にフェッチされます。 実行中は 1 分ごと、それ以外の場合は 5 分ごとです。
インストール
Claude Codeは、セッション開始時に ~/.claude/skills/ の下にあるすべてのプラグイン フォルダーを読み込みます。
- 空の
~/.claude/skills: クローンを直接作成します:
h
git clone https://github.com/schreibse/claude-code-mods ~/.claude/skills
```-
**既存のスキル:** 他の場所でクローンを作成し、必要な MOD をリンクします:
```s
h
git clone https://github.com/schreibse/claude-code-mods ~/src/claude-code-mods
ln -s ~/src/claude-code-mods/quiet-bash ~/.claude/skills/quiet-bash # per mod
新しいセッションがそれらを拾います。実行中の one には /exit と claude --continue が必要です。
MOD を削除する: フォルダーを削除するかリンクを解除します。 単一セッションで one を試してください:
claude --plugin-dir ~/src/claude-code-mods/<mod>。
このリポジトリはスキル フォルダー自体です。そのため、.gitignore はすべてを無視し、それぞれを再インクルードします。
mod: 新しい mod には !/<name>/ 行が必要です。そうしないと git はそれを認識できません。 .claude-plugin/types/ が生成されます
エンジンによって制御され、追跡されないままになります。
編集: トークンとしてのシークレット
betterleaks は、モデルに到達する前に、すべてのプロンプトとツールの結果をスキャンします。フラグを設定する各値
‹secret:xxxxxxxx› になり、後で表示される場所(スキャナーが表示される場所であっても)に隠れたままになります。
再び認識されなくなります。
|モデルの呼びかけ |何が起こるか | |---|---| |トークンを使用した書き込み、編集、NotebookEdit |実際の値はファイルに書き込まれます。 |ファイルが保持する秘密を削除するような書き込み |拒否されました: 編集 | を使用してください |トークンを使用したエージェント、SendMessage、TodoWrite |トークンとして渡される | |トークンを使用するその他のツール (Bash、WebFetch、MCP など) |拒否されたため、値が離れることはありません | | MOD が認識しなくなったトークン (再起動後) |拒否され、間違って復元されることはありません |
簡潔な出力。 Read、Grep、または Bash を実行する前に、すべてのファイルに呼び出し名が付けられます (Bash: 各単語
これは既存のファイルであり、1 MB の 10 まで) 全体がスキャンされるため、cut -c1-60 .env、
cut -d= -f2 または PEM キーからの数行の読み取りは依然としてトークンとして返されます。複数行
秘密は一行ごとに隠されています。
Bash ワードは、各セグメントが実行されるディレクトリ (cd sub && cut -c1-40 .env) に対して解決されます。
~/、$HOME/、${HOME}/ はホーム ディレクトリに展開されます。
ルール。 betterleaks のデフォルトと redact/betterleaks.toml: Sentry DSN キー、およびクライアント
シークレットが一般的なルールには短すぎます。 dev、local、test、を含むクライアント シークレット
example、changeme、または placeholder は表示されたままになるため、ローカル開発クライアントはコマンドで動作し続けます。
対象外:
- 画像;背後にファイルがない出力、短縮 (
git show HEAD:.env | cut …、printenv | cut …);実際の値を保持するトランスクリプト ファイルの構造化ツール レコード (モデルはそれらを読み取りません)。 - カットショート プレスキャンでは、グロブ (
cut -c1-40 *.env) とスペースで引用されたパスが見つかりません。 - 8 文字より短い値が非表示になることはありません。
- Write/Edit によってファイルに復元された値は、変換して読み戻すことができます (
base64、rev、xxd) または送信済み (curl -T file)。 redact は、モデルのコンテキストから偶然シークレットが外されるのを防ぎます。 それは、それらを取得しようとするモデルに対するサンドボックスではありません。 ‹secret:…›トークンを引用するサブエージェントのレポートは、他のツール呼び出しと同様に拒否されます。 oneを運んでいます。
ボールトはセッション メモリ内に存在します。/exit はそれを忘れます。
ステータス行には「redacted N: N counts vault Entry」が表示されるため、PEM キーは行ごとに 1 回カウントされます。
トーストでは、非表示にする新しい値ごとにルールに名前を付けます。 betterleaks がなければ、ステータス行に次のように表示されますoff (no betterleaks) と何も隠されていません。 betterleaks の実行が失敗すると、その呼び出しは終了します
未編集 (ボールトにすでにある値は非表示のまま): 連続失敗ごとの one トースト、ステータス
off (betterleaks) と言うと、次の呼び出しで再度スキャンが行われます。
mem-guard: Bash のメモリ ルール
ノード ツール (node、npx、pnpm、npm、yarn、nx、jest、
vitest、playwright、tsc、/exitQ) として実行されます。
systemd-run --user --scope --slice=claude-cmd.slice -p MemoryMax=30% -p MemorySwapMax=4% -- bash -c '…'、
したがって、オーバーランはデスクトップをダウンさせるのではなく、137 を終了することで終了します。主要な cd … && 滞在
ラッパーの外側にあるため、シェルのディレクトリは引き続き移動します。
ルールは、コマンドの各部分が実行する内容を読み取ります (&&、|、;、&、$( ) の後、内部)
cd に続く bash -c '…') は言及するだけの言葉ではないので、次のようなコミット メッセージが表示されます。
pkill -f が通過します。調査されていない: xargs、make、eval、スクリプト。
この設定を前提としています。メッセージでは次のように名前が付けられています。
claude-cmd.sliceユーザー ユニット。これがないと、systemd は独自の制限のないスライスを作成します。 各コマンドは依然として RAM の 30 % に制限されていますが、ヘッドルーム チェックは測定するものがなく、オフのままです。
i
# ~/.config/systemd/user/claude-cmd.slice
[Slice]
MemoryMax=30%
MemorySwapMax=4%
```systemd
は、パーセンテージをマシンの RAM (27 GiB: 8.2G および 1.1G) のバイトに変換します。
同じユニットがどのマシンにも適合します。マシンが何を取得するかを確認します。
`systemd-run --user --scope -q -p MemoryMax=30% -- sh -c 'cat /sys/fs/cgroup$(cut -d: -f3 /proc/self/cgroup)/memory.max'`
- 重いスクリプトに `:lite` ツイン (`lint:affected:lite`、`typecheck:lite`、
`test:affected:lite`) と遅い `ci:local` スクリプト。
## 使用率: 対象外
- GitHub では、ブランチの最新のワークフロー実行のみが表示されます。
- SSH ホスト エイリアス (`git@work:org/repo`) を使用するリモートは、`ci no login (work)` として読み取られます。
ログインしています。
- サーバーは、セッションのルート内、またはコンテナー内で実行される場合、セッションとしてカウントされます。
compose プロジェクトがそこに存在します。 one チェックアウトの Two セッションはどちらもそのサーバーを参照します。
## herdr: 画像とリンク
herdr (ここでは Ghostty 内) の下にある Quiet-bash のサムネイルには、そのサムネールのみが描画されます。
alt テキスト、mr-banner、coderabbit-band、および Claude 自身の出力内のリンクはクリックできません。
**原因:** Claude Codeは、`XTVERSION` の答えが次の端末に対してのみキティ グラフィックスをオンにします。
`kitty` (≥ 0.28) または `ghostty` で始まり、認識される端末のみにハイパーリンクします。牧畜民
は両方を転送しますが、独自の名前で応答するため、Claude Code は両方をオフにします。
**修正:** Claude Codeが起動する前に、herdr 内のみで両方を強制的にオンにします (起動時にそれらを読み取ります)。
```s
h
# ~/.bashrc.d/herdr-terminal.sh
if [ -n "$HERDR_ENV" ]; then
export CLAUDE_CODE_FORCE_TERMINAL_IMAGES=1
export FORCE_HYPERLINK=1
fi
また、~/.config/herdr/config.toml で herdr のキティ グラフィックス パススルーをオンにします (デフォルトではオフ)。
l
[experimental]
kitty_graphics = true
次に、herdr server reload-config、新しい herdr ペインを開きます (古いペインは古い環境を保持します)。
そこでClaude Codeを開始します。チェックしてください: /thumb /path/to/some.png は絵を描くはずです。
herdr-link-toast (Claude Code mod ではなく、herdr プラグイン)
herdr はバックグラウンドで Ctrl キーを押しながらクリックしたリンクをフィードバックなしで開き、file:// リンクを無視します
全く。 herdr-link-toast xdg-open との http(s) リンクを開き、
乾杯。また、quiet-bash のサムネイル キャプション内のパスも開きます。
`http://localhost/open-file/<
インストール
まず作者の README で marketplace とプラグイン名を確認してください。コマンドはリポジトリの構成によって変わる場合があります。
claude plugin marketplace add schreibse/claude-code-mods claude plugin install reminder-log
原文 / README
claude-code-mods
Personal Claude Code mods: plugins of function hooks that restyle the transcript, add rows around the prompt and react to tool calls. Built and used on Claude Code 2.1.287+, Linux.
Mods
| Mod | What it does | Commands | Needs |
|---|---|---|---|
| quiet-bash | One-line tool rows (✓ <description>, red ✗ exit N on failure, +N −M on edits, duration for calls ≥10 s). Hides every tool's result block (Bash output, Edit diffs, WebFetch, MCP and Agent results; interactive tools, SendUserFile and image Reads keep theirs), finished read-only rows (Read/Grep/Glob, and calls the engine ran read-only like ls or git status), collapsed tool groups unless one failed, and timed-out GitLab pipeline-wait notices. Inline PNG thumbnails under rows that read, sent or wrote a PNG, relative paths included | /quiet brings it all back; /thumb [big] <path> shows a PNG | ImageMagick (magick) for thumbnails; a terminal with kitty graphics (see herdr) |
| quiet-spinner | Plain spinner words (thinking, writing, running) and Took 1m 4s instead of the whimsical ones | – | – |
| usage-percent | Row under the prompt: ctx 34% \| 5h 41% \| wk 86%, yellow from 80 %, red from 95 %. In Nx repos also memory in the middle (claude.slice usage + app.slice pressure) and on the right the session's own nx serve projects (▶ admin api) and the branch's pipeline (ci ⏳ test, ⏸ when it waits on a manual job) | – | gh / glab logged in for the pipeline; systemd claude.slice for memory |
| reminder-log | Tallies the reminders Claude Code injects for the model, per session; drops the token counter and repeated commit attribution blocks | /reminders prints the tally of the last 30 days | – |
| mr-banner | Colored card with a link under each MR/PR created, merged, approved or reviewed | – | GitLab MCP server named gitlab, or glab / gh |
| coderabbit-band | Band above the prompt with the open CodeRabbit threads (by severity) and nitpicks of the current branch's GitLab MR, with a link. Shows only when something is open | /coderabbit hides it until the counts change | glab logged in; GitLab remote |
| redact | Secrets in prompts and tool output reach the model as ‹secret:…› tokens; only Write/Edit turn them back into the real value. See redact | – | betterleaks on PATH |
| mem-guard | Bash commands that run Node tools go into a memory-capped claude-cmd.slice scope. Refused, with the fix in the message: nx affected/run-many without --parallel=1, a pnpm script that has a :lite twin, jest without a worker cap, pkill -f/pgrep -f with an unbracketed pattern, ci:local, and heavy runs while the slice is above 75 % or under pressure. See mem-guard | – | a systemd user claude-cmd.slice, see mem-guard |
| handover | Skill plus mod: the handover skill writes a one-sentence handover for a cold session to ~/.claude/handover.md; a band above the prompt shows it, and after /clear (or a new session in the same folder, within 14 days) it waits once in the prompt as a suggestion, taken with Tab | /handover-copy copies it and hides the band | – |
| herdr-notify | GNOME popup when Claude waits for a permission, an answer or a new prompt (a Notification hook, not a plugin). Skipped while that pane is the focused one in herdr. Clicking it raises Ghostty and focuses that session's herdr pane. Hook: "Notification": [{"matcher": "permission_prompt\|idle_prompt\|elicitation_dialog", "hooks": [{"type": "command", "command": "bash \"$HOME/.claude/skills/herdr-notify/notify.sh\""}]}] | – | herdr, Ghostty, notify-send, jq |
The model sees exactly what it would without them: the mods change what is drawn, except
reminder-log, which drops two kinds of injected reminders, redact, which hides secrets, and mem-guard,
which runs Node commands inside a systemd scope and refuses some with a mem-guard: … error.
Three mods call out on their own:
- mr-banner, when a GitLab MCP note or approval answers without the MR's link, calls
get_merge_requeston thegitlabMCP server for the link and title.gh/glabcommands cost nothing extra. - coderabbit-band polls
glabfor GitLaboriginremotes: a 60 s timer checks the branch, and a fetch (glab mr viewplus all pages of the MR's discussions) runs every minute for 15 min after agit push, every 5 min while the band shows something, every 15 min otherwise, and once 5 s after a thread is resolved. - usage-percent, in Nx repos, polls every 10 s:
psandpwdxfornx serveprocesses, anddocker inspectonce per container a server runs in, to read its compose project directory. The pipeline (gh run list/glab ci get) is fetched when HEAD moves, 15 s after agit push, every minute while it runs and every 5 min otherwise.
Install
Claude Code loads every plugin folder under ~/.claude/skills/ at session start.
- Empty
~/.claude/skills: clone straight into it:git clone https://github.com/schreibse/claude-code-mods ~/.claude/skills - Existing skills there: clone elsewhere and link the mods you want:
git clone https://github.com/schreibse/claude-code-mods ~/src/claude-code-mods ln -s ~/src/claude-code-mods/quiet-bash ~/.claude/skills/quiet-bash # per mod
New sessions pick them up; a running one needs /exit and claude --continue.
Leave a mod out: delete or unlink its folder. Try one for a single session:
claude --plugin-dir ~/src/claude-code-mods/<mod>.
This repo is the skills folder itself, so .gitignore ignores everything and re-includes each
mod: a new mod needs a !/<name>/ line or git won't see it. .claude-plugin/types/ is generated
by the engine and stays untracked.
redact: secrets as tokens
betterleaks scans every prompt and tool result before it reaches the model. Each value it flags
becomes ‹secret:xxxxxxxx› and stays hidden wherever it appears later, even where the scanner
would not recognise it again.
| The model's call | What happens | |---|---| | Write, Edit, NotebookEdit with a token | the real value is written to the file | | Write that would drop a secret the file holds | refused: use Edit | | Agent, SendMessage, TodoWrite with a token | passed on as the token | | Any other tool with a token (Bash, WebFetch, MCP …) | refused, so the value never leaves | | A token the mod no longer knows (after a restart) | refused, never restored wrongly |
Cut-short output. Before Read, Grep or Bash runs, every file the call names (Bash: each word
that is an existing file, up to 10 of 1 MB) is scanned whole, so cut -c1-60 .env,
cut -d= -f2 or a Read of a few lines from a PEM key still come back as tokens. Multi-line
secrets are hidden line by line.
Bash words resolve against the directory each segment runs in (cd sub && cut -c1-40 .env),
and ~/, $HOME/ and ${HOME}/ expand to the home directory.
Rules. betterleaks' defaults plus redact/betterleaks.toml: Sentry DSN keys, and client
secrets too short for the generic rules. A client secret containing dev, local, test,
example, changeme or placeholder stays visible, so local dev clients keep working in commands.
Not covered:
- images; output with no file behind it, cut short (
git show HEAD:.env | cut …,printenv | cut …); the transcript file's structured tool records, which keep real values (the model does not read them). - the cut-short pre-scan misses globs (
cut -c1-40 *.env) and quoted paths with spaces. - values shorter than 8 characters are never hidden.
- a value restored into a file by Write/Edit can be read back transformed (
base64,rev,xxd) or sent (curl -T file). redact keeps secrets out of the model's context by accident; it is not a sandbox against a model trying to get them. - a subagent's report that quotes a
‹secret:…›token is refused like any other tool call carrying one.
The vault lives in session memory: /exit forgets it.
The status line shows redacted N: N counts vault entries, so a PEM key counts once per line.
A toast names the rule for each new value it hides. Without betterleaks the status line says
off (no betterleaks) and nothing is hidden. A betterleaks run that fails leaves that call
unredacted (values already in the vault stay hidden): one toast per failure streak, the status
says off (betterleaks), and the next call scans again.
mem-guard: memory rules for Bash
Every Bash command that names a Node tool (node, npx, pnpm, npm, yarn, nx, jest,
vitest, playwright, tsc, ngc) runs as
systemd-run --user --scope --slice=claude-cmd.slice -p MemoryMax=30% -p MemorySwapMax=4% -- bash -c '…',
so an overrun dies with exit 137 instead of taking the desktop down. Leading cd … && stay
outside the wrapper, so the shell's directory still moves.
The rules read what each part of a command runs (after &&, |, ;, &, $( ), inside
bash -c '…', following cd), never words it only mentions, so a commit message saying
pkill -f passes. Not looked into: xargs, make, eval, scripts.
Assumes this setup; the messages name it:
- a
claude-cmd.sliceuser unit. Without it systemd makes the slice with no limit of its own: each command is still capped at 30 % of RAM, but the headroom check has nothing to measure and stays off:
systemd turns a percentage into bytes of the machine's RAM (on 27 GiB: 8.2G and 1.1G), so the same unit fits any machine. Check what a machine gets:# ~/.config/systemd/user/claude-cmd.slice [Slice] MemoryMax=30% MemorySwapMax=4%systemd-run --user --scope -q -p MemoryMax=30% -- sh -c 'cat /sys/fs/cgroup$(cut -d: -f3 /proc/self/cgroup)/memory.max' - repos whose heavy scripts have a
:litetwin (lint:affected:lite,typecheck:lite,test:affected:lite) and a slowci:localscript.
usage-percent: not covered
- On GitHub only the newest workflow run of the branch is shown.
- A remote using an SSH host alias (
git@work:org/repo) reads asci no login (work)though you are logged in. - A server counts as the session's when it runs inside the session's root, or in a container whose compose project lives there. Two sessions on one checkout both see its servers.
herdr: images and links
Under herdr (here inside Ghostty), quiet-bash's thumbnails draw only their alt text, and links in mr-banner, coderabbit-band and Claude's own output aren't clickable.
Cause: Claude Code turns on kitty graphics only for terminals whose XTVERSION answer is
kitty (≥ 0.28) or starts with ghostty, and hyperlinks only for terminals it recognises. herdr
forwards both, but answers with its own name, so Claude Code turns both off.
Fix: force both on, inside herdr only, before Claude Code starts (it reads them at startup):
# ~/.bashrc.d/herdr-terminal.sh
if [ -n "$HERDR_ENV" ]; then
export CLAUDE_CODE_FORCE_TERMINAL_IMAGES=1
export FORCE_HYPERLINK=1
fi
Also turn on herdr's kitty graphics passthrough (off by default) in ~/.config/herdr/config.toml:
[experimental]
kitty_graphics = true
Then herdr server reload-config, open a new herdr pane (old panes keep the old environment)
and start Claude Code there. Check it: /thumb /path/to/some.png should draw the picture.
herdr-link-toast (a herdr plugin, not a Claude Code mod)
herdr opens a ctrl+clicked link in the background with no feedback, and ignores file:// links
altogether. herdr-link-toast opens http(s) links with xdg-open and shows a
toast. It also opens the path in quiet-bash's thumbnail captions, which link to
http://localhost/open-file/<path> because file:// isn't clickable in herdr. Such a link opens
only when the path ends in .png; any other gets a "Could not open link" toast. Needs python3.
Install:
herdr plugin link ~/.claude/skills/herdr-link-toast
Without herdr, in plain kitty or Ghostty, none of this is needed. Terminals without the kitty graphics protocol show the thumbnail's alt text (its path).
Developing
Each mod is .claude-plugin/plugin.json, hooks/hooks.json and hooks/register.ts(x), plus
types/index.d.ts when it keeps session state. Per mod:
claude plugin validate <mod> # what it hooks and calls, and what the engine would refuse
claude plugin test <mod> # its *.test.ts(x)
tsc -p <mod> # once the engine has laid .claude-plugin/types/
Edits in ~/.claude/skills hot-reload into running sessions that loaded the mod.
