4.5 KiB
AGENTS.md
This file provides guidance to AI Agents when working with code in this repository.
Project Overview
Tmuxifier is a shell-based tool for creating and managing complex Tmux session and window layouts. Users write layout files as shell scripts that use tmux commands and helper functions to define session/window configurations.
Architecture
Core Components
- bin/tmuxifier: Main executable that bootstraps the environment, validates Tmux version (≥1.6), and dispatches to libexec commands
- libexec/: Command implementations (tmuxifier-*, e.g., tmuxifier-load-session, tmuxifier-new-window)
- lib/layout-helpers.sh: Helper functions available within layout files (new_window, split_v, split_h, run_cmd, select_pane, etc.)
- lib/runtime.sh: Runtime environment loader sourced by layout files
- lib/env.sh: Sets up TMUXIFIER_LAYOUT_PATH (defaults to $TMUXIFIER/layouts)
- templates/: Templates for new session.sh and window.sh layout files
- examples/: Example layout files demonstrating usage
Layout File Types
Session layouts (*.session.sh):
- Define entire Tmux sessions with multiple windows
- Must call
initialize_sessionto create the session - Can load window layouts via
load_windowor define windows inline - Must call
finalize_and_go_to_sessionat the end - Can set
session_rootfor default directory
Window layouts (*.window.sh):
- Define single window configurations with panes
- Loaded into existing sessions or from session layouts
- Can set
window_rootfor window-specific directory - Use helper functions to split panes and run commands
Key Concepts
- Layout files are executed as shell scripts with lib/layout-helpers.sh sourced
- Helper functions wrap tmux commands, managing session/window context
- The
tmuxcommand itself is aliased to tmuxifier-tmux wrapper - Session creation moves default window to position 999, then kills it in finalize_and_go_to_session
- TMUXIFIER_TMUX_OPTS allows passing custom arguments to tmux
Development Commands
Testing
Tests use bashunit framework. Use deepwiki MCP tool to lookup bashunit documentation if needed.
make test # Run all tests
make test FILE=tests/lib/util/foo_test.sh # Run a single test file
make bootstrap # Fetch test dependencies
Tests are located in tests/ directory and follow bashunit conventions. Test
files are named *_test.sh.
Legacy tests in test-legacy/ use test-runner.sh framework with assert.sh and
stub.sh libraries. Run with make test-legacy.
Manual Testing
# Create and load a test window layout
./bin/tmuxifier new-window test-window
./bin/tmuxifier load-window test-window
# Create and load a test session layout
./bin/tmuxifier new-session test-session
./bin/tmuxifier load-session test-session
# List available layouts
./bin/tmuxifier list-sessions
./bin/tmuxifier list-windows
Code Style
- Shell scripts follow Bash conventions
- 2-space indentation
- Functions document arguments in comments
- Use local variables for function scope
- Prefer
[ ]over[[ ]]for basic tests - Command substitution uses
$()not backticks
Important Implementation Details
Helper Function Pattern
Helper functions in lib/layout-helpers.sh follow this pattern:
function_name() {
# Parse optional arguments
if [ -n "$1" ]; then local arg=(-flag "$1"); fi
# Execute tmux command with session/window context
tmuxifier-tmux command -t "$session:$window" "${arg[@]}"
# Update state if needed
__go_to_window_or_session_path
}
Tmux Version Handling
Code must support Tmux 1.6+. Version-specific behavior uses tmuxifier-tmux-version comparisons:
if [ "$(tmuxifier-tmux-version "1.9")" == "<" ]; then
# Tmux 1.8 and earlier
else
# Tmux 1.9 and later
fi
Path Expansion
Use __expand_path to handle ~ and variables in paths:
session_root() {
local dir="$(__expand_path $@)"
if [ -d "$dir" ]; then
session_root="$dir"
fi
}
Environment Variables
- TMUXIFIER: Set to installation directory (auto-detected from bin location)
- TMUXIFIER_LAYOUT_PATH: Custom layouts directory (default: $TMUXIFIER/layouts)
- TMUXIFIER_TMUX_OPTS: Custom arguments passed to tmux
- TMUXIFIER_TMUX_ITERM_ATTACH: Set to "-CC" for iTerm2 integration
- TMUXIFIER_NO_COMPLETE: Disable shell completion if set
- TMUXIFIER_MIN_TMUX_VERSION: Minimum required Tmux version (1.6)