agy-superpowers 5.1.4 → 5.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/template/agent/rules/debug-confirmation-policy.md +34 -0
- package/template/agent/rules/language-matching.md +32 -0
- package/template/agent/skills/rust-developer/SKILL.md +281 -0
- package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +231 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +124 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +131 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +132 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +95 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +141 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +125 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +127 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +120 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +131 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +156 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +122 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +167 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +134 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +143 -0
- package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +121 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +143 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +187 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +165 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +177 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +163 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +146 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +142 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +160 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +125 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +162 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +177 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +184 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +168 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +182 -0
- package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +199 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +175 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +185 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +203 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +171 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +158 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +195 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +171 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +156 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +191 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +198 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +154 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +167 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +169 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +172 -0
- package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +189 -0
- package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +113 -0
- package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +147 -0
- package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +122 -0
- package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +161 -0
- package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +149 -0
- package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +138 -0
- package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +169 -0
- package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +116 -0
- package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +128 -0
- package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +136 -0
- package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +131 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +179 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +144 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +152 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +145 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +133 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +152 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +124 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +115 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +151 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +130 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +155 -0
- package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +171 -0
- package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +138 -0
- package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +107 -0
- package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +154 -0
- package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +118 -0
- package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +157 -0
- package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +133 -0
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +131 -0
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +136 -0
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +135 -0
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +122 -0
- package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +172 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +168 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +142 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +168 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +147 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +158 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +139 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +147 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +149 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +174 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +159 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +138 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +142 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +156 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +172 -0
- package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +164 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +99 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +104 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +94 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +78 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +76 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +123 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +127 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +129 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +131 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +142 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +86 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +154 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +118 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +92 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +65 -0
- package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +101 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +161 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +187 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +142 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +152 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +141 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +181 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +160 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +171 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +130 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +167 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +144 -0
- package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +154 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +141 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +95 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +135 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +124 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +135 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +134 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +134 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +105 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +65 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +97 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +122 -0
- package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +119 -0
- package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +153 -0
- package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +136 -0
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +133 -0
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +120 -0
- package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +137 -0
- package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +134 -0
- package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +150 -0
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +123 -0
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +113 -0
- package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +175 -0
- package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +149 -0
- package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +142 -0
- package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +133 -0
- package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +148 -0
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +130 -0
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +120 -0
- package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +155 -0
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +139 -0
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +135 -0
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +162 -0
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +186 -0
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +162 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +160 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +151 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +171 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +142 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +168 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +151 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +144 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +189 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +226 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +161 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +130 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +154 -0
- package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +127 -0
- package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +154 -0
- package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +142 -0
- package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +146 -0
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +160 -0
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +159 -0
- package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +144 -0
- package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +137 -0
- package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +188 -0
- package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +143 -0
- package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +131 -0
- package/template/agent/skills/systematic-debugging/SKILL.md +17 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# lint-cargo-metadata
|
|
2
|
+
|
|
3
|
+
> Enable clippy::cargo for published crates
|
|
4
|
+
|
|
5
|
+
## Why It Matters
|
|
6
|
+
|
|
7
|
+
The `clippy::cargo` lint group checks Cargo.toml for issues that affect publishing and dependency management. For crates intended for crates.io, these checks help ensure a professional, well-configured package.
|
|
8
|
+
|
|
9
|
+
## Configuration
|
|
10
|
+
|
|
11
|
+
```toml
|
|
12
|
+
# Cargo.toml
|
|
13
|
+
[lints.clippy]
|
|
14
|
+
cargo = "warn"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Or in code:
|
|
18
|
+
|
|
19
|
+
```rust
|
|
20
|
+
#![warn(clippy::cargo)]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## What It Catches
|
|
24
|
+
|
|
25
|
+
### Missing Metadata
|
|
26
|
+
|
|
27
|
+
```toml
|
|
28
|
+
# WARN: missing package.description
|
|
29
|
+
# WARN: missing package.license or package.license-file
|
|
30
|
+
# WARN: missing package.repository
|
|
31
|
+
[package]
|
|
32
|
+
name = "my-crate"
|
|
33
|
+
version = "0.1.0"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Dependency Issues
|
|
37
|
+
|
|
38
|
+
```toml
|
|
39
|
+
# WARN: feature used but not defined
|
|
40
|
+
# WARN: dependency version not specified
|
|
41
|
+
[dependencies]
|
|
42
|
+
serde = "*" # Bad: any version
|
|
43
|
+
tokio = { git = "..." } # WARN for published crates
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Feature Issues
|
|
47
|
+
|
|
48
|
+
```toml
|
|
49
|
+
# WARN: negative_feature_names
|
|
50
|
+
[features]
|
|
51
|
+
no-std = [] # Should be: std = [] (opt-out vs opt-in)
|
|
52
|
+
|
|
53
|
+
# WARN: redundant_feature_names
|
|
54
|
+
[features]
|
|
55
|
+
default = ["feature-a"]
|
|
56
|
+
feature-a = [] # Feature name matches crate name
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Notable Lints
|
|
60
|
+
|
|
61
|
+
| Lint | Issue |
|
|
62
|
+
|------|-------|
|
|
63
|
+
| `cargo_common_metadata` | Missing description/license/repository |
|
|
64
|
+
| `multiple_crate_versions` | Same crate at different versions |
|
|
65
|
+
| `negative_feature_names` | Features like `no-std` instead of `std` |
|
|
66
|
+
| `redundant_feature_names` | Feature same as crate name |
|
|
67
|
+
| `wildcard_dependencies` | Using `*` for version |
|
|
68
|
+
|
|
69
|
+
## Complete Cargo.toml
|
|
70
|
+
|
|
71
|
+
```toml
|
|
72
|
+
[package]
|
|
73
|
+
name = "my-crate"
|
|
74
|
+
version = "0.1.0"
|
|
75
|
+
edition = "2021"
|
|
76
|
+
rust-version = "1.70"
|
|
77
|
+
|
|
78
|
+
# Required for cargo lint satisfaction
|
|
79
|
+
description = "A short description of what this crate does"
|
|
80
|
+
license = "MIT OR Apache-2.0"
|
|
81
|
+
repository = "https://github.com/user/my-crate"
|
|
82
|
+
|
|
83
|
+
# Recommended
|
|
84
|
+
documentation = "https://docs.rs/my-crate"
|
|
85
|
+
readme = "README.md"
|
|
86
|
+
keywords = ["keyword1", "keyword2"]
|
|
87
|
+
categories = ["category-slug"]
|
|
88
|
+
|
|
89
|
+
[dependencies]
|
|
90
|
+
# Specific versions, not wildcards
|
|
91
|
+
serde = "1.0"
|
|
92
|
+
tokio = { version = "1.0", features = ["full"] }
|
|
93
|
+
|
|
94
|
+
[features]
|
|
95
|
+
default = ["std"]
|
|
96
|
+
std = [] # Opt-out, not no-std opt-in
|
|
97
|
+
|
|
98
|
+
[lints.clippy]
|
|
99
|
+
cargo = "warn"
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Multiple Crate Versions
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
# WARN: multiple versions of `syn` in dependency tree
|
|
106
|
+
# syn v1.0.109
|
|
107
|
+
# syn v2.0.48
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Fix by updating dependencies or using `[patch]`:
|
|
111
|
+
|
|
112
|
+
```toml
|
|
113
|
+
[patch.crates-io]
|
|
114
|
+
old-dep = { git = "...", branch = "syn-2" }
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## When to Disable
|
|
118
|
+
|
|
119
|
+
For internal/unpublished crates:
|
|
120
|
+
|
|
121
|
+
```toml
|
|
122
|
+
[lints.clippy]
|
|
123
|
+
cargo = "allow" # Not publishing, metadata not needed
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Or selectively:
|
|
127
|
+
|
|
128
|
+
```toml
|
|
129
|
+
[lints.clippy]
|
|
130
|
+
cargo = "warn"
|
|
131
|
+
multiple_crate_versions = "allow" # Acceptable in this project
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## See Also
|
|
135
|
+
|
|
136
|
+
- [doc-cargo-metadata](./doc-cargo-metadata.md) - Cargo.toml metadata
|
|
137
|
+
- [proj-workspace-deps](./proj-workspace-deps.md) - Workspace dependencies
|
|
138
|
+
- [lint-deny-correctness](./lint-deny-correctness.md) - Correctness lints
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# lint-deny-correctness
|
|
2
|
+
|
|
3
|
+
> `#![deny(clippy::correctness)]`
|
|
4
|
+
|
|
5
|
+
## Why It Matters
|
|
6
|
+
|
|
7
|
+
Clippy's correctness lints catch code that is outright wrong - logic errors, undefined behavior, or code that doesn't do what you think. These should always be errors, not warnings.
|
|
8
|
+
|
|
9
|
+
## Setup
|
|
10
|
+
|
|
11
|
+
```rust
|
|
12
|
+
// At the top of lib.rs or main.rs
|
|
13
|
+
#![deny(clippy::correctness)]
|
|
14
|
+
|
|
15
|
+
// Or in Cargo.toml for workspace-wide
|
|
16
|
+
[lints.clippy]
|
|
17
|
+
correctness = "deny"
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## What It Catches
|
|
21
|
+
|
|
22
|
+
```rust
|
|
23
|
+
// Infinite loop (iter::repeat without take)
|
|
24
|
+
for x in std::iter::repeat(1) { // ERROR: infinite iterator
|
|
25
|
+
println!("{}", x);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Comparison to NaN (always false)
|
|
29
|
+
if x == f64::NAN { // ERROR: NaN != NaN always
|
|
30
|
+
// This never executes
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Use after free patterns
|
|
34
|
+
let r;
|
|
35
|
+
{
|
|
36
|
+
let x = 5;
|
|
37
|
+
r = &x; // ERROR: x dropped here
|
|
38
|
+
}
|
|
39
|
+
println!("{}", r);
|
|
40
|
+
|
|
41
|
+
// Wrong equality check
|
|
42
|
+
if x = 5 { // ERROR: assignment in condition (should be ==)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Useless comparisons
|
|
46
|
+
if x >= 0 && x < 0 { // ERROR: impossible condition
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Important Correctness Lints
|
|
51
|
+
|
|
52
|
+
```rust
|
|
53
|
+
// approx_constant - using imprecise PI, E values
|
|
54
|
+
let pi = 3.14; // Use std::f64::consts::PI
|
|
55
|
+
|
|
56
|
+
// invalid_regex - regex that won't compile
|
|
57
|
+
let re = Regex::new("["); // Invalid regex
|
|
58
|
+
|
|
59
|
+
// iter_next_loop - using .next() in for loop incorrectly
|
|
60
|
+
for x in iter.next() { // Should be: for x in iter
|
|
61
|
+
|
|
62
|
+
// never_loop - loop that never actually loops
|
|
63
|
+
loop {
|
|
64
|
+
break; // Always breaks immediately
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// nonsensical_open_options - impossible file options
|
|
68
|
+
File::options().read(false).write(false).open("f");
|
|
69
|
+
|
|
70
|
+
// unit_cmp - comparing unit type ()
|
|
71
|
+
if foo() == bar() { } // Both return (), always true
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Full Recommended Lints
|
|
75
|
+
|
|
76
|
+
```rust
|
|
77
|
+
#![deny(clippy::correctness)]
|
|
78
|
+
#![warn(clippy::suspicious)]
|
|
79
|
+
#![warn(clippy::style)]
|
|
80
|
+
#![warn(clippy::complexity)]
|
|
81
|
+
#![warn(clippy::perf)]
|
|
82
|
+
|
|
83
|
+
// For published crates
|
|
84
|
+
#![warn(missing_docs)]
|
|
85
|
+
#![warn(clippy::cargo)]
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Running Clippy
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# Basic check
|
|
92
|
+
cargo clippy
|
|
93
|
+
|
|
94
|
+
# With all warnings as errors
|
|
95
|
+
cargo clippy -- -D warnings
|
|
96
|
+
|
|
97
|
+
# Check specific lint category
|
|
98
|
+
cargo clippy -- -W clippy::correctness
|
|
99
|
+
|
|
100
|
+
# In CI (fail on warnings)
|
|
101
|
+
cargo clippy -- -D warnings -D clippy::correctness
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## See Also
|
|
105
|
+
|
|
106
|
+
- [lint-warn-suspicious](lint-warn-suspicious.md) - Warn on suspicious code
|
|
107
|
+
- [lint-warn-perf](lint-warn-perf.md) - Warn on performance issues
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# lint-missing-docs
|
|
2
|
+
|
|
3
|
+
> Warn on missing documentation for public items
|
|
4
|
+
|
|
5
|
+
## Why It Matters
|
|
6
|
+
|
|
7
|
+
The `missing_docs` lint ensures all public API items are documented. For libraries, documentation IS the user interface. Missing docs mean users can't understand your API without reading source code.
|
|
8
|
+
|
|
9
|
+
## Configuration
|
|
10
|
+
|
|
11
|
+
```rust
|
|
12
|
+
// In lib.rs
|
|
13
|
+
#![warn(missing_docs)]
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Or in `Cargo.toml`:
|
|
17
|
+
|
|
18
|
+
```toml
|
|
19
|
+
[lints.rust]
|
|
20
|
+
missing_docs = "warn"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
For strict enforcement:
|
|
24
|
+
|
|
25
|
+
```rust
|
|
26
|
+
#![deny(missing_docs)]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## What It Catches
|
|
30
|
+
|
|
31
|
+
```rust
|
|
32
|
+
#![warn(missing_docs)]
|
|
33
|
+
|
|
34
|
+
pub struct User { // WARN: missing documentation for a struct
|
|
35
|
+
pub name: String, // WARN: missing documentation for a field
|
|
36
|
+
pub age: u32, // WARN: missing documentation for a field
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
pub fn process() { } // WARN: missing documentation for a function
|
|
40
|
+
|
|
41
|
+
pub trait Handler { // WARN: missing documentation for a trait
|
|
42
|
+
fn handle(&self); // WARN: missing documentation for a method
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Good
|
|
47
|
+
|
|
48
|
+
```rust
|
|
49
|
+
#![warn(missing_docs)]
|
|
50
|
+
|
|
51
|
+
//! User management module.
|
|
52
|
+
|
|
53
|
+
/// Represents a registered user in the system.
|
|
54
|
+
pub struct User {
|
|
55
|
+
/// The user's display name.
|
|
56
|
+
pub name: String,
|
|
57
|
+
/// The user's age in years.
|
|
58
|
+
pub age: u32,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/// Processes pending user requests.
|
|
62
|
+
///
|
|
63
|
+
/// # Examples
|
|
64
|
+
///
|
|
65
|
+
/// ```
|
|
66
|
+
/// process();
|
|
67
|
+
/// ```
|
|
68
|
+
pub fn process() { }
|
|
69
|
+
|
|
70
|
+
/// Handler trait for request processing.
|
|
71
|
+
pub trait Handler {
|
|
72
|
+
/// Handle an incoming request.
|
|
73
|
+
fn handle(&self);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Private Items
|
|
78
|
+
|
|
79
|
+
`missing_docs` only applies to `pub` items. Private items don't trigger warnings:
|
|
80
|
+
|
|
81
|
+
```rust
|
|
82
|
+
#![warn(missing_docs)]
|
|
83
|
+
|
|
84
|
+
struct Internal { } // No warning - private
|
|
85
|
+
|
|
86
|
+
pub struct Public { } // WARN - public, needs docs
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Allow for Specific Items
|
|
90
|
+
|
|
91
|
+
```rust
|
|
92
|
+
#![warn(missing_docs)]
|
|
93
|
+
|
|
94
|
+
/// Documented module.
|
|
95
|
+
pub mod api {
|
|
96
|
+
/// Documented struct.
|
|
97
|
+
pub struct Config { }
|
|
98
|
+
|
|
99
|
+
#[allow(missing_docs)]
|
|
100
|
+
pub mod internal {
|
|
101
|
+
// Internal API, docs not required
|
|
102
|
+
pub struct Helper { }
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Gradual Adoption
|
|
108
|
+
|
|
109
|
+
For existing codebases, start with `warn` and fix incrementally:
|
|
110
|
+
|
|
111
|
+
```rust
|
|
112
|
+
// Phase 1: Warn, fix critical items
|
|
113
|
+
#![warn(missing_docs)]
|
|
114
|
+
|
|
115
|
+
// Phase 2: After cleanup, deny
|
|
116
|
+
#![deny(missing_docs)]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Combining with doc Attributes
|
|
120
|
+
|
|
121
|
+
```rust
|
|
122
|
+
#![warn(missing_docs)]
|
|
123
|
+
#![warn(rustdoc::broken_intra_doc_links)]
|
|
124
|
+
#![warn(rustdoc::private_intra_doc_links)]
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Workspace Configuration
|
|
128
|
+
|
|
129
|
+
```toml
|
|
130
|
+
# In workspace Cargo.toml
|
|
131
|
+
[workspace.lints.rust]
|
|
132
|
+
missing_docs = "warn"
|
|
133
|
+
|
|
134
|
+
# Member crates inherit
|
|
135
|
+
[lints]
|
|
136
|
+
workspace = true
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## What to Document
|
|
140
|
+
|
|
141
|
+
| Item | Doc Focus |
|
|
142
|
+
|------|-----------|
|
|
143
|
+
| Structs | Purpose, usage example |
|
|
144
|
+
| Struct fields | What it represents |
|
|
145
|
+
| Enums | When to use each variant |
|
|
146
|
+
| Functions | What it does, params, return |
|
|
147
|
+
| Traits | Contract and expectations |
|
|
148
|
+
| Modules | What the module provides |
|
|
149
|
+
|
|
150
|
+
## See Also
|
|
151
|
+
|
|
152
|
+
- [doc-all-public](./doc-all-public.md) - Documentation patterns
|
|
153
|
+
- [lint-unsafe-doc](./lint-unsafe-doc.md) - Unsafe documentation
|
|
154
|
+
- [doc-examples-section](./doc-examples-section.md) - Adding examples
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# lint-pedantic-selective
|
|
2
|
+
|
|
3
|
+
> Enable clippy::pedantic selectively
|
|
4
|
+
|
|
5
|
+
## Why It Matters
|
|
6
|
+
|
|
7
|
+
The `clippy::pedantic` group contains opinionated lints that aren't universally applicable. Enabling it wholesale produces noise; selectively enabling useful pedantic lints improves code quality without false positives.
|
|
8
|
+
|
|
9
|
+
## Bad
|
|
10
|
+
|
|
11
|
+
```rust
|
|
12
|
+
// Too noisy - will fight you constantly
|
|
13
|
+
#![warn(clippy::pedantic)]
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Good
|
|
17
|
+
|
|
18
|
+
```toml
|
|
19
|
+
# Cargo.toml - cherry-pick useful pedantic lints
|
|
20
|
+
[lints.clippy]
|
|
21
|
+
# Enable pedantic as baseline
|
|
22
|
+
pedantic = "warn"
|
|
23
|
+
|
|
24
|
+
# Disable noisy ones
|
|
25
|
+
missing_errors_doc = "allow" # Document errors separately
|
|
26
|
+
missing_panics_doc = "allow" # Document panics separately
|
|
27
|
+
module_name_repetitions = "allow" # Allow Foo::FooError pattern
|
|
28
|
+
too_many_lines = "allow" # Function length varies
|
|
29
|
+
must_use_candidate = "allow" # Too many suggestions
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Recommended Pedantic Lints
|
|
33
|
+
|
|
34
|
+
| Lint | Why Enable |
|
|
35
|
+
|------|-----------|
|
|
36
|
+
| `doc_markdown` | Catch unmarked code in docs |
|
|
37
|
+
| `match_wildcard_for_single_variants` | Explicit variant matching |
|
|
38
|
+
| `semicolon_if_nothing_returned` | Consistent semicolons |
|
|
39
|
+
| `string_add_assign` | Use `+=` for string concatenation |
|
|
40
|
+
| `unnested_or_patterns` | Simplify match patterns |
|
|
41
|
+
| `unused_self` | Catch methods that should be functions |
|
|
42
|
+
| `used_underscore_binding` | Warn on using `_var` |
|
|
43
|
+
| `wildcard_imports` | Avoid glob imports |
|
|
44
|
+
|
|
45
|
+
## Often Disabled
|
|
46
|
+
|
|
47
|
+
| Lint | Why Disable |
|
|
48
|
+
|------|-------------|
|
|
49
|
+
| `missing_errors_doc` | Handle with `#[doc]` policy |
|
|
50
|
+
| `missing_panics_doc` | Handle with `#[doc]` policy |
|
|
51
|
+
| `module_name_repetitions` | Sometimes intentional |
|
|
52
|
+
| `must_use_candidate` | Too aggressive |
|
|
53
|
+
| `too_many_lines` | Arbitrary threshold |
|
|
54
|
+
| `struct_excessive_bools` | Valid for config structs |
|
|
55
|
+
|
|
56
|
+
## Full Configuration
|
|
57
|
+
|
|
58
|
+
```toml
|
|
59
|
+
# Cargo.toml
|
|
60
|
+
[lints.clippy]
|
|
61
|
+
# Start with pedantic
|
|
62
|
+
pedantic = "warn"
|
|
63
|
+
|
|
64
|
+
# Keep these
|
|
65
|
+
doc_markdown = "warn"
|
|
66
|
+
match_wildcard_for_single_variants = "warn"
|
|
67
|
+
semicolon_if_nothing_returned = "warn"
|
|
68
|
+
unused_self = "warn"
|
|
69
|
+
wildcard_imports = "warn"
|
|
70
|
+
|
|
71
|
+
# Disable these
|
|
72
|
+
missing_errors_doc = "allow"
|
|
73
|
+
missing_panics_doc = "allow"
|
|
74
|
+
module_name_repetitions = "allow"
|
|
75
|
+
must_use_candidate = "allow"
|
|
76
|
+
too_many_lines = "allow"
|
|
77
|
+
similar_names = "allow"
|
|
78
|
+
struct_excessive_bools = "allow"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Alternative: Explicit Opt-in
|
|
82
|
+
|
|
83
|
+
```toml
|
|
84
|
+
# Only enable specific lints, not the group
|
|
85
|
+
[lints.clippy]
|
|
86
|
+
# From pedantic, only these:
|
|
87
|
+
doc_markdown = "warn"
|
|
88
|
+
semicolon_if_nothing_returned = "warn"
|
|
89
|
+
unused_self = "warn"
|
|
90
|
+
wildcard_imports = "warn"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Module-Level Overrides
|
|
94
|
+
|
|
95
|
+
```rust
|
|
96
|
+
// Allow specific lint for a module
|
|
97
|
+
#![allow(clippy::module_name_repetitions)]
|
|
98
|
+
|
|
99
|
+
// Or for specific items
|
|
100
|
+
#[allow(clippy::too_many_arguments)]
|
|
101
|
+
fn complex_function(/* many args */) { }
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Team Consensus
|
|
105
|
+
|
|
106
|
+
Pedantic lints are style choices. Agree as a team:
|
|
107
|
+
|
|
108
|
+
1. Enable `pedantic` as baseline
|
|
109
|
+
2. Run `cargo clippy` on codebase
|
|
110
|
+
3. Discuss each warning category
|
|
111
|
+
4. Disable ones that don't fit your style
|
|
112
|
+
5. Document decisions in `clippy.toml`
|
|
113
|
+
|
|
114
|
+
## See Also
|
|
115
|
+
|
|
116
|
+
- [lint-warn-style](./lint-warn-style.md) - Style warnings
|
|
117
|
+
- [lint-warn-complexity](./lint-warn-complexity.md) - Complexity warnings
|
|
118
|
+
- [lint-deny-correctness](./lint-deny-correctness.md) - Correctness lints
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# lint-rustfmt-check
|
|
2
|
+
|
|
3
|
+
> Run cargo fmt --check in CI
|
|
4
|
+
|
|
5
|
+
## Why It Matters
|
|
6
|
+
|
|
7
|
+
Consistent formatting eliminates style debates and makes diffs cleaner. Running `cargo fmt --check` in CI ensures all code follows the same format. This catches formatting issues before merge, not after.
|
|
8
|
+
|
|
9
|
+
## CI Configuration
|
|
10
|
+
|
|
11
|
+
### GitHub Actions
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
name: CI
|
|
15
|
+
|
|
16
|
+
on: [push, pull_request]
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
fmt:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
24
|
+
with:
|
|
25
|
+
components: rustfmt
|
|
26
|
+
- run: cargo fmt --all --check
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### GitLab CI
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
fmt:
|
|
33
|
+
image: rust:latest
|
|
34
|
+
script:
|
|
35
|
+
- rustup component add rustfmt
|
|
36
|
+
- cargo fmt --all --check
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Pre-commit Hook
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
#!/bin/sh
|
|
43
|
+
# .git/hooks/pre-commit
|
|
44
|
+
cargo fmt --all --check
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Configuration
|
|
48
|
+
|
|
49
|
+
Create `rustfmt.toml` for custom settings:
|
|
50
|
+
|
|
51
|
+
```toml
|
|
52
|
+
# rustfmt.toml
|
|
53
|
+
edition = "2021"
|
|
54
|
+
max_width = 100
|
|
55
|
+
use_small_heuristics = "Max"
|
|
56
|
+
imports_granularity = "Module"
|
|
57
|
+
group_imports = "StdExternalCrate"
|
|
58
|
+
reorder_imports = true
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Common Options
|
|
62
|
+
|
|
63
|
+
| Option | Default | Description |
|
|
64
|
+
|--------|---------|-------------|
|
|
65
|
+
| `max_width` | 100 | Maximum line width |
|
|
66
|
+
| `tab_spaces` | 4 | Spaces per indent |
|
|
67
|
+
| `edition` | "2015" | Rust edition |
|
|
68
|
+
| `use_small_heuristics` | "Default" | Layout heuristics |
|
|
69
|
+
| `imports_granularity` | "Preserve" | Import grouping |
|
|
70
|
+
| `group_imports` | "Preserve" | Import ordering |
|
|
71
|
+
|
|
72
|
+
## Running Locally
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Check formatting (doesn't modify files)
|
|
76
|
+
cargo fmt --all --check
|
|
77
|
+
|
|
78
|
+
# Apply formatting
|
|
79
|
+
cargo fmt --all
|
|
80
|
+
|
|
81
|
+
# Format specific file
|
|
82
|
+
cargo fmt -- src/main.rs
|
|
83
|
+
|
|
84
|
+
# Check with verbose output
|
|
85
|
+
cargo fmt --all --check -- --verbose
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Workspace Formatting
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# Format all workspace members
|
|
92
|
+
cargo fmt --all
|
|
93
|
+
|
|
94
|
+
# Format specific package
|
|
95
|
+
cargo fmt -p my-package
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Ignoring Files
|
|
99
|
+
|
|
100
|
+
In `rustfmt.toml`:
|
|
101
|
+
|
|
102
|
+
```toml
|
|
103
|
+
# Skip generated files
|
|
104
|
+
ignore = [
|
|
105
|
+
"src/generated/*",
|
|
106
|
+
"build.rs",
|
|
107
|
+
]
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Or in code:
|
|
111
|
+
|
|
112
|
+
```rust
|
|
113
|
+
#[rustfmt::skip]
|
|
114
|
+
mod generated_code;
|
|
115
|
+
|
|
116
|
+
#[rustfmt::skip]
|
|
117
|
+
const MATRIX: [[i32; 4]; 4] = [
|
|
118
|
+
[1, 0, 0, 0],
|
|
119
|
+
[0, 1, 0, 0],
|
|
120
|
+
[0, 0, 1, 0],
|
|
121
|
+
[0, 0, 0, 1],
|
|
122
|
+
];
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Nightly Features
|
|
126
|
+
|
|
127
|
+
Some options require nightly:
|
|
128
|
+
|
|
129
|
+
```toml
|
|
130
|
+
# rustfmt.toml (nightly only)
|
|
131
|
+
unstable_features = true
|
|
132
|
+
imports_granularity = "Crate"
|
|
133
|
+
wrap_comments = true
|
|
134
|
+
format_code_in_doc_comments = true
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Use nightly rustfmt
|
|
139
|
+
cargo +nightly fmt
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## IDE Integration
|
|
143
|
+
|
|
144
|
+
Most IDEs format on save. Configure to use project `rustfmt.toml`:
|
|
145
|
+
|
|
146
|
+
```json
|
|
147
|
+
// VS Code settings.json
|
|
148
|
+
{
|
|
149
|
+
"rust-analyzer.rustfmt.extraArgs": ["--config-path", "./rustfmt.toml"]
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## See Also
|
|
154
|
+
|
|
155
|
+
- [lint-warn-style](./lint-warn-style.md) - Style lints
|
|
156
|
+
- [lint-pedantic-selective](./lint-pedantic-selective.md) - Pedantic lints
|
|
157
|
+
- [name-funcs-snake](./name-funcs-snake.md) - Naming conventions
|