К основному содержанию
скилл Claude Code CX Codex Cursor GitHub Copilot

code-simplifier — скилл для Claude Code: что делает и как установить

Находит избыточные конструкции и лишние аллокации в коде на Rust для RTK. Упрощает синтаксис по идиомам языка, не ломая поведение проекта.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add rtk-ai/rtk --skill code-simplifier -a claude-code
Открыть на GitHub

Что делает code-simplifier

Скилл анализирует код на Rust в репозитории RTK через инструменты Read, Grep, Glob и Edit. Он заменяет ручные циклы цепочками итераторов. Вложенные конструкции match переводятся в вызовы and_then или unwrap_or, а лишние вызовы .clone() удаляются.

Набор инструкций строго защищает проектные соглашения RTK. Скилл не трогает вызовы .context() у оператора ?, оставляет статические регулярные выражения в LazyLock и сохраняет вызовы std::process::exit(code). Для контроля изменений запускаются cargo clippy и cargo test.

Скилл рассчитан строго на кодовую базу RTK, поэтому вне этого проекта его специфичные ограничения будут мешать.

Какие задачи решает

  • переписать циклы for на итераторы map и filter
  • заменить вложенные ветвления match на методы Option и Result
  • убрать лишние клонирования строк при фильтрации данных
  • упростить сборку строк до вызова join
  • распутать глубокую вложенность через ранний возврат из функции

Примеры запросов агенту

  • Сделай этот модуль на Rust более идиоматичным и упрости циклы
  • Проверь файл src/filter.rs на лишние аллокации и чрезмерное усложнение
  • Упрости вложенные match в этой функции без нарушения правил RTK

Как установить code-simplifier

1Через Skills CLI (Vercel)

npx skills add rtk-ai/rtk --skill code-simplifier -a claude-code

2Вручную: положить файлы

~/.claude/skills/code-simplifier/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/code-simplifier/

Из того же набора4

Весь набор →

Похожие

update-implementation-plan официальный github Обновляет существующий план реализации под новые требования, рефакторинг, обновление пакетов или изменения архитектуры. Нужен, когда план должен стать исполнимым списком задач. GitHub Copilot 11 107установок review-and-refactor официальный github Проверяет код проекта по локальным инструкциям и рефакторит участки, которым нужна правка. Подходит перед ревью или очисткой существующего кода. GitHub Copilot 11 056установок github-triage code-yeongyu Читает все открытые issues и PR в репозитории и пишет отчёты с доказательствами. Ничего не комментирует и не закрывает. Claude Code CX Codex Cursor +1 2 700установок cookbook-audit официальный anthropics Скилл автоматизирует аудит Anthropic Cookbook ноутбуков по стилю-гайду: проверяет структуру, качество кода, безопасность и соответствие учебным целям. Пригодится, если вы пишете или рецензируете ноутбуки с примерами. Claude Code CX Codex Cursor +1 776установок csharp-async официальный github Скилл подсказывает правила асинхронного C# и помогает находить ошибки в коде. Пригодится для ревью методов, задач и API. GitHub Copilot 10 883установок postgresql-table-design Seth Hobson Помогает проектировать и проверять схемы PostgreSQL: типы, ключи, ограничения, индексы и разбиение таблиц. Claude Code CX Codex Cursor 27 780установок improve-codebase-architecture Matt Pocock Скилл ищет архитектурные узкие места в кодовой базе и показывает варианты углубления модулей в HTML-отчёте. Подойдёт для ревью перед рефакторингом. Claude Code 1 163 035установок tdd Matt Pocock Скилл управляет циклом красный-зелёный в TDD: проверяет, что тесты пишутся до кода, держит их на уровне публичных интерфейсов и не завязывает на внутреннюю структуру. Claude Code 1 141 062установок

Вопросы о code-simplifier

Как установить code-simplifier в Claude Code?

Выполните команду npx skills add rtk-ai/rtk --skill code-simplifier -a claude-code в терминале.

Что делает скилл code-simplifier?

Он инспектирует код на Rust, находит избыточные аллокации и сложные конструкции, переписывая их в идиоматичном стиле без изменения логики.

Какие элементы скилл никогда не удаляет при рефакторинге?

Он сохраняет регулярные выражения LazyLock, обязательные цепочки .context() для оператора ?, запасные ветки Err и тестовые модули #[cfg(test)].

Исходный текст

SKILL.md · Apache-2.0
---
name: code-simplifier
description: Review RTK Rust code for idiomatic simplification. Detects over-engineering, unnecessary allocations, verbose patterns. Applies Rust idioms without changing behavior.
triggers:
  - "simplify"
  - "too verbose"
  - "over-engineered"
  - "refactor this"
  - "make this idiomatic"
allowed-tools:
  - Read
  - Grep
  - Glob
  - Edit
effort: low
tags: [rust, simplify, refactor, idioms, rtk]
---

# RTK Code Simplifier

Review and simplify Rust code in RTK while respecting the project's constraints.

## Constraints (never simplify away)

- `LazyLock` regex — cannot be moved inside functions even if "simpler"
- `.context()` on every `?` — verbose but mandatory
- Fallback to raw command — never remove even if it looks like dead code
- Exit code propagation — never simplify to `Ok(())`
- `#[cfg(test)] mod tests` — never remove test modules

## Simplification Patterns

### 1. Iterator chains over manual loops

```rust
// ❌ 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

```rust
// ❌ 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

```rust
// ❌ 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

```rust
// ❌ 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

```rust
// ❌ 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

```rust
// ❌ 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

```rust
// ❌ 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:

```bash
# 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
# Fixed, reused patterns should be in `LazyLock<Regex>` statics

# Verify no new unwrap in production
grep -n "\.unwrap()" src/<file>.rs
# Should only appear inside #[cfg(test)] blocks
```

## What NOT to Simplify

- `static RE: LazyLock<Regex> = LazyLock::new(|| Regex::new(...).unwrap());` — the `.unwrap()` here is acceptable, it's init-time
- `.context("description")?` chains — verbose but required
- The fallback match arm `Err(e) => { eprintln!(...); raw_output }` — looks redundant but is the safety net
- `std::process::exit(code)` at end of run() — looks like it could be `Ok(())`but it isn't

© rtk-ai · Apache-2.0 · rtk-ai/rtk

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой