agy-superpowers 5.2.2 → 5.2.4
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/README.md +47 -150
- package/package.json +1 -1
- package/template/agent/rules/CLAUDE.md +80 -0
- package/template/agent/rules/code-styles.md +31 -32
- package/template/agent/rules/debug-confirmation-policy.md +2 -0
- package/template/agent/rules/file-length-policy.md +2 -0
- package/template/agent/rules/git-policy.md +7 -0
- package/template/agent/rules/language-matching.md +2 -0
- package/template/agent/rules/scratch-scripts.md +39 -0
- package/template/agent/rules/superpowers.md +8 -51
- package/template/agent/skills/executing-plans/SKILL.md +17 -0
- package/template/agent/skills/systematic-debugging/SKILL.md +16 -0
- package/template/agent/skills/test-driven-development/SKILL.md +16 -0
- package/template/agent/skills/verification-before-completion/SKILL.md +22 -0
- package/template/agent/skills/writing-plans/SKILL.md +16 -0
- package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
- package/template/agent/skills/analytics-setup/SKILL.md +0 -51
- package/template/agent/skills/api-design/SKILL.md +0 -193
- package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
- package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
- package/template/agent/skills/backend-developer/SKILL.md +0 -148
- package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
- package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
- package/template/agent/skills/community-manager/SKILL.md +0 -115
- package/template/agent/skills/content-marketer/SKILL.md +0 -111
- package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
- package/template/agent/skills/cto-architect/SKILL.md +0 -133
- package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
- package/template/agent/skills/data-analyst/SKILL.md +0 -147
- package/template/agent/skills/devops-engineer/SKILL.md +0 -117
- package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
- package/template/agent/skills/game-design/SKILL.md +0 -194
- package/template/agent/skills/game-developer/SKILL.md +0 -175
- package/template/agent/skills/growth-hacker/SKILL.md +0 -122
- package/template/agent/skills/idea-validator/SKILL.md +0 -55
- package/template/agent/skills/indie-legal/SKILL.md +0 -53
- package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
- package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
- package/template/agent/skills/launch-strategist/SKILL.md +0 -62
- package/template/agent/skills/market-researcher/SKILL.md +0 -53
- package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
- package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
- package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
- package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
- package/template/agent/skills/real-time-features/SKILL.md +0 -194
- package/template/agent/skills/retention-specialist/SKILL.md +0 -123
- package/template/agent/skills/rust-developer/SKILL.md +0 -281
- package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
- package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
- package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
- package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
- package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
- package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
- package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
- package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
- package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
- package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
- package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
- package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
- package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
- package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
- package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
- package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
- package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
- package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
- package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
- package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
- package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
- package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
- package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
- package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
- package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
- package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
- package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
- package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
- package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
- package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
- package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
- package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
- package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
- package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
- package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
- package/template/agent/skills/saas-architect/SKILL.md +0 -139
- package/template/agent/skills/security-engineer/SKILL.md +0 -133
- package/template/agent/skills/seo-specialist/SKILL.md +0 -130
- package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
# lint-warn-perf
|
|
2
|
-
|
|
3
|
-
> Enable clippy::perf for performance improvements
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
The `clippy::perf` lint group catches performance anti-patterns—inefficient allocations, unnecessary copies, suboptimal API usage. While not all performance issues are critical, avoiding obvious inefficiencies is good practice.
|
|
8
|
-
|
|
9
|
-
## Configuration
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// In lib.rs or main.rs
|
|
13
|
-
#![warn(clippy::perf)]
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Or in `Cargo.toml`:
|
|
17
|
-
|
|
18
|
-
```toml
|
|
19
|
-
[lints.clippy]
|
|
20
|
-
perf = "warn"
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## What It Catches
|
|
24
|
-
|
|
25
|
-
### Unnecessary Allocations
|
|
26
|
-
|
|
27
|
-
```rust
|
|
28
|
-
// WARN: Unnecessary to_string before into
|
|
29
|
-
fn take_string(s: impl Into<String>) { }
|
|
30
|
-
take_string("hello".to_string()); // Just use: "hello"
|
|
31
|
-
|
|
32
|
-
// WARN: Box::new in return with deref coercion
|
|
33
|
-
fn make_trait() -> Box<dyn Trait> {
|
|
34
|
-
Box::new(concrete) // Could use Into
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// WARN: Unnecessary vec! for iteration
|
|
38
|
-
for x in vec![1, 2, 3] { } // Use array: [1, 2, 3]
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Inefficient Operations
|
|
42
|
-
|
|
43
|
-
```rust
|
|
44
|
-
// WARN: Single-character string patterns
|
|
45
|
-
s.starts_with("x") // Use char: 'x'
|
|
46
|
-
s.contains("a") // Use char: 'a'
|
|
47
|
-
|
|
48
|
-
// WARN: iter().nth(0) instead of first()
|
|
49
|
-
iter.nth(0) // Use: iter.first() or iter.next()
|
|
50
|
-
|
|
51
|
-
// WARN: Manual saturating arithmetic
|
|
52
|
-
if x > i32::MAX - y { i32::MAX } else { x + y }
|
|
53
|
-
// Use: x.saturating_add(y)
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Collection Inefficiencies
|
|
57
|
-
|
|
58
|
-
```rust
|
|
59
|
-
// WARN: extend with a single element
|
|
60
|
-
vec.extend(std::iter::once(item)); // Use: vec.push(item)
|
|
61
|
-
|
|
62
|
-
// WARN: Inefficient to_vec
|
|
63
|
-
slice.iter().cloned().collect::<Vec<_>>() // Use: slice.to_vec()
|
|
64
|
-
|
|
65
|
-
// WARN: Manual string concatenation
|
|
66
|
-
let s = format!("{}{}", a, b); // When both are &str, use: a.to_owned() + b
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## Notable Lints in This Group
|
|
70
|
-
|
|
71
|
-
| Lint | Improvement |
|
|
72
|
-
|------|-------------|
|
|
73
|
-
| `box_collection` | Use `Vec<T>` not `Box<Vec<T>>` |
|
|
74
|
-
| `iter_nth` | Use `.get(n)` or `.next()` |
|
|
75
|
-
| `large_enum_variant` | Box large variants |
|
|
76
|
-
| `manual_memcpy` | Use slice copy methods |
|
|
77
|
-
| `redundant_allocation` | Remove double boxing |
|
|
78
|
-
| `single_char_pattern` | Use `char` not `&str` |
|
|
79
|
-
| `slow_vector_initialization` | Use `vec![0; n]` |
|
|
80
|
-
| `unnecessary_to_owned` | Remove redundant `.to_owned()` |
|
|
81
|
-
|
|
82
|
-
## Examples
|
|
83
|
-
|
|
84
|
-
```rust
|
|
85
|
-
// Before (perf warnings)
|
|
86
|
-
fn process(input: &str) -> String {
|
|
87
|
-
let parts: Vec<_> = input.split(",").collect();
|
|
88
|
-
let mut result = String::new();
|
|
89
|
-
for part in parts.iter() {
|
|
90
|
-
if part.starts_with(" ") {
|
|
91
|
-
result = result + &part.trim().to_string();
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
result
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// After (optimized)
|
|
98
|
-
fn process(input: &str) -> String {
|
|
99
|
-
input.split(',')
|
|
100
|
-
.filter(|part| part.starts_with(' '))
|
|
101
|
-
.map(str::trim)
|
|
102
|
-
.collect()
|
|
103
|
-
}
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
## Allocation Patterns
|
|
107
|
-
|
|
108
|
-
```rust
|
|
109
|
-
// Unnecessary allocation
|
|
110
|
-
let vec: Vec<i32> = vec![]; // Creates capacity
|
|
111
|
-
let vec: Vec<i32> = Vec::new(); // No allocation
|
|
112
|
-
|
|
113
|
-
// Pre-allocation
|
|
114
|
-
let mut vec = Vec::with_capacity(100); // One allocation
|
|
115
|
-
for i in 0..100 {
|
|
116
|
-
vec.push(i); // No reallocation
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
## String Patterns
|
|
121
|
-
|
|
122
|
-
```rust
|
|
123
|
-
// Slow: str pattern
|
|
124
|
-
s.contains("x");
|
|
125
|
-
s.find("y");
|
|
126
|
-
|
|
127
|
-
// Fast: char pattern
|
|
128
|
-
s.contains('x');
|
|
129
|
-
s.find('y');
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
## See Also
|
|
133
|
-
|
|
134
|
-
- [lint-warn-complexity](./lint-warn-complexity.md) - Complexity warnings
|
|
135
|
-
- [mem-with-capacity](./mem-with-capacity.md) - Pre-allocation
|
|
136
|
-
- [perf-profile-first](./perf-profile-first.md) - Profile before optimizing
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
# lint-warn-style
|
|
2
|
-
|
|
3
|
-
> Enable clippy::style for idiomatic code
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
The `clippy::style` lint group enforces idiomatic Rust patterns. While not bugs, style violations make code harder to read and maintain. Consistent style helps teams work together and makes code easier to review.
|
|
8
|
-
|
|
9
|
-
## Configuration
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// In lib.rs or main.rs
|
|
13
|
-
#![warn(clippy::style)]
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Or in `Cargo.toml`:
|
|
17
|
-
|
|
18
|
-
```toml
|
|
19
|
-
[lints.clippy]
|
|
20
|
-
style = "warn"
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## What It Catches
|
|
24
|
-
|
|
25
|
-
### Redundant Code
|
|
26
|
-
|
|
27
|
-
```rust
|
|
28
|
-
// WARN: Redundant clone on Copy type
|
|
29
|
-
let x = 5;
|
|
30
|
-
let y = x.clone(); // Just use: let y = x;
|
|
31
|
-
|
|
32
|
-
// WARN: Redundant closure
|
|
33
|
-
iter.map(|x| foo(x)) // Just use: iter.map(foo)
|
|
34
|
-
|
|
35
|
-
// WARN: Redundant pattern matching
|
|
36
|
-
match result {
|
|
37
|
-
Ok(x) => Ok(x),
|
|
38
|
-
Err(e) => Err(e),
|
|
39
|
-
} // Just return result
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Non-Idiomatic Patterns
|
|
43
|
-
|
|
44
|
-
```rust
|
|
45
|
-
// WARN: Should use if let
|
|
46
|
-
match option {
|
|
47
|
-
Some(x) => do_something(x),
|
|
48
|
-
None => {},
|
|
49
|
-
}
|
|
50
|
-
// Better: if let Some(x) = option { do_something(x) }
|
|
51
|
-
|
|
52
|
-
// WARN: Should use or_else
|
|
53
|
-
let value = if option.is_some() {
|
|
54
|
-
option.unwrap()
|
|
55
|
-
} else {
|
|
56
|
-
default()
|
|
57
|
-
};
|
|
58
|
-
// Better: option.unwrap_or_else(default)
|
|
59
|
-
|
|
60
|
-
// WARN: Collapsible if statements
|
|
61
|
-
if condition1 {
|
|
62
|
-
if condition2 {
|
|
63
|
-
do_something();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// Better: if condition1 && condition2 { do_something() }
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### Naming Issues
|
|
70
|
-
|
|
71
|
-
```rust
|
|
72
|
-
// WARN: Function should not start with 'is_' returning non-bool
|
|
73
|
-
fn is_valid() -> i32 { 0 } // Misleading name
|
|
74
|
-
|
|
75
|
-
// WARN: Method should not be named 'new' without returning Self
|
|
76
|
-
impl Foo {
|
|
77
|
-
fn new() -> Bar { Bar } // Confusing
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## Notable Lints in This Group
|
|
82
|
-
|
|
83
|
-
| Lint | Better Pattern |
|
|
84
|
-
|------|---------------|
|
|
85
|
-
| `len_zero` | Use `is_empty()` instead of `len() == 0` |
|
|
86
|
-
| `redundant_field_names` | Use shorthand `{ x }` not `{ x: x }` |
|
|
87
|
-
| `unused_unit` | Remove `-> ()` and trailing `()` |
|
|
88
|
-
| `collapsible_if` | Combine nested ifs with `&&` |
|
|
89
|
-
| `single_match` | Use `if let` instead |
|
|
90
|
-
| `match_like_matches_macro` | Use `matches!()` macro |
|
|
91
|
-
| `needless_return` | Remove explicit `return` at end |
|
|
92
|
-
| `question_mark` | Use `?` instead of `match` |
|
|
93
|
-
|
|
94
|
-
## Examples
|
|
95
|
-
|
|
96
|
-
```rust
|
|
97
|
-
// Before (style warnings)
|
|
98
|
-
fn process(data: Vec<i32>) -> Option<i32> {
|
|
99
|
-
if data.len() == 0 {
|
|
100
|
-
return None;
|
|
101
|
-
}
|
|
102
|
-
let first = match data.first() {
|
|
103
|
-
Some(x) => x,
|
|
104
|
-
None => return None,
|
|
105
|
-
};
|
|
106
|
-
return Some(*first);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// After (idiomatic)
|
|
110
|
-
fn process(data: Vec<i32>) -> Option<i32> {
|
|
111
|
-
if data.is_empty() {
|
|
112
|
-
return None;
|
|
113
|
-
}
|
|
114
|
-
let first = data.first()?;
|
|
115
|
-
Some(*first)
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## Selective Allowance
|
|
120
|
-
|
|
121
|
-
Some style lints may conflict with team preferences:
|
|
122
|
-
|
|
123
|
-
```rust
|
|
124
|
-
// If your team prefers explicit returns
|
|
125
|
-
#[allow(clippy::needless_return)]
|
|
126
|
-
fn explicit_return() -> i32 {
|
|
127
|
-
return 42;
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## See Also
|
|
132
|
-
|
|
133
|
-
- [lint-warn-suspicious](./lint-warn-suspicious.md) - Suspicious patterns
|
|
134
|
-
- [lint-warn-complexity](./lint-warn-complexity.md) - Complexity warnings
|
|
135
|
-
- [lint-rustfmt-check](./lint-rustfmt-check.md) - Formatting checks
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
# lint-warn-suspicious
|
|
2
|
-
|
|
3
|
-
> Enable clippy::suspicious for likely bugs
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
The `clippy::suspicious` lint group catches code patterns that are syntactically valid but almost always wrong. These are potential bugs that deserve investigation. Enabling this group as a warning helps catch mistakes early.
|
|
8
|
-
|
|
9
|
-
## Configuration
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// In lib.rs or main.rs
|
|
13
|
-
#![warn(clippy::suspicious)]
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Or in `Cargo.toml`:
|
|
17
|
-
|
|
18
|
-
```toml
|
|
19
|
-
[lints.clippy]
|
|
20
|
-
suspicious = "warn"
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
Or in `clippy.toml`:
|
|
24
|
-
|
|
25
|
-
```toml
|
|
26
|
-
warn = ["clippy::suspicious"]
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## What It Catches
|
|
30
|
-
|
|
31
|
-
### Suspicious Arithmetic
|
|
32
|
-
|
|
33
|
-
```rust
|
|
34
|
-
// WARN: Suspicious use of + in a << expression
|
|
35
|
-
let bits = 1 << 4 + 1; // Probably meant (1 << 4) + 1 or 1 << (4 + 1)
|
|
36
|
-
|
|
37
|
-
// WARN: Suspicious use of | in a + expression
|
|
38
|
-
let value = x | 1 + y; // Probably meant (x | 1) + y or x | (1 + y)
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Suspicious Comparisons
|
|
42
|
-
|
|
43
|
-
```rust
|
|
44
|
-
// WARN: Almost swapped operands in a comparison
|
|
45
|
-
if 5 < x && x < 3 { } // Impossible condition
|
|
46
|
-
|
|
47
|
-
// WARN: Suspicious assignment in a condition
|
|
48
|
-
if (x = 5) { } // Probably meant x == 5
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### Suspicious Method Calls
|
|
52
|
-
|
|
53
|
-
```rust
|
|
54
|
-
// WARN: Suspicious map usage
|
|
55
|
-
let _: Vec<_> = vec.iter().map(|x| {
|
|
56
|
-
println!("{}", x); // Side effect in map
|
|
57
|
-
x
|
|
58
|
-
}).collect(); // Use for_each instead
|
|
59
|
-
|
|
60
|
-
// WARN: Suspicious string formatting
|
|
61
|
-
let s = format!("{}", format!("{}", x)); // Redundant nested format
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Suspicious Casts
|
|
65
|
-
|
|
66
|
-
```rust
|
|
67
|
-
// WARN: Suspicious use of not on a bool
|
|
68
|
-
let inverted = !x as i32; // Did you mean (!x) as i32 or !(x as i32)?
|
|
69
|
-
|
|
70
|
-
// WARN: Cast of float to int may lose precision
|
|
71
|
-
let n = 3.14_f64 as i32; // May want .round() first
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Notable Lints in This Group
|
|
75
|
-
|
|
76
|
-
| Lint | Description |
|
|
77
|
-
|------|-------------|
|
|
78
|
-
| `suspicious_arithmetic_impl` | Unusual operator in arithmetic trait |
|
|
79
|
-
| `suspicious_assignment_formatting` | Looks like typo in assignment |
|
|
80
|
-
| `suspicious_else_formatting` | Else on wrong line |
|
|
81
|
-
| `suspicious_map` | Map with side effects |
|
|
82
|
-
| `suspicious_op_assign_impl` | Unusual op-assign implementation |
|
|
83
|
-
| `suspicious_splitn` | splitn that can't produce n parts |
|
|
84
|
-
| `suspicious_unary_op_formatting` | Confusing unary operator spacing |
|
|
85
|
-
|
|
86
|
-
## Example Catches
|
|
87
|
-
|
|
88
|
-
```rust
|
|
89
|
-
// Caught: Suspicious double negation
|
|
90
|
-
let value = --x; // In Rust, this is -(-x), not pre-decrement
|
|
91
|
-
|
|
92
|
-
// Caught: Suspicious modulo
|
|
93
|
-
let remainder = x % 1; // Always 0 for integers
|
|
94
|
-
|
|
95
|
-
// Caught: Suspicious else formatting
|
|
96
|
-
if condition {
|
|
97
|
-
do_something();
|
|
98
|
-
}
|
|
99
|
-
else { // Weird formatting, might be a mistake
|
|
100
|
-
do_other();
|
|
101
|
-
}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
## When to Allow
|
|
105
|
-
|
|
106
|
-
Rarely. If you need to suppress, document why:
|
|
107
|
-
|
|
108
|
-
```rust
|
|
109
|
-
#[allow(clippy::suspicious_arithmetic_impl)]
|
|
110
|
-
impl Mul for Matrix {
|
|
111
|
-
// Custom matrix multiplication using + for reduction step
|
|
112
|
-
fn mul(self, rhs: Self) -> Self::Output {
|
|
113
|
-
// ...
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## See Also
|
|
119
|
-
|
|
120
|
-
- [lint-deny-correctness](./lint-deny-correctness.md) - Deny definite bugs
|
|
121
|
-
- [lint-warn-style](./lint-warn-style.md) - Style warnings
|
|
122
|
-
- [lint-warn-complexity](./lint-warn-complexity.md) - Complexity warnings
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
# lint-workspace-lints
|
|
2
|
-
|
|
3
|
-
> Configure lints at workspace level for consistent enforcement
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Without centralized lint configuration, each crate develops its own standards (or none). Workspace-level lints (Rust 1.74+) ensure consistent code quality across all crates. Denied lints catch issues in CI before they reach production.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```toml
|
|
12
|
-
# crate-a/Cargo.toml - strict
|
|
13
|
-
[lints.clippy]
|
|
14
|
-
unwrap_used = "deny"
|
|
15
|
-
|
|
16
|
-
# crate-b/Cargo.toml - lenient
|
|
17
|
-
# No lint config
|
|
18
|
-
|
|
19
|
-
# crate-c/Cargo.toml - different
|
|
20
|
-
[lints.clippy]
|
|
21
|
-
unwrap_used = "warn"
|
|
22
|
-
|
|
23
|
-
# Inconsistent enforcement, some issues slip through
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Good
|
|
27
|
-
|
|
28
|
-
```toml
|
|
29
|
-
# Root Cargo.toml
|
|
30
|
-
[workspace.lints.rust]
|
|
31
|
-
unsafe_code = "deny"
|
|
32
|
-
missing_docs = "warn"
|
|
33
|
-
|
|
34
|
-
[workspace.lints.clippy]
|
|
35
|
-
# Correctness
|
|
36
|
-
unwrap_used = "deny"
|
|
37
|
-
expect_used = "warn"
|
|
38
|
-
panic = "deny"
|
|
39
|
-
|
|
40
|
-
# Style
|
|
41
|
-
needless_pass_by_value = "warn"
|
|
42
|
-
redundant_clone = "warn"
|
|
43
|
-
|
|
44
|
-
# Complexity
|
|
45
|
-
cognitive_complexity = "warn"
|
|
46
|
-
|
|
47
|
-
[workspace.lints.rustdoc]
|
|
48
|
-
broken_intra_doc_links = "deny"
|
|
49
|
-
|
|
50
|
-
# crate-a/Cargo.toml
|
|
51
|
-
[lints]
|
|
52
|
-
workspace = true
|
|
53
|
-
|
|
54
|
-
# crate-b/Cargo.toml
|
|
55
|
-
[lints]
|
|
56
|
-
workspace = true
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Recommended Lint Configuration
|
|
60
|
-
|
|
61
|
-
```toml
|
|
62
|
-
# Root Cargo.toml
|
|
63
|
-
[workspace.lints.rust]
|
|
64
|
-
# Safety
|
|
65
|
-
unsafe_code = "deny"
|
|
66
|
-
missing_debug_implementations = "warn"
|
|
67
|
-
|
|
68
|
-
# Quality
|
|
69
|
-
unused_results = "warn"
|
|
70
|
-
unused_qualifications = "warn"
|
|
71
|
-
|
|
72
|
-
[workspace.lints.clippy]
|
|
73
|
-
# === Correctness (deny) ===
|
|
74
|
-
correctness = { level = "deny", priority = -1 }
|
|
75
|
-
|
|
76
|
-
# === Suspicious (deny) ===
|
|
77
|
-
suspicious = { level = "deny", priority = -1 }
|
|
78
|
-
|
|
79
|
-
# === Style (warn) ===
|
|
80
|
-
style = { level = "warn", priority = -1 }
|
|
81
|
-
|
|
82
|
-
# === Complexity (warn) ===
|
|
83
|
-
complexity = { level = "warn", priority = -1 }
|
|
84
|
-
|
|
85
|
-
# === Perf (warn) ===
|
|
86
|
-
perf = { level = "warn", priority = -1 }
|
|
87
|
-
|
|
88
|
-
# === Pedantic (selective) ===
|
|
89
|
-
# Not all pedantic lints are useful
|
|
90
|
-
doc_markdown = "warn"
|
|
91
|
-
needless_pass_by_value = "warn"
|
|
92
|
-
redundant_closure_for_method_calls = "warn"
|
|
93
|
-
semicolon_if_nothing_returned = "warn"
|
|
94
|
-
|
|
95
|
-
# === Nursery (selective) ===
|
|
96
|
-
cognitive_complexity = "warn"
|
|
97
|
-
useless_let_if_seq = "warn"
|
|
98
|
-
|
|
99
|
-
# === Restriction (selective) ===
|
|
100
|
-
unwrap_used = "deny"
|
|
101
|
-
expect_used = "warn"
|
|
102
|
-
dbg_macro = "warn"
|
|
103
|
-
print_stdout = "warn" # Use logging instead
|
|
104
|
-
todo = "warn"
|
|
105
|
-
|
|
106
|
-
[workspace.lints.rustdoc]
|
|
107
|
-
broken_intra_doc_links = "deny"
|
|
108
|
-
private_intra_doc_links = "warn"
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
## Per-Crate Overrides
|
|
112
|
-
|
|
113
|
-
```toml
|
|
114
|
-
# crate-with-binary/Cargo.toml
|
|
115
|
-
[lints]
|
|
116
|
-
workspace = true
|
|
117
|
-
|
|
118
|
-
# Binary entry point can use unwrap
|
|
119
|
-
[lints.clippy]
|
|
120
|
-
unwrap_used = "allow"
|
|
121
|
-
|
|
122
|
-
# test-utils/Cargo.toml
|
|
123
|
-
[lints]
|
|
124
|
-
workspace = true
|
|
125
|
-
|
|
126
|
-
# Test utilities can print
|
|
127
|
-
[lints.clippy]
|
|
128
|
-
print_stdout = "allow"
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## CI Integration
|
|
132
|
-
|
|
133
|
-
```yaml
|
|
134
|
-
# .github/workflows/ci.yml
|
|
135
|
-
jobs:
|
|
136
|
-
lint:
|
|
137
|
-
runs-on: ubuntu-latest
|
|
138
|
-
steps:
|
|
139
|
-
- uses: actions/checkout@v4
|
|
140
|
-
- uses: dtolnay/rust-toolchain@stable
|
|
141
|
-
with:
|
|
142
|
-
components: clippy
|
|
143
|
-
|
|
144
|
-
- name: Clippy
|
|
145
|
-
run: cargo clippy --workspace --all-targets -- -D warnings
|
|
146
|
-
|
|
147
|
-
- name: Rustdoc
|
|
148
|
-
run: RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
## Lint Categories
|
|
152
|
-
|
|
153
|
-
```toml
|
|
154
|
-
# Category-level configuration
|
|
155
|
-
[workspace.lints.clippy]
|
|
156
|
-
# All lints in category at once
|
|
157
|
-
correctness = { level = "deny", priority = -1 }
|
|
158
|
-
suspicious = { level = "deny", priority = -1 }
|
|
159
|
-
style = { level = "warn", priority = -1 }
|
|
160
|
-
complexity = { level = "warn", priority = -1 }
|
|
161
|
-
perf = { level = "warn", priority = -1 }
|
|
162
|
-
pedantic = { level = "warn", priority = -1 }
|
|
163
|
-
|
|
164
|
-
# Then override specific lints (higher priority)
|
|
165
|
-
missing_errors_doc = "allow" # Override pedantic
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
## See Also
|
|
169
|
-
|
|
170
|
-
- [lint-deny-correctness](./lint-deny-correctness.md) - Critical lints
|
|
171
|
-
- [proj-workspace-deps](./proj-workspace-deps.md) - Workspace configuration
|
|
172
|
-
- [anti-unwrap-abuse](./anti-unwrap-abuse.md) - unwrap lints
|