SLOPSHOPPER

session-park

/park-all closes every Claude Code terminal session for an upgrade; /unpark-all reopens them resumed

commandprocess
v0.1.0no licenseupdated 2026-10-18namdar12/claude-mods/plugins/session-park
A shopper browsing a rack in a slop shop
README

claude-mods

Mods for Claude Code, published as a plugin marketplace.

ModWhat it does
mermaid-paneRenders Mermaid diagrams into a side pane. Any `mermaid block in Claude's reply opens there automatically, and Claude also gets a show_diagram tool. Page through them with n/p, view the source with s, open in the browser with o; reopen with /diagrams.
cca-quizMultiple-choice practice for the Claude Certified Architect exams, shown above the prompt while Claude works. Toggle with /quiz (/quiz on, /quiz off, /quiz reset); answer with 1–4.
session-park/park-all saves and closes every open Claude Code terminal session (the one you ran it in last) so you can upgrade; /unpark-all reopens each one resumed in its original directory. /park-all force also closes sessions that are mid-turn.

Install

At the prompt of a Claude Code terminal session:

/plugin install mermaid-pane --marketplace namdar12/claude-mods
/plugin install cca-quiz --marketplace namdar12/claude-mods
/plugin install session-park --marketplace namdar12/claude-mods

Answer y to add the marketplace, then pick a scope (user scope is first; Enter selects it). The mod is active right away.

From a shell:

claude plugin install mermaid-pane --marketplace namdar12/claude-mods
claude plugin install cca-quiz --marketplace namdar12/claude-mods
claude plugin install session-park --marketplace namdar12/claude-mods

In the desktop app, where /plugin does not run: click + next to the prompt box, then Plugins, Add marketplace with namdar12/claude-mods, then Add plugin.

Notes

  • mermaid-pane renders with npx @mermaid-js/mermaid-cli (Node.js required; the first render downloads it) and writes diagrams to ~/.claude/mermaid-diagrams/. Image sizing (sips) and "open in browser" (open) use macOS commands; on other systems the pane still shows the diagram source.
  • kitty and Ghostty show the rendered picture (the kitty graphics protocol). Every other terminal (Warp, iTerm2, WezTerm, Terminal.app, …) gets the diagram drawn in box-drawing characters on white, its labels wrapped to fit the pane's width: widen the pane (ctrl+x ← in the fullscreen layout) to see more. Flowcharts, sequence, state, class and ER diagrams draw as text; other types show their source. o always opens the full picture in the browser.
  • The text renderer is beautiful-mermaid (MIT), vendored in plugins/mermaid-pane/hooks/vendor/.
  • session-park needs its helper script on your machine (Python 3, macOS). After installing the mod, copy plugins/session-park/bin/claude-park to ~/.local/bin/claude-park and make it executable (chmod +x). Restore opens one Warp tab per session, or Terminal.app windows when Warp is not installed. You can also run it from a shell: claude-park park, claude-park restore, claude-park list.
Source 1 files
hooks/register.ts 33 lines
1import type { Register } from 'claude-code'
2
3const SCRIPT = '~/.local/bin/claude-park'
4
5export const register: Register = on => {
6  on('session.start', async ($, e, next) => {
7    await $.command.register({
8      name: 'park-all',
9      description: 'Save and close every open Claude Code terminal session (this one last) so you can upgrade',
10    })
11    await $.command.register({
12      name: 'unpark-all',
13      description: 'Reopen every parked Claude Code session, resumed where it was',
14    })
15
16    return next(e)
17  })
18
19  on('command.run', { command: 'park-all' }, async ($, e) => {
20    const self = await $.session.id()
21    const force = e.args.includes('force') ? ' --force' : ''
22    const run = await $.process.run(['/bin/sh', '-c', `${SCRIPT} park --self ${self}${force}`])
23
24    return { text: (run.stdout + run.stderr).trim() }
25  })
26
27  on('command.run', { command: 'unpark-all' }, async $ => {
28    const run = await $.process.run(['/bin/sh', '-c', `${SCRIPT} restore`])
29
30    return { text: (run.stdout + run.stderr).trim() }
31  })
32}
33