home / skills / serejaris / ris-claude-code / 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-orchestrationReview the files below or copy the command above to add this skill to your agents.
---
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
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.
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.
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.