home / skills / openclaw / skills / zellij

zellij skill

/skills/jivvei/zellij

This skill enables remote control of zellij interactive sessions by sending keystrokes and scraping pane output to automate CLIs.

npx playbooks add skill openclaw/skills --skill zellij

Review the files below or copy the command above to add this skill to your agents.

Files (6)
SKILL.md
5.3 KB
---
name: zellij
description: Remote-control zellij sessions for interactive CLIs by sending keystrokes and scraping pane output.
homepage: https://zellij.dev
metadata: {"moltbot":{"emoji":"🪟","os":["darwin","linux"],"requires":{"bins":["zellij","jq"]},"install":[{"id":"brew","kind":"brew","formula":"zellij","bins":["zellij"],"label":"Install Zellij (brew)"},{"id":"cargo","kind":"cargo","crate":"zellij","bins":["zellij"],"label":"Install Zellij (Cargo)"}]}}
---

# zellij Skill (Moltbot)

Use zellij only when you need an interactive TTY. Prefer exec background mode for long-running, non-interactive tasks.

## Quickstart (data dir, exec tool)

```bash
DATA_DIR="${CLAWDBOT_ZELLIJ_DATA_DIR:-${TMPDIR:-/tmp}/moltbot-zellij-data}"
mkdir -p "$DATA_DIR"
SESSION=moltbot-python

zellij --data-dir "$DATA_DIR" new-session --session "$SESSION" --layout "default" --detach
zellij --data-dir "$DATA_DIR" run --session "$SESSION" --name repl -- python3 -q
zellij --data-dir "$DATA_DIR" pipe --session "$SESSION" --pane-id 0
```

After starting a session, always print monitor commands:

```
To monitor:
  zellij --data-dir "$DATA_DIR" attach --session "$SESSION"
  zellij --data-dir "$DATA_DIR" pipe --session "$SESSION" --pane-id 0
```

## Data directory convention

- Use `CLAWDBOT_ZELLIJ_DATA_DIR` (default `${TMPDIR:-/tmp}/moltbot-zellij-data`).
- Zellij stores state (sessions, plugins, etc.) in this directory.

## Targeting panes and naming

- Zellij uses `pane-id` (numeric) to target specific panes.
- Find pane IDs: `zellij --data-dir "$DATA_DIR" list-sessions --long` or use `list-panes.sh`.
- Keep session names short; avoid spaces.

## Finding sessions

- List sessions on your data dir: `zellij --data-dir "$DATA_DIR" list-sessions`.
- List sessions across all data dirs: `{baseDir}/scripts/find-sessions.sh --all` (uses `CLAWDBOT_ZELLIJ_DATA_DIR`).

## Sending input safely

- Use `zellij action` to send keystrokes: `zellij --data-dir "$DATA_DIR" action --session "$SESSION" write-chars --chars "$cmd"`.
- Control keys: `zellij --data-dir "$DATA_DIR" action --session "$SESSION" write 2` (Ctrl+C).

## Watching output

- Capture pane output: `zellij --data-dir "$DATA_DIR" pipe --session "$SESSION" --pane-id 0`.
- Wait for prompts: `{baseDir}/scripts/wait-for-text.sh -s "$SESSION" -p 0 -p 'pattern'`.
- Attaching is OK; detach with `Ctrl+p d` (zellij default detach).

## Spawning processes

- For python REPLs, zellij works well with standard `python3 -q`.
- No special flags needed like tmux's `PYTHON_BASIC_REPL=1`.

## Windows / WSL

- zellij is supported on macOS/Linux. On Windows, use WSL and install zellij inside WSL.
- This skill is gated to `darwin`/`linux` and requires `zellij` on PATH.

## Orchestrating Coding Agents (Codex, Claude Code)

zellij excels at running multiple coding agents in parallel:

```bash
DATA_DIR="${TMPDIR:-/tmp}/codex-army-data"

# Create multiple sessions
for i in 1 2 3 4 5; do
  zellij --data-dir "$DATA_DIR" new-session --session "agent-$i" --layout "compact" --detach
done

# Launch agents in different workdirs
zellij --data-dir "$DATA_DIR" action --session "agent-1" write-chars --chars "cd /tmp/project1 && codex --yolo 'Fix bug X'\n"
zellij --data-dir "$DATA_DIR" action --session "agent-2" write-chars --chars "cd /tmp/project2 && codex --yolo 'Fix bug Y'\n"

# Poll for completion (check if prompt returned)
for sess in agent-1 agent-2; do
  pane_id=$(zellij --data-dir "$DATA_DIR" list-sessions --long | grep "\"$sess\"" | jq -r '.tabs[0].panes[0].id')
  if zellij --data-dir "$DATA_DIR" pipe --session "$sess" --pane-id "$pane_id" | grep -q "❯"; then
    echo "$sess: DONE"
  else
    echo "$sess: Running..."
  fi
done

# Get full output from completed session
zellij --data-dir "$DATA_DIR" pipe --session "agent-1" --pane-id 0
```

**Tips:**
- Use separate git worktrees for parallel fixes (no branch conflicts)
- `pnpm install` first before running codex in fresh clones
- Check for shell prompt (`❯` or `$`) to detect completion
- Codex needs `--yolo` or `--full-auto` for non-interactive fixes

## Cleanup

- Kill a session: `zellij --data-dir "$DATA_DIR" delete-session --session "$SESSION"`.
- Kill all sessions on a data dir: use `{baseDir}/scripts/cleanup-sessions.sh "$DATA_DIR"`.

## Zellij vs Tmux Quick Reference

| Task | tmux | zellij |
|------|------|--------|
| List sessions | `list-sessions` | `list-sessions` |
| Create session | `new-session -d` | `new-session --detach` |
| Attach | `attach -t` | `attach --session` |
| Send keys | `send-keys` | `action write-chars` |
| Capture pane | `capture-pane` | `pipe` |
| Kill session | `kill-session` | `delete-session` |
| Detach | `Ctrl+b d` | `Ctrl+p d` |

## Helper: wait-for-text.sh

`{baseDir}/scripts/wait-for-text.sh` polls a pane for a regex (or fixed string) with a timeout.

```bash
{baseDir}/scripts/wait-for-text.sh -s session -p pane-id -r 'pattern' [-F] [-T 20] [-i 0.5]
```

- `-s`/`--session` session name (required)
- `-p`/`--pane-id` pane ID (required)
- `-r`/`--pattern` regex to match (required); add `-F` for fixed string
- `-T` timeout seconds (integer, default 15)
- `-i` poll interval seconds (default 0.5)

## Helper: find-panes.sh

`{baseDir}/scripts/find-panes.sh` lists panes for a given session.

```bash
{baseDir}/scripts/find-panes.sh -s session [-d data-dir]
```

- `-s`/`--session` session name (required)
- `-d`/`--data-dir` zellij data dir (uses `CLAWDBOT_ZELLIJ_DATA_DIR` if not specified)

Overview

This skill lets you remote-control zellij terminal multiplexer sessions: send keystrokes, spawn processes, and scrape pane output for interactive CLIs. It manages a configurable zellij data directory, targets panes by id, and includes helpers to wait for prompts or capture full pane output. Use it when you need programmatic interaction with TTY-based tools and multi-agent workflows.

How this skill works

The skill starts and manages zellij sessions in a specified data directory (defaulting to a temp-based path or CLAWDBOT_ZELLIJ_DATA_DIR). It sends input using zellij action write-chars/write for control keys, captures output via zellij pipe, and discovers panes and sessions with list-sessions and helper scripts. Additional helpers poll panes for text or list panes to automate wait-and-collect patterns.

When to use it

  • Drive interactive REPLs or CLIs that require a real TTY
  • Run and monitor multiple coding agents in parallel (isolated sessions)
  • Capture pane output for scraping logs, prompts, or command results
  • Send complex keystroke sequences or control keys (Ctrl+C, Enter) to a specific pane
  • Automate workflows that need session lifecycle control (create, attach, delete)

Best practices

  • Set CLAWDBOT_ZELLIJ_DATA_DIR or pass an explicit data-dir to isolate state
  • Keep session names short and avoid spaces to simplify discovery
  • Target panes by numeric pane-id; find ids with list-sessions --long or helper scripts
  • Prefer zellij exec/background for non-interactive long jobs; use zellij only for real TTYs
  • Use wait-for-text.sh to detect prompts or completion instead of blind sleeps
  • Kill sessions when done to avoid accumulating state in the data directory

Example use cases

  • Start a python REPL in a detached zellij session and send test commands, then pipe output to capture results
  • Run multiple agent sessions (agent-1..agent-N) each in its own worktree, send task commands, and poll panes for the shell prompt to mark completion
  • Automate an interactive installer by sending keystrokes and waiting for specific prompts with wait-for-text.sh
  • Capture full terminal output from a pane via zellij pipe for post-processing or archival
  • Clean up stale sessions on a data directory with a cleanup script to reclaim resources

FAQ

Which platforms are supported?

This skill targets macOS and Linux; for Windows use WSL and install zellij inside WSL.

How do I send control keys like Ctrl+C?

Use zellij action write with the control key code (example: zellij action --session "$SESSION" write 2 for Ctrl+C) or write-chars for literal characters.