NateCC0902/NeonCoat/tree/main/mods/reply-media

将回复中的 mermaid 围栏、数学公式和本地图片作为图片绘制在终端中,并播放其本地视频(kitty 图形:Ghostty、kitty)
NateCC0902/NeonCoat/tree/main/mods/reply-media

适用于 Claude Code 的模组和状态行。回复中的图表、公式、图片和视频都会以图片形式绘制在终端中,其 markdown 以彩色绘制,状态行会显示该会话的花费。

| 路径 | 作用 |
| --- | --- |
| mods/reply-media/ | 将 mermaid 围栏、公式(math 围栏和 $$ 块)以及本地图片(单独占一行的 )绘制为图片。以图片形式书写的本地视频会以其第一帧加上播放按钮绘制,并就地播放。每张图片下方,一个按钮复制其源内容,另一个按钮在窗格中将其放大打开。 |
| mods/reply-markdown/ | 以彩色绘制标题、列表、任务列表、引用、标注(> [!WARNING])、分隔线和表格,并将每个代码围栏放入带复制按钮的卡片中。 |
| mods/skill-router/ | /skill-router <question> 询问一个小模型,你的仅用户技能中哪一个适合该问题。没有问题时它会列出它们。 |
| statusline.mjs | 状态行。第一行:已用上下文、花费、模型、每秒 token 数、文件夹、缓存命中率、git 状态。第二行:订阅窗口及其刷新时间、Remote Control,以及机器上运行的其他会话。 |
sips 和 open。reply-media,需要一个支持 kitty 图形协议的终端:Ghostty 或 kitty。reply-media:brew install librsvg ffmpeg
git clone https://github.com/NateCC0902/NeonCoat.git
cd NeonCoat/mods/reply-media/render && npm install
然后将 ~/.claude/settings.json 指向克隆目录。CLAUDE_CODE_PLUGIN_DIRS 以冒号分隔,每个 mod 一个条目(不会扫描父文件夹),因此请省略你不需要的 mod:
{
"env": {
"CLAUDE_CODE_PLUGIN_DIRS": "/path/to/NeonCoat/mods/reply-media:/path/to/NeonCoat/mods/reply-markdown:/path/to/NeonCoat/mods/skill-router"
},
"statusLine": {
"type": "command",
"command": "node /path/to/NeonCoat/statusline.mjs",
"padding": 0,
"refreshInterval": 5
}
}
之后启动的会话会加载这些 mod。这些文件从克隆目录实时加载:已保存的 mod 文件会在运行中的会话里热重载,因此一次错误的编辑会破坏所有会话的终端 UI。
每个 mod 的选项是 /config 中的行,改动会立即生效。
| Mod | 选项 | 默认值 | 它改变什么 |
| --- | --- | --- | --- |
| 三者全部 | enabled | true | 关闭该 mod 而不移除它。 |
| reply-media | pxPerColumn | 8 | 每个终端列的图片像素数。数值越低,图片绘制得越大。 |
| reply-media | cellAspect | 2.17 | 一个终端单元格的高度是宽度的多少倍。当图片看起来被压扁或拉伸时,请更改此值。 |
| reply-media | resumedReplies | 3 | 恢复的会话中最后多少条回复会重新绘制其图片。 |
| reply-markdown | tableBorder | bold | round、single 或 bold。 |
| reply-markdown | cardBorder | round | 代码卡片和标注框的边框:round、single 或 bold。 |
更改后,从仓库根目录运行这些命令:
claude plugin validate mods/<name> && claude plugin test mods/<name>
npx -p typescript tsc -p mods/<name>
(cd mods/reply-media/render && npm test)
echo '{}' | node statusline.mjs && node --test statusline.test.mjs
请先查看作者 README 确认 marketplace 和插件名称;命令可能随仓库结构改变。
claude plugin marketplace add NateCC0902/NeonCoat claude plugin install reply-media
Mods and a status line for Claude Code. A reply's diagrams, formulas, images and videos are drawn as pictures in the terminal, its markdown is drawn in color, and the status line says what the session is costing.

| Path | What it does |
| --- | --- |
| mods/reply-media/ | Draws mermaid fences, formulas (math fences and $$ blocks) and local images ( on a line of its own) as pictures. A local video written as an image is drawn as its first frame with a play button, and plays in place. Under each picture, one button copies its source and one opens it larger in a pane. |
| mods/reply-markdown/ | Draws headings, lists, task lists, quotes, callouts (> [!WARNING]), rules and tables in color, and puts each code fence in a card with a copy button. |
| mods/skill-router/ | /skill-router <question> asks a small model which of your user-only skills fits the question. With no question it lists them. |
| statusline.mjs | The status line. First row: context used, cost, model, tokens per second, folder, cache hit rate, git state. Second row: subscription windows and when they refill, Remote Control, and the other sessions running on the machine. |
reply-markdown drawsHeadings, lists, a quote, a rule, and bold, italic and inline code:
<img src="docs/markdown-text.png" width="830" alt="A reply with three levels of heading, a nested bullet list, a numbered list, a quote and a rule, each in its own color">The five callouts:
<img src="docs/markdown-callouts.png" width="830" alt="Note, Tip, Important, Warning and Caution, each a box in its own color">A table, a task list, and a code fence as a card with its copy button:
<img src="docs/markdown-blocks.png" width="830" alt="A framed table, a task list with two items ticked, and a TypeScript snippet in a card with a copy button">sips and open.reply-media, a terminal that speaks the kitty graphics protocol: Ghostty or kitty.reply-media:brew install librsvg ffmpeg
git clone https://github.com/NateCC0902/NeonCoat.git
cd NeonCoat/mods/reply-media/render && npm install
Then point ~/.claude/settings.json at the clone. CLAUDE_CODE_PLUGIN_DIRS is colon-separated with one entry per mod (a parent folder is not scanned), so leave out the mods you do not want:
{
"env": {
"CLAUDE_CODE_PLUGIN_DIRS": "/path/to/NeonCoat/mods/reply-media:/path/to/NeonCoat/mods/reply-markdown:/path/to/NeonCoat/mods/skill-router"
},
"statusLine": {
"type": "command",
"command": "node /path/to/NeonCoat/statusline.mjs",
"padding": 0,
"refreshInterval": 5
}
}
The mods load in sessions started after that. These files are loaded live from the clone: a saved mod file hot-reloads in running sessions, so a broken edit breaks the terminal UI of all of them.
reply-media draws only what Claude writes in the forms it knows: a mermaid fence, a math fence, an image on a line of its own. Claude does not write them unprompted, so add these notes to ~/.claude/CLAUDE.md. The Formatting note does the same for the forms reply-markdown draws only when Claude chooses to write them.
Diagrams:
Draw diagrams in replies as ```mermaid code fences, never as ASCII art. The reply-media mod turns each fence into a picture in the terminal.
Use only these types, the rest do not render: flowchart, stateDiagram-v2, sequenceDiagram, classDiagram, erDiagram, xychart-beta.
Start the fence at column 0: an indented fence (inside a list item or a quote) is not picked up.
Prefer flowchart LR: a TD chart with more than a few nodes fills the terminal's height.
For a flowchart with a cycle, declare the node the back-edge leaves from on a line of its own before any edge (e.g. `T{test}`), or the layout draws that node above the one before it.
Directory trees and tables are not diagrams: keep them as text.
Math:
Write a formula that stands on a line of its own as LaTeX in a ```math code fence, one formula per fence, starting at column 0. The same mod turns it into a picture. Leave out `\tag`: a tagged formula is not drawn.
Write math inside a sentence in Unicode (a⃗ · b⃗ = |a||b|cos θ), never as `$x$`: a picture cannot sit inside a line of text.
Images:
To show an image file from this machine, write `` on a line of its own, starting at column 0. The same mod draws it. The path is absolute, under `~/`, or relative to the session's working directory. An image at a URL is not fetched, so give its link as text.
A video file (mp4, mov, webm, mkv, gif) written the same way is shown as its first frame with a play button.
Formatting:
For a warning or a note I must not miss, write a GitHub alert: a quote whose first line is `[!NOTE]`, `[!TIP]`, `[!IMPORTANT]`, `[!WARNING]` or `[!CAUTION]`. It becomes a colored box.
For steps or checks to tick off, write a task list: `- [ ]` and `- [x]`.
Put a command or snippet I will copy in a code fence of its own, with its language, not in inline code: the fence gets a copy button.
Each mod's options are rows in /config, and a change takes effect at once.
| Mod | Option | Default | What it changes |
| --- | --- | --- | --- |
| all three | enabled | true | Turns the mod off without removing it. |
| reply-media | pxPerColumn | 8 | Pixels of a picture per terminal column. Lower draws pictures larger. |
| reply-media | cellAspect | 2.17 | How many times taller than wide one terminal cell is. Change it when pictures look squashed or stretched. |
| reply-media | resumedReplies | 3 | How many of a resumed session's last replies get their pictures drawn again. |
| reply-markdown | tableBorder | bold | round, single or bold. |
| reply-markdown | cardBorder | round | The border of a code card and of a callout box: round, single or bold. |
The colors are written into the code to match one dark theme, which is not in this repo. For another theme, edit the constants at the top of each file: COLORS in statusline.mjs, COLOR and CALLOUT in mods/reply-markdown/hooks/register.tsx, and THEME in mods/reply-media/render/render.mjs.
Run these after a change, from the repo's root:
claude plugin validate mods/<name> && claude plugin test mods/<name>
npx -p typescript tsc -p mods/<name>
(cd mods/reply-media/render && npm test)
echo '{}' | node statusline.mjs && node --test statusline.test.mjs
The types check works once Claude Code has loaded the mod and written its types to mods/<name>/.claude-plugin/types/. CLAUDE.md has the notes for changing or adding a mod.