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

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.
/ride hides or shows it. Terminals that cannot draw images get a text track instead.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.
claude plugin validate .
claude plugin test .
| Mod | What it does | Install |
|---|---|---|
| ride-status | Status line shows context used as altitude | /plugin install ride-status --marketplace shailendergoud2907/ladakh-ride |
| safe-ride | Blocks rm -rf on home or root, plain force-push, git reset --hard | /plugin install safe-ride --marketplace shailendergoud2907/ladakh-ride |
| tool-log | Side panel of tool calls, /tool-log | /plugin install tool-log --marketplace shailendergoud2907/ladakh-ride |
| done-chime | Chime and toast after a turn of 30 s or more (sound plays on macOS) | /plugin install done-chime --marketplace shailendergoud2907/ladakh-ride |
| limit-alert | Toast at 80% and 95% of the 5-hour limit | /plugin install limit-alert --marketplace shailendergoud2907/ladakh-ride |
| mba-voice | Adds 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-theme | Ladakh 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.
hooks/register.tsx 54 lines1import { 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}
54types/index.d.ts 8 lines1export type ToolCall = { id: string; tool: string; isDone: boolean }
2
3declare module 'claude-code' {
4 interface PluginState {
5 'tool-log': { calls: ToolCall[] }
6 }
7}
8