🦀 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.boolcomo parámetro en vez de un enum con significado.ascon pérdida silenciosa en vez deTryFrom.- Ausencia de
# Errors/# Panicsen rustdoc. unsafesin 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
| Skill | Cuándo se activa | Qué hace |
|---|---|---|
rust-best-practices | Al escribir o modificar Rust | Guía de estilo y diseño; ~500 líneas organizadas para escaneo rápido |
rust-review | Al pedir review de un archivo, crate o diff | Ejecuta fmt, clippy y tests; informe priorizado con file:line y la regla incumplida |
rust-port | Al portar C, C++, Python, Go, JS o TS | Porta 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
- Mentalidad: código con forma de Rust, estados inválidos irrepresentables, app vs librería.
- Checklist antes de entregar:
fmt,clippy -D warnings, tests, docs. - Ownership y borrowing: qué hacer en vez de clonar.
- Tipos y API: naming, newtypes, traits comunes, builders, visibilidad, genéricos vs
dyn. - Errores y pánicos:
OptionvsResultvspanic; errores de librería vs aplicación. - Idioms del día a día: iteradores, combinadores,
format!, imports, drop guards. - Concurrencia y async:
Send, disciplina de locks,async fn, yield points. unsafey FFI: cuándo se permite,SAFETY:, soundness, bindgen.- Crates, módulos y dependencias: workspace, features, semver.
- Documentación y comentarios.
- Tests.
- Rendimiento, en orden.
- 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-GETTERde 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 testyclippy. - Genera
PORTING.mdcon 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 warnings28 lints en total. Algunos de los que más valor aportan:
| Detecta | Por qué importa |
|---|---|
unwrap() fuera de tests | Pánico en producción |
unsafe sin // SAFETY: | Falta de justificación de soundness |
#[allow] sin razón | Supresiones silenciosas |
Cualquier parámetro bool | API ambigua en la llamada |
as con pérdida | Truncamientos invisibles |
Falta de # Errors / # Panics | Documentación incompleta |
dbg! y todo! olvidados | Restos de desarrollo |
Detalle de MSRV
allow_attributesyallow_attributes_without_reasonsolo funcionan conrust-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/BeautifulRustRequiere 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/BeautifulRustDentro de una sesión:
/plugin marketplace add morganlinton/BeautifulRust
/plugin install beautiful-rust@beautiful-rustQuedan 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-portRequiere 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-portCodex, 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/| Agente | Usuario | Proyecto |
|---|---|---|
| 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:
| Skill | Con skill | Sin skill | Coste extra |
|---|---|---|---|
| rust-best-practices (3 tareas) | 29/30 | 24/30 | ~⅓ más tokens por tarea |
| rust-review | 11/12 | 7/12 | — |
| rust-port (C y Python) | 22/22 | 19/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 testni una revisión humana. Ordenan al agente, no garantizan correctness.
🎯 Para qué te sirve
Encaja directo con tus proyectos Rust + Tauri:
- 🦀 VaultLocal Desktop — backend Rust con watcher, indexación y comandos IPC.
- 🦀 Markdown Vault — core Rust + SQLite FTS5.
- Rust — cliente de notas local-first.
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
- Repositorio — morganlinton/BeautifulRust
- SKILL.md de rust-best-practices
- Config de lints
- Review de ejemplo
- CHANGELOG
- agentskills.io — formato Agent Skills
🔗 Notas relacionadas
- ✨ Taste Skill — el equivalente anti-slop para frontend.
- 🧩 Claude Plugins Official — directorio de plugins de Anthropic.
- 🔍 REA — otra skill técnica con servidor MCP.
- 📥 Vault Ingest — cómo se guardó esta nota.