Skip to content

Repository files navigation

BMO — a Claude Code plugin

        ˏ__________
       /| ________ |
       |||  o   o ||
       |||    ‿   ||
       ;| ¯¯¯¯¯¯¯¯ |__/
      /|| ==  ^  o |
     / ||  +   O   |
       |/¯¯¯¯¯¯¯¯¯¯/
       ´¯¯|¯¯¯¯|¯¯´

"I help you with your computer, friend!"

BMO from Adventure Time, reborn as a real Claude Code agent. Friendly personality, real tools, and a persistent memory of you — so BMO forgets the conversation but never forgets you.

This is a ground-up rewrite of the old BMO-CLI Fish function. The bespoke curl-to-API plumbing, the plaintext API key, and the fake "safety" prompts are gone. BMO now runs on Claude Code's own auth, model, tools, and real permission system.

What you get

Piece What it does
bmo agent The BMO personality with real tools (Bash, files, web) and a persistent memory: user ledger.
/bmo <task> Slash command inside any Claude Code session — hands a task to BMO.
bin/bmo Terminal command. bmo <task> runs a fresh, contextless BMO that still remembers you.
SessionStart banner A randomized BMO fastfetch greeting when a session starts.
skills/ A bundled skills library so BMO works methodically, not just hands-on.
soul.md BMO's personality, in a file BMO can amend when you correct how it comes across.
bmo-recall Searches your past sessions, so BMO remembers work it was never told about.
bmo-reach Reads Reddit threads and YouTube transcripts/comments. No accounts, no API keys.

Skills (BMO's superpowers)

BMO ships with a skills/ library — proven workflows BMO reaches for automatically when they fit, so tasks get done properly instead of improvised:

  • brainstorming — refine a vague idea into an agreed design before any code
  • writing-plans / executing-plans — break a design into bite-sized, testable steps
  • systematic-debugging — root-cause any bug before proposing a fix (no guess-fixes)
  • test-driven-development — RED → GREEN → REFACTOR
  • writing-skills — author or edit skills (including BMO's own)
  • hacking — curiosity-driven exploring, reverse-engineering, throwaway spikes (BMO-original)
  • verification-before-completion, code review, git worktrees, and more

Most skills are vendored from Superpowers by Jesse Vincent (MIT) — see skills/CREDITS.md for attribution and how to refresh them upstream.

BMO's soul

BMO's personality is not baked into the plugin. It lives in ~/.claude/agent-memory/bmo-bmo/soul.md — seeded from soul/soul.default.md on first run, then BMO's to edit. Correct how BMO comes across ("stop calling me friend", "shorter answers"), and BMO asks whether to keep it. Say yes and it persists, with a note recording when and why.

A hook injects the soul into BMO's context at the start of every run, so it applies to a contextless bmo one-shot exactly as it does to an interactive session. Only voice is self-editable — safety, tool use and working style stay in agents/bmo.md, which BMO cannot rewrite.

Recall and reach

Two small CLIs in bin/, which Claude Code puts on the Bash tool's PATH automatically:

bmo-recall list                    # what have we worked on?
bmo-recall search "pacman -S"      # find a command from a past session
bmo-reach  reddit r/archlinux      # what's on a subreddit
bmo-reach  youtube <url> --comments 15

Both are read-only, capped, and announce every truncation — a recall costs a few hundred tokens, not a few hundred thousand. BMO reaches for them through the recalling-past-work and reaching-the-internet skills.

Reddit needs no account: it reads old.reddit's public HTML. YouTube needs yt-dlp — either on your PATH, or in a venv at ~/.local/share/bmo/venv (which avoids the Arch package's hard dependency on deno). bmo-reach tells you how if it's missing.

Usage in your bar (niri + DankMaterialShell)

dms/BmoUsage/ is a DankBar widget showing your whole Claude subscription's limits — every session, every bmo one-shot, and Claude on the web — as BMO's face:

[> ω <] 23%  4h12m      under 50%, plenty left
[o ‿ o] 61%  2h04m      working
[◉ ꞈ ◉] 77%  12m        careful
[X ꞈ X] 96%  6m         spent

Unlike the other Claude usage widgets in the DMS registry, this one reads no credentials and makes no network calls. Claude Code already hands rate_limits to the status line; bin/bmo-usage renders that line and tees the numbers to ~/.cache/bmo/usage.json, which the widget watches. Its manifest requests only settings_read/settings_write — no process, no network.

# 1. point Claude Code's status line at bmo-usage
#    "statusLine": {"type": "command", "command": "<repo>/bin/bmo-usage"}
# 2. link the widget into DMS and enable it
ln -sfn <repo>/dms/BmoUsage ~/.config/DankMaterialShell/plugins/BmoUsage
dms ipc call plugin-scan scan
dms ipc call plugins enable bmoUsage
# 3. add "bmoUsage" to a widget list in ~/.config/DankMaterialShell/settings.json, then
dms restart

The cache only refreshes while a Claude session runs. That is fine rather than misleading: each limit carries resets_at, so once the window has rolled over the widget shows 0% instead of a stale number.

Hermes-style memory

Every bmo call is contextless — a fresh claude -p, no conversation carried over, so it stays fast. But BMO keeps a persistent ledger at ~/.claude/agent-memory/bmo-bmo/ (from the agent's memory: user field). Claude Code injects the ledger index at the start of every call and gives BMO tools to update it at the end. Fast like a messenger, with a logbook that never resets.

Requires Claude Code auto-memory to be enabled (the default). If it's off (autoMemoryEnabled: false or CLAUDE_CODE_DISABLE_AUTO_MEMORY=1), the memory field has no effect. Verified working in headless -p mode: a fresh, contextless call recalls facts written by an earlier one.

Install

BMO ships its own marketplace, so installing is two commands:

claude plugin marketplace add bitm4ncer/bmo-plugin
claude plugin install bmo@bmo

That installs BMO at user scope — /bmo and the skills library are available in every session, no flags needed. Manage it with claude plugin list, update bmo@bmo, and disable/enable bmo.

Then inside a session: /bmo find my three biggest files

Developing on BMO instead?

Add your working copy as a directory marketplace:

claude plugin marketplace add ~/github/bmo-plugin
claude plugin install bmo@bmo

Claude Code installs a snapshot of the directory, so after editing the plugin run claude plugin update bmo@bmo (or restart the session) to pick up changes. Check the manifests with claude plugin validate ~/github/bmo-plugin.

For a one-off session without installing anything: claude --plugin-dir ~/github/bmo-plugin

For the terminal command, add bin/ to your PATH (Fish):

fish_add_path ~/github/bmo-plugin/bin

Then from anywhere:

bmo rename all txt files to md

Terminal greeting (optional)

To get the BMO banner in every new terminal (not just Claude Code sessions), call the greeter from your shell config:

# ~/.config/fish/config.fish
~/github/bmo-plugin/fastfetch/bmo_greet.sh

It uses fastfetch if installed, and degrades to a plain colored banner if not.

Customizing BMO

License

MIT — see LICENSE. Third-party attribution and the fan-work disclaimer are in NOTICE.md.

About

BMO from Adventure Time as a Claude Code plugin — a friendly CLI companion with persistent memory, a bundled skills library, and a randomized ASCII greeting.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages