After the first prompt, Haiku names the session and a color is picked, so ClaudePulse can show them.

Small Claude Code mods.
/plugin marketplace add PhilRoli/claude-mods
For TrainTracker. Shortly before your tracked train arrives (default: 10 minutes), every session is told to stop starting new work, leave the code in a consistent state and report what's done and what remains, so you can switch locations or turn off wifi without cutting a session off mid-task.
/plugin install train-pause@claude-mods
Requires TrainTracker (≥ 1.3.0), which writes the arrival time to ~/.traintracker/arrival.json ({"arrival": <epoch seconds, delay included>}) while a train is tracked. Idle sessions pick up the instruction on their next prompt; the status line shows a countdown. Change the window with WRAP_UP_MINUTES in plugins/train-pause/hooks/register.ts.
Same idea for usage limits: once the 5-hour or weekly window is ≥ 95% used, the session is told to wrap up. A window that resets within 5 minutes is ignored. Needs a subscription (the engine reports no limits otherwise).
/plugin install session-limit-pause@claude-mods
Tune with WRAP_UP_PERCENT and IGNORE_IF_RESET_WITHIN_MIN in plugins/session-limit-pause/hooks/register.ts.
/nosleep keeps the Mac awake with the lid closed (pmset -a disablesleep 1) and restores sleep when the session ends. /nosleep on|off sets it explicitly; the status line shows lid-closed awake while active.
/plugin install nosleep@claude-mods
macOS only. One-time setup so sudo doesn't prompt:
echo "$USER ALL=(root) NOPASSWD: /usr/bin/pmset -a disablesleep 1, /usr/bin/pmset -a disablesleep 0" | sudo tee /etc/sudoers.d/nosleep >/dev/null && sudo chmod 0440 /etc/sudoers.d/nosleep && sudo visudo -cf /etc/sudoers.d/nosleep
A hard-killed session leaves sleep disabled until the next session starts (or sudo pmset -a disablesleep 0).
For ClaudePulse. After your first prompt, Haiku gives the session a short title (/rename) and a color is picked from the session id (/color), so the menu bar app can show both.
/plugin install session-label@claude-modshooks/register.tsx 28 lines1import type { Register } from 'claude-code'
2
3const COLORS = ['red', 'blue', 'green', 'yellow', 'purple', 'orange', 'pink', 'cyan']
4
5const SYSTEM = 'Title a coding session from its first prompt in 2-4 words. Reply with the title only.'
6
7const pick = (seed: string) => COLORS[[...seed].reduce((h, c) => (h * 31 + c.charCodeAt(0)) >>> 0, 7) % COLORS.length]
8
9export const register: Register = on => {
10 let isLabelled = false
11
12 on('prompt.submit', async ($, e, next) => {
13 const entered = await next(e)
14 if (isLabelled || e.origin.kind !== 'composer' || e.text.startsWith('/')) return entered
15 isLabelled = true
16
17 // Not awaited: the commands queue until the session is idle.
18 ;(async () => {
19 const r = await $.model.complete({ model: 'haiku', system: SYSTEM, prompt: e.text.slice(0, 2000), maxTokens: 30 })
20 const name = r.isAnswered ? r.text.trim().replace(/^["']|["']$/g, '').slice(0, 60) : ''
21 if (name) await $.command.run({ command: 'rename', args: name })
22 await $.command.run({ command: 'color', args: pick(await $.session.id()) })
23 })().catch(err => $.ui.log(`session-label: ${err}`))
24
25 return entered
26 })
27}
28