Skip to content

Commit 38ff897

Browse files
committed
chore: drop obsolete params from detect_agents and simplify agent resolution
1 parent 87ef285 commit 38ff897

1 file changed

Lines changed: 23 additions & 69 deletions

File tree

src/setup/mod.rs

Lines changed: 23 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -639,8 +639,7 @@ async fn run_setup_wizard(mut base: BaseArgs, flags: WizardFlags) -> Result<()>
639639
.ok_or_else(|| anyhow!("setup cancelled"))?
640640
};
641641
let home = home_dir().ok_or_else(|| anyhow!("failed to resolve HOME/USERPROFILE"))?;
642-
let local_root = resolve_local_root_for_scope(scope)?;
643-
let detected = detect_agents(local_root.as_deref(), &home);
642+
let detected = detect_agents();
644643
let selected_agent =
645644
resolve_default_agent_selection(flag_agent, &detected, "Select coding agent", true)?;
646645
if verbose && flag_agent.is_some() {
@@ -796,9 +795,7 @@ async fn run_default_setup(mut base: BaseArgs, args: SetupArgs) -> Result<()> {
796795
}
797796

798797
let scope = default_setup_scope(&args.agents);
799-
let home = home_dir().ok_or_else(|| anyhow!("failed to resolve HOME/USERPROFILE"))?;
800-
let local_root = resolve_local_root_for_scope(scope)?;
801-
let detected = detect_agents(local_root.as_deref(), &home);
798+
let detected = detect_agents();
802799
let selected_agent = resolve_default_agent_selection(
803800
args.agents.agent,
804801
&detected,
@@ -1114,7 +1111,7 @@ async fn execute_skills_setup(
11141111
quiet: bool,
11151112
) -> Result<SkillsSetupOutcome> {
11161113
let home = home_dir().ok_or_else(|| anyhow!("failed to resolve HOME/USERPROFILE"))?;
1117-
let selection = resolve_setup_selection(args, &home)?;
1114+
let selection = resolve_setup_selection(args)?;
11181115
let scope = selection.scope;
11191116
let local_root = selection.local_root;
11201117
let detected = selection.detected;
@@ -1242,11 +1239,11 @@ async fn run_instrument_setup(
12421239
"instrument setup requires running inside a git repository (could not find .git in parent chain)"
12431240
)
12441241
})?;
1245-
let mut detected = detect_agents(Some(&root), &home);
1242+
let mut detected = detect_agents();
12461243

12471244
let runnable_agents = detect_runnable_agents();
12481245
let selected = if args.agent.is_none() {
1249-
resolve_unambiguous_instrument_agent(&runnable_agents, &detected)
1246+
resolve_unambiguous_instrument_agent(&runnable_agents)
12501247
} else {
12511248
None
12521249
};
@@ -2116,7 +2113,7 @@ fn execute_mcp_install(
21162113

21172114
fn run_mcp_setup(base: BaseArgs, args: AgentsMcpSetupArgs) -> Result<()> {
21182115
let home = home_dir().ok_or_else(|| anyhow!("failed to resolve HOME/USERPROFILE"))?;
2119-
let selection = resolve_mcp_selection(&args, &home)?;
2116+
let selection = resolve_mcp_selection(&args)?;
21202117
let scope = selection.scope;
21212118
let local_root = selection.local_root;
21222119
let detected = selection.detected;
@@ -2149,7 +2146,7 @@ fn run_mcp_setup(base: BaseArgs, args: AgentsMcpSetupArgs) -> Result<()> {
21492146
Ok(())
21502147
}
21512148

2152-
fn resolve_setup_selection(args: &AgentsSetupArgs, home: &Path) -> Result<SetupSelection> {
2149+
fn resolve_setup_selection(args: &AgentsSetupArgs) -> Result<SetupSelection> {
21532150
let mut scope = initial_scope(args.local, args.global, args.yes, YesScopeDefault::Global);
21542151
let interactive = ui::is_interactive() && !args.yes;
21552152
let mut prompted_workflows: Option<Vec<WorkflowArg>> = if args.no_workflow {
@@ -2218,7 +2215,7 @@ fn resolve_setup_selection(args: &AgentsSetupArgs, home: &Path) -> Result<SetupS
22182215
)?,
22192216
};
22202217
let local_root = resolve_local_root_for_scope(scope)?;
2221-
let detected = detect_agents(local_root.as_deref(), home);
2218+
let detected = detect_agents();
22222219
let selected_agent = resolve_default_agent_selection(
22232220
args.agent,
22242221
&detected,
@@ -2244,7 +2241,7 @@ fn resolve_setup_selection(args: &AgentsSetupArgs, home: &Path) -> Result<SetupS
22442241
})
22452242
}
22462243

2247-
fn resolve_mcp_selection(args: &AgentsMcpSetupArgs, home: &Path) -> Result<McpSelection> {
2244+
fn resolve_mcp_selection(args: &AgentsMcpSetupArgs) -> Result<McpSelection> {
22482245
let mut scope = initial_scope(args.local, args.global, args.yes, YesScopeDefault::Global);
22492246
let interactive = ui::is_interactive() && !args.yes;
22502247

@@ -2288,7 +2285,7 @@ fn resolve_mcp_selection(args: &AgentsMcpSetupArgs, home: &Path) -> Result<McpSe
22882285
)?,
22892286
};
22902287
let local_root = resolve_local_root_for_scope(scope)?;
2291-
let detected = detect_agents(local_root.as_deref(), home);
2288+
let detected = detect_agents();
22922289
let selected_agent = resolve_default_agent_selection(
22932290
args.agent,
22942291
&detected,
@@ -2309,7 +2306,7 @@ fn run_doctor(base: BaseArgs, args: AgentsDoctorArgs) -> Result<()> {
23092306
let (scope, local_root) = resolve_doctor_scope(&args)?;
23102307
let home = home_dir().ok_or_else(|| anyhow!("failed to resolve HOME/USERPROFILE"))?;
23112308
let docs_output_dir = setup_docs_output_dir(scope, local_root.as_deref(), &home)?;
2312-
let detected = detect_agents(local_root.as_deref(), &home);
2309+
let detected = detect_agents();
23132310

23142311
let warnings = Vec::new();
23152312
let agents = [Agent::Claude, Agent::Codex, Agent::Cursor, Agent::Opencode]
@@ -2612,16 +2609,6 @@ fn resolve_default_agent_selection(
26122609
bail!("multiple coding agents available; pass --agent <AGENT> or re-run in an interactive terminal");
26132610
}
26142611

2615-
#[allow(dead_code)]
2616-
fn map_instrument_agent_arg(agent: InstrumentAgentArg) -> Agent {
2617-
match agent {
2618-
InstrumentAgentArg::Claude => Agent::Claude,
2619-
InstrumentAgentArg::Codex => Agent::Codex,
2620-
InstrumentAgentArg::Cursor => Agent::Cursor,
2621-
InstrumentAgentArg::Opencode => Agent::Opencode,
2622-
}
2623-
}
2624-
26252612
fn map_instrument_agent_arg_to_agent_arg(agent: InstrumentAgentArg) -> AgentArg {
26262613
match agent {
26272614
InstrumentAgentArg::Claude => AgentArg::Claude,
@@ -2695,7 +2682,7 @@ fn detect_runnable_agents() -> Vec<Agent> {
26952682
agents
26962683
}
26972684

2698-
fn detect_agents(_local_root: Option<&Path>, _home: &Path) -> Vec<DetectionSignal> {
2685+
fn detect_agents() -> Vec<DetectionSignal> {
26992686
let mut signals = Vec::new();
27002687
for (binary, agent) in [
27012688
("claude", Agent::Claude),
@@ -2714,20 +2701,10 @@ fn detect_agents(_local_root: Option<&Path>, _home: &Path) -> Vec<DetectionSigna
27142701
signals
27152702
}
27162703

2717-
fn resolve_unambiguous_instrument_agent(
2718-
runnable_agents: &[Agent],
2719-
detected: &[DetectionSignal],
2720-
) -> Option<Agent> {
2721-
let runnable_set: BTreeSet<Agent> = runnable_agents.iter().copied().collect();
2722-
if runnable_set.len() == 1 {
2723-
return runnable_set.into_iter().next();
2724-
}
2725-
2726-
let detected_set: BTreeSet<Agent> = detected.iter().map(|signal| signal.agent).collect();
2727-
if detected_set.len() == 1 {
2728-
return detected_set.into_iter().next();
2704+
fn resolve_unambiguous_instrument_agent(runnable_agents: &[Agent]) -> Option<Agent> {
2705+
if runnable_agents.len() == 1 {
2706+
return Some(runnable_agents[0]);
27292707
}
2730-
27312708
None
27322709
}
27332710

@@ -3509,7 +3486,7 @@ mod tests {
35093486
yolo: false,
35103487
};
35113488
let home = std::env::temp_dir();
3512-
let selection = resolve_setup_selection(&args, &home).expect("resolve setup selection");
3489+
let selection = resolve_setup_selection(&args).expect("resolve setup selection");
35133490
assert!(selection.selected_workflows.is_empty());
35143491
}
35153492

@@ -3528,7 +3505,7 @@ mod tests {
35283505
yolo: false,
35293506
};
35303507
let home = std::env::temp_dir();
3531-
let selection = resolve_setup_selection(&args, &home).expect("resolve setup selection");
3508+
let selection = resolve_setup_selection(&args).expect("resolve setup selection");
35323509
assert!(selection.selected_workflows.is_empty());
35333510
}
35343511

@@ -4067,39 +4044,16 @@ mod tests {
40674044
}
40684045

40694046
#[test]
4070-
fn instrument_agent_resolution_prefers_single_runnable_agent() {
4071-
let detected = vec![
4072-
DetectionSignal {
4073-
agent: Agent::Claude,
4074-
on_path: false,
4075-
reason: "config".to_string(),
4076-
},
4077-
DetectionSignal {
4078-
agent: Agent::Codex,
4079-
on_path: false,
4080-
reason: "binary".to_string(),
4081-
},
4082-
DetectionSignal {
4083-
agent: Agent::Opencode,
4084-
on_path: false,
4085-
reason: "config".to_string(),
4086-
},
4087-
];
4088-
4089-
let resolved = resolve_unambiguous_instrument_agent(&[Agent::Codex], &detected);
4047+
fn instrument_agent_resolution_selects_single_runnable_agent() {
4048+
let resolved = resolve_unambiguous_instrument_agent(&[Agent::Codex]);
40904049
assert_eq!(resolved, Some(Agent::Codex));
40914050
}
40924051

40934052
#[test]
4094-
fn instrument_agent_resolution_falls_back_to_single_detected_agent() {
4095-
let detected = vec![DetectionSignal {
4096-
agent: Agent::Codex,
4097-
on_path: false,
4098-
reason: "config".to_string(),
4099-
}];
4100-
4101-
let resolved = resolve_unambiguous_instrument_agent(&[], &detected);
4102-
assert_eq!(resolved, Some(Agent::Codex));
4053+
fn instrument_agent_resolution_returns_none_for_multiple_runnable_agents() {
4054+
let resolved =
4055+
resolve_unambiguous_instrument_agent(&[Agent::Codex, Agent::Claude, Agent::Opencode]);
4056+
assert_eq!(resolved, None);
41034057
}
41044058

41054059
#[test]

0 commit comments

Comments
 (0)