cb2ea5973b
Closes the v2 plugin conversion. Six providers ported from the owlry-plugins sibling repo into the single owlry crate as feature- gated modules. Each follows the same pattern established by systemd: drop extern "C"/PluginItem/ProviderHandle/owlry_plugin! scaffolding, implement Provider or DynamicProvider directly on a regular struct. Static providers (Provider trait, populate via refresh): - providers/bookmarks.rs — Firefox + Chromium bookmarks via rusqlite, favicon cache preserved. dep: rusqlite (bundled), feature: bookmarks - providers/clipboard.rs — cliphist history. feature: clipboard - providers/emoji.rs — bundled emoji list with keyword tags. feature: emoji - providers/ssh.rs — ~/.ssh/config host extraction. feature: ssh Dynamic providers (DynamicProvider trait, generate per query): - providers/filesearch.rs — fd / mlocate shellout with extract_search_term for ':file' and '/' triggers. feature: filesearch - providers/websearch.rs — URL builder with DuckDuckGo/Google/custom engines. TODO: plumb engine through constructor once Lua config lands (Phase 3). feature: websearch Wiring: - Cargo.toml: 7 per-provider features + 'full' meta-feature. rusqlite added as optional dep (only pulled in with feature 'bookmarks'). - config/mod.rs: ProvidersConfig gains 6 new bool fields (defaults true) - providers/mod.rs: gated module declarations + new_with_config takes a config snapshot and registers each provider behind its feature flag Verification across feature axes: - --no-default-features: 178 tests pass (feature-gated modules excluded) - default (systemd only): 186 tests pass - --features full: 233 tests pass (+55 from the 6 new conversions) Tasks #6 and #7 complete.