@hellix-ai/cubes
v0.3.0
Published
The Cubes command line: your Cubes sessions in your own terminal (attach, a split view of all of them, image paste, clipboard, tab status and notifications), and Claude Code conversations moved between your computer and Cubes (import, export).
Maintainers
Readme
cubes
The Cubes command line. Work in your Cubes sessions from your own terminal
(Warp, iTerm2, Ghostty, Terminal.app, anything) with your own font, colors and keyboard shortcuts: attach
to one, or keep all of them in a split view, with image paste, your clipboard, and a tab that tells you
when a session needs you. And move Claude Code conversations between your computer and Cubes: import
one into a new session, or export a session's conversation to continue it here with claude --resume.
npm install -g @hellix-ai/cubes # needs Node.js 22.4+
cubes login --host cubes.hellix.ai # prints a code; approve it in the browser
cubes ls # sessions, under a heading per group (--mine, --live)
cubes attach # pick a running one
cubes attach 7ff4 # or name one: an id prefix, or part of its title
cubes import # continue one of your local Claude Code conversations in Cubes
cubes export 7ff4 # bring a session's conversation here (then claude --resume)No install: npx @hellix-ai/cubes attach <session>. Later, cubes upgrade updates it in place.
The split view
Run cubes on its own for everything at once: your sessions on the left, one of them open on the right.
It runs inside its own tmux (install it with brew install tmux or apt install tmux; a tmux you already
use is never touched), so close the terminal and run cubes again to land right back where you were.
- The list is grouped like the web's Sessions page, with a session's spawned sessions nested under it and a coloured dot for its state: working, idle, needs you, starting, ended.
- Above the session, a header says which one it is: name · group · runner · state.
- Browsing:
⏎(or a click) shows a session on the right and leaves you in the list, so↑↓and⏎again show the next one. F1switches between the list and the session, from either side. It is the one single key Claude Code does not use (in a session every other key,Ctrl-]included, goes to Claude). On a MacBook the top row sends it withfnheld, unless Use F1, F2, etc. keys as standard function keys is on. From the list,⏎on the session already showing (orTab) goes in too, and a click on either side moves you there.- Other keys:
llive only ·mmine only ·/find ·←→fold a session's children ·qquits (sessions keep running).
While attached
Every key goes to the session, exactly as if Claude Code were running locally, except:
| key | does |
| --- | --- |
| Ctrl-] | detach. The session keeps running. |
| Ctrl-V | paste the image on your clipboard: it is uploaded to the session and its path typed in (macOS, and Linux with wl-paste or xclip). With no image on the clipboard, Ctrl-V goes through unchanged. |
Copying. Drag over text in a session and it is copied the moment you let go - the session's tmux
does the selecting (so there is no selection left for Cmd+C), and the CLI puts the text on your
clipboard. Claude Code's own copy (the c on its login URL) lands there too. On Linux this needs
wl-copy, xclip or xsel.
One keyboard per session. Attaching takes the keyboard from any browser tab open on the same session
(that tab becomes read-only, with a Take over button) and fits the session to your window. If someone
takes it back, the terminal says so and goes read-only; detach and attach again to reclaim it.
cubes attach --view watches without taking it.
Your tab shows the session. The terminal tab is titled after the session, with its state in front,
the way Claude Code does it locally (minus the animation): ● while it works, ✳ when idle, ✋ when it is waiting
for you. The moment it starts waiting, the terminal also gets a bell (most terminals mark the tab or
bounce the dock) and a desktop notification with Claude's question (iTerm2, Ghostty, WezTerm, kitty and
others). In Warp, the same events Warp's own Claude Code plugin sends drive its tab status and
notifications instead. Muted sessions stay quiet. Your own title comes back when you detach.
--no-status turns all of it off.
A stopped or hibernated session is resumed before attaching (--no-resume to refuse), with the
spinning Cubes mark on screen until it is up. If the connection drops, nothing reconnects behind your
back: you are told why (the connection dropped, the session's machine stopped answering, too many
viewers) and r reconnects when you choose to.
Scrollback lives in the session's tmux: scroll with the mouse wheel or trackpad (tmux copy-mode), not your terminal's own scrollback.
Moving a conversation between your computer and Cubes
cubes import starts a Cubes session that continues a Claude Code conversation from this computer.
cubes import # pick one of your recent conversations (this directory's first)
cubes import 0f3c1d52 # or name it: its id, the start of it, or the path to its .jsonlIt asks which org (if you are in more than one), then everything the web's New session dialog asks:
title, group, repositories, a cube to start from, agents, model, runner, Remote Control and extra
claude arguments, with the same defaults and the same rules (a group pre-selects its repositories, an
agent that declares a model decides it). The repository your conversation's checkout points at is
pre-selected. Then it uploads the conversation, starts the session continuing it, and offers to attach.
Any question can be answered up front, so it also works in a script:
cubes import 0f3c1d52 --yes --title "importer, continued" --repo acme/api --runner k3s --no-rc--title, --group, --repo (repeatable), --cube and --input name=value (repeatable), --agent
(repeatable), --model (or default), --runner, --rc / --no-rc, --cli-args="...", plus
--package ID, --mcp-config FILE and --hooks FILE, which the dialog does not offer. --yes takes
the default for anything not given.
cubes export copies a session's conversation onto this computer, where claude --resume finds it.
cd ~/code/api
cubes export 7ff4 # then: claude --resume <id>, as printed
cubes export 7ff4 --dir ~/code/apiIt is filed under ~/.claude/projects (or $CLAUDE_CONFIG_DIR) for the directory you run it in, or
--dir. Exporting again brings your copy up to date; if you have continued it locally since, it is not
replaced unless you pass --force. A stopped session on a cluster runner keeps its conversation on its
own machine, so it is resumed first (you are asked).
Only the conversation travels, in both directions. An imported session checks its repositories out fresh on its runner, and an export does not bring the session's files: push them from the session and pull them here.
Commands
cubes # the split view
cubes login [--host URL] [--org ALIAS] [--no-browser]
cubes logout
cubes whoami
cubes org [ALIAS]
cubes ls [--mine] [--live] [--all] [--json]
cubes attach [SESSION] [--view] [--no-resume] [--no-status]
cubes import [CONVERSATION] [--yes] [--attach | --no-attach] [form flags]
cubes export [SESSION] [--dir DIR] [--force]
cubes upgrade [--check]cubes ls lists sessions the way the web's Sessions page does: a section per package, then per group
(A-Z), then Ungrouped, live ones first in each. --mine keeps the ones you started, --live the ones
running now; they combine. --all adds sessions other sessions spawned; --json prints the rows.
--org ALIAS works on any command. If you belong to several organizations, cubes org lists them and
cubes org <alias> changes the default.
Sign-in
cubes login uses the OAuth device flow against your Cubes install's own sign-in: the CLI never sees your
password. The login is stored in ~/.config/cubes/config.json (mode 0600) and lasts until you
cubes logout, which revokes it, or until it goes unused for 30 days.
For scripts and CI, skip the stored login: set CUBES_HOST, CUBES_TOKEN (an access token) and
optionally CUBES_ORG.
