mi6_cli/commands/
disable.rs1use anyhow::{Context, Result};
4
5use mi6_core::{FrameworkAdapter, FrameworkResolutionMode, resolve_frameworks};
6
7use crate::display::StderrColors;
8
9pub struct DisableOptions {
11 pub frameworks: Vec<String>,
13 pub local: bool,
15 pub settings_local: bool,
17 pub print: bool,
19}
20
21pub fn run_disable(opts: DisableOptions) -> Result<()> {
23 let colors = StderrColors::new();
24
25 let mode = FrameworkResolutionMode::Active {
27 local: opts.local,
28 settings_local: opts.settings_local,
29 };
30 let adapters =
31 resolve_frameworks(&opts.frameworks, Some(mode)).map_err(|e| anyhow::anyhow!("{}", e))?;
32
33 for adapter in adapters {
34 disable_framework(adapter, &opts, &colors)?;
35 }
36
37 Ok(())
38}
39
40fn disable_framework(
42 adapter: &dyn FrameworkAdapter,
43 opts: &DisableOptions,
44 colors: &StderrColors,
45) -> Result<()> {
46 if !adapter.has_mi6_hooks(opts.local, opts.settings_local) {
48 eprintln!(
49 "{}mi6 is not enabled for {}{}",
50 colors.yellow,
51 adapter.name(),
52 colors.reset
53 );
54 return Ok(());
55 }
56
57 let settings_path = adapter
58 .settings_path(opts.local, opts.settings_local)
59 .context("failed to determine settings path")?;
60
61 if opts.print {
62 eprintln!(
63 "{}Would disable{} mi6 for {}{}{}:",
64 colors.cyan,
65 colors.reset,
66 colors.bold,
67 adapter.name(),
68 colors.reset
69 );
70 if adapter.name() == "claude" {
72 eprintln!(" Would remove plugin: {}", settings_path.display());
73 } else {
74 eprintln!(" Would modify: {}", settings_path.display());
75 }
76 } else {
77 eprintln!("Disabling mi6 for {}...", adapter.name());
78
79 let uninstall_result = adapter
81 .uninstall_hooks(opts.local, opts.settings_local)
82 .context("failed to uninstall hooks")?;
83
84 for cmd in &uninstall_result.commands_run {
86 eprintln!(
87 " Running: {}{}{}... {}done{}",
88 colors.bold_white, cmd, colors.reset, colors.bold_green, colors.reset
89 );
90 }
91
92 if adapter.name() == "claude" {
93 eprintln!(
95 " Removing plugin from: {}{}{}... {}done{}",
96 colors.bold_white,
97 settings_path.display(),
98 colors.reset,
99 colors.bold_green,
100 colors.reset
101 );
102 } else {
103 eprintln!(
104 " Removing hooks from: {}{}{}... {}done{}",
105 colors.bold_white,
106 settings_path.display(),
107 colors.reset,
108 colors.bold_green,
109 colors.reset
110 );
111 }
112 }
113
114 Ok(())
115}
116
117pub fn disable_framework_silent(adapter: &dyn FrameworkAdapter) -> Result<()> {
121 adapter
123 .uninstall_hooks(false, false)
124 .context("failed to uninstall hooks")?;
125 Ok(())
126}