feat(presets): add TOML preset loader with validation

- Convert presets from YAML to TOML format (no external dep)
- Add DEFAULT_PRESET fallback for graceful degradation
- Add validate_preset() for preset validation
- Add validate_signal_path() for circular dependency detection
- Add generate_preset_toml() for skeleton generation
- Use tomllib (Python 3.11+ stdlib)
This commit is contained in:
2026-03-16 13:55:58 -07:00
parent 2e96b7cd83
commit 997bffab68
2 changed files with 330 additions and 0 deletions

106
presets.toml Normal file
View File

@@ -0,0 +1,106 @@
# Mainline Presets Configuration
# Human- and machine-readable preset definitions
#
# Format: TOML
# Usage: mainline --preset <name>
#
# Built-in presets can be overridden by user presets in:
# - ~/.config/mainline/presets.toml
# - ./presets.toml (local override)
[presets.demo]
description = "Demo mode with effect cycling and camera modes"
source = "headlines"
display = "pygame"
camera = "vertical"
effects = ["noise", "fade", "glitch", "firehose", "hud"]
viewport_width = 80
viewport_height = 24
camera_speed = 1.0
firehose_enabled = true
[presets.poetry]
description = "Poetry feed with subtle effects"
source = "poetry"
display = "pygame"
camera = "vertical"
effects = ["fade", "hud"]
viewport_width = 80
viewport_height = 24
camera_speed = 0.5
firehose_enabled = false
[presets.pipeline]
description = "Pipeline visualization mode"
source = "pipeline"
display = "terminal"
camera = "trace"
effects = ["hud"]
viewport_width = 80
viewport_height = 24
camera_speed = 1.0
firehose_enabled = false
[presets.websocket]
description = "WebSocket display mode"
source = "headlines"
display = "websocket"
camera = "vertical"
effects = ["noise", "fade", "glitch", "hud"]
viewport_width = 80
viewport_height = 24
camera_speed = 1.0
firehose_enabled = false
[presets.sixel]
description = "Sixel graphics display mode"
source = "headlines"
display = "sixel"
camera = "vertical"
effects = ["noise", "fade", "glitch", "hud"]
viewport_width = 80
viewport_height = 24
camera_speed = 1.0
firehose_enabled = false
[presets.firehose]
description = "High-speed firehose mode"
source = "headlines"
display = "pygame"
camera = "vertical"
effects = ["noise", "fade", "glitch", "firehose", "hud"]
viewport_width = 80
viewport_height = 24
camera_speed = 2.0
firehose_enabled = true
# Sensor configuration (for future use with param bindings)
[sensors.mic]
enabled = false
threshold_db = 50.0
[sensors.oscillator]
enabled = false
waveform = "sine"
frequency = 1.0
# Effect configurations
[effect_configs.noise]
enabled = true
intensity = 1.0
[effect_configs.fade]
enabled = true
intensity = 1.0
[effect_configs.glitch]
enabled = true
intensity = 0.5
[effect_configs.firehose]
enabled = true
intensity = 1.0
[effect_configs.hud]
enabled = true
intensity = 1.0