gemini-tmux-orchestration

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

$ Installieren

git clone https://github.com/serejaris/ris-claude-code /tmp/ris-claude-code && cp -r /tmp/ris-claude-code/skills/gemini-tmux-orchestration ~/.claude/skills/ris-claude-code

// tip: Run this command in your terminal to install the skill


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

ActionCommand
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 texttmux send-keys -t {right} 'task text'
Send Entertmux send-keys -t {right} Enter
Check outputtmux capture-pane -t {right} -p -S -100
Clear inputtmux send-keys -t {right} Escape Escape
Kill panetmux kill-pane -t {right}
Kill sessiontmux kill-session -t gemini

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

Status Markers

Detect Gemini state by grepping capture-pane output:

MarkerState
Type your messageIdle, ready for input
esc to cancelWorking on task
✓ built / ✓ ShellAction completed
Found \d+ errorsBuild failed
error TSTypeScript error
potential loopNeeds intervention (send 2 + Enter)
Waiting for authOAuth expired

Workflow

# 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

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

Custom Commands

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

# .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