feat: full pattern matrix — M1 complete, M2 LLM chat, 30+ pattern files #10

Open
pyr0ball wants to merge 31 commits from feat/patterns-expansion into main
2 changed files with 20 additions and 4 deletions
Showing only changes of commit 8e28ac2624 - Show all commits

View file

@ -44,15 +44,30 @@ pub fn run() {
config::SourceOs::IpadOs => "ipad",
config::SourceOs::Unknown => "unknown",
};
let mut pf = patterns::load(source, migration.source_distro_family.as_deref(), family).ok();
log::info!("robin: loading patterns for {source} → {family} (distro: {})", migration.distro);
let mut pf = match patterns::load(source, migration.source_distro_family.as_deref(), family) {
Ok(p) => {
log::info!("robin: loaded {} patterns", p.patterns.len());
Some(p)
}
Err(e) => {
log::warn!("robin: no pattern file found ({e}) — notifications disabled");
None
}
};
// Layer dual-boot supplement patterns on top when a co-installed OS is configured.
if let (Some(ref mut primary), Some(ref dualboot)) = (&mut pf, &migration.dual_boot_with) {
if let Ok(supplement) = patterns::load_supplement(dualboot) {
primary.extend(supplement);
match patterns::load_supplement(dualboot) {
Ok(supplement) => {
log::info!("robin: loaded {} dual-boot supplement patterns for {dualboot}", supplement.patterns.len());
primary.extend(supplement);
}
Err(e) => log::warn!("robin: dual-boot supplement not found for {dualboot}: {e}"),
}
}
pf
} else {
log::info!("robin: no migration config — onboarding needed");
None
};
@ -70,6 +85,7 @@ pub fn run() {
while let Some(event) = rx.recv().await {
if let Some(ref pf) = *pf {
if let Some(matched) = patterns::classify(&event, pf) {
log::info!("robin: matched pattern '{}' — dispatching notification", matched.pattern_id);
notify::dispatch(&app_handle, matched);
}
}

View file

@ -2,5 +2,5 @@
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() {
app_lib::run();
robin_lib::run();
}