Date: 2025-11-18 Version Target: v2.3.0 Status: 🚧 IN PROGRESS - Foundation Complete (Day 1)
Created complete plugin module in midimon-core/src/plugin/:
- ✅
mod.rs- Module exports and documentation - ✅
action_plugin.rs- ActionPlugin trait (335 lines) - ✅
trigger_plugin.rs- TriggerPlugin trait (95 lines, future feature) - ✅
capability.rs- Permission system (160 lines) - ✅
metadata.rs- Plugin metadata structures (150 lines)
Total: ~740 lines of foundation code
pub trait ActionPlugin: Send + Sync {
fn name(&self) -> &str;
fn version(&self) -> &str;
fn description(&self) -> &str;
fn execute(&mut self, params: Value, context: TriggerContext) -> Result<(), Box<dyn Error>>;
fn capabilities(&self) -> Vec<Capability> { vec![] }
fn initialize(&mut self) -> Result<(), Box<dyn Error>> { Ok(()) }
fn shutdown(&mut self) -> Result<(), Box<dyn Error>> { Ok(()) }
}Features:
- Thread-safe with Send + Sync bounds
- TriggerContext includes velocity and mode
- Optional initialize/shutdown lifecycle methods
- Capability-based permission system
- Comprehensive documentation and examples
pub struct TriggerContext {
pub velocity: Option<u8>,
pub current_mode: Option<usize>,
pub timestamp: Instant,
}Helper Methods:
new(),with_velocity(),with_velocity_and_mode()- Default implementation
6 capability types with risk levels:
- Network (Medium risk) - HTTP/HTTPS requests
- Filesystem (High risk) - File read/write
- Audio (Low risk) - Audio device access
- Midi (Low risk) - MIDI send/receive
- Subprocess (High risk) - Process execution
- SystemControl (Medium risk) - System settings
Features:
- Risk level classification (Low, Medium, High)
- Human-readable names and descriptions
- Color coding for UI display
- Serialization support
pub struct PluginMetadata {
pub name: String,
pub version: String,
pub description: String,
pub author: String,
pub homepage: Option<String>,
pub license: String,
pub plugin_type: PluginType,
pub capabilities: Vec<Capability>,
pub binary_path: PathBuf,
pub checksum: String,
pub signature: Option<String>,
pub enabled: bool,
}Features:
- Builder pattern support
- Dangerous capability detection
- Serialization for manifest parsing
Added Action::Plugin variant to midimon-core/src/actions.rs:
Plugin {
plugin: String, // Plugin identifier
params: serde_json::Value, // JSON parameters
}Integration: Seamlessly integrated with existing Action enum
16 unit tests passing (100% pass rate):
- ActionPlugin trait: 4 tests
- TriggerContext: 3 tests
- Capability system: 7 tests
- PluginMetadata: 3 tests
Test Categories:
- Metadata validation
- Plugin execution
- Context creation
- Risk level ordering
- Capability serialization
- Dangerous capability detection
- Added
serde_jsonto workspace dependencies - Updated midimon-core Cargo.toml
- Export plugin module from lib.rs
- Zero compiler warnings
- Zero compilation errors
midimon-core/
└── src/
├── plugin/
│ ├── mod.rs ✅ Module exports
│ ├── action_plugin.rs ✅ ActionPlugin trait
│ ├── trigger_plugin.rs ✅ TriggerPlugin trait (future)
│ ├── capability.rs ✅ Permission system
│ └── metadata.rs ✅ Plugin metadata
├── actions.rs ✅ Updated with Action::Plugin
└── lib.rs ✅ Exports plugin module
File: midimon-core/src/plugin/loader.rs
Requirements:
- Dynamic library loading with
libloadingcrate - Symbol resolution for plugin entry points
- Platform-specific loading (.so/.dylib/.dll)
- Error handling for missing/invalid plugins
- Plugin validation (version compat, required symbols)
Estimated: 1-2 days
File: midimon-daemon/src/plugin_discovery.rs
Requirements:
- Scan
~/.midimon/plugins/directory - Parse
plugin.tomlmanifests - Build plugin registry
- Detect duplicates
- Version conflict resolution
Estimated: 1 day
Define and implement plugin.toml schema:
[plugin]
name = "http_request"
version = "1.0.0"
description = "Make HTTP requests as actions"
author = "MIDIMon Team"
license = "MIT"
type = "action"
binary = "http_request.so"
checksum = "sha256:..."
[plugin.capabilities]
network = trueEstimated: 0.5 days (part of discovery)
File: midimon-daemon/src/plugin_manager.rs
Requirements:
- Install/uninstall plugins
- Enable/disable plugins
- Load plugins on daemon startup
- Initialize plugins (call ActionPlugin::initialize())
- Shutdown plugins gracefully
- Hot-reload support
- Plugin state persistence
Estimated: 2-3 days
Files:
midimon-daemon/src/plugin_security.rsmidimon-daemon/src/plugin_permissions.rs
Requirements:
- Permission system (prompt user for dangerous capabilities)
- SHA256 checksum verification
- Resource limits (timeout, memory monitoring)
- Sandbox execution (if feasible)
Estimated: 1-2 days
File: midimon-daemon/src/action_executor.rs
Requirements:
- Add
Action::Pluginhandling in execute() - Route to PluginManager
- Pass TriggerContext to plugin execute()
- Error handling (log, notify user)
- Integration tests
Estimated: 1-2 days
Directory: plugins/http_request/
Features:
- GET/POST/PUT/DELETE methods
- Custom headers, body, auth
- Timeout configuration
- Tests and README
Estimated: 1-1.5 days
Directory: plugins/spotify/
Features:
- Play/pause/next/previous
- Volume control
- Playlist selection
- OAuth setup guide
Estimated: 1-1.5 days
Directory: plugins/home_automation/
Features:
- MQTT client
- Publish messages
- Home Assistant integration
- Broker configuration
Estimated: 1 day
Files:
midimon-gui/ui/src/lib/components/PluginManagerView.sveltemidimon-gui/ui/src/lib/components/PluginConfigEditor.svelte
Features:
- List installed plugins
- Install plugin (file picker, drag-drop)
- Uninstall plugin (confirmation)
- Enable/disable toggle
- Configure plugin (dynamic form from schema)
Estimated: 2 days
File: midimon-gui/src-tauri/src/commands.rs
Commands to Add:
list_plugins()install_plugin(path: String)uninstall_plugin(name: String)enable_plugin(name: String)get_plugin_config(name: String)save_plugin_config(name: String, config: Value)
Estimated: 1 day
Files:
docs-site/src/guides/using-plugins.mddocs-site/src/configuration/actions.md(update)
Estimated: 0.5 days
Files:
docs-site/src/developers/plugin-guide.mddocs-site/src/developers/action-plugin-api.mddocs-site/src/developers/trigger-plugin-api.mddocs-site/src/developers/plugin-security.md
Estimated: 1 day
Repository: midimon-plugin-template (GitHub)
Contents:
- Minimal ActionPlugin example
- Cargo.toml with dependencies
- Build script
- README with quickstart
Estimated: 0.5 days
- Phase 1: 2 days
- Phase 2: 3 days
- Phase 3: 1 day
- Phase 4: 3 days
- Phase 5: 2 days
- Phase 6: 1.5 days
- Total: 12.5 days (~2.5 weeks)
- Phase 1: 3 days
- Phase 2: 4 days
- Phase 3: 2 days
- Phase 4: 4 days
- Phase 5: 3 days
- Phase 6: 2 days
- Total: 18 days (~3.5 weeks)
- Add 20% buffer: 21.6 days (~4.5 weeks)
- Target: v2.3.0 release in 4-5 weeks from today
- ✅ ActionPlugin trait design (complete, well-tested)
- ✅ Capability system (complete, straightforward)
- ✅ Plugin metadata (complete, serializable)
- ⏳ Dynamic library loading (platform differences)
- ⏳ Plugin discovery (file system edge cases)
- ⏳ UI complexity (dynamic form generation)
- ⏳ Plugin security (sandboxing feasibility)
- ⏳ Performance overhead (lazy loading strategy)
- ⏳ API stability (breaking changes impact)
- Plugin API implemented and tested (85%+ coverage)
- ActionPlugin trait complete and tested
- Plugin loader with dynamic loading
- Plugin discovery system
- 3 example plugins (HTTP, Spotify, Home Automation)
- Plugin Manager UI functional
- Developer documentation complete
- Plugin template project available
- All workspace tests passing (100%)
- Zero regressions from v2.2
- Foundation: ✅ 100% (Plugin traits, capabilities, metadata)
- Loading: ⏳ 0% (Next task)
- Management: ⏳ 0%
- Integration: ⏳ 5% (Action enum updated)
- Examples: ⏳ 0%
- GUI: ⏳ 0%
- Documentation: ⏳ 0%
Overall Progress: ~15% complete
- Production: ~740 lines (plugin module)
- Tests: ~200 lines (16 tests)
- Total: ~940 lines
- Plugin Module: 16/16 tests passing (100%)
- Workspace: Pending full test run
- Compilation: ✅ Success
- Warnings: 0
- Errors: 0
- Implement plugin loader with
libloading - Add platform-specific loading logic
- Write tests for plugin loading
- Start plugin discovery system
- Complete plugin discovery
- Implement manifest parsing
- Build plugin registry
- Start PluginManager implementation
libloading- Dynamic library loadingsha2- SHA256 checksum verificationreqwest- HTTP plugin (example)rspotify- Spotify plugin (example)rumqttc- MQTT plugin (example)
- ✅ v2.2.0 release and validation (COMPLETE)
- ⏳ v2.4 Profile Marketplace (plugins should be shareable)
-
TriggerContext without Serialize/Deserialize:
Instantdoesn't impl Default, so we removed derives and made TriggerContext non-serializable. This is fine since it's only passed in-process. -
Capability-Based Permissions: Using enum instead of string flags for type safety and better error messages.
-
Plugin Action as Enum Variant: Added
Action::Pluginto core enum rather than separate registry for consistency with existing actions.
- Should we support WASM plugins in the future?
- How to handle plugin version conflicts?
- Should plugins have access to daemon state?
Status: ✅ Foundation Complete - Ready for Plugin Loader implementation Last Updated: 2025-11-18 (Day 1) Next Review: After Plugin Loader complete