Skip to main content

Daemon-based tmux pane manager with learning patterns

Project description

termtap

Execute commands in tmux panes with intelligent state detection via pattern learning.

Features

  • 🤖 Pattern Learning - Teach termtap process states (ready/busy) interactively
  • 🎯 Smart Execution - Commands wait for processes to be ready before sending
  • 🖥️ Companion UI - Visual pattern editor and queue management
  • 📡 Daemon Architecture - Background process with RPC communication
  • 🔌 MCP Support - Tools and resources for Claude/LLMs
  • 📦 Terminal Emulation - Precise output capture with tmux streaming

Prerequisites

Required system dependencies:

  • tmux - Terminal multiplexer
  • gum - Interactive terminal UI components (for pattern editing)
# macOS
brew install tmux gum

# Arch Linux
sudo pacman -S tmux gum

# Ubuntu/Debian
sudo apt install tmux
# For gum: https://github.com/charmbracelet/gum#installation

Installation

# Install via uv tool (recommended)
uv tool install termtap

# Or with pipx
pipx install termtap

# Update to latest
uv tool upgrade termtap

Quick Start

1. Start Daemon

termtap daemon start

2. Launch Companion UI (optional but recommended)

termtap companion

The companion provides:

  • Pattern editor with live preview
  • Queue viewer for pending actions
  • Pane selector for interactive workflows

3. Run REPL

termtap

4. Execute Commands

>>> execute("python3")
# First time: Companion asks if process is ready
# You teach the pattern once, termtap learns it
>>> pane()  # View output

MCP Setup for Claude

# Quick setup with Claude CLI
claude mcp add termtap -- termtap --mcp

# Or manually edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
  "mcpServers": {
    "termtap": {
      "command": "termtap",
      "args": ["--mcp"]
    }
  }
}

Commands

Command Description
execute(command, target=None) Run command in tmux pane, wait for ready state
pane(target=None, offset=0, limit=100) Read pane output with pagination
ls(filter=None) List tmux sessions
interrupt(target=None) Send Ctrl+C to pane
send_keystrokes(keys, target=None) Send raw keystrokes (for interactive programs)
debug(code) Inspect daemon state (Python expressions)

Pattern Learning Workflow

First Time Execution

>>> execute("python3")
# Companion shows: "Is this process ready? (y/n)"
# You press 'y' and mark the pattern: ">>> "

Pattern Storage

Patterns are saved to ~/.termtap/patterns.json:

{
  "python": {
    "ready": [">>> ", "\\.\\.\\. "]
  }
}

Subsequent Executions

>>> execute("print('hello')")
# Automatically waits for ">>> " pattern
# Executes immediately when ready

Architecture

Components

  • Daemon (termtap daemon) - Background process managing pane state
  • Client - RPC client in REPL/MCP mode
  • Companion (termtap companion) - Textual UI for pattern management
  • Terminal Emulator - SlimScreen with pyte for output capture

Action Lifecycle

  1. SELECTING_PANE - Choose target pane (if not specified)
  2. READY_CHECK - Check if process matches learned patterns
  3. WATCHING - Command sent, waiting for completion
  4. COMPLETED - Process returned to ready state

Pattern Matching

Process Output          Pattern           State
----------------       --------          -------
>>> _                  >>> $             ready
...                    \.\.\. $          ready
Executing...           (any)             busy

Development

# Clone repository
git clone https://github.com/angelsen/tap-tools
cd tap-tools/packages/termtap

# Install for development
uv sync

# Run checks
basedpyright          # Type checking
ruff check --fix      # Linting

# Run development version
uv run termtap

# Stop daemon
termtap daemon stop

Troubleshooting

Daemon not responding

termtap daemon status   # Check daemon state
termtap daemon stop     # Stop daemon
termtap daemon start    # Restart

Pattern not matching

termtap companion       # Open companion UI
# Navigate to Patterns → Edit pattern → Test with preview

Stuck in READY_CHECK

  • Open companion UI
  • Queue tab shows pending actions
  • Mark pattern as ready/busy or cancel action

License

MIT - see LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

termtap-0.13.1.tar.gz (87.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

termtap-0.13.1-py3-none-any.whl (90.4 kB view details)

Uploaded Python 3

File details

Details for the file termtap-0.13.1.tar.gz.

File metadata

  • Download URL: termtap-0.13.1.tar.gz
  • Upload date:
  • Size: 87.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"EndeavourOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for termtap-0.13.1.tar.gz
Algorithm Hash digest
SHA256 a56498e2adfe275d721cec5f962e952df3113984a95c21601d23eb608505a6e1
MD5 f0c2103be68e9e39d1190e1d838c59b3
BLAKE2b-256 414e1cd8d48d36048565b08a6b9426a36db19a0f59360fef31c7a77c10fef4ec

See more details on using hashes here.

File details

Details for the file termtap-0.13.1-py3-none-any.whl.

File metadata

  • Download URL: termtap-0.13.1-py3-none-any.whl
  • Upload date:
  • Size: 90.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"EndeavourOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for termtap-0.13.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a7bb4a723b374acb10e2cd308bcd48859917961c4c3434f5a793e19023c8eb20
MD5 65f38dfb2657ff5bcd036ac02fcbe7ec
BLAKE2b-256 396dbfe26e88ef2ae69f817bd32a16162680fdaf1b588e16f6139caa053844ba

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page