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.0.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.0-py3-none-any.whl (90.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: termtap-0.13.0.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.0.tar.gz
Algorithm Hash digest
SHA256 1eeb509b0a54acb27aa81968f2b7690effde68c83cb15d49fb21632b0c0ac508
MD5 fd40548df37f636d98c725cb69ad89f9
BLAKE2b-256 de0d433af20e1adad2979b77d4b05f9b4f286fc9bd4640a2a29887a4bdcd11aa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: termtap-0.13.0-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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fd3e3ca40ede2aed7ad6b262c3cb19b455d6d4e4926c98f7178387a34462d9b1
MD5 5ce2206531884e7f99b474264dbe339b
BLAKE2b-256 6df5942c4aca49560e723cff035486318483c1be05e7758314fcb844c7969d30

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