Rtk code-simplifier
Review RTK Rust code for idiomatic simplification. Detects over-engineering, unnecessary allocations, verbose patterns. Applies Rust idioms without changing behavior.
install
source · Clone the upstream repo
git clone https://github.com/rtk-ai/rtk
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/rtk-ai/rtk "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/code-simplifier" ~/.claude/skills/rtk-ai-rtk-code-simplifier && rm -rf "$T"
manifest:
.claude/skills/code-simplifier/SKILL.mdsource content
RTK Code Simplifier
Review and simplify Rust code in RTK while respecting the project's constraints.
Constraints (never simplify away)
regex — cannot be moved inside functions even if "simpler"lazy_static!
on every.context()
— verbose but mandatory?- Fallback to raw command — never remove even if it looks like dead code
- Exit code propagation — never simplify to
Ok(())
— never remove test modules#[cfg(test)] mod tests
Simplification Patterns
1. Iterator chains over manual loops
// ❌ Verbose let mut result = Vec::new(); for line in input.lines() { let trimmed = line.trim(); if !trimmed.is_empty() && trimmed.starts_with("error") { result.push(trimmed.to_string()); } } // ✅ Idiomatic let result: Vec<String> = input.lines() .map(|l| l.trim()) .filter(|l| !l.is_empty() && l.starts_with("error")) .map(str::to_string) .collect();
2. String building
// ❌ Verbose push loop let mut out = String::new(); for (i, line) in lines.iter().enumerate() { out.push_str(line); if i < lines.len() - 1 { out.push('\n'); } } // ✅ join let out = lines.join("\n");
3. Option/Result chaining
// ❌ Nested match let result = match maybe_value { Some(v) => match transform(v) { Ok(r) => r, Err(_) => default, }, None => default, }; // ✅ Chained let result = maybe_value .and_then(|v| transform(v).ok()) .unwrap_or(default);
4. Struct destructuring
// ❌ Repeated field access fn process(args: &MyArgs) -> String { format!("{} {}", args.command, args.subcommand) } // ✅ Destructure fn process(&MyArgs { ref command, ref subcommand, .. }: &MyArgs) -> String { format!("{} {}", command, subcommand) }
5. Early returns over nesting
// ❌ Deeply nested fn filter(input: &str) -> Option<String> { if !input.is_empty() { if let Some(line) = input.lines().next() { if line.starts_with("error") { return Some(line.to_string()); } } } None } // ✅ Early return fn filter(input: &str) -> Option<String> { if input.is_empty() { return None; } let line = input.lines().next()?; if !line.starts_with("error") { return None; } Some(line.to_string()) }
6. Avoid redundant clones
// ❌ Unnecessary clone fn filter_output(input: &str) -> String { let s = input.to_string(); // Pointless clone s.lines().filter(|l| !l.is_empty()).collect::<Vec<_>>().join("\n") } // ✅ Work with &str fn filter_output(input: &str) -> String { input.lines().filter(|l| !l.is_empty()).collect::<Vec<_>>().join("\n") }
7. Use if let
for single-variant match
if let// ❌ Full match for one variant match output { Ok(s) => process(&s), Err(_) => {}, } // ✅ if let (but still handle errors in RTK — don't silently drop) if let Ok(s) = output { process(&s); } // Note: in RTK filters, always handle Err with eprintln! + fallback
RTK-Specific Checks
Run these after simplification:
# Verify no regressions cargo fmt --all && cargo clippy --all-targets && cargo test # Verify no new regex in functions grep -n "Regex::new" src/<file>.rs # All should be inside lazy_static! blocks # Verify no new unwrap in production grep -n "\.unwrap()" src/<file>.rs # Should only appear inside #[cfg(test)] blocks
What NOT to Simplify
— thelazy_static! { static ref RE: Regex = Regex::new(...).unwrap(); }
here is acceptable, it's init-time.unwrap()
chains — verbose but required.context("description")?- The fallback match arm
— looks redundant but is the safety netErr(e) => { eprintln!(...); raw_output }
at end of run() — looks like it could bestd::process::exit(code)
but it isn'tOk(())