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,172 +0,0 @@
1
- # async-try-join
2
-
3
- > Use `try_join!` for concurrent fallible operations with early return on error
4
-
5
- ## Why It Matters
6
-
7
- When running multiple fallible operations concurrently, `try_join!` returns `Err` as soon as any future fails, without waiting for the others. This provides fail-fast behavior while still running operations in parallel. For many operations, use `futures::future::try_join_all`.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- // Sequential - slow and no early return benefit
13
- async fn fetch_all() -> Result<(A, B, C)> {
14
- let a = fetch_a().await?; // If this fails, we wait for nothing
15
- let b = fetch_b().await?; // But if this fails, we waited for A
16
- let c = fetch_c().await?;
17
- Ok((a, b, c))
18
- }
19
-
20
- // join! ignores errors
21
- async fn fetch_all() -> (Result<A>, Result<B>, Result<C>) {
22
- let (a, b, c) = join!(fetch_a(), fetch_b(), fetch_c());
23
- // All complete even if first one failed
24
- (a, b, c) // Now we have to handle three Results
25
- }
26
- ```
27
-
28
- ## Good
29
-
30
- ```rust
31
- use tokio::try_join;
32
-
33
- async fn fetch_all() -> Result<(A, B, C)> {
34
- // Concurrent AND fail-fast
35
- let (a, b, c) = try_join!(
36
- fetch_a(),
37
- fetch_b(),
38
- fetch_c(),
39
- )?;
40
-
41
- Ok((a, b, c))
42
- }
43
-
44
- // For dynamic collections
45
- use futures::future::try_join_all;
46
-
47
- async fn fetch_users(ids: &[u64]) -> Result<Vec<User>> {
48
- let futures: Vec<_> = ids.iter()
49
- .map(|id| fetch_user(*id))
50
- .collect();
51
-
52
- try_join_all(futures).await
53
- }
54
- ```
55
-
56
- ## Error Handling Patterns
57
-
58
- ```rust
59
- // Different error types - need common error type
60
- async fn mixed_operations() -> Result<(A, B), Error> {
61
- let (a, b) = try_join!(
62
- fetch_a().map_err(Error::from), // Convert errors
63
- fetch_b().map_err(Error::from),
64
- )?;
65
- Ok((a, b))
66
- }
67
-
68
- // Collect all results, then handle errors
69
- async fn all_or_nothing(ids: &[u64]) -> Result<Vec<User>> {
70
- try_join_all(ids.iter().map(|id| fetch_user(*id))).await
71
- }
72
-
73
- // Collect successes, log failures
74
- async fn best_effort(ids: &[u64]) -> Vec<User> {
75
- let results = futures::future::join_all(
76
- ids.iter().map(|id| fetch_user(*id))
77
- ).await;
78
-
79
- results.into_iter()
80
- .filter_map(|r| match r {
81
- Ok(user) => Some(user),
82
- Err(e) => {
83
- log::warn!("Failed to fetch user: {}", e);
84
- None
85
- }
86
- })
87
- .collect()
88
- }
89
- ```
90
-
91
- ## Cancellation Behavior
92
-
93
- ```rust
94
- // try_join! cancels remaining futures on error
95
- async fn with_cancellation() -> Result<()> {
96
- // If fetch_a() fails, fetch_b() and fetch_c() are dropped
97
- // But "dropped" != "immediately stopped"
98
- // They stop at their next .await point
99
-
100
- try_join!(
101
- async {
102
- fetch_a().await?;
103
- cleanup_a().await; // May not run if other future fails
104
- Ok::<_, Error>(())
105
- },
106
- async {
107
- fetch_b().await?;
108
- cleanup_b().await; // May not run if other future fails
109
- Ok::<_, Error>(())
110
- },
111
- )?;
112
-
113
- Ok(())
114
- }
115
-
116
- // For guaranteed cleanup, use Drop guards or explicit handling
117
- ```
118
-
119
- ## With Timeout
120
-
121
- ```rust
122
- use tokio::time::{timeout, Duration};
123
-
124
- async fn fetch_with_timeout() -> Result<(A, B)> {
125
- timeout(
126
- Duration::from_secs(10),
127
- try_join!(fetch_a(), fetch_b())
128
- )
129
- .await
130
- .map_err(|_| Error::Timeout)?
131
- }
132
-
133
- // Per-operation timeout
134
- async fn individual_timeouts() -> Result<(A, B)> {
135
- try_join!(
136
- timeout(Duration::from_secs(5), fetch_a())
137
- .map_err(|_| Error::Timeout)
138
- .and_then(|r| async { r }),
139
- timeout(Duration::from_secs(5), fetch_b())
140
- .map_err(|_| Error::Timeout)
141
- .and_then(|r| async { r }),
142
- )
143
- }
144
- ```
145
-
146
- ## try_join! vs FuturesUnordered
147
-
148
- ```rust
149
- use futures::stream::{FuturesUnordered, StreamExt};
150
-
151
- // try_join!: wait for all, fail fast
152
- let (a, b, c) = try_join!(fa, fb, fc)?;
153
-
154
- // FuturesUnordered: process as they complete
155
- let mut futures = FuturesUnordered::new();
156
- futures.push(fetch_a());
157
- futures.push(fetch_b());
158
- futures.push(fetch_c());
159
-
160
- while let Some(result) = futures.next().await {
161
- match result {
162
- Ok(data) => process(data),
163
- Err(e) => return Err(e), // Can fail fast manually
164
- }
165
- }
166
- ```
167
-
168
- ## See Also
169
-
170
- - [async-join-parallel](./async-join-parallel.md) - Non-fallible concurrent futures
171
- - [async-select-racing](./async-select-racing.md) - First-to-complete semantics
172
- - [err-question-mark](./err-question-mark.md) - Error propagation
@@ -1,189 +0,0 @@
1
- # async-watch-latest
2
-
3
- > Use `watch` channel for sharing the latest value with multiple observers
4
-
5
- ## Why It Matters
6
-
7
- `watch` is optimized for scenarios where receivers only care about the most recent value, not the history of changes. Unlike `broadcast`, slow receivers don't lag—they simply skip intermediate values. This is perfect for configuration, state, or status that should always reflect the current situation.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- // Using broadcast when only latest value matters
13
- let (tx, _) = broadcast::channel::<Config>(100);
14
-
15
- // Receivers might process stale configs if they're slow
16
- // And they waste time processing intermediate values
17
-
18
- // Using mpsc with buffered stale values
19
- let (tx, mut rx) = mpsc::channel::<Status>(100);
20
- // Receiver might process outdated statuses
21
- ```
22
-
23
- ## Good
24
-
25
- ```rust
26
- use tokio::sync::watch;
27
-
28
- let (tx, rx) = watch::channel(Config::default());
29
-
30
- // Multiple observers
31
- let rx1 = rx.clone();
32
- let rx2 = rx.clone();
33
-
34
- // Observer 1: waits for changes
35
- tokio::spawn(async move {
36
- let mut rx = rx1;
37
- while rx.changed().await.is_ok() {
38
- let config = rx.borrow();
39
- apply_config(&*config);
40
- }
41
- });
42
-
43
- // Observer 2: also sees all changes
44
- tokio::spawn(async move {
45
- let mut rx = rx2;
46
- while rx.changed().await.is_ok() {
47
- let config = rx.borrow();
48
- log_config_change(&*config);
49
- }
50
- });
51
-
52
- // Update the value
53
- tx.send(Config::new())?;
54
- ```
55
-
56
- ## watch Semantics
57
-
58
- ```rust
59
- use tokio::sync::watch;
60
-
61
- let (tx, mut rx) = watch::channel("initial");
62
-
63
- // Immediate read - no waiting
64
- assert_eq!(*rx.borrow(), "initial");
65
-
66
- // Wait for change
67
- tx.send("updated")?;
68
- rx.changed().await?;
69
- assert_eq!(*rx.borrow(), "updated");
70
-
71
- // Multiple rapid updates - receiver sees latest
72
- tx.send("v1")?;
73
- tx.send("v2")?;
74
- tx.send("v3")?;
75
- rx.changed().await?;
76
- assert_eq!(*rx.borrow(), "v3"); // Skipped v1, v2
77
- ```
78
-
79
- ## Configuration Reload Pattern
80
-
81
- ```rust
82
- use tokio::sync::watch;
83
- use std::sync::Arc;
84
-
85
- struct AppConfig {
86
- log_level: Level,
87
- max_connections: usize,
88
- }
89
-
90
- async fn config_watcher(tx: watch::Sender<Arc<AppConfig>>) {
91
- loop {
92
- tokio::time::sleep(Duration::from_secs(60)).await;
93
-
94
- if let Ok(new_config) = reload_config_from_disk() {
95
- // Only notifies if value actually changed
96
- tx.send_if_modified(|current| {
97
- if *current != new_config {
98
- *current = Arc::new(new_config);
99
- true
100
- } else {
101
- false
102
- }
103
- });
104
- }
105
- }
106
- }
107
-
108
- async fn worker(mut config_rx: watch::Receiver<Arc<AppConfig>>) {
109
- loop {
110
- tokio::select! {
111
- _ = config_rx.changed() => {
112
- let config = config_rx.borrow().clone();
113
- reconfigure(&config);
114
- }
115
- _ = do_work() => {}
116
- }
117
- }
118
- }
119
- ```
120
-
121
- ## State Machine Updates
122
-
123
- ```rust
124
- #[derive(Clone, PartialEq)]
125
- enum ConnectionState {
126
- Disconnected,
127
- Connecting,
128
- Connected,
129
- Error(String),
130
- }
131
-
132
- struct Connection {
133
- state_tx: watch::Sender<ConnectionState>,
134
- state_rx: watch::Receiver<ConnectionState>,
135
- }
136
-
137
- impl Connection {
138
- async fn wait_connected(&mut self) -> Result<(), Error> {
139
- loop {
140
- let state = self.state_rx.borrow().clone();
141
- match state {
142
- ConnectionState::Connected => return Ok(()),
143
- ConnectionState::Error(e) => return Err(Error::Connection(e)),
144
- _ => {
145
- self.state_rx.changed().await?;
146
- }
147
- }
148
- }
149
- }
150
- }
151
- ```
152
-
153
- ## Borrow vs Clone
154
-
155
- ```rust
156
- use tokio::sync::watch;
157
-
158
- let (tx, rx) = watch::channel(vec![1, 2, 3]);
159
-
160
- // borrow() returns Ref - must not hold across await
161
- {
162
- let data = rx.borrow();
163
- println!("{:?}", *data);
164
- } // Ref dropped here
165
-
166
- // For use across await, clone the data
167
- let data = rx.borrow().clone();
168
- some_async_operation().await;
169
- use_data(&data); // Safe
170
-
171
- // Or use borrow_and_update() to mark as seen
172
- let data = rx.borrow_and_update().clone();
173
- ```
174
-
175
- ## watch vs broadcast vs mpsc
176
-
177
- | Feature | watch | broadcast | mpsc |
178
- |---------|-------|-----------|------|
179
- | Receivers | Multiple | Multiple | Single |
180
- | Message delivery | Latest only | All messages | All messages |
181
- | Slow receiver | Skips to latest | Lags/misses | Backpressure |
182
- | Clone required | No | Yes | No |
183
- | Best for | Config, status | Events | Work queues |
184
-
185
- ## See Also
186
-
187
- - [async-broadcast-pubsub](./async-broadcast-pubsub.md) - When history matters
188
- - [async-mpsc-queue](./async-mpsc-queue.md) - Work queue patterns
189
- - [async-cancellation-token](./async-cancellation-token.md) - Related pattern
@@ -1,113 +0,0 @@
1
- # doc-all-public
2
-
3
- > Document all public items with `///` doc comments
4
-
5
- ## Why It Matters
6
-
7
- Public items define your crate's API contract. Without documentation, users must read source code to understand how to use your library. Well-documented APIs reduce support burden, improve adoption, and serve as the primary reference for users.
8
-
9
- Rust's `cargo doc` generates beautiful HTML documentation from doc comments, but only if you write them.
10
-
11
- ## Bad
12
-
13
- ```rust
14
- pub struct Config {
15
- pub timeout: Duration,
16
- pub retries: u32,
17
- pub base_url: String,
18
- }
19
-
20
- pub fn connect(config: Config) -> Result<Connection, Error> {
21
- // ...
22
- }
23
-
24
- pub enum Status {
25
- Pending,
26
- Active,
27
- Failed,
28
- }
29
- ```
30
-
31
- ## Good
32
-
33
- ```rust
34
- /// Configuration for establishing a connection to the service.
35
- ///
36
- /// # Examples
37
- ///
38
- /// ```
39
- /// use my_crate::Config;
40
- /// use std::time::Duration;
41
- ///
42
- /// let config = Config {
43
- /// timeout: Duration::from_secs(30),
44
- /// retries: 3,
45
- /// base_url: "https://api.example.com".to_string(),
46
- /// };
47
- /// ```
48
- pub struct Config {
49
- /// Maximum time to wait for a response before timing out.
50
- pub timeout: Duration,
51
-
52
- /// Number of retry attempts for failed requests.
53
- pub retries: u32,
54
-
55
- /// Base URL for all API requests.
56
- pub base_url: String,
57
- }
58
-
59
- /// Establishes a connection using the provided configuration.
60
- ///
61
- /// # Errors
62
- ///
63
- /// Returns an error if the connection cannot be established
64
- /// or if the configuration is invalid.
65
- pub fn connect(config: Config) -> Result<Connection, Error> {
66
- // ...
67
- }
68
-
69
- /// Represents the current status of a job.
70
- pub enum Status {
71
- /// Job is waiting to be processed.
72
- Pending,
73
- /// Job is currently being processed.
74
- Active,
75
- /// Job has failed and will not be retried.
76
- Failed,
77
- }
78
- ```
79
-
80
- ## What to Document
81
-
82
- | Item Type | Required Content |
83
- |-----------|------------------|
84
- | Structs | Purpose, usage example |
85
- | Struct fields | What the field represents |
86
- | Enums | When to use each variant |
87
- | Enum variants | What state it represents |
88
- | Functions | What it does, parameters, return value |
89
- | Traits | Contract and expected behavior |
90
- | Trait methods | Default implementation behavior |
91
- | Type aliases | Why the alias exists |
92
- | Constants | What the value represents |
93
-
94
- ## Enforcement
95
-
96
- Enable the `missing_docs` lint to catch undocumented public items:
97
-
98
- ```rust
99
- #![warn(missing_docs)]
100
- ```
101
-
102
- Or in `Cargo.toml` for workspace-wide enforcement:
103
-
104
- ```toml
105
- [workspace.lints.rust]
106
- missing_docs = "warn"
107
- ```
108
-
109
- ## See Also
110
-
111
- - [doc-module-inner](./doc-module-inner.md) - Module-level documentation
112
- - [doc-examples-section](./doc-examples-section.md) - Adding examples
113
- - [lint-missing-docs](./lint-missing-docs.md) - Enforcing documentation
@@ -1,147 +0,0 @@
1
- # doc-cargo-metadata
2
-
3
- > Fill `Cargo.toml` metadata for published crates
4
-
5
- ## Why It Matters
6
-
7
- Cargo.toml metadata appears on crates.io, in search results, and helps users evaluate your crate. Missing metadata makes your crate look unprofessional, harder to find, and harder to trust. Complete metadata improves discoverability and adoption.
8
-
9
- ## Bad
10
-
11
- ```toml
12
- [package]
13
- name = "my-awesome-crate"
14
- version = "0.1.0"
15
- edition = "2021"
16
-
17
- [dependencies]
18
- # ...
19
- ```
20
-
21
- ## Good
22
-
23
- ```toml
24
- [package]
25
- name = "my-awesome-crate"
26
- version = "0.1.0"
27
- edition = "2021"
28
- rust-version = "1.70"
29
-
30
- # Required for crates.io
31
- description = "A fast, ergonomic HTTP client for Rust"
32
- license = "MIT OR Apache-2.0"
33
- repository = "https://github.com/username/my-awesome-crate"
34
-
35
- # Highly recommended
36
- documentation = "https://docs.rs/my-awesome-crate"
37
- readme = "README.md"
38
- keywords = ["http", "client", "async", "networking"]
39
- categories = ["network-programming", "web-programming::http-client"]
40
- authors = ["Your Name <you@example.com>"]
41
- homepage = "https://my-awesome-crate.dev"
42
-
43
- # Optional but helpful
44
- include = ["src/**/*", "Cargo.toml", "LICENSE*", "README.md"]
45
- exclude = ["tests/fixtures/*", ".github/*"]
46
-
47
- [badges]
48
- maintenance = { status = "actively-developed" }
49
-
50
- [dependencies]
51
- # ...
52
- ```
53
-
54
- ## Required Fields for Publishing
55
-
56
- | Field | Purpose |
57
- |-------|---------|
58
- | `name` | Crate name on crates.io |
59
- | `version` | Semver version |
60
- | `license` or `license-file` | SPDX license identifier |
61
- | `description` | One-line summary (≤256 chars) |
62
-
63
- ## Recommended Fields
64
-
65
- | Field | Purpose | Example |
66
- |-------|---------|---------|
67
- | `repository` | Link to source code | `https://github.com/user/repo` |
68
- | `documentation` | Link to docs | `https://docs.rs/crate` |
69
- | `readme` | Path to README | `README.md` |
70
- | `keywords` | Search terms (max 5) | `["http", "async"]` |
71
- | `categories` | crates.io categories | `["network-programming"]` |
72
- | `rust-version` | MSRV | `"1.70"` |
73
-
74
- ## Keywords Best Practices
75
-
76
- ```toml
77
- # Good: specific, searchable terms
78
- keywords = ["json", "serialization", "serde", "parsing"]
79
-
80
- # Bad: too generic or redundant
81
- keywords = ["rust", "library", "awesome", "fast", "best"]
82
- ```
83
-
84
- ## Categories
85
-
86
- Choose from [crates.io categories](https://crates.io/category_slugs):
87
-
88
- ```toml
89
- categories = [
90
- "network-programming",
91
- "web-programming::http-client",
92
- "asynchronous",
93
- ]
94
- ```
95
-
96
- ## License Patterns
97
-
98
- ```toml
99
- # Single license
100
- license = "MIT"
101
-
102
- # Dual license (common in Rust ecosystem)
103
- license = "MIT OR Apache-2.0"
104
-
105
- # Custom license file
106
- license-file = "LICENSE"
107
- ```
108
-
109
- ## Include/Exclude
110
-
111
- Control what gets published:
112
-
113
- ```toml
114
- # Explicit include (whitelist)
115
- include = [
116
- "src/**/*",
117
- "Cargo.toml",
118
- "LICENSE*",
119
- "README.md",
120
- "CHANGELOG.md",
121
- ]
122
-
123
- # Or exclude (blacklist)
124
- exclude = [
125
- "tests/fixtures/large-file.bin",
126
- ".github/*",
127
- "benches/*",
128
- ]
129
- ```
130
-
131
- ## Verification
132
-
133
- Check your package before publishing:
134
-
135
- ```bash
136
- # See what will be included
137
- cargo package --list
138
-
139
- # Check metadata
140
- cargo publish --dry-run
141
- ```
142
-
143
- ## See Also
144
-
145
- - [doc-module-inner](./doc-module-inner.md) - Crate-level documentation
146
- - [lint-cargo-metadata](./lint-cargo-metadata.md) - Linting Cargo.toml
147
- - [proj-workspace-deps](./proj-workspace-deps.md) - Workspace management