Skip to main content

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.

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.14.0.tar.gz (94.4 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.14.0-py3-none-any.whl (92.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: termtap-0.14.0.tar.gz
  • Upload date:
  • Size: 94.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","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.14.0.tar.gz
Algorithm Hash digest
SHA256 93dee93f7039e6fea8054205d6b33022e7a273139e7957e25f827213ec9bbbad
MD5 4aedb64b042aa4390f6d7b483f21e9c2
BLAKE2b-256 d51f2565c9e1c890601dc086d1766349bf869e8912c8d6d84a5431f81431405b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: termtap-0.14.0-py3-none-any.whl
  • Upload date:
  • Size: 92.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","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.14.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4d30ab1f65a4a28ecf0d570bbc688e1c663ad38cb30e52f85508b21335a4f602
MD5 50cb5a3d1300f0e1a65f214f8532dce0
BLAKE2b-256 b29a2ee7a6416860ca1d3854127de1e22e5d30aed9a2a3c1c2869e2621979976

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 Sentry Error logging StatusPage Status page