Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/tomevault-io/skills-registry --skill rust-supply-chain명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
SOC 직업 분류 기준
| name | rust-supply-chain |
| description | | Use when this capability is needed. |
Deep Knowledge: Use
mcp__documentation__fetch_docswith technology:cargo-denyorrustsec.
Production Rust app needs:
| Tool | Concern |
|---|---|
| cargo-deny | License compliance, banned crates, advisory enforcement |
| cargo-audit | RustSec advisory DB lookup |
| cargo-nextest | Faster, more reliable test runner (parallel, retries) |
cargo-tarpaulin / llvm-cov | Code coverage |
| cargo-machete | Detect unused dependencies |
| cargo-outdated | Find stale dependencies |
| cargo-vet | Mozilla-style audit attestations for transitive deps |
| cargo-msrv | Minimum supported Rust version detection |
| cargo-binstall | Install tools as binaries (faster than cargo install) |
For BHODL-style wallet apps: all of these in CI. No exceptions.
# Fast install via binstall (downloads pre-built binaries)
cargo install cargo-binstall
cargo binstall cargo-deny cargo-audit cargo-nextest cargo-tarpaulin \
cargo-machete cargo-outdated cargo-vet cargo-msrv
# Or build from source (slower)
cargo install cargo-deny cargo-audit cargo-nextest cargo-tarpaulin \
cargo-machete cargo-outdated cargo-vet
deny.toml (project root):
[graph]
all-features = true
no-default-features = false
[advisories]
db-path = "~/.cargo/advisory-db"
db-urls = ["https://github.com/rustsec/advisory-db"]
yanked = "deny" # fail on yanked crates
ignore = [
# Allowed exceptions with rationale
# "RUSTSEC-2024-XXXX", # reason: not exploitable in our use
]
[licenses]
allow = [
"MIT",
"Apache-2.0",
"Apache-2.0 WITH LLVM-exception",
"BSD-2-Clause",
"BSD-3-Clause",
"ISC",
"Unicode-DFS-2016", # for unicode-* crates
"Zlib",
"MPL-2.0", # be careful, file-level copyleft
"CC0-1.0", # Bitcoin libs use this
"Unlicense", # public domain
"0BSD",
]
confidence-threshold = 0.8
# Block GPL, AGPL — they'd virally infect a wallet codebase
# Reject by NOT listing them in `allow` (default deny)
[[licenses.exceptions]]
name = "ring"
allow = ["LicenseRef-ring"] # has its own license file
=
= [
{ name = , reason = },
{ name = , reason = },
]
= [
{ name = , version = },
{ name = , version = },
]
= [
]
=
=
= []
= []
# Run all checks
cargo deny check
# Specific category
cargo deny check licenses
cargo deny check advisories
cargo deny check bans
cargo deny check sources
# In CI (exit non-zero on issues)
cargo deny --log-level error check
For BHODL-type wallet: deny GPL/AGPL hard — they'd require open-sourcing the whole app under matching license.
# Update advisory DB
cargo audit fetch
# Run audit
cargo audit
# JSON output
cargo audit --json | jq '.vulnerabilities'
# Allow some advisories with rationale
cargo audit --ignore RUSTSEC-2024-0001
cargo-audit is lighter-weight than cargo deny check advisories — use both: cargo-deny for policy enforcement, cargo-audit for quick scans.
# Drop-in replacement for `cargo test`
cargo nextest run
# Run specific tests
cargo nextest run wallet::tests::insert
cargo nextest run --package bdk-ffi
# With retry on flake
cargo nextest run --retries 2
# JUnit output for CI
cargo nextest run --profile ci
# List all tests without running
cargo nextest list
Configuration .config/nextest.toml:
[profile.default]
retries = 0
fail-fast = true
test-threads = "num-cpus"
slow-timeout = { period = "60s", terminate-after = 2 }
[profile.ci]
retries = 2
fail-fast = false
test-threads = 4
junit = { path = "target/nextest/junit.xml" }
status-level = "all"
final-status-level = "slow"
Why nextest:
cargo install cargo-tarpaulin
# Run with coverage
cargo tarpaulin --workspace --out Xml --output-dir coverage
# HTML report
cargo tarpaulin --workspace --out Html --output-dir coverage
open coverage/tarpaulin-report.html
# Exclude generated code
cargo tarpaulin --exclude-files 'target/*' '*/build.rs'
# Per-test (slower but more accurate)
cargo tarpaulin --workspace --line --branch
For Linux only. For macOS/Windows use llvm-cov.
cargo install cargo-llvm-cov
cargo llvm-cov --workspace --html
cargo llvm-cov --workspace --lcov --output-path lcov.info # for Codecov
# Combined with nextest
cargo llvm-cov nextest --workspace --lcov --output-path lcov.info
Works on macOS, Windows, Linux. Recommended for cross-platform projects.
cargo install cargo-machete
cargo machete # list unused
cargo machete --fix # auto-remove
# Skip known false positives
# .cargo/machete.toml
# ignored = ["serde_derive"]
Removes dead deps → faster builds, smaller attack surface.
cargo install cargo-outdated
cargo outdated # show outdated
cargo outdated --workspace --depth 1 # direct deps only
cargo outdated --exit-code 1 # CI: fail if outdated
Tip: don't blindly upgrade — check changelogs first, especially for crypto/network crates.
Mozilla-developed: each org curates a list of crate versions audited (by them or by trusted parties).
cargo install cargo-vet
cargo vet init
cargo vet # checks all deps audited
cargo vet inspect <crate> <version> # opens diff to inspect
cargo vet certify <crate> <version> # mark as audited
Exchange audit.toml between orgs to share trust. Used by Mozilla, Embark, Bytecode Alliance.
For BHODL: probably overkill for a single-team OSS project — but if scaling to a team or going commercial, adopt.
cargo install cargo-msrv
cargo msrv find # find minimum version that compiles
cargo msrv verify # verify advertised MSRV
Useful for libraries with users on older toolchains.
# .github/workflows/quality.yml
name: Quality
on: [push, pull_request]
env:
CARGO_TERM_COLOR: always
RUSTFLAGS: "-D warnings"
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
- name: Format
run: cargo fmt -- --check
- name: Clippy
run: cargo clippy --workspace --all-targets --all-features -- -D warnings
- name: Install cargo-binstall
uses: cargo-bins/cargo-binstall@main
{ }
Cargo.toml Lints[lints.rust]
unsafe_code = "forbid" # disallow unsafe in this crate
missing_docs = "warn"
[lints.clippy]
all = "warn"
pedantic = "warn"
nursery = "warn"
cargo = "warn"
# Allow specific
module_name_repetitions = "allow"
must_use_candidate = "allow"
rustfmt.tomledition = "2021"
max_width = 100
hard_tabs = false
tab_spaces = 4
imports_granularity = "Module"
group_imports = "StdExternalCrate"
reorder_imports = true
use_field_init_shorthand = true
clippy.tomlmsrv = "1.85"
cognitive-complexity-threshold = 30
too-many-arguments-threshold = 8
type-complexity-threshold = 250
For BHODL-style production wallet, CI MUST enforce:
cargo fmt --check — formatting consistentcargo clippy -- -D warnings — no clippy warningscargo deny check — license + advisories + banscargo audit — no known vulnerabilitiescargo machete — no unused depscargo nextest run — all tests passcargo llvm-cov — coverage threshold (e.g., 80%)cargo build --release --target <each-target> — cross-compile workscargo doc --no-deps — docs buildinfrastructure/reproducible-builds)For releases additionally:
security/sigstore-cosign)cargo sbom or syft)Goal: ship under permissive license (MIT/Apache-2.0). Therefore deny anything more restrictive transitively:
| License | Action |
|---|---|
| MIT, Apache-2.0, BSD, ISC, Unlicense, CC0 | Allow |
| MPL-2.0 | Allow but be aware (file-level copyleft — modifications must be open) |
| LGPL | Allow if dynamically linked only (rare in Rust — assume static link → reject) |
| GPL-2.0, GPL-3.0 | Reject — would force whole app under GPL |
| AGPL | Reject — also affects network-served code |
| Custom / proprietary | Manually evaluate, usually reject |
deny.toml should explicitly omit GPL from allow list.
cargo install cargo-sbom
cargo sbom --output-format spdx-json > sbom.spdx.json
cargo sbom --output-format cyclonedx-json > sbom.cyclonedx.json
Attach to release artifacts; sign with cosign (see security/sigstore-cosign).
| Anti-pattern | Why it's bad | Correct approach |
|---|---|---|
Skipping cargo deny check in CI | License/advisory drift goes unnoticed | Run on every PR |
Using cargo install for every CI tool | Slow (compile from source) | Use cargo-binstall or taiki-e/install-action |
cargo audit ignore without rationale | Accumulates muted advisories | Add comment explaining why each ignore is OK |
Blindly upgrading deps via cargo update | Can introduce breaking change | Review changelogs, especially crypto |
cargo test instead of cargo nextest | Slower, less robust | Switch to nextest |
| Coverage as goal in itself | Encourages low-quality tests | Coverage as floor (e.g., 80%), not target |
cargo deny allowing MPL-2.0 blindly | File-level copyleft — modifications you make to MPL files must be open | Allow only if you don't modify those files |
Missing multiple-versions = "warn" in bans | Bloated dep tree | Always warn on duplicates |
Allowing unknown-git source | Supply-chain risk via random forks | unknown-git = "deny" |
| No MSRV pin | Users on stable break | Set MSRV in Cargo.toml, verify with cargo-msrv |
| Static-linking GPL crate | Whole binary becomes GPL | cargo deny blocks |
| Symptom | Cause | Fix |
|---|---|---|
cargo deny: license MPL-2.0 not allowed | License not in allow list | Add to allow, or remove dep |
cargo audit: 1 vulnerability | Transitive dep affected | cargo update -p <vulnerable-crate>, or cargo audit ignore w/ reason |
cargo nextest: process exited with signal 11 | Test binary segfault | Run with --no-capture for stderr; check unsafe code |
Tarpaulin: Failed to run tests | Linux-only tool on macOS | Use cargo llvm-cov |
| Coverage report shows 0% | Tests didn't run or wrong instrumentation | Verify with cargo llvm-cov nextest --workspace |
cargo machete flags proc-macro deps | Used at compile time only | Add to [package.metadata.cargo-machete] ignored = [...] |
cargo deny: Many duplicates | Transitive version conflicts | cargo tree --duplicates to find; update or skip in deny.toml |
| Slow CI quality job | Tools install from source | Use cargo-binstall for pre-built binaries |
cargo audit fetch fails | Network/proxy | Set CARGO_AUDIT_DB_PATH to pre-cached DB |
cargo deny: source unknown | Git-sourced dep | Move to crates.io or whitelist URL in [sources] |
| Scenario | Use Instead |
|---|---|
| Cross-compile mechanics | build-tools/rust-cross-compile |
| Pure Rust language | languages/rust |
| Generic Rust testing | testing/rust-testing |
| Property-based testing | testing/proptest |
| Multi-language SBOM/vuln (Kotlin, JS, Python) | quality/osv-scanner |
| Sigstore signing | security/sigstore-cosign |
Source: claude-dev-suite/claude-dev-suite — distributed by TomeVault.