Packages
Multi-surface application runtime for Elixir. One TEA module renders to terminal, browser (LiveView), SSH, and MCP (agents). 30+ widgets, flexbox + CSS grid, AI agent runtime, distributed swarm with CRDTs, time-travel debugging, session recording, sandboxed REPL, and agentic commerce.
Current section
Files
Jump to
Current section
Files
docs/adr/0011-terminal-module-consolidation.md
# ADR-0011: Terminal Module Consolidation
## Status
Implemented
## Context
The terminal subsystem had accumulated significant technical debt through organic growth:
1. **Duplicate Formatting Modules**: Multiple modules providing overlapping formatting functionality:
- `Raxol.Terminal.FormattingManager`
- `Raxol.Terminal.Formatting.FormattingManager`
- Various inline formatting helpers
2. **Redundant Mode Managers**: Several mode management implementations:
- `Raxol.Terminal.Mode.ModeManager`
- `Raxol.Terminal.Modes.ModeStateManager`
- `Raxol.Terminal.Cursor.OptimizedCursorManager`
3. **Unused Screen Buffer Modules**: 11 screen_buffer modules with minimal or no usage:
- `cloud.ex`, `csi.ex`, `file_watcher.ex`, `metrics.ex`, `mode.ex`
- `output.ex`, `preferences.ex`, `scroll.ex`, `system.ex`, `theme.ex`, `visualizer.ex`
4. **Scattered Caching Logic**: No unified caching strategy across terminal operations
This fragmentation led to:
- Confusion about which module to use for what purpose
- Duplicate code paths with subtle behavioral differences
- Increased maintenance burden
- Difficulty onboarding new contributors
## Decision
Consolidate terminal modules into a smaller set of well-defined, single-responsibility modules:
### 1. Unified Formatting Module
Create `Raxol.Terminal.Format` as the single source of truth for all text formatting:
```elixir
defmodule Raxol.Terminal.Format do
# All formatting functions consolidated here
def bold(text), do: ...
def italic(text), do: ...
def color(text, fg, bg \\ nil), do: ...
def style(text, opts), do: ...
end
```
### 2. Unified Caching Layer
Create `Raxol.Performance.Cache` for all caching needs:
```elixir
defmodule Raxol.Performance.Cache do
# ETS-backed caching with TTL support
def get(key), do: ...
def put(key, value, opts \\ []), do: ...
def invalidate(key), do: ...
def clear(), do: ...
end
```
### 3. Deprecate Redundant Modules
Mark 16 modules as deprecated with clear migration paths:
**Formatting (2 modules)**:
- `Raxol.Terminal.FormattingManager` -> Use `Raxol.Terminal.Format`
- `Raxol.Terminal.Formatting.FormattingManager` -> Use `Raxol.Terminal.Format`
**Mode Management (3 modules)**:
- `Raxol.Terminal.Mode.ModeManager` -> Use existing mode handling in emulator
- `Raxol.Terminal.Modes.ModeStateManager` -> Use existing mode handling
- `Raxol.Terminal.Cursor.OptimizedCursorManager` -> Use `Raxol.Terminal.Cursor`
**Screen Buffer (11 modules)**:
- All `screen_buffer/*.ex` modules deprecated as unused stubs
### 4. Preserve GenServer Efficiency
The audit confirmed existing GenServers (ConfigServer, MetricsCollector) already use ETS backing efficiently. No changes needed to process architecture.
## Implementation
### New Modules Created
- `lib/raxol/terminal/format.ex` - Unified formatting
- `lib/raxol/performance/cache.ex` - Unified caching
### Modules Deprecated
Each deprecated module received a `@moduledoc` update:
```elixir
@moduledoc """
DEPRECATED: This module is deprecated. Use Raxol.Terminal.Format instead.
This module remains for backwards compatibility but will be removed in v3.0.
"""
```
### Migration Strategy
- Phase 1: Create new consolidated modules (complete)
- Phase 2: Add deprecation notices to old modules (complete)
- Phase 3: Update internal callers to use new modules (in progress)
- Phase 4: Remove deprecated modules in v3.0 (future)
## Consequences
### Positive
- **Clarity**: Single module for each concern eliminates confusion
- **Maintainability**: 16 fewer modules to maintain
- **Onboarding**: Clearer architecture for new contributors
- **Performance**: Unified caching layer enables better optimization
- **Testing**: Fewer code paths means more focused test coverage
### Negative
- **Breaking Changes**: Callers of deprecated modules need updates
- **Deprecation Period**: Must maintain deprecated modules until v3.0
### Mitigation
- Deprecation warnings guide users to new modules
- Old modules continue to work during transition
- Clear migration documentation in module docs
## Validation
### Metrics
- **Modules Consolidated**: 16 deprecated, 2 new created
- **Lines of Code**: Net reduction of ~500 lines
- **Test Coverage**: All new modules have comprehensive tests
- **Compile Warnings**: Zero warnings from consolidation
### Technical Validation
- All existing tests continue to pass
- New modules have 100% function coverage
- Performance benchmarks show no regression
## References
- [Terminal Format Module](../../lib/raxol/terminal/format.ex)
- [Performance Cache Module](../../lib/raxol/performance/cache.ex)
- [ADR-0003: Terminal Emulation Strategy](0003-terminal-emulation-strategy.md)
---
**Decision Date**: 2025-02-27
**Implementation Completed**: 2025-02-27
**Impact**: Reduced terminal subsystem complexity and maintenance burden