SLOPSHOPPER

bash-watch

Status-line note when a Bash command fails; clears when the next one succeeds.

newguardstatus
v0.1.0MITupdated 2026-10-06nankris/claude-code-mods/bash-watch
A shopper browsing a rack in a slop shop
README

claude-code-mods

Three small Claude Code mods. A mod is a plugin made of function hooks that runs inside a Claude Code session and can draw a band above the prompt, a side pane, or a status-line note.

ModWhat it does
turn-bandA dim line above the prompt after each reply: Last turn: 5s, 1 tool calls.
tool-callsType /tool-calls to open a side pane listing tool calls as they run (runs) and finish (done). Keeps the last 200.
bash-watchShows failed: <command> in the status line when a Bash command fails, and clears it on the next success.

Install once (all sessions)

claude plugin marketplace add nankris/claude-code-mods
claude plugin install turn-band@claude-code-mods
claude plugin install tool-calls@claude-code-mods
claude plugin install bash-watch@claude-code-mods

Check with claude plugin list. Switch one off with claude plugin disable turn-band.

Try one for a single session

Clone the repo, then point Claude Code at a mod folder:

claude --plugin-dir /path/to/claude-code-mods/turn-band

Repeat the flag to load several mods at once.

Check and test

claude plugin validate ./turn-band
claude plugin test ./turn-band

Each mod folder holds .claude-plugin/plugin.json, hooks/hooks.json, hooks/register.tsx and a hooks/register.test.ts. turn-band and tool-calls also have types/index.d.ts, which declares the state they keep.

Limits

  • Mods only draw inside Claude Code (a terminal, or the desktop app's Code tab). They do not appear in the regular Chat or Cowork views.
  • Install commands like /plugin install are typed in a terminal session.
  • Mods run inside the Claude Code process. Read the source of any mod, including these, before installing it.

License

MIT. See LICENSE.

Source 1 files
hooks/register.tsx 13 lines
1import type { Register } from 'claude-code'
2
3export const register: Register = on => {
4  on('tool.call', { tool: 'Bash' }, async ($, e, next) => {
5    const ran = await next(e)
6    const hasFailed = ran.deny === undefined && ran.isError === true
7
8    $.ui.status(hasFailed ? `failed: ${e.command.slice(0, 40)}` : undefined)
9
10    return ran
11  })
12}
13