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.
Files changed (231) hide show
  1. package/README.md +47 -150
  2. package/package.json +1 -1
  3. package/template/agent/rules/CLAUDE.md +80 -0
  4. package/template/agent/rules/code-styles.md +31 -32
  5. package/template/agent/rules/debug-confirmation-policy.md +2 -0
  6. package/template/agent/rules/file-length-policy.md +2 -0
  7. package/template/agent/rules/git-policy.md +7 -0
  8. package/template/agent/rules/language-matching.md +2 -0
  9. package/template/agent/rules/scratch-scripts.md +39 -0
  10. package/template/agent/rules/superpowers.md +8 -51
  11. package/template/agent/skills/executing-plans/SKILL.md +17 -0
  12. package/template/agent/skills/systematic-debugging/SKILL.md +16 -0
  13. package/template/agent/skills/test-driven-development/SKILL.md +16 -0
  14. package/template/agent/skills/verification-before-completion/SKILL.md +22 -0
  15. package/template/agent/skills/writing-plans/SKILL.md +16 -0
  16. package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
  17. package/template/agent/skills/analytics-setup/SKILL.md +0 -51
  18. package/template/agent/skills/api-design/SKILL.md +0 -193
  19. package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
  20. package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
  21. package/template/agent/skills/backend-developer/SKILL.md +0 -148
  22. package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
  23. package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
  24. package/template/agent/skills/community-manager/SKILL.md +0 -115
  25. package/template/agent/skills/content-marketer/SKILL.md +0 -111
  26. package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
  27. package/template/agent/skills/cto-architect/SKILL.md +0 -133
  28. package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
  29. package/template/agent/skills/data-analyst/SKILL.md +0 -147
  30. package/template/agent/skills/devops-engineer/SKILL.md +0 -117
  31. package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
  32. package/template/agent/skills/game-design/SKILL.md +0 -194
  33. package/template/agent/skills/game-developer/SKILL.md +0 -175
  34. package/template/agent/skills/growth-hacker/SKILL.md +0 -122
  35. package/template/agent/skills/idea-validator/SKILL.md +0 -55
  36. package/template/agent/skills/indie-legal/SKILL.md +0 -53
  37. package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
  38. package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
  39. package/template/agent/skills/launch-strategist/SKILL.md +0 -62
  40. package/template/agent/skills/market-researcher/SKILL.md +0 -53
  41. package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
  42. package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
  43. package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
  44. package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
  45. package/template/agent/skills/real-time-features/SKILL.md +0 -194
  46. package/template/agent/skills/retention-specialist/SKILL.md +0 -123
  47. package/template/agent/skills/rust-developer/SKILL.md +0 -281
  48. package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
  49. package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
  50. package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
  51. package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
  52. package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
  53. package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
  54. package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
  55. package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
  56. package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
  57. package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
  58. package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
  59. package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
  60. package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
  61. package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
  62. package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
  63. package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
  64. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
  65. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
  66. package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
  67. package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
  68. package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
  69. package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
  70. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
  71. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
  72. package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
  73. package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
  74. package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
  75. package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
  76. package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
  77. package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
  78. package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
  79. package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
  80. package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
  81. package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
  82. package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
  83. package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
  84. package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
  85. package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
  86. package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
  87. package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
  88. package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
  89. package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
  90. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
  91. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
  92. package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
  93. package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
  94. package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
  95. package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
  96. package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
  97. package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
  98. package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
  99. package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
  100. package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
  101. package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
  102. package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
  103. package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
  104. package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
  105. package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
  106. package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
  107. package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
  108. package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
  109. package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
  110. package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
  111. package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
  112. package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
  113. package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
  114. package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
  115. package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
  116. package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
  117. package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
  118. package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
  119. package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
  120. package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
  121. package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
  122. package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
  123. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
  124. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
  125. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
  126. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
  127. package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
  128. package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
  129. package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
  130. package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
  131. package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
  132. package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
  133. package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
  134. package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
  135. package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
  136. package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
  137. package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
  138. package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
  139. package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
  140. package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
  141. package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
  142. package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
  143. package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
  144. package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
  145. package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
  146. package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
  147. package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
  148. package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
  149. package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
  150. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
  151. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
  152. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
  153. package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
  154. package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
  155. package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
  156. package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
  157. package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
  158. package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
  159. package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
  160. package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
  161. package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
  162. package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
  163. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
  164. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
  165. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
  166. package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
  167. package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
  168. package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
  169. package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
  170. package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
  171. package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
  172. package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
  173. package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
  174. package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
  175. package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
  176. package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
  177. package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
  178. package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
  179. package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
  180. package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
  181. package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
  182. package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
  183. package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
  184. package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
  185. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
  186. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
  187. package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
  188. package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
  189. package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
  190. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
  191. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
  192. package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
  193. package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
  194. package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
  195. package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
  196. package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
  197. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
  198. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
  199. package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
  200. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
  201. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
  202. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
  203. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
  204. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
  205. package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
  206. package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
  207. package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
  208. package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
  209. package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
  210. package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
  211. package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
  212. package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
  213. package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
  214. package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
  215. package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
  216. package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
  217. package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
  218. package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
  219. package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
  220. package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
  221. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
  222. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
  223. package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
  224. package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
  225. package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
  226. package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
  227. package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
  228. package/template/agent/skills/saas-architect/SKILL.md +0 -139
  229. package/template/agent/skills/security-engineer/SKILL.md +0 -133
  230. package/template/agent/skills/seo-specialist/SKILL.md +0 -130
  231. package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
@@ -1,162 +0,0 @@
1
- # proj-workspace-large
2
-
3
- > Use workspaces for large projects
4
-
5
- ## Why It Matters
6
-
7
- Cargo workspaces manage multiple related crates under one repository. They share a single `Cargo.lock`, build cache, and can be versioned together. For large projects, workspaces improve build times, enforce modularity, and simplify dependency management.
8
-
9
- ## Bad
10
-
11
- ```
12
- # Separate repositories for each crate
13
- my-app-core/
14
- my-app-cli/
15
- my-app-server/
16
- my-app-common/
17
-
18
- # Each has its own Cargo.lock
19
- # Dependencies may drift
20
- # Cross-crate development is painful
21
- ```
22
-
23
- ## Good
24
-
25
- ```
26
- my-app/
27
- ├── Cargo.toml # Workspace root
28
- ├── Cargo.lock # Shared lock file
29
- ├── crates/
30
- │ ├── core/
31
- │ │ ├── Cargo.toml
32
- │ │ └── src/
33
- │ ├── cli/
34
- │ │ ├── Cargo.toml
35
- │ │ └── src/
36
- │ ├── server/
37
- │ │ ├── Cargo.toml
38
- │ │ └── src/
39
- │ └── common/
40
- │ ├── Cargo.toml
41
- │ └── src/
42
- └── README.md
43
- ```
44
-
45
- ## Workspace Cargo.toml
46
-
47
- ```toml
48
- # Root Cargo.toml
49
- [workspace]
50
- resolver = "2" # Use the new resolver
51
- members = [
52
- "crates/core",
53
- "crates/cli",
54
- "crates/server",
55
- "crates/common",
56
- ]
57
-
58
- # Shared dependencies - all crates use same versions
59
- [workspace.dependencies]
60
- tokio = { version = "1.0", features = ["full"] }
61
- serde = { version = "1.0", features = ["derive"] }
62
- tracing = "0.1"
63
- anyhow = "1.0"
64
-
65
- # Shared lints
66
- [workspace.lints.rust]
67
- unsafe_code = "forbid"
68
-
69
- [workspace.lints.clippy]
70
- all = "warn"
71
- ```
72
-
73
- ## Member Crate Cargo.toml
74
-
75
- ```toml
76
- # crates/core/Cargo.toml
77
- [package]
78
- name = "my-app-core"
79
- version = "0.1.0"
80
- edition = "2021"
81
-
82
- [dependencies]
83
- # Inherit from workspace
84
- tokio = { workspace = true }
85
- serde = { workspace = true }
86
-
87
- # Crate-specific dependencies
88
- uuid = "1.0"
89
-
90
- # Internal dependency
91
- my-app-common = { path = "../common" }
92
-
93
- [lints]
94
- workspace = true # Inherit workspace lints
95
- ```
96
-
97
- ## When to Use Workspaces
98
-
99
- | Scenario | Recommendation |
100
- |----------|----------------|
101
- | Single binary/library | No workspace needed |
102
- | Library + CLI | Maybe, depends on size |
103
- | Multiple related crates | Yes |
104
- | Shared internal libraries | Yes |
105
- | Microservices mono-repo | Yes |
106
- | Plugin architecture | Yes |
107
-
108
- ## Benefits
109
-
110
- | Aspect | Single Crate | Workspace |
111
- |--------|--------------|-----------|
112
- | Build cache | Crate only | Shared across all |
113
- | Dependency versions | Per-crate | Synchronized |
114
- | Compile times | Full rebuild | Incremental |
115
- | Modularity | Files/modules | Crate boundaries |
116
- | Publishing | Single crate | Independent |
117
-
118
- ## Commands
119
-
120
- ```bash
121
- # Build all crates
122
- cargo build --workspace
123
-
124
- # Build specific crate
125
- cargo build -p my-app-core
126
-
127
- # Test all crates
128
- cargo test --workspace
129
-
130
- # Run specific binary
131
- cargo run -p my-app-cli
132
-
133
- # Check all
134
- cargo check --workspace
135
- ```
136
-
137
- ## Pattern: Virtual Workspace
138
-
139
- Root Cargo.toml is workspace-only (no `[package]`):
140
-
141
- ```toml
142
- [workspace]
143
- members = ["crates/*"]
144
-
145
- [workspace.dependencies]
146
- # ...
147
- ```
148
-
149
- ## Pattern: Crate Interdependencies
150
-
151
- ```toml
152
- # crates/server/Cargo.toml
153
- [dependencies]
154
- my-app-core = { path = "../core" }
155
- my-app-common = { path = "../common" }
156
- ```
157
-
158
- ## See Also
159
-
160
- - [proj-workspace-deps](./proj-workspace-deps.md) - Workspace dependencies
161
- - [proj-bin-dir](./proj-bin-dir.md) - Multiple binaries
162
- - [proj-lib-main-split](./proj-lib-main-split.md) - Lib/main separation
@@ -1,160 +0,0 @@
1
- # test-arrange-act-assert
2
-
3
- > Structure tests with clear Arrange, Act, Assert sections
4
-
5
- ## Why It Matters
6
-
7
- The AAA pattern makes tests readable and maintainable. Each section has a clear purpose: set up test data, execute the code under test, verify the results. This structure helps identify what's being tested and makes tests easier to debug when they fail.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- #[test]
13
- fn test_user() {
14
- assert_eq!(User::new("alice", "alice@example.com").unwrap().name(), "alice");
15
- assert!(User::new("", "email@example.com").is_err());
16
- let u = User::new("bob", "bob@example.com").unwrap();
17
- assert!(u.validate());
18
- assert_eq!(u.email(), "bob@example.com");
19
- }
20
- // Multiple concerns, hard to understand, hard to debug
21
- ```
22
-
23
- ## Good
24
-
25
- ```rust
26
- #[test]
27
- fn new_user_has_correct_name() {
28
- // Arrange
29
- let name = "alice";
30
- let email = "alice@example.com";
31
-
32
- // Act
33
- let user = User::new(name, email).unwrap();
34
-
35
- // Assert
36
- assert_eq!(user.name(), "alice");
37
- }
38
-
39
- #[test]
40
- fn user_creation_fails_with_empty_name() {
41
- // Arrange
42
- let name = "";
43
- let email = "email@example.com";
44
-
45
- // Act
46
- let result = User::new(name, email);
47
-
48
- // Assert
49
- assert!(result.is_err());
50
- assert!(matches!(result, Err(UserError::EmptyName)));
51
- }
52
- ```
53
-
54
- ## With Comments
55
-
56
- ```rust
57
- #[test]
58
- fn order_total_includes_tax() {
59
- // Arrange
60
- let mut order = Order::new();
61
- order.add_item(Item::new("Widget", 100.00));
62
- order.add_item(Item::new("Gadget", 50.00));
63
- let tax_rate = 0.10;
64
-
65
- // Act
66
- let total = order.calculate_total(tax_rate);
67
-
68
- // Assert
69
- let expected = (100.00 + 50.00) * 1.10;
70
- assert_eq!(total, expected);
71
- }
72
- ```
73
-
74
- ## Complex Arrange
75
-
76
- ```rust
77
- #[test]
78
- fn search_returns_matching_documents() {
79
- // Arrange
80
- let mut index = SearchIndex::new();
81
- index.add_document(Document::new(1, "rust programming"));
82
- index.add_document(Document::new(2, "python programming"));
83
- index.add_document(Document::new(3, "rust web development"));
84
-
85
- let query = Query::new("rust");
86
-
87
- // Act
88
- let results = index.search(&query);
89
-
90
- // Assert
91
- assert_eq!(results.len(), 2);
92
- assert!(results.iter().any(|d| d.id == 1));
93
- assert!(results.iter().any(|d| d.id == 3));
94
- }
95
- ```
96
-
97
- ## Async Tests
98
-
99
- ```rust
100
- #[tokio::test]
101
- async fn fetch_user_returns_user_data() {
102
- // Arrange
103
- let client = TestClient::new();
104
- let user_id = 42;
105
-
106
- // Act
107
- let result = client.fetch_user(user_id).await;
108
-
109
- // Assert
110
- assert!(result.is_ok());
111
- let user = result.unwrap();
112
- assert_eq!(user.id, user_id);
113
- }
114
- ```
115
-
116
- ## Helper Functions
117
-
118
- ```rust
119
- #[cfg(test)]
120
- mod tests {
121
- use super::*;
122
-
123
- // Arrange helpers
124
- fn create_test_user() -> User {
125
- User::new("test", "test@example.com").unwrap()
126
- }
127
-
128
- fn create_order_with_items(items: &[(&str, f64)]) -> Order {
129
- let mut order = Order::new();
130
- for (name, price) in items {
131
- order.add_item(Item::new(name, *price));
132
- }
133
- order
134
- }
135
-
136
- // Assert helpers
137
- fn assert_order_total(order: &Order, expected: f64) {
138
- let total = order.calculate_total(0.0);
139
- assert!((total - expected).abs() < 0.01);
140
- }
141
-
142
- #[test]
143
- fn order_total_sums_items() {
144
- // Arrange
145
- let order = create_order_with_items(&[
146
- ("A", 10.0),
147
- ("B", 20.0),
148
- ]);
149
-
150
- // Act & Assert
151
- assert_order_total(&order, 30.0);
152
- }
153
- }
154
- ```
155
-
156
- ## See Also
157
-
158
- - [test-descriptive-names](./test-descriptive-names.md) - Test naming
159
- - [test-fixture-raii](./test-fixture-raii.md) - Test setup/teardown
160
- - [test-mock-traits](./test-mock-traits.md) - Mocking dependencies
@@ -1,151 +0,0 @@
1
- # test-cfg-test-module
2
-
3
- > Put unit tests in `#[cfg(test)] mod tests { }` within each module
4
-
5
- ## Why It Matters
6
-
7
- The `#[cfg(test)]` attribute ensures test code is only compiled during `cargo test`, not in release builds. Placing tests in a `tests` submodule within the same file keeps tests close to the code they test while maintaining separation. This is Rust's idiomatic unit test pattern.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- // Tests without cfg(test) - compiled into release binary
13
- mod tests {
14
- #[test]
15
- fn test_something() { ... } // Included in release build!
16
- }
17
-
18
- // Tests in separate file without access to private items
19
- // src/my_module.rs
20
- fn private_helper() { ... }
21
-
22
- // tests/my_module_test.rs
23
- // Can't access private_helper!
24
- ```
25
-
26
- ## Good
27
-
28
- ```rust
29
- // src/my_module.rs
30
-
31
- fn public_api() -> i32 {
32
- private_helper() * 2
33
- }
34
-
35
- fn private_helper() -> i32 {
36
- 21
37
- }
38
-
39
- #[cfg(test)]
40
- mod tests {
41
- use super::*; // Access to private items
42
-
43
- #[test]
44
- fn test_public_api() {
45
- assert_eq!(public_api(), 42);
46
- }
47
-
48
- #[test]
49
- fn test_private_helper() {
50
- assert_eq!(private_helper(), 21); // Can test private!
51
- }
52
- }
53
- ```
54
-
55
- ## Module Structure
56
-
57
- ```rust
58
- // src/lib.rs
59
- mod parser;
60
- mod lexer;
61
- mod ast;
62
-
63
- // src/parser.rs
64
- pub fn parse(input: &str) -> Result<Ast, Error> {
65
- let tokens = tokenize(input)?;
66
- build_ast(tokens)
67
- }
68
-
69
- fn tokenize(input: &str) -> Result<Vec<Token>, Error> { ... }
70
- fn build_ast(tokens: Vec<Token>) -> Result<Ast, Error> { ... }
71
-
72
- #[cfg(test)]
73
- mod tests {
74
- use super::*;
75
-
76
- #[test]
77
- fn test_parse_simple() {
78
- let ast = parse("1 + 2").unwrap();
79
- assert_eq!(ast.evaluate(), 3);
80
- }
81
-
82
- #[test]
83
- fn test_tokenize() {
84
- let tokens = tokenize("1 + 2").unwrap();
85
- assert_eq!(tokens.len(), 3);
86
- }
87
- }
88
- ```
89
-
90
- ## Test Helpers
91
-
92
- ```rust
93
- #[cfg(test)]
94
- mod tests {
95
- use super::*;
96
-
97
- // Test-only helpers
98
- fn create_test_data() -> Data {
99
- Data {
100
- id: 1,
101
- name: "test".into(),
102
- values: vec![1, 2, 3],
103
- }
104
- }
105
-
106
- fn assert_valid(data: &Data) {
107
- assert!(data.id > 0);
108
- assert!(!data.name.is_empty());
109
- }
110
-
111
- #[test]
112
- fn test_processing() {
113
- let data = create_test_data();
114
- let result = process(&data);
115
- assert_valid(&result);
116
- }
117
- }
118
- ```
119
-
120
- ## Multiple Test Modules
121
-
122
- ```rust
123
- // For larger test suites, use submodules
124
- #[cfg(test)]
125
- mod tests {
126
- use super::*;
127
-
128
- mod parsing {
129
- use super::*;
130
-
131
- #[test]
132
- fn test_parse_number() { ... }
133
-
134
- #[test]
135
- fn test_parse_string() { ... }
136
- }
137
-
138
- mod validation {
139
- use super::*;
140
-
141
- #[test]
142
- fn test_validate_range() { ... }
143
- }
144
- }
145
- ```
146
-
147
- ## See Also
148
-
149
- - [test-use-super](./test-use-super.md) - Importing from parent module
150
- - [test-integration-dir](./test-integration-dir.md) - Integration tests
151
- - [test-descriptive-names](./test-descriptive-names.md) - Test naming
@@ -1,171 +0,0 @@
1
- # test-criterion-bench
2
-
3
- > Use `criterion` for benchmarking
4
-
5
- ## Why It Matters
6
-
7
- Criterion provides statistically rigorous benchmarking with warmup, multiple iterations, outlier detection, and comparison between runs. It's far more reliable than simple timing with `Instant::now()`.
8
-
9
- ## Setup
10
-
11
- ```toml
12
- # Cargo.toml
13
- [dev-dependencies]
14
- criterion = "0.5"
15
-
16
- [[bench]]
17
- name = "my_benchmark"
18
- harness = false
19
- ```
20
-
21
- ## Basic Benchmark
22
-
23
- ```rust
24
- // benches/my_benchmark.rs
25
- use criterion::{black_box, criterion_group, criterion_main, Criterion};
26
-
27
- fn fibonacci(n: u64) -> u64 {
28
- match n {
29
- 0 => 0,
30
- 1 => 1,
31
- n => fibonacci(n - 1) + fibonacci(n - 2),
32
- }
33
- }
34
-
35
- fn bench_fibonacci(c: &mut Criterion) {
36
- c.bench_function("fib 20", |b| {
37
- b.iter(|| fibonacci(black_box(20)))
38
- });
39
- }
40
-
41
- criterion_group!(benches, bench_fibonacci);
42
- criterion_main!(benches);
43
- ```
44
-
45
- ## black_box is Critical
46
-
47
- ```rust
48
- // BAD: Compiler may optimize away the computation
49
- b.iter(|| fibonacci(20)); // Result unused, might be eliminated
50
-
51
- // GOOD: black_box prevents optimization
52
- b.iter(|| fibonacci(black_box(20)));
53
-
54
- // Also wrap the result if needed
55
- b.iter(|| black_box(fibonacci(black_box(20))));
56
- ```
57
-
58
- ## Comparing Implementations
59
-
60
- ```rust
61
- fn bench_comparison(c: &mut Criterion) {
62
- let mut group = c.benchmark_group("String concat");
63
-
64
- let data = "hello";
65
-
66
- group.bench_function("format!", |b| {
67
- b.iter(|| format!("{}{}", black_box(data), " world"))
68
- });
69
-
70
- group.bench_function("push_str", |b| {
71
- b.iter(|| {
72
- let mut s = String::from(black_box(data));
73
- s.push_str(" world");
74
- s
75
- })
76
- });
77
-
78
- group.bench_function("concat", |b| {
79
- b.iter(|| [black_box(data), " world"].concat())
80
- });
81
-
82
- group.finish();
83
- }
84
- ```
85
-
86
- ## Parameterized Benchmarks
87
-
88
- ```rust
89
- fn bench_vec_push(c: &mut Criterion) {
90
- let mut group = c.benchmark_group("Vec::push");
91
-
92
- for size in [100, 1000, 10000].iter() {
93
- group.bench_with_input(
94
- BenchmarkId::from_parameter(size),
95
- size,
96
- |b, &size| {
97
- b.iter(|| {
98
- let mut v = Vec::new();
99
- for i in 0..size {
100
- v.push(black_box(i));
101
- }
102
- v
103
- });
104
- },
105
- );
106
- }
107
-
108
- group.finish();
109
- }
110
- ```
111
-
112
- ## Throughput Measurement
113
-
114
- ```rust
115
- use criterion::Throughput;
116
-
117
- fn bench_parse(c: &mut Criterion) {
118
- let input = "a]ong string to parse...";
119
-
120
- let mut group = c.benchmark_group("Parser");
121
- group.throughput(Throughput::Bytes(input.len() as u64));
122
-
123
- group.bench_function("parse", |b| {
124
- b.iter(|| parse(black_box(input)))
125
- });
126
-
127
- group.finish();
128
- }
129
- ```
130
-
131
- ## Running Benchmarks
132
-
133
- ```bash
134
- # Run all benchmarks
135
- cargo bench
136
-
137
- # Run specific benchmark
138
- cargo bench -- fib
139
-
140
- # Save baseline for comparison
141
- cargo bench -- --save-baseline main
142
-
143
- # Compare against baseline
144
- cargo bench -- --baseline main
145
- ```
146
-
147
- ## Evidence from tokio
148
-
149
- ```rust
150
- // https://github.com/tokio-rs/tokio/blob/master/benches/sync_mpsc.rs
151
- use criterion::{criterion_group, criterion_main, Criterion};
152
-
153
- fn send_data<T: Default, const SIZE: usize>(
154
- g: &mut BenchmarkGroup<WallTime>,
155
- prefix: &str
156
- ) {
157
- let rt = rt();
158
- g.bench_function(format!("{prefix}_{SIZE}"), |b| {
159
- b.iter(|| {
160
- let (tx, mut rx) = mpsc::channel::<T>(SIZE);
161
- rt.block_on(tx.send(T::default())).unwrap();
162
- rt.block_on(rx.recv()).unwrap();
163
- })
164
- });
165
- }
166
- ```
167
-
168
- ## See Also
169
-
170
- - [perf-profile-first](perf-profile-first.md) - Profile before optimizing
171
- - [perf-black-box-bench](perf-black-box-bench.md) - Use black_box in benchmarks