---
name: textual-ui-developer
description: Develop and improve the MassGen Textual TUI by running it in a browser via textual-serve and using Claude's browser tool for visual feedback.
---

# Textual UI Developer

This skill provides a workflow for developing and improving the MassGen Textual TUI with visual feedback.

## Purpose

Use this skill when you need to:
- Debug or improve the Textual TUI display
- Add new widgets or features to the TUI
- Fix styling or layout issues
- Test the TUI visually in a browser

## Setup

### Step 1: Ensure textual-serve is available

The `textual-serve` package should already be installed. If not:

```bash
uv pip install textual-serve
```

### Step 2: Start Claude with Browser Access

Claude Code must be running with Chrome integration:

```bash
claude --chrome
```

### Step 3: Start the Textual TUI Server

Run in background so you can continue working:

```bash
uv run massgen --textual-serve &
```

Or with a specific config:

```bash
uv run massgen --textual-serve --config massgen/configs/basic/three_haiku_default.yaml
```

## Workflow

### Visual Development Loop

1. **Start the server** in background (with optional test prompt):
   ```bash
   # Without prompt (shows welcome screen first)
   uv run massgen --textual-serve &

   # With prompt (auto-submits when launched - faster testing!)
   uv run massgen --textual-serve "What is 2+2?" &
   ```

2. **Open in browser** using browser tools:
   - First call `tabs_context_mcp` to get browser context
   - Navigate to `http://localhost:8000`
   - Click on the landing page card to launch the TUI
   - Wait 2-3 seconds for the app to fully load
   - If you used a prompt, agents will start working immediately!

3. **Take screenshots** at key points:
   - Welcome screen (initial state)
   - After submitting a question (agent panels visible)
   - After agents complete (final state)
   - Modals (press 's', 'o', 'v' to open Status, Events, Votes)

4. **Make changes** to the Textual code:
   - Widget files: `massgen/frontend/displays/textual_widgets/`
   - Main display: `massgen/frontend/displays/textual_terminal_display.py`
   - Themes: `massgen/frontend/displays/textual_themes/`

5. **IMPORTANT - Restart server after changes**:
   CSS and Python changes require restarting the server:
   ```bash
   pkill -f "massgen --textual-serve" && pkill -f "massgen --display textual"
   sleep 2
   uv run massgen --textual-serve &
   ```
   Then open a NEW browser tab to test changes.

### Key Files

| File | Description |
|------|-------------|
| `massgen/frontend/displays/textual_terminal_display.py` | Main Textual app and display logic |
| `massgen/frontend/displays/textual_widgets/` | Custom widgets (tab bar, tool cards, etc.) |
| `massgen/frontend/displays/textual_widgets/tab_bar.py` | Agent tab switching widget |
| `massgen/frontend/displays/textual_widgets/tool_card.py` | Tool call display cards |
| `massgen/frontend/displays/textual_themes/dark.tcss` | Dark theme CSS |
| `massgen/frontend/displays/textual_themes/light.tcss` | Light theme CSS |

### Key Classes in textual_terminal_display.py

| Class | Purpose |
|-------|---------|
| `TextualApp` | Main Textual application, handles compose, keyboard bindings, modals |
| `TextualTerminalDisplay` | Bridge between orchestrator and TextualApp |
| `HeaderWidget` | Top status bar showing agents, turn, question |
| `AgentPanel` | Scrollable panel for agent output with tool cards |
| `WelcomeScreen` | Initial splash screen with logo |
| `BaseModal` | Base class for all modal dialogs |
| `VoteResultsModal`, `OrchestratorEventsModal`, `SystemStatusModal` | Various info modals |

### Commands Reference

```bash
# Start TUI server (default port 8000)
uv run massgen --textual-serve

# Start with a pre-filled prompt (auto-submits when TUI launches!)
uv run massgen --textual-serve "What is 2+2?"

# Start with specific config
uv run massgen --textual-serve --config path/to/config.yaml

# Start with config AND prompt
uv run massgen --textual-serve --config massgen/configs/basic/three_haiku_agents.yaml "Write a haiku"

# Start on different port
uv run massgen --textual-serve --textual-serve-port 9000

# Run TUI directly in terminal (no browser)
uv run massgen --display textual

# Kill all TUI processes
pkill -f "massgen --textual-serve" && pkill -f "massgen --display textual"
```

**Pro tip**: Using `--textual-serve "prompt"` auto-submits the question when you click the landing page card, saving time during iterative testing!

## Keyboard Shortcuts

When the TUI is running:
- `s` - Open System Status modal
- `o` - Open Orchestrator Events modal
- `v` - Open Voting Breakdown modal
- `q` - Quit the application
- `1-9` - Switch to agent by number
- `Tab` / `Shift+Tab` - Cycle through agents
- `Ctrl+P` - Open command palette
- `ESC` - Close modals (may require clicking Close button in browser)

## Tips

1. **Hot reload limitations**: textual-serve spawns new instances per connection, but Python code changes require server restart.

2. **CSS changes**: Both `dark.tcss` and `light.tcss` need updating for theme consistency.

3. **Check the console**: The terminal running textual-serve shows Python errors and tracebacks.

4. **Browser limitations**: Some keyboard shortcuts (like ESC) may not work properly in textual-serve browser mode. The Close button always works.

5. **High CPU warning**: Complex tasks with many tool calls can cause high CPU usage. Use simple test prompts like "What is 2+2?" for quick UI testing.

6. **Test prompts**:
   - Simple: "What is 2+2?" (no tools, fast)
   - With tools: "Create a poem and write it to a file" (uses filesystem tools)
   - Complex: "Search the web for X" (longer running)

7. **Tab switching**: Click directly on agent tabs or use number keys (1, 2, 3...) to switch between agents.

## Common Issues

### Server not reflecting changes
**Solution**: Kill and restart the server, then open a new browser tab.

### ESC key not closing modals
**Cause**: Browser captures ESC before textual-serve.
**Solution**: Click the "Close (ESC)" button instead.

### Agents stuck on "Waiting for agent..."
**Cause**: MCP server initialization can take time.
**Solution**: Wait 5-10 seconds, or check terminal for errors.

### High CPU usage
**Cause**: Complex tool-using tasks or busy loops.
**Solution**: Use `pkill -9 -f "massgen"` to force kill, then restart.

## Textual Resources

- **Textual Docs**: https://textual.textualize.io/
- **Widget Gallery**: https://textual.textualize.io/widget_gallery/
- **CSS Reference**: https://textual.textualize.io/css_types/
- **textual-serve Repo**: https://github.com/Textualize/textual-serve
