SLOPSHOPPER

tool-log

Side panel listing the tool calls of this session. Open it with /tool-log.

newpaneguardcommand
v0.1.0no licenseupdated 2026-10-11shailendergoud2907/ladakh-ride/mods/tool-log
A shopper browsing a rack in a slop shop
Preview · a replayed session in a sandbox
claude · ~/work/app · tool-log
│ ┃ Tool calls ✕ › fix the failing auth test and add an audit log call │ ┃ done Read │ ┃ done Grep ⏺ Read(src/auth.ts) │ ┃ done Edit ⎿ Read 6 lines │ ┃ done Write ⏺ Update(src/auth.ts) │ ┃ done Write ⎿ Added 2 lines, removed 1 line │ ┃ done Bash ⏺ Bash(bun test) │ ┃ done Bash ⎿ 3 pass, 1 fail │ ┃ done Bash │ ┃ done Bash ● Done. refresh now rejects expired claims and logs an audit event. │ │ ✻ Worked for 42s · done 4:20 PM │ │ › /tool-log │ ⎿ tool-log: Tool calls pane opened. │ │ ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › ? for shortcuts

Draws

Pane · Tool calls
done Read done Grep done Edit done Write done Write done Bash done Bash done Bash done Bash
README

ladakh-ride

A Ladakh road trip above the Claude prompt. A Royal Enfield rides from Leh to Khardung La as your conversation's context window fills up.

  • Snow peaks, a Pangong Tso lake, prayer flags, a stupa at Leh and 25/50/75% milestones.
  • Caption shows percent of context used, tokens used out of the window, a flavour-only altitude, and your 5-hour limit when your account reports one.
  • Toasts at 75% and 90% full.
  • /ride hides or shows it. Terminals that cannot draw images get a text track instead.

Install

Type this at the prompt of a terminal Claude Code session:

/plugin install ladakh-ride --marketplace shailendergoud2907/ladakh-ride

Answer y to add the marketplace, then pick the user scope.

Develop

claude plugin validate .
claude plugin test .

More mods in this repo

ModWhat it doesInstall
ride-statusStatus line shows context used as altitude/plugin install ride-status --marketplace shailendergoud2907/ladakh-ride
safe-rideBlocks rm -rf on home or root, plain force-push, git reset --hard/plugin install safe-ride --marketplace shailendergoud2907/ladakh-ride
tool-logSide panel of tool calls, /tool-log/plugin install tool-log --marketplace shailendergoud2907/ladakh-ride
done-chimeChime and toast after a turn of 30 s or more (sound plays on macOS)/plugin install done-chime --marketplace shailendergoud2907/ladakh-ride
limit-alertToast at 80% and 95% of the 5-hour limit/plugin install limit-alert --marketplace shailendergoud2907/ladakh-ride
mba-voiceAdds a short working-style note to the system prompt/plugin install mba-voice --marketplace shailendergoud2907/ladakh-ride
ladakh-tips/ladakh prints a riding tip/plugin install ladakh-tips --marketplace shailendergoud2907/ladakh-ride
ladakh-themeLadakh Dusk and Ladakh Glacier colour themes, pick with /theme/plugin install ladakh-theme --marketplace shailendergoud2907/ladakh-ride
mba-shortcuts/mba-shortcuts:case, :pitch, :redteam, :memo/plugin install mba-shortcuts --marketplace shailendergoud2907/ladakh-ride

/focus 25 now lives inside ladakh-ride and shows in the band.

Source 2 files
hooks/register.tsx 54 lines
1import { atom, read, update } from 'claude-code'
2import type { Register } from 'claude-code'
3
4import type { ToolCall } from '../types'
5
6const PANE = 'tool-log'
7const calls = atom({ plugin: 'tool-log', key: 'calls' } as const, [])
8
9export const register: Register = on => {
10  on('session.start', async ($, e, next) => {
11    await $.command.register({
12      name: 'tool-log',
13      description: 'Show the tool calls of this session in a pane',
14    })
15    void $.ui.open({ id: PANE, title: 'Tool calls' })
16
17    return next(e)
18  })
19
20  on('command.run', { command: 'tool-log' }, async $ => {
21    await $.ui.open({ id: PANE, title: 'Tool calls' })
22
23    return { text: 'Tool calls pane opened.' }
24  })
25
26  on('tool.call', async ($, e, next) => {
27    const call: ToolCall = { id: e.tool_use_id, tool: e.tool, isDone: false }
28    await update($, calls, list => [...list, call].slice(-200))
29    const ran = await next(e)
30    await update($, calls, list =>
31      list.map(one => (one.id === call.id ? { ...one, isDone: true } : one)),
32    )
33
34    return ran
35  })
36
37  on('ui.render', { component: 'Pane', requestId: PANE }, async ($, e) => {
38    const { Box, Text } = $.ui.resolve(e)
39    const list = await read($, calls)
40    const room = Math.max(1, (e.viewport?.rows ?? 24) - 4)
41
42    return (
43      <Box flexDirection="column">
44        {list.length === 0 && <Text dimColor>No tool calls yet.</Text>}
45        {list.slice(-room).map(call => (
46          <Text dimColor={call.isDone}>
47            {call.isDone ? 'done' : 'runs'} {call.tool}
48          </Text>
49        ))}
50      </Box>
51    )
52  })
53}
54
types/index.d.ts 8 lines
1export type ToolCall = { id: string; tool: string; isDone: boolean }
2
3declare module 'claude-code' {
4  interface PluginState {
5    'tool-log': { calls: ToolCall[] }
6  }
7}
8