home / skills / serejaris / ris-claude-code / gemini-tmux-orchestration

gemini-tmux-orchestration skill

/skills/gemini-tmux-orchestration

This skill orchestrates Gemini operations via tmux to enable parallel execution and large context, boosting task throughput and control.

npx playbooks add skill serejaris/ris-claude-code --skill gemini-tmux-orchestration

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

Files (3)
SKILL.md
3.2 KB
---
name: gemini-tmux-orchestration
description: Use when delegating coding tasks to Gemini CLI agent, when you need parallel AI execution, or when tasks benefit from Gemini's 1M+ context window - orchestrates Gemini via tmux since headless mode cannot write files
---

# Gemini CLI Orchestration via tmux

## Overview

Gemini CLI in headless mode (`-p`) cannot execute shell commands or write files. Use **tmux send-keys** to control Gemini interactively while monitoring via **capture-pane**.

## Quick Reference

| Action | Command |
|--------|---------|
| Start (split pane) | `tmux split-window -h -d "cd PROJECT && gemini --yolo"` |
| Start (session) | `tmux new-session -d -s gemini -x 200 -y 50` |
| Send text | `tmux send-keys -t {right} 'task text'` |
| Send Enter | `tmux send-keys -t {right} Enter` |
| Check output | `tmux capture-pane -t {right} -p -S -100` |
| Clear input | `tmux send-keys -t {right} Escape Escape` |
| Kill pane | `tmux kill-pane -t {right}` |
| Kill session | `tmux kill-session -t gemini` |

Target: `{right}` for split pane, `gemini` for named session.

## Status Markers

Detect Gemini state by grepping capture-pane output:

| Marker | State |
|--------|-------|
| `Type your message` | Idle, ready for input |
| `esc to cancel` | Working on task |
| `✓ built` / `✓ Shell` | Action completed |
| `Found \d+ errors` | Build failed |
| `error TS` | TypeScript error |
| `potential loop` | Needs intervention (send `2` + Enter) |
| `Waiting for auth` | OAuth expired |

## Workflow

```bash
# 1. Start Gemini
tmux split-window -h -d "cd ~/project && gemini --yolo"
sleep 5

# 2. Send task (TWO separate calls - critical!)
tmux send-keys -t {right} 'Build the app per PLAN.md'
tmux send-keys -t {right} Enter

# 3. Poll for completion
while true; do
  output=$(tmux capture-pane -t {right} -p -S -50)

  # Check if idle (task done)
  if echo "$output" | grep -q "Type your message"; then
    break
  fi

  # Handle loop detection
  if echo "$output" | grep -q "potential loop"; then
    tmux send-keys -t {right} '2'
    tmux send-keys -t {right} Enter
  fi

  sleep 10
done

# 4. Check result
tmux capture-pane -t {right} -p -S -200 | tail -100
```

## Common Mistakes

| Mistake | Fix |
|---------|-----|
| `send-keys 'text' Enter` in one call | Enter не регистрируется — отправлять отдельно |
| Chaining: `send-keys && sleep && capture` | Команды утекают в ввод Gemini — separate bash calls |
| Fixed `sleep 60` | Используй polling с маркерами |
| Ignoring loop detection | Gemini зависает — детектить и отправлять `2` |
| Long prompts | Создай `.gemini/commands/task.toml` |

## Custom Commands

Для повторяющихся задач создай `.gemini/commands/`:

```toml
# .gemini/commands/improve-design.toml
[command]
description = "Improve app design"

[[steps]]
prompt = "Improve design: gradients, shadows, animations. Run build when done."
```

Вызов: `tmux send-keys -t {right} '/improve-design'` + Enter

## When NOT to Use

- Read-only analysis → `gemini -p "analyze" --output-format json`
- Simple questions → direct API call
- Need deterministic output → headless with JSON schema

Overview

This skill orchestrates the Gemini CLI agent inside tmux so you can run parallel, interactive AI tasks that need file writes or long context windows. It provides a repeatable workflow for launching Gemini in a split pane or session, sending prompts programmatically, polling output, and handling common failure modes. Use it when headless Gemini cannot perform needed shell actions or persist files.

How this skill works

The skill controls Gemini by automating tmux commands: start a session or split pane running Gemini, send prompt text with tmux send-keys, and capture output with tmux capture-pane. It monitors status markers in the captured output to detect idle, busy, errors, loops, or auth issues and reacts (for example by sending control responses or killing sessions). Polling replaces fixed sleeps to robustly detect completion.

When to use it

  • Delegating coding tasks to a Gemini CLI agent that must run builds, tests, or write files
  • Running multiple Gemini agents in parallel using tmux panes or sessions
  • Leveraging Gemini’s very large context window while still needing interactive shell control
  • Automating long-running or multi-step workflows where headless mode can’t execute shell commands
  • Recovering or intervening when an agent enters loops, build failures, or needs auth refresh

Best practices

  • Always send prompt text and the Enter key in two separate send-keys calls to ensure Enter registers
  • Use polling of capture-pane output with well-defined markers instead of fixed sleep durations
  • Detect and handle 'potential loop' or auth markers automatically to avoid stalls
  • Keep repetitive tasks as custom .gemini/commands/*.toml commands and invoke them via send-keys
  • Isolate each agent in its own tmux pane or named session to simplify capture and cleanup

Example use cases

  • Start a tmux split for Gemini to run a full project build and automatically collect the build log
  • Spawn several Gemini panes to work concurrently on different repo modules and aggregate outputs
  • Ask Gemini to refactor files and write results into the repo where headless mode cannot write
  • Run long-running test suites with automated detection of TypeScript or build errors
  • Recover from a stuck agent by detecting loop prompts and sending the recommended reply

FAQ

Why send Enter separately from the prompt?

Gemini in tmux often ignores Enter when sent in the same send-keys call; two calls ensure the agent receives the input and executes the task.

How do I know when a task is finished?

Poll capture-pane and look for status markers like 'Type your message' for idle or '✓ built' for completion; stop polling when these appear.

What should I do if Gemini starts looping?

Detect 'potential loop' in the pane output and send the recommended control response (commonly '2' + Enter) to break the loop.