bama
BAMA: 모든 Mac 앱을 만들 수 있습니다
코딩 에이전트에게 러스트 코드 작성·검토·이식 방법을 가르치고 검증된 clippy 설정을 제공합니다
Agent Skills that teach coding agents to write, review, and port idiomatic Rust, plus a tested clippy config. Works with Claude Code, Codex, Copilot, Cursor, and Gemini CLI.
스킬Python · RustGitHub @morganlinton직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
설치형 프로젝트는 배포 도메인 없이도 확인할 수 있습니다. 개인 저장소는 GitHub 로그인으로, 조직 저장소는 위의 저장소 확인 파일로 직접 확인해 주세요.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Three standard Agent Skills and a lints config that teach coding agents to write, review, port, and enforce idiomatic Rust:
rust-best-practices loads whenever an agent writes or changes Rust, and steers it
toward idiomatic, robust, maintainable code.rust-review reviews existing Rust code, a file, a crate, or a diff, and writes a
prioritized report where every finding cites the rule it breaks and shows the fix.rust-port ports C, C++, Python, Go, or JavaScript to idiomatic Rust with the same
behavior, porting the original tests first so you can prove the two match.lints/ is a drop-in clippy configuration that enforces the machine-checkable rules
in CI.They work with Claude Code, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, and any other agent that reads the Agent Skills format. Every code example in the skills compiles on stable Rust, and every lint in the config was checked against current clippy.
The guidance is distilled from five sources, with a condensed digest of each bundled in the skill so the agent can consult the original reasoning when it needs to:
Where the sources disagree, the skill picks a side and says why.
Asked for a small semver-parsing library, an agent without the skill produced working
code with public fields, no # Errors docs, and unwrap() in its doc examples. With the
skill, the same agent kept the fields private, documented failure modes, and wrote doc
examples users can copy safely. Condensed from those two runs:
// Without the skill
/// A semantic version. The fields are public for convenience.
pub struct Version {
pub major: u64,
pub minor: u64,
pub patch: u64,
pub pre: Vec<Identifier>,
pub build: Vec<String>,
}
impl Version {
/// Parses a version string.
///
/// ```
/// let v = Version::parse("1.2.3").unwrap();
/// ```
pub fn parse(s: &str) -> Result<Version, ParseError> { /* ... */ }
}
// With the skill
/// A semantic version. Equality, hashing, and ordering ignore build metadata.
pub struct Version {
major: u64,
minor: u64,
patch: u64,
pre: Vec<Identifier>,
build: Vec<String>,
}
impl Version {
/// Parses a version string according to SemVer 2.0.0.
///
/// # Errors
///
/// Returns [`ParseVersionError`] if the string is empty, a numeric part has a
/// leading zero or overflows `u64`, or an identifier contains invalid characters.
///
/// ```
/// # use semver_lite::Version;
/// # fn main() -> Result<(), semver_lite::ParseVersionError> {
/// let v = Version::parse("1.2.3-beta.1")?;
/// assert_eq!(v.major(), 1);
/// # Ok(())
/// # }
/// ```
pub fn parse(s: &str) -> Result<Self, ParseVersionError> { /* ... */ }
/// Returns the major version number.
pub fn major(&self) -> u64 { self.major }
}
Across three test tasks (a library, a CLI, and refactoring a messy module), the skill passed 29 of 30 checks against 24 of 30 without it. See Testing the skills.
Each skill is a folder under skills/: rust-best-practices/, rust-review/, and
rust-port/. Every option below puts those folders where your agent looks for skills.
Install all three; the review and port skills lean on the best-practices skill for style.
The skills installer supports most agents
(Node 22.20 or later):
npx skills add morganlinton/BeautifulRust
Add -g to install for your user instead of the current project, or -a <agent> to pick
an agent, such as -a codex or -a cursor.
Install it as a plugin so updates arrive with one command:
claude plugin install beautiful-rust --marketplace morganlinton/BeautifulRust
Inside a session, the same thing is:
/plugin marketplace add morganlinton/BeautifulRust
/plugin install beautiful-rust@beautiful-rust
This installs all three skills. They appear as /beautiful-rust:rust-best-practices,
/beautiful-rust:rust-review, and /beautiful-rust:rust-port, though you rarely need to
call them, since they trigger on their own. To try it for one session without installing, clone the repo
and run claude --plugin-dir ./BeautifulRust.
With GitHub CLI 2.90 or later:
gh skill install morganlinton/BeautifulRust rust-best-practices
gh skill install morganlinton/BeautifulRust rust-review
gh skill install morganlinton/BeautifulRust rust-port
This installs into the current project by default. Add --scope user to install for your
user, or --agent <name> to install for a different agent.
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
Clone the repo and copy the three skill folders into your agent's skills directory.
Most agents now read the shared .agents/skills/ location:
git clone https://github.com/morganlinton/BeautifulRust
mkdir -p ~/.agents/skills
cp -R BeautifulRust/skills/rust-* ~/.agents/skills/
| Agent | User directory | Project directory |
|---|---|---|
| Claude Code | ~/.claude/skills/ | .claude/skills/ |
| OpenAI Codex | ~/.agents/skills/ | .agents/skills/ |
| GitHub Copilot | ~/.copilot/skills/ or ~/.agents/skills/ | .github/skills/ or .agents/skills/ |
| Cursor | ~/.cursor/skills/ or ~/.agents/skills/ | .cursor/skills/ or .agents/skills/ |
| Gemini CLI | ~/.gemini/skills/ or ~/.agents/skills/ | .gemini/skills/ or .agents/skills/ |
Claude Code does not read .agents/skills/, so use its own directory or the plugin.
Restart the agent if the skill doesn't show up right away.
claude.ai takes one zip per skill, with the skill folder as the zip root:
cd skills
zip -r ../rust-best-practices.zip rust-best-practices -x '*.DS_Store' -x '*/evals/*'
zip -r ../rust-review.zip rust-review -x '*.DS_Store' -x '*/evals/*'
zip -r ../rust-port.zip rust-port -x '*.DS_Store' -x '*/evals/*'
Upload each under Customize > Skills. Code execution must be enabled first.
Ask your agent to review a file, crate, or diff, for example "review src/parser.rs" or
"what would you change in this PR". The rust-review skill runs cargo fmt, clippy, and
the tests when a toolchain is available, then writes a report with three tiers: must fix,
should fix, and consider. Every finding gives a file:line location, the rule it breaks
with its source (an API Guidelines code such as C-GETTER, an Effective Rust item, a
Microsoft guideline, or a clippy lint), and the smallest code change that fixes it. Each
report ends with what the code already does well.
examples/review-inventory.md is a real review the skill
produced for the deliberately messy module in the eval cases.
Ask your agent to port a module, for example "port parser.c to Rust" or "rewrite this
Python service in Rust". The rust-port skill reads the original and its tests, ports the
tests first, designs a Rust API instead of transliterating the original, and verifies with
cargo test and clippy. It maps each language's habits to their Rust equivalents:
NULL and None to Option, error codes and exceptions to an error enum, out-parameters
to return values, flag ints and magic strings to typed enums and options, and dict
insertion order to an ordered collection instead of a HashMap that would silently
reorder output. Each port comes with a PORTING.md that maps the old API and tests to the
new ones and lists every deliberate difference.
Bevy calls your systems and builds their arguments, so some general Rust advice is wrong
for them. Taken at face value, the skills would tell an agent to change Res<Time> to a
reference, replace use bevy::prelude::* with explicit imports, and split a system to
quiet clippy. When a crate depends on bevy or bevy_ecs, both the writing and review
skills now read references/bevy.md
first. It covers Bevy 0.20 and does two things:
Commands have applied. Systems that depend on each other may
have no order between them. A .single().unwrap() crashes the game once the player
dies.Every behavior in the reference was checked with a test against bevy 0.20.0. Two eval cases cover it: a review of a combat plugin with two of those bugs planted, and a feature added to the fixed plugin, which checks that the agent keeps Bevy's conventions.
The skills teach the rules; the lints keep them from slipping back in. Copy
lints/clippy.toml next to your Cargo.toml and paste the [lints]
block from lints/lints.toml into it, then run:
cargo clippy --all-targets --all-features -- -D warnings
It flags unwrap() outside tests, unsafe blocks without a // SAFETY: comment, #[allow]
without a reason, any bool function parameter, silent lossy as casts, missing # Errors
and # Panics docs, and leftover dbg! and todo!. Lints marked [lib] in the file are
for libraries, and applications can drop them. Bevy crates need four extra allows,
listed in the Bevy reference,
because the table otherwise flags every idiomatic system signature.
Every lint in the table is proven to fire. lints/check/ is a small crate
with one deliberate violation per lint, and this script runs clippy on it from the repo
root:
bash scripts/check-lints.sh
It fails if a lint stops firing, if something unexpected fires, or if the check crate's
copy of the table drifts from lints/lints.toml. allow_attributes and
allow_attributes_without_reason need rust-version = "1.81" or later, because clippy
switches them off for crates that can't use #[expect].
skills/rust-best-practices/SKILL.md is about 500 lines, organized so an agent can scan
it while coding:
-D warnings, test, doc; lint policydynOption vs Result vs panic, library vs application error typesformat!, imports, drop guardsSend assertions, lock discipline, async fn, yield pointsSAFETY: comments, soundness, bindgenskills/rust-best-practices/references/ holds one digest per source for deeper lookups.
BeautifulRust/
├── .claude-plugin/
│ ├── plugin.json plugin manifest
│ └── marketplace.json lets this repo act as its own marketplace
├── skills/
│ ├── rust-best-practices/ writing skill
│ │ ├── SKILL.md
│ │ ├── references/ one digest per source, plus bevy.md
│ │ └── evals/
│ ├── rust-review/ review skill
│ │ ├── SKILL.md
│ │ └── evals/
│ └── rust-port/ porting skill
│ ├── SKILL.md
│ └── evals/ a C module and a Python module to port
├── lints/
│ ├── lints.toml [lints] block for Cargo.toml
│ ├── clippy.toml clippy thresholds
│ └── check/ one deliberate violation per lint
├── scripts/
│ ├── check-skill.py validates skills, evals, and manifests
│ ├── check-lints.sh proves every lint in the table fires
│ ├── check-examples.py compiles every Rust example in the docs
│ └── examples.json context that lets fragment examples compile
├── benchmarks/
│ └── cross-agent-2026-10/ Claude Code vs Codex, with and without the skills
├── examples/
│ └── review-inventory.md a real review report
├── CHANGELOG.md
├── CONTRIBUTING.md
└── README.md
skills/rust-best-practices/evals/ holds four test cases in the layout claude plugin eval
reads: a library API design task, an application CLI task, and a refactor-this-module task
with an input file. Each case has the prompt, a description of a good result, and one
assertion per file under graders/. Run them with and without the skill from the skill
directory:
claude plugin eval . --allow-tools Write,Edit,Bash --scaffold
skills/rust-review/evals/ holds a review case for the same messy module and one for a
Bevy plugin with two ECS bugs planted, and skills/rust-port/evals/ holds a C module and
a Python module to port, each with its original test suite. The writing skill also has a
Bevy case that adds a feature to a working plugin. Run them the same way from each
skill's directory.
These are real model runs and are billed.
Across agents. The October 2026 benchmark ran all eight cases on Claude Code and OpenAI's Codex CLI, with and without the skills, and graded the results blind:
| No skills | Skills | |
|---|---|---|
| Claude Code (Opus 5.5) | 72/85 (85%) | 80/85 (94%) |
| Codex CLI (default model) | 53/85 (62%) | 76/85 (89%) |
The skills helped Codex more than Claude, and helped reviews most. They hurt in one case: Claude did worse on the Bevy feature task with them. The benchmark page has the details, the method, and the caveats. Notably, it was one run per configuration, graded by a Claude model.
Edit the skill, bump version in .claude-plugin/plugin.json, commit, and push.
Claude Code plugin users pick up the new version with:
claude plugin update beautiful-rust
Anyone who copied the folder or used an installer re-runs the install command. Record each release in CHANGELOG.md.
Validate before pushing. python3 scripts/check-skill.py checks skill
frontmatter, links, eval cases, and plugin manifests. Pass --json for
machine-readable output. python3 scripts/check-examples.py compiles every Rust
block in the skills, reference digests, README, and examples with cargo check.
python3 scripts/check-skill.py
python3 scripts/check-examples.py
claude plugin validate .
Issues and pull requests are welcome. Every rule needs a published source; see CONTRIBUTING.md for how to propose a rule, report a review false positive, or add an eval case.
The guidance in this skill is a synthesis. The five digests in
skills/rust-best-practices/references/ are paraphrased summaries written for this
project; they restate each source's advice in condensed form and link back to the
original. Read the originals for the full reasoning.
| Source | Author | License |
|---|---|---|
| Google Rust Style Guide | CC BY 3.0 | |
| Rust API Guidelines | The Rust Project | MIT or Apache-2.0 |
| Effective Rust | David Drysdale, published by O'Reilly | CC BY-NC-ND 4.0 (online edition) |
| Rust Design Patterns | rust-unofficial contributors | MPL-2.0 |
| Pragmatic Rust Guidelines | Microsoft | MIT |
The skill text, the digests, the banner, and the generator script in this repository are MIT licensed (see LICENSE). The crab is a crab, not the Rust mascot.
MIT. See LICENSE.