🦀 Beautiful Rust — Skills para que los Agentes Escriban Rust Idiomático

Qué es

Tres Agent Skills + una config de clippy para que un agente de código escriba, revise y porte Rust idiomático. Destiladas de cinco guías autoritativas, con ejemplos que compilan y lints verificados uno por uno.

  • Autor: Morgan Linton (CTO/cofundador de Bold Metrics; antes Sonos y Carnegie Mellon, según su perfil).
  • Licencia: MIT · v1.4.0 (26-oct-2026) · ~1.171 ⭐ y 49 forks en tres días.
  • Funciona con: Claude Code, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI y cualquier agente que lea el formato Agent Skills.

Sobre el gancho de X

«Claude no es tan bueno escribiendo Rust» es el titular del post, no un benchmark formal. Lo que sí aporta el repo son evals propias: con la skill, el mismo modelo pasó 29/30 comprobaciones frente a 24/30 sin ella.


🎯 Por qué existe

El diagnóstico es razonable: los modelos escriben Rust que compila, pero no siempre idiomático. Los fallos típicos:

  • Campos pub «por comodidad» donde debería haber encapsulación.
  • unwrap() en ejemplos de documentación y en rutas que pueden fallar.
  • clone() para callar al borrow checker.
  • bool como parámetro en vez de un enum con significado.
  • as con pérdida silenciosa en vez de TryFrom.
  • Ausencia de # Errors / # Panics en rustdoc.
  • unsafe sin comentario // SAFETY:.

La skill convierte esas convenciones en reglas explícitas que el agente consulta mientras escribe, y los lints impiden que vuelvan a colarse.


🧩 Las tres skills

SkillCuándo se activaQué hace
rust-best-practicesAl escribir o modificar RustGuía de estilo y diseño; ~500 líneas organizadas para escaneo rápido
rust-reviewAl pedir review de un archivo, crate o diffEjecuta fmt, clippy y tests; informe priorizado con file:line y la regla incumplida
rust-portAl portar C, C++, Python, Go, JS o TSPorta primero los tests, diseña API Rust y escribe PORTING.md
flowchart LR
    A["Rust nuevo"] --> S1["rust-best-practices"]
    B["Rust existente"] --> S2["rust-review"]
    C["C / C++ / Python / Go / JS"] --> S3["rust-port"]
    S1 --> L["lints/ (clippy)"]
    S2 --> L
    S3 --> L

Lo que cubre rust-best-practices

  1. Mentalidad: código con forma de Rust, estados inválidos irrepresentables, app vs librería.
  2. Checklist antes de entregar: fmt, clippy -D warnings, tests, docs.
  3. Ownership y borrowing: qué hacer en vez de clonar.
  4. Tipos y API: naming, newtypes, traits comunes, builders, visibilidad, genéricos vs dyn.
  5. Errores y pánicos: Option vs Result vs panic; errores de librería vs aplicación.
  6. Idioms del día a día: iteradores, combinadores, format!, imports, drop guards.
  7. Concurrencia y async: Send, disciplina de locks, async fn, yield points.
  8. unsafe y FFI: cuándo se permite, SAFETY:, soundness, bindgen.
  9. Crates, módulos y dependencias: workspace, features, semver.
  10. Documentación y comentarios.
  11. Tests.
  12. Rendimiento, en orden.
  13. Checklist final.

rust-review

  • Revisa solo lo que le señalas (archivo, módulo, crate o diff).
  • Distingue librería (reglas estrictas de API) de aplicación (simplicidad, errores tipo anyhow).
  • Informe en tres niveles: must fix, should fix, consider.
  • Cada hallazgo cita la regla: C-GETTER de API Guidelines, un ítem de Effective Rust, una guía de Microsoft o un lint de clippy.
  • Termina con lo que el código ya hace bien.
  • Incluye un review real de ejemplo: examples/review-inventory.md.

rust-port

  • Lee el original y sus tests; porta los tests antes que el código.
  • Traduce hábitos, no sintaxis: NULL/None → Option, códigos de error y excepciones → enum de error, out-params → valores de retorno, flags y strings mágicos → enums tipados, orden de inserción de dict → colección ordenada.
  • Verifica con cargo test y clippy.
  • Genera PORTING.md con el mapeo de API y tests, y cada diferencia deliberada.

⚙️ Los lints

Copia lints/clippy.toml junto a tu Cargo.toml y pega el bloque [lints] de lints/lints.toml. Luego:

cargo clippy --all-targets --all-features -- -D warnings

28 lints en total. Algunos de los que más valor aportan:

DetectaPor qué importa
unwrap() fuera de testsPánico en producción
unsafe sin // SAFETY:Falta de justificación de soundness
#[allow] sin razónSupresiones silenciosas
Cualquier parámetro boolAPI ambigua en la llamada
as con pérdidaTruncamientos invisibles
Falta de # Errors / # PanicsDocumentación incompleta
dbg! y todo! olvidadosRestos de desarrollo

Detalle de MSRV

allow_attributes y allow_attributes_without_reason solo funcionan con rust-version = "1.81" o superior. Clippy los desactiva en crates con MSRV menor.

El repo incluye lints/check/, un crate con una violación deliberada por lint, y un script que falla si algún lint deja de dispararse o si la tabla se desincroniza.


📦 Instalación

Cualquier agente, un comando

npx skills add morganlinton/BeautifulRust

Requiere Node 22.20+. Añade -g para instalar a nivel de usuario o -a codex / -a cursor para elegir agente.

Claude Code (como plugin, con updates)

claude plugin install beautiful-rust --marketplace morganlinton/BeautifulRust

Dentro de una sesión:

/plugin marketplace add morganlinton/BeautifulRust
/plugin install beautiful-rust@beautiful-rust

Quedan como /beautiful-rust:rust-best-practices, /beautiful-rust:rust-review y /beautiful-rust:rust-port, aunque normalmente se activan solas.

GitHub Copilot

gh skill install morganlinton/BeautifulRust rust-best-practices
gh skill install morganlinton/BeautifulRust rust-review
gh skill install morganlinton/BeautifulRust rust-port

Requiere gh 2.90+. Añade --scope user para instalación global.

Gemini CLI

gemini skills install https://github.com/morganlinton/BeautifulRust --path skills/rust-best-practices
gemini skills install https://github.com/morganlinton/BeautifulRust --path skills/rust-review
gemini skills install https://github.com/morganlinton/BeautifulRust --path skills/rust-port

Codex, Cursor o cualquier otro: copiar la carpeta

git clone https://github.com/morganlinton/BeautifulRust
mkdir -p ~/.agents/skills
cp -R BeautifulRust/skills/rust-* ~/.agents/skills/
AgenteUsuarioProyecto
Claude Code~/.claude/skills/.claude/skills/
OpenAI Codex~/.agents/skills/.agents/skills/
GitHub Copilot~/.copilot/skills/ o ~/.agents/skills/.github/skills/ o .agents/skills/
Cursor~/.cursor/skills/ o ~/.agents/skills/.cursor/skills/ o .agents/skills/
Gemini CLI~/.gemini/skills/ o ~/.agents/skills/.gemini/skills/ o .agents/skills/

Claude Code no lee .agents/skills/

Usa ~/.claude/skills/, .claude/skills/ o el plugin. Si la skill no aparece, reinicia el agente.


📊 Evals del propio repo

Ejecutadas con claude plugin eval, con runs reales y facturados:

SkillCon skillSin skillCoste extra
rust-best-practices (3 tareas)29/3024/30~⅓ más tokens por tarea
rust-review11/127/12—
rust-port (C y Python)22/2219/22—

En el port, la diferencia interesante no fue solo pasar checks: el baseline generó un port 5,8× el tamaño del original y reimplementó el parseo de strings y enteros de Python; la versión con skill quedó en 3,1× y sin reimplementar el runtime.

Cómo leer estos números

Son evals del autor, sobre tareas diseñadas por él y con Claude. No son un benchmark independiente ni cubren todo Rust. Sirven como señal de dirección, no como veredicto absoluto.


🧠 Lectura crítica

Lo bueno:

  • Reglas con fuente: cada regla viene de Google, Rust API Guidelines, Effective Rust, Rust Design Patterns o Microsoft. Donde las fuentes discrepan, la skill elige y explica por qué.
  • Ejemplos que compilan y lints probados con un crate de violaciones deliberadas. Eso es más de lo que hace la mayoría de «awesome prompts».
  • Tres flujos reales (escribir, revisar, portar), no un único prompt gigante.
  • MIT y formato estándar: se puede copiar, editar y meter en CI.

Lo que hay que tener en cuenta:

  • Repo de tres días, un autor principal, mucha atención repentina. La calidad inicial es buena, pero el mantenimiento está por verse.
  • Las evals son autoinformadas y el coste en tokens sube (~⅓ más). En tareas triviales puede no compensar.
  • El título «senior Rust engineer» del post no está verificado; el perfil público dice CTO de Bold Metrics, antes Sonos y Carnegie Mellon. Es señal de seniority, no una certificación de Rust.
  • Las skills no sustituyen cargo clippy, cargo test ni una revisión humana. Ordenan al agente, no garantizan correctness.

🎯 Para qué te sirve

Encaja directo con tus proyectos Rust + Tauri:

Instalación recomendada en tu caso: global en ~/.agents/skills para todos los agentes, más el bloque de lints en cada crate. Si usas Claude Code, mejor el plugin para recibir updates con claude plugin update beautiful-rust.


🔗 Enlaces

🔗 Notas relacionadas