Help us improve
Share bugs, ideas, or general feedback.
From beagle-rust
Scaffolds new Rust projects with best practices for Cargo.toml, linting (clippy, rustfmt), CI pipelines, and workspace organization.
npx claudepluginhub existential-birds/beagle --plugin beagle-rustHow this skill is triggered — by the user, by Claude, or both
Slash command
/beagle-rust:rust-project-setupThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Step-by-step guidance for setting up new Rust projects with proper configuration, linting, and CI.
Enforces strict Rust standards including FAIL FAST error handling, workspace architecture, dependency management with version scripts, and patterns for code reviews, projects, and compilation fixes.
Scaffolds production-ready Rust projects using Cargo with proper module organization, testing setup, and best practices for binaries, libraries, workspaces, web APIs, and WebAssembly.
Assists with Cargo.toml configuration, crate dependency management, project initialization, builds, tests, benchmarks, docs, troubleshooting, and best practices for Rust projects.
Share bugs, ideas, or general feedback.
Step-by-step guidance for setting up new Rust projects with proper configuration, linting, and CI.
| Topic | Reference |
|---|---|
| Cargo.toml configuration, profiles, dependencies | references/cargo-config.md |
| Workspace organization, member layout, shared deps | references/workspace-layout.md |
| GitHub Actions CI, caching, MSRV checks | references/ci-setup.md |
| Feature flags, conditional compilation, build scripts | references/features-conditional.md |
| no_std development, embedded targets, cross-compilation | references/no-std.md |
# Binary
cargo init my-app
# Library
cargo init --lib my-lib
# Workspace (create Cargo.toml manually)
mkdir my-workspace && cd my-workspace
Set edition, rust-version (MSRV), and metadata:
[package]
name = "my-app"
version = "0.1.0"
edition = "2024"
rust-version = "1.85"
Add clippy and rustfmt configuration:
# Cargo.toml
[lints.clippy]
all = { level = "deny", priority = 10 }
pedantic = { level = "warn", priority = 3 }
[lints.rust]
future-incompatible = "warn"
nonstandard_style = "deny"
# unsafe_op_in_unsafe_fn is deny-by-default in edition 2024 — no need to set it
Edition 2024 lint defaults:
unsafe_op_in_unsafe_fnis deny by default. Unsafe operations insideunsafe fnrequire explicitunsafe {}blocks. Thegenkeyword is reserved — user#genif needed as an identifier.
# rustfmt.toml
edition = "2024"
reorder_imports = true
imports_granularity = "Crate"
group_imports = "StdExternalCrate"
[profile.release]
lto = true
codegen-units = 1
strip = true
Add GitHub Actions workflow for check, clippy, test, and fmt. See references/ci-setup.md.
Cargo.lock (reproducible builds)Cargo.lock (consumers resolve their own versions).gitignore for libraries: Cargo.lockFor library crates, enable doc lints:
// src/lib.rs
#![deny(missing_docs)]
Prefer #[expect(lint)] over #[allow(lint)] for temporary suppressions — it warns when the suppression becomes unnecessary:
#[expect(dead_code, reason = "used in next PR")]
fn upcoming_feature() {}
| Use | When |
|---|---|
| Single crate | Small project, CLI tool, simple library |
| Workspace | Multiple related crates, shared dependencies, separate compile targets |
Workspaces reduce compile times by sharing dependencies and build artifacts across members.
my-app/
Cargo.toml
rustfmt.toml
src/
main.rs
lib.rs # separate logic from entry point
tests/
integration_test.rs
my-lib/
Cargo.toml
rustfmt.toml
src/
lib.rs
module_a.rs
module_b/
mod.rs
types.rs
tests/
api_test.rs
examples/
basic_usage.rs
my-workspace/
Cargo.toml # [workspace] definition
rustfmt.toml # shared formatting
crates/
core/ # shared types and logic
api/ # HTTP server
cli/ # command-line interface
serde = "=1.0.210"serde = "1"tokio = { version = "1", features = ["rt-multi-thread", "macros"] }[dev-dependencies] for test-only cratescargo tree for duplicate versionscargo audit for security vulnerabilitiesonce_cell/lazy_static with std::sync::LazyLock (stable since Rust 1.80)When migrating existing projects to edition 2024:
unsafe fn bodies now require explicit unsafe {} blocks around unsafe operationsextern "C" {} blocks must be written as unsafe extern "C" {}#[no_mangle] and #[export_name] require #[unsafe(no_mangle)] and #[unsafe(export_name)]gen is a reserved keyword — rename any gen identifiers to r#gen or choose a different name-> impl Trait captures all in-scope lifetimes by default; use + use<'a> for precise control! (never type) falls back to ! instead of () — review match arms and diverging expressionsif let and tail expressions drop earlier — review code holding locks or guards in these positionsRun cargo fix --edition to auto-fix most mechanical changes.
Use these as objective pass conditions after the checklist—not informal “looks done.”
cargo metadata --format-version 1. Pass: exit code 0 and the output lists your crate(s) (package name matches what you expect).cargo clippy --all-targets (add -- -D warnings if warnings must fail) and cargo fmt --check. Pass: both exit 0 before you treat CI as authoritative.Cargo.lock is committed (git ls-files Cargo.lock prints Cargo.lock). Library crate: Cargo.lock is not tracked (empty git ls-files Cargo.lock, or file gitignored and never added). Pass: the index matches that policy with no surprise Cargo.lock changes.beagle-rust:rust-best-practices — idiomatic patterns and edition 2024 coding guidancebeagle-rust:rust-code-review — code review covering ownership, unsafe, and trait design