agy-superpowers 5.2.1 → 5.2.3

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.
Files changed (233) hide show
  1. package/README.md +47 -150
  2. package/package.json +1 -1
  3. package/template/agent/patches/skills-patches.md +23 -0
  4. package/template/agent/rules/scratch-scripts.md +37 -0
  5. package/template/agent/rules/superpowers.md +6 -50
  6. package/template/agent/skills/brainstorming/SKILL.md +4 -3
  7. package/template/agent/skills/brainstorming/visual-companion.md +2 -3
  8. package/template/agent/skills/finishing-a-development-branch/SKILL.md +11 -16
  9. package/template/agent/skills/subagent-driven-development/SKILL.md +16 -0
  10. package/template/agent/skills/subagent-driven-development/implementer-prompt.md +4 -3
  11. package/template/agent/skills/using-git-worktrees/SKILL.md +3 -2
  12. package/template/agent/skills/using-superpowers/SKILL.md +8 -6
  13. package/template/agent/skills/using-superpowers/references/copilot-tools.md +52 -0
  14. package/template/agent/skills/writing-plans/SKILL.md +5 -3
  15. package/template/agent/skills/writing-skills/SKILL.md +1 -1
  16. package/template/agent/superpowers-version.json +2 -2
  17. package/template/agent/tmp/agent-config-backup.yml +9 -0
  18. package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
  19. package/template/agent/skills/analytics-setup/SKILL.md +0 -51
  20. package/template/agent/skills/api-design/SKILL.md +0 -193
  21. package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
  22. package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
  23. package/template/agent/skills/backend-developer/SKILL.md +0 -148
  24. package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
  25. package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
  26. package/template/agent/skills/community-manager/SKILL.md +0 -115
  27. package/template/agent/skills/content-marketer/SKILL.md +0 -111
  28. package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
  29. package/template/agent/skills/cto-architect/SKILL.md +0 -133
  30. package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
  31. package/template/agent/skills/data-analyst/SKILL.md +0 -147
  32. package/template/agent/skills/devops-engineer/SKILL.md +0 -117
  33. package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
  34. package/template/agent/skills/game-design/SKILL.md +0 -194
  35. package/template/agent/skills/game-developer/SKILL.md +0 -175
  36. package/template/agent/skills/growth-hacker/SKILL.md +0 -122
  37. package/template/agent/skills/idea-validator/SKILL.md +0 -55
  38. package/template/agent/skills/indie-legal/SKILL.md +0 -53
  39. package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
  40. package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
  41. package/template/agent/skills/launch-strategist/SKILL.md +0 -62
  42. package/template/agent/skills/market-researcher/SKILL.md +0 -53
  43. package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
  44. package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
  45. package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
  46. package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
  47. package/template/agent/skills/real-time-features/SKILL.md +0 -194
  48. package/template/agent/skills/retention-specialist/SKILL.md +0 -123
  49. package/template/agent/skills/rust-developer/SKILL.md +0 -281
  50. package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
  51. package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
  52. package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
  53. package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
  54. package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
  55. package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
  56. package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
  57. package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
  58. package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
  59. package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
  60. package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
  61. package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
  62. package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
  63. package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
  64. package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
  65. package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
  66. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
  67. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
  68. package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
  69. package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
  70. package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
  71. package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
  72. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
  73. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
  74. package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
  75. package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
  76. package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
  77. package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
  78. package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
  79. package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
  80. package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
  81. package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
  82. package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
  83. package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
  84. package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
  85. package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
  86. package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
  87. package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
  88. package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
  89. package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
  90. package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
  91. package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
  92. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
  93. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
  94. package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
  95. package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
  96. package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
  97. package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
  98. package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
  99. package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
  100. package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
  101. package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
  102. package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
  103. package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
  104. package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
  105. package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
  106. package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
  107. package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
  108. package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
  109. package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
  110. package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
  111. package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
  112. package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
  113. package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
  114. package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
  115. package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
  116. package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
  117. package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
  118. package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
  119. package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
  120. package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
  121. package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
  122. package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
  123. package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
  124. package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
  125. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
  126. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
  127. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
  128. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
  129. package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
  130. package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
  131. package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
  132. package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
  133. package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
  134. package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
  135. package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
  136. package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
  137. package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
  138. package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
  139. package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
  140. package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
  141. package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
  142. package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
  143. package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
  144. package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
  145. package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
  146. package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
  147. package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
  148. package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
  149. package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
  150. package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
  151. package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
  152. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
  153. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
  154. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
  155. package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
  156. package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
  157. package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
  158. package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
  159. package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
  160. package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
  161. package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
  162. package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
  163. package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
  164. package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
  165. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
  166. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
  167. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
  168. package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
  169. package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
  170. package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
  171. package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
  172. package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
  173. package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
  174. package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
  175. package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
  176. package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
  177. package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
  178. package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
  179. package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
  180. package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
  181. package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
  182. package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
  183. package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
  184. package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
  185. package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
  186. package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
  187. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
  188. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
  189. package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
  190. package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
  191. package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
  192. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
  193. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
  194. package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
  195. package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
  196. package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
  197. package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
  198. package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
  199. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
  200. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
  201. package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
  202. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
  203. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
  204. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
  205. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
  206. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
  207. package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
  208. package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
  209. package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
  210. package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
  211. package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
  212. package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
  213. package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
  214. package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
  215. package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
  216. package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
  217. package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
  218. package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
  219. package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
  220. package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
  221. package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
  222. package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
  223. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
  224. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
  225. package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
  226. package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
  227. package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
  228. package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
  229. package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
  230. package/template/agent/skills/saas-architect/SKILL.md +0 -139
  231. package/template/agent/skills/security-engineer/SKILL.md +0 -133
  232. package/template/agent/skills/seo-specialist/SKILL.md +0 -130
  233. package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
@@ -1,92 +0,0 @@
1
- # name-type-param-single
2
-
3
- > Use single uppercase letters for type parameters: `T`, `E`, `K`, `V`
4
-
5
- ## Why It Matters
6
-
7
- Generic type parameters conventionally use single uppercase letters. This keeps signatures concise and follows established conventions that readers instantly recognize. `T` for "type", `E` for "error", `K` for "key", `V` for "value" are universal in Rust.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- // Verbose type parameters
13
- struct Container<ElementType> {
14
- items: Vec<ElementType>,
15
- }
16
-
17
- fn process<InputType, OutputType>(input: InputType) -> OutputType { ... }
18
-
19
- // Lowercase - looks like lifetime
20
- struct Wrapper<t> { ... } // Confusing
21
- ```
22
-
23
- ## Good
24
-
25
- ```rust
26
- // Single uppercase letters
27
- struct Container<T> {
28
- items: Vec<T>,
29
- }
30
-
31
- fn process<I, O>(input: I) -> O { ... }
32
-
33
- // Standard conventions
34
- struct HashMap<K, V> { ... } // K=Key, V=Value
35
- enum Result<T, E> { ... } // T=Type, E=Error
36
- enum Option<T> { ... } // T=Type
37
- struct Ref<'a, T> { ... } // Lifetime + Type
38
- ```
39
-
40
- ## Standard Type Parameter Names
41
-
42
- | Parameter | Meaning | Example |
43
- |-----------|---------|---------|
44
- | `T` | Type (generic) | `Vec<T>` |
45
- | `E` | Error | `Result<T, E>` |
46
- | `K` | Key | `HashMap<K, V>` |
47
- | `V` | Value | `HashMap<K, V>` |
48
- | `I` | Input / Item | `Iterator<Item = I>` |
49
- | `O` | Output | `Fn(I) -> O` |
50
- | `R` | Return / Result | `fn() -> R` |
51
- | `S` | State | `StateMachine<S>` |
52
- | `A` | Allocator | `Vec<T, A>` |
53
- | `F` | Function | `map<F>(f: F)` |
54
-
55
- ## Multiple Type Parameters
56
-
57
- ```rust
58
- // Use related letters
59
- fn transform<I, O, E>(input: I) -> Result<O, E>
60
- where
61
- I: Input,
62
- O: Output,
63
- E: Error,
64
- { ... }
65
-
66
- // Or sequential: T, U, V
67
- fn combine<T, U, V>(a: T, b: U) -> V { ... }
68
-
69
- // Descriptive only when many parameters need clarity
70
- struct Query<Db, Row, Err> { ... }
71
- ```
72
-
73
- ## Trait Bounds
74
-
75
- ```rust
76
- // Keep type params short, move complexity to where clause
77
- fn process<T, E>(value: T) -> Result<T, E>
78
- where
79
- T: Clone + Debug + Send + Sync,
80
- E: Error + From<IoError>,
81
- { ... }
82
-
83
- // Not inline
84
- fn process<T: Clone + Debug + Send + Sync, E: Error + From<IoError>>(value: T) -> Result<T, E>
85
- // Too long!
86
- ```
87
-
88
- ## See Also
89
-
90
- - [name-lifetime-short](./name-lifetime-short.md) - Lifetime parameter naming
91
- - [name-types-camel](./name-types-camel.md) - Concrete type naming
92
- - [type-generic-bounds](./type-generic-bounds.md) - Trait bounds
@@ -1,65 +0,0 @@
1
- # name-types-camel
2
-
3
- > Use `UpperCamelCase` for types, traits, and enum names
4
-
5
- ## Why It Matters
6
-
7
- Rust's naming conventions are enforced by the compiler and linter. Consistent naming makes code immediately recognizable—you know `HttpClient` is a type, `send_request` is a function. Violating conventions triggers warnings and makes code harder to read.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- // Lowercase types - compiler warns
13
- struct http_client { ... } // warning: type `http_client` should have an upper camel case name
14
- trait serializable { ... } // warning
15
- enum response_type { ... } // warning
16
-
17
- // Screaming case for types
18
- struct HTTP_CLIENT { ... } // Not idiomatic
19
- ```
20
-
21
- ## Good
22
-
23
- ```rust
24
- // UpperCamelCase for all types
25
- struct HttpClient { ... }
26
- trait Serializable { ... }
27
- enum ResponseType { ... }
28
-
29
- // Compound words
30
- struct TcpConnection { ... }
31
- struct IoError { ... }
32
- struct FileReader { ... }
33
-
34
- // Generic types
35
- struct HashMap<K, V> { ... }
36
- struct Result<T, E> { ... }
37
- ```
38
-
39
- ## Acronyms
40
-
41
- ```rust
42
- // Treat acronyms as words (capitalize first letter only)
43
- struct HttpServer { ... } // Not HTTPServer
44
- struct JsonParser { ... } // Not JSONParser
45
- struct Uuid { ... } // Not UUID
46
- struct TcpStream { ... } // Not TCPStream
47
-
48
- // Exception: Two-letter acronyms can be all caps
49
- struct IOError { ... } // Acceptable
50
- struct IoError { ... } // Also acceptable (preferred)
51
- ```
52
-
53
- ## Type Aliases
54
-
55
- ```rust
56
- // Type aliases also use UpperCamelCase
57
- type Result<T> = std::result::Result<T, Error>;
58
- type BoxedFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
59
- ```
60
-
61
- ## See Also
62
-
63
- - [name-variants-camel](./name-variants-camel.md) - Enum variant naming
64
- - [name-funcs-snake](./name-funcs-snake.md) - Function naming
65
- - [name-acronym-word](./name-acronym-word.md) - Acronym handling
@@ -1,101 +0,0 @@
1
- # name-variants-camel
2
-
3
- > Use `UpperCamelCase` for enum variants
4
-
5
- ## Why It Matters
6
-
7
- Enum variants follow the same naming convention as types—`UpperCamelCase`. This distinguishes them from fields, variables, and functions. The compiler warns on violations, and consistent naming helps readers instantly recognize variant names.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- enum Status {
13
- pending, // warning: variant `pending` should have an upper camel case name
14
- in_progress, // warning
15
- COMPLETED, // Not idiomatic
16
- }
17
-
18
- enum Color {
19
- RED, // Screaming case - not Rust style
20
- GREEN,
21
- BLUE,
22
- }
23
- ```
24
-
25
- ## Good
26
-
27
- ```rust
28
- enum Status {
29
- Pending,
30
- InProgress,
31
- Completed,
32
- Failed,
33
- }
34
-
35
- enum Color {
36
- Red,
37
- Green,
38
- Blue,
39
- Custom(u8, u8, u8),
40
- }
41
-
42
- enum HttpMethod {
43
- Get,
44
- Post,
45
- Put,
46
- Delete,
47
- Patch,
48
- }
49
- ```
50
-
51
- ## Variants with Data
52
-
53
- ```rust
54
- enum Message {
55
- // Unit variant
56
- Quit,
57
-
58
- // Tuple variant
59
- Move(i32, i32),
60
-
61
- // Struct variant
62
- Write { text: String },
63
-
64
- // Named fields
65
- ChangeColor {
66
- red: u8,
67
- green: u8,
68
- blue: u8,
69
- },
70
- }
71
- ```
72
-
73
- ## Variant Naming Tips
74
-
75
- ```rust
76
- // Be specific
77
- enum Error {
78
- NotFound, // Good: specific
79
- PermissionDenied, // Good: specific
80
- Error, // Bad: vague
81
- }
82
-
83
- // Avoid redundant type name in variant
84
- enum ConnectionState {
85
- Connected, // Good
86
- Disconnected, // Good
87
- ConnectionError, // Bad: redundant "Connection"
88
- }
89
-
90
- // Use None/Some pattern for Option-like enums
91
- enum MaybeValue<T> {
92
- Some(T),
93
- None,
94
- }
95
- ```
96
-
97
- ## See Also
98
-
99
- - [name-types-camel](./name-types-camel.md) - Type naming
100
- - [api-non-exhaustive](./api-non-exhaustive.md) - Forward-compatible enums
101
- - [type-enum-states](./type-enum-states.md) - State machine enums
@@ -1,161 +0,0 @@
1
- # opt-bounds-check
2
-
3
- > Use iterators and patterns that eliminate bounds checks in hot paths
4
-
5
- ## Why It Matters
6
-
7
- Rust's safety guarantees require bounds checking on array/slice indexing. In tight loops, these checks can cause measurable overhead (branch mispredictions, preventing vectorization). Patterns like iterators, `get_unchecked`, and index splitting can eliminate these checks while maintaining safety.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- fn sum_products(a: &[f64], b: &[f64]) -> f64 {
13
- let mut sum = 0.0;
14
- for i in 0..a.len() {
15
- sum += a[i] * b[i]; // Two bounds checks per iteration
16
- }
17
- sum
18
- }
19
-
20
- fn apply_filter(data: &mut [u8], kernel: &[u8; 3]) {
21
- for i in 1..data.len() - 1 {
22
- // Three bounds checks per iteration
23
- data[i] = (data[i - 1] + data[i] + data[i + 1]) / 3;
24
- }
25
- }
26
- ```
27
-
28
- ## Good
29
-
30
- ```rust
31
- fn sum_products(a: &[f64], b: &[f64]) -> f64 {
32
- // Iterator zips - no bounds checks, vectorizes well
33
- a.iter().zip(b.iter()).map(|(x, y)| x * y).sum()
34
- }
35
-
36
- fn apply_filter(data: &mut [u8]) {
37
- // Windows pattern - no bounds checks
38
- for window in data.windows(3) {
39
- // window[0], window[1], window[2] are all valid
40
- }
41
-
42
- // Or use chunks
43
- for chunk in data.chunks_exact(4) {
44
- process_simd(chunk);
45
- }
46
- }
47
- ```
48
-
49
- ## Iterator Patterns
50
-
51
- ```rust
52
- // All of these avoid bounds checks:
53
-
54
- // zip - parallel iteration
55
- for (a, b) in xs.iter().zip(ys.iter()) { ... }
56
-
57
- // enumerate - index + value
58
- for (i, x) in data.iter().enumerate() { ... }
59
-
60
- // windows - sliding window
61
- for window in data.windows(3) { ... }
62
-
63
- // chunks - fixed-size groups
64
- for chunk in data.chunks(4) { ... }
65
- for chunk in data.chunks_exact(4) { ... } // Guarantees exact size
66
-
67
- // split_at - divide slice
68
- let (left, right) = data.split_at(mid);
69
- ```
70
-
71
- ## Split for Parallel Access
72
-
73
- ```rust
74
- fn parallel_sum(data: &[i32]) -> i32 {
75
- // Split into independent chunks
76
- let (left, right) = data.split_at(data.len() / 2);
77
-
78
- // Process chunks without bounds checks
79
- let sum_left: i32 = left.iter().sum();
80
- let sum_right: i32 = right.iter().sum();
81
-
82
- sum_left + sum_right
83
- }
84
- ```
85
-
86
- ## get_unchecked for Proven Safety
87
-
88
- ```rust
89
- fn matrix_multiply(a: &[f64], b: &[f64], c: &mut [f64], n: usize) {
90
- assert!(a.len() >= n * n);
91
- assert!(b.len() >= n * n);
92
- assert!(c.len() >= n * n);
93
-
94
- for i in 0..n {
95
- for j in 0..n {
96
- let mut sum = 0.0;
97
- for k in 0..n {
98
- // SAFETY: bounds verified by asserts above
99
- unsafe {
100
- sum += a.get_unchecked(i * n + k)
101
- * b.get_unchecked(k * n + j);
102
- }
103
- }
104
- // SAFETY: bounds verified by asserts above
105
- unsafe {
106
- *c.get_unchecked_mut(i * n + j) = sum;
107
- }
108
- }
109
- }
110
- }
111
- ```
112
-
113
- ## Slice Patterns
114
-
115
- ```rust
116
- fn process_header(data: &[u8]) -> Option<Header> {
117
- // Slice pattern - single length check, no per-field checks
118
- let [a, b, c, d, rest @ ..] = data else {
119
- return None;
120
- };
121
-
122
- Some(Header {
123
- magic: *a,
124
- version: *b,
125
- flags: u16::from_le_bytes([*c, *d]),
126
- payload: rest,
127
- })
128
- }
129
- ```
130
-
131
- ## Verify Bounds Check Elimination
132
-
133
- ```bash
134
- # Check generated assembly
135
- cargo asm --release my_crate::hot_function
136
-
137
- # Look for 'cmp' and 'ja'/'jbe' instructions near array access
138
- # If eliminated, you'll see direct memory access
139
- ```
140
-
141
- ## When to Accept Bounds Checks
142
-
143
- ```rust
144
- // Random access patterns - checks unavoidable
145
- fn random_lookup(data: &[u8], indices: &[usize]) -> Vec<u8> {
146
- indices.iter()
147
- .filter_map(|&i| data.get(i).copied()) // Checked, but necessary
148
- .collect()
149
- }
150
-
151
- // Infrequent access - overhead negligible
152
- fn get_config(&self, key: &str) -> Option<&Value> {
153
- self.config.get(key) // Fine, not hot path
154
- }
155
- ```
156
-
157
- ## See Also
158
-
159
- - [opt-simd-portable](./opt-simd-portable.md) - SIMD requires unchecked access
160
- - [opt-cache-friendly](./opt-cache-friendly.md) - Cache-efficient patterns
161
- - [perf-profile-first](./perf-profile-first.md) - Identify actual hot paths
@@ -1,187 +0,0 @@
1
- # opt-cache-friendly
2
-
3
- > Organize data for cache-efficient access patterns
4
-
5
- ## Why It Matters
6
-
7
- Cache misses are expensive—a L3 cache miss costs ~100+ cycles vs ~4 cycles for L1 hit. Data layout and access patterns determine cache efficiency. Arrays of structs (AoS) vs structs of arrays (SoA), memory locality, and access patterns can make order-of-magnitude performance differences.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- // Array of Structs (AoS) - poor cache use when accessing one field
13
- struct Particle {
14
- position: [f32; 3], // 12 bytes
15
- velocity: [f32; 3], // 12 bytes
16
- mass: f32, // 4 bytes
17
- id: u64, // 8 bytes
18
- flags: u8, // 1 byte + padding
19
- // Total: 40 bytes per particle
20
- }
21
-
22
- fn update_positions(particles: &mut [Particle], dt: f32) {
23
- for p in particles {
24
- // Access position and velocity - 24 bytes
25
- // But loads 40-byte struct per particle
26
- // 16 bytes wasted per cache line load
27
- p.position[0] += p.velocity[0] * dt;
28
- p.position[1] += p.velocity[1] * dt;
29
- p.position[2] += p.velocity[2] * dt;
30
- }
31
- }
32
- ```
33
-
34
- ## Good
35
-
36
- ```rust
37
- // Struct of Arrays (SoA) - cache-efficient for field access
38
- struct Particles {
39
- positions_x: Vec<f32>,
40
- positions_y: Vec<f32>,
41
- positions_z: Vec<f32>,
42
- velocities_x: Vec<f32>,
43
- velocities_y: Vec<f32>,
44
- velocities_z: Vec<f32>,
45
- masses: Vec<f32>,
46
- ids: Vec<u64>,
47
- flags: Vec<u8>,
48
- }
49
-
50
- fn update_positions(p: &mut Particles, dt: f32) {
51
- // Access contiguous memory - perfect cache utilization
52
- for (px, vx) in p.positions_x.iter_mut().zip(&p.velocities_x) {
53
- *px += vx * dt;
54
- }
55
- for (py, vy) in p.positions_y.iter_mut().zip(&p.velocities_y) {
56
- *py += vy * dt;
57
- }
58
- for (pz, vz) in p.positions_z.iter_mut().zip(&p.velocities_z) {
59
- *pz += vz * dt;
60
- }
61
- }
62
- ```
63
-
64
- ## Hot/Cold Splitting
65
-
66
- ```rust
67
- // Separate frequently and rarely accessed fields
68
- struct EntityHot {
69
- position: [f32; 3],
70
- velocity: [f32; 3],
71
- // Hot data - accessed every frame
72
- }
73
-
74
- struct EntityCold {
75
- name: String,
76
- creation_time: Instant,
77
- metadata: HashMap<String, Value>,
78
- // Cold data - rarely accessed
79
- }
80
-
81
- struct Entities {
82
- hot: Vec<EntityHot>,
83
- cold: Vec<EntityCold>,
84
- }
85
-
86
- // Hot loop touches only hot data
87
- fn update(entities: &mut Entities, dt: f32) {
88
- for e in &mut entities.hot {
89
- e.position[0] += e.velocity[0] * dt;
90
- // Cold data stays out of cache
91
- }
92
- }
93
- ```
94
-
95
- ## Prefetching
96
-
97
- ```rust
98
- // Process in cache-line-sized chunks
99
- const CACHE_LINE: usize = 64;
100
-
101
- fn process_with_prefetch(data: &mut [u8]) {
102
- for chunk in data.chunks_mut(CACHE_LINE) {
103
- // Prefetch next chunk while processing current
104
- // (automatic in many cases, manual for complex patterns)
105
- process_chunk(chunk);
106
- }
107
- }
108
-
109
- // Matrix multiplication - block for cache
110
- fn matmul_blocked(a: &[f64], b: &[f64], c: &mut [f64], n: usize) {
111
- const BLOCK: usize = 32; // Fits in L1 cache
112
-
113
- for i0 in (0..n).step_by(BLOCK) {
114
- for j0 in (0..n).step_by(BLOCK) {
115
- for k0 in (0..n).step_by(BLOCK) {
116
- // Process BLOCK x BLOCK tile
117
- for i in i0..min(i0 + BLOCK, n) {
118
- for j in j0..min(j0 + BLOCK, n) {
119
- // Inner loop operates on cached data
120
- }
121
- }
122
- }
123
- }
124
- }
125
- }
126
- ```
127
-
128
- ## Avoid Pointer Chasing
129
-
130
- ```rust
131
- // Bad: linked list - random memory access
132
- struct Node {
133
- value: i32,
134
- next: Option<Box<Node>>,
135
- }
136
-
137
- fn sum_linked(head: &Node) -> i32 {
138
- // Each node is a cache miss
139
- }
140
-
141
- // Good: contiguous vector
142
- fn sum_vector(data: &[i32]) -> i32 {
143
- data.iter().sum() // Sequential access, prefetcher happy
144
- }
145
-
146
- // Good: if graph needed, use indices
147
- struct Graph {
148
- values: Vec<i32>,
149
- edges: Vec<usize>, // Indices into values
150
- }
151
- ```
152
-
153
- ## Memory Layout Attributes
154
-
155
- ```rust
156
- // Ensure cache-line alignment
157
- #[repr(C, align(64))]
158
- struct CacheAligned {
159
- data: [u8; 64],
160
- }
161
-
162
- // Prevent false sharing in concurrent code
163
- #[repr(C, align(64))]
164
- struct PaddedCounter {
165
- value: AtomicU64,
166
- _pad: [u8; 56],
167
- }
168
- ```
169
-
170
- ## Measuring Cache Performance
171
-
172
- ```bash
173
- # Linux perf
174
- perf stat -e cache-references,cache-misses ./my_program
175
-
176
- # Detailed cache analysis
177
- perf stat -e L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses ./my_program
178
-
179
- # Cachegrind
180
- valgrind --tool=cachegrind ./my_program
181
- ```
182
-
183
- ## See Also
184
-
185
- - [mem-smaller-integers](./mem-smaller-integers.md) - Smaller data fits more in cache
186
- - [mem-box-large-variant](./mem-box-large-variant.md) - Keep enum sizes small
187
- - [opt-bounds-check](./opt-bounds-check.md) - Sequential access patterns