agy-superpowers 5.2.2 → 5.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -150
- package/package.json +1 -1
- package/template/agent/rules/CLAUDE.md +80 -0
- package/template/agent/rules/code-styles.md +31 -32
- package/template/agent/rules/debug-confirmation-policy.md +2 -0
- package/template/agent/rules/file-length-policy.md +2 -0
- package/template/agent/rules/git-policy.md +7 -0
- package/template/agent/rules/language-matching.md +2 -0
- package/template/agent/rules/scratch-scripts.md +39 -0
- package/template/agent/rules/superpowers.md +8 -51
- package/template/agent/skills/executing-plans/SKILL.md +17 -0
- package/template/agent/skills/systematic-debugging/SKILL.md +16 -0
- package/template/agent/skills/test-driven-development/SKILL.md +16 -0
- package/template/agent/skills/verification-before-completion/SKILL.md +22 -0
- package/template/agent/skills/writing-plans/SKILL.md +16 -0
- package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
- package/template/agent/skills/analytics-setup/SKILL.md +0 -51
- package/template/agent/skills/api-design/SKILL.md +0 -193
- package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
- package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
- package/template/agent/skills/backend-developer/SKILL.md +0 -148
- package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
- package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
- package/template/agent/skills/community-manager/SKILL.md +0 -115
- package/template/agent/skills/content-marketer/SKILL.md +0 -111
- package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
- package/template/agent/skills/cto-architect/SKILL.md +0 -133
- package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
- package/template/agent/skills/data-analyst/SKILL.md +0 -147
- package/template/agent/skills/devops-engineer/SKILL.md +0 -117
- package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
- package/template/agent/skills/game-design/SKILL.md +0 -194
- package/template/agent/skills/game-developer/SKILL.md +0 -175
- package/template/agent/skills/growth-hacker/SKILL.md +0 -122
- package/template/agent/skills/idea-validator/SKILL.md +0 -55
- package/template/agent/skills/indie-legal/SKILL.md +0 -53
- package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
- package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
- package/template/agent/skills/launch-strategist/SKILL.md +0 -62
- package/template/agent/skills/market-researcher/SKILL.md +0 -53
- package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
- package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
- package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
- package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
- package/template/agent/skills/real-time-features/SKILL.md +0 -194
- package/template/agent/skills/retention-specialist/SKILL.md +0 -123
- package/template/agent/skills/rust-developer/SKILL.md +0 -281
- package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
- package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
- package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
- package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
- package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
- package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
- package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
- package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
- package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
- package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
- package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
- package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
- package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
- package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
- package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
- package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
- package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
- package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
- package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
- package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
- package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
- package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
- package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
- package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
- package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
- package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
- package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
- package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
- package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
- package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
- package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
- package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
- package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
- package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
- package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
- package/template/agent/skills/saas-architect/SKILL.md +0 -139
- package/template/agent/skills/security-engineer/SKILL.md +0 -133
- package/template/agent/skills/seo-specialist/SKILL.md +0 -130
- package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
# proj-pub-crate-internal
|
|
2
|
-
|
|
3
|
-
> Use pub(crate) for internal APIs
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
`pub(crate)` exposes items within the crate but hides them from external users. This creates clear boundaries between public API and internal implementation, preventing accidental breakage and reducing public API surface.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Everything public - users depend on internals
|
|
13
|
-
pub mod internal {
|
|
14
|
-
pub struct InternalState {
|
|
15
|
-
pub buffer: Vec<u8>, // Implementation detail exposed
|
|
16
|
-
pub dirty: bool,
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
pub fn process_internal(state: &mut InternalState) {
|
|
20
|
-
// Users can call this, creating coupling
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
pub struct Widget {
|
|
25
|
-
pub state: internal::InternalState, // Exposed!
|
|
26
|
-
}
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Good
|
|
30
|
-
|
|
31
|
-
```rust
|
|
32
|
-
// Internal module with crate visibility
|
|
33
|
-
pub(crate) mod internal {
|
|
34
|
-
pub(crate) struct InternalState {
|
|
35
|
-
pub(crate) buffer: Vec<u8>,
|
|
36
|
-
pub(crate) dirty: bool,
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
pub(crate) fn process_internal(state: &mut InternalState) {
|
|
40
|
-
// Only callable within crate
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
pub struct Widget {
|
|
45
|
-
state: internal::InternalState, // Private field
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
impl Widget {
|
|
49
|
-
pub fn new() -> Self {
|
|
50
|
-
Self {
|
|
51
|
-
state: internal::InternalState {
|
|
52
|
-
buffer: Vec::new(),
|
|
53
|
-
dirty: false,
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
pub fn do_something(&mut self) {
|
|
59
|
-
internal::process_internal(&mut self.state);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Visibility Levels
|
|
65
|
-
|
|
66
|
-
| Visibility | Accessible From |
|
|
67
|
-
|------------|-----------------|
|
|
68
|
-
| `pub` | Everywhere |
|
|
69
|
-
| `pub(crate)` | Current crate only |
|
|
70
|
-
| `pub(super)` | Parent module only |
|
|
71
|
-
| `pub(in path)` | Specific module path |
|
|
72
|
-
| (private) | Current module only |
|
|
73
|
-
|
|
74
|
-
## Pattern: Internal Module
|
|
75
|
-
|
|
76
|
-
```rust
|
|
77
|
-
// src/lib.rs
|
|
78
|
-
mod internal; // Private module
|
|
79
|
-
pub mod api; // Public API
|
|
80
|
-
|
|
81
|
-
// src/internal.rs
|
|
82
|
-
pub(crate) struct Helper;
|
|
83
|
-
pub(crate) fn helper_function() -> Helper { Helper }
|
|
84
|
-
|
|
85
|
-
// src/api.rs
|
|
86
|
-
use crate::internal::{Helper, helper_function};
|
|
87
|
-
|
|
88
|
-
pub struct PublicType {
|
|
89
|
-
helper: Helper, // Uses internal type, but field is private
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
## Pattern: Test Visibility
|
|
94
|
-
|
|
95
|
-
```rust
|
|
96
|
-
pub struct Parser {
|
|
97
|
-
// Private implementation
|
|
98
|
-
state: ParserState,
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Expose for testing but not public API
|
|
102
|
-
#[cfg(test)]
|
|
103
|
-
pub(crate) fn debug_state(&self) -> &ParserState {
|
|
104
|
-
&self.state
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Or use a dedicated test helper
|
|
108
|
-
#[doc(hidden)]
|
|
109
|
-
pub mod __test_helpers {
|
|
110
|
-
pub use super::ParserState;
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## Pattern: Feature Module Internals
|
|
115
|
-
|
|
116
|
-
```rust
|
|
117
|
-
// src/user/mod.rs
|
|
118
|
-
mod repository; // Private
|
|
119
|
-
mod service; // Private
|
|
120
|
-
|
|
121
|
-
pub use service::UserService; // Only export the public API
|
|
122
|
-
|
|
123
|
-
// repository and service are pub(crate) internally
|
|
124
|
-
// so other modules in crate can use them if needed
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## Benefits
|
|
128
|
-
|
|
129
|
-
| Approach | API Stability | Flexibility |
|
|
130
|
-
|----------|---------------|-------------|
|
|
131
|
-
| All `pub` | Any change breaks users | None |
|
|
132
|
-
| `pub(crate)` internals | Only `pub` items matter | Can refactor freely |
|
|
133
|
-
| Private | Maximum encapsulation | Limits crate flexibility |
|
|
134
|
-
|
|
135
|
-
## See Also
|
|
136
|
-
|
|
137
|
-
- [proj-pub-super-parent](./proj-pub-super-parent.md) - Parent-only visibility
|
|
138
|
-
- [proj-pub-use-reexport](./proj-pub-use-reexport.md) - Clean re-exports
|
|
139
|
-
- [api-non-exhaustive](./api-non-exhaustive.md) - Future-proof structs
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
# proj-pub-super-parent
|
|
2
|
-
|
|
3
|
-
> Use pub(super) for parent-only visibility
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
`pub(super)` exposes items only to the immediate parent module. This is useful for helper functions and types that submodules share but shouldn't be visible to the rest of the crate.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// src/parser/mod.rs
|
|
13
|
-
pub mod lexer;
|
|
14
|
-
pub mod ast;
|
|
15
|
-
|
|
16
|
-
// src/parser/lexer.rs
|
|
17
|
-
pub fn internal_helper() { // Visible to entire crate!
|
|
18
|
-
// Helper only needed by lexer and ast
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
pub(crate) struct Token { // Visible to entire crate
|
|
22
|
-
// Only parser submodules need this
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Good
|
|
27
|
-
|
|
28
|
-
```rust
|
|
29
|
-
// src/parser/mod.rs
|
|
30
|
-
pub mod lexer;
|
|
31
|
-
pub mod ast;
|
|
32
|
-
|
|
33
|
-
// Shared types for parser submodules only
|
|
34
|
-
pub(super) struct Token {
|
|
35
|
-
pub(super) kind: TokenKind,
|
|
36
|
-
pub(super) span: Span,
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
pub(super) fn shared_helper() -> Token {
|
|
40
|
-
// Only visible in parser/*
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// src/parser/lexer.rs
|
|
44
|
-
use super::{Token, shared_helper};
|
|
45
|
-
|
|
46
|
-
pub fn lex(input: &str) -> Vec<Token> {
|
|
47
|
-
shared_helper();
|
|
48
|
-
// ...
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// src/parser/ast.rs
|
|
52
|
-
use super::Token;
|
|
53
|
-
|
|
54
|
-
pub fn parse(tokens: Vec<Token>) -> Ast {
|
|
55
|
-
// ...
|
|
56
|
-
}
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Visibility Hierarchy
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
src/
|
|
63
|
-
├── lib.rs # crate root
|
|
64
|
-
├── parser/
|
|
65
|
-
│ ├── mod.rs # pub(super) items visible here
|
|
66
|
-
│ ├── lexer.rs # can use pub(super) from mod.rs
|
|
67
|
-
│ └── ast.rs # can use pub(super) from mod.rs
|
|
68
|
-
└── codegen.rs # CANNOT see pub(super) parser items
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Pattern: Layered Visibility
|
|
72
|
-
|
|
73
|
-
```rust
|
|
74
|
-
// src/database/mod.rs
|
|
75
|
-
mod connection;
|
|
76
|
-
mod query;
|
|
77
|
-
mod pool;
|
|
78
|
-
|
|
79
|
-
// Only this module's children can see
|
|
80
|
-
pub(super) struct RawConnection { /* ... */ }
|
|
81
|
-
|
|
82
|
-
// Entire crate can see
|
|
83
|
-
pub(crate) struct Pool { /* ... */ }
|
|
84
|
-
|
|
85
|
-
// Everyone can see
|
|
86
|
-
pub struct Database { /* ... */ }
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Pattern: Test Helpers
|
|
90
|
-
|
|
91
|
-
```rust
|
|
92
|
-
// src/parser/mod.rs
|
|
93
|
-
mod lexer;
|
|
94
|
-
mod ast;
|
|
95
|
-
|
|
96
|
-
#[cfg(test)]
|
|
97
|
-
mod tests {
|
|
98
|
-
use super::*;
|
|
99
|
-
|
|
100
|
-
// Test helper visible only to parser module's tests
|
|
101
|
-
pub(super) fn make_test_token() -> Token {
|
|
102
|
-
Token { kind: TokenKind::Test, span: Span::dummy() }
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// src/parser/lexer.rs
|
|
107
|
-
#[cfg(test)]
|
|
108
|
-
mod tests {
|
|
109
|
-
use super::super::tests::make_test_token;
|
|
110
|
-
// ...
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## Comparison
|
|
115
|
-
|
|
116
|
-
| Visibility | Scope | Use Case |
|
|
117
|
-
|------------|-------|----------|
|
|
118
|
-
| `pub` | Everywhere | Public API |
|
|
119
|
-
| `pub(crate)` | Crate-wide | Internal shared utilities |
|
|
120
|
-
| `pub(super)` | Parent module | Submodule helpers |
|
|
121
|
-
| `pub(in path)` | Specific path | Precise control |
|
|
122
|
-
| (private) | Current module | Implementation details |
|
|
123
|
-
|
|
124
|
-
## When to Use pub(super)
|
|
125
|
-
|
|
126
|
-
- Helper functions shared between sibling modules
|
|
127
|
-
- Types used by submodules but not the rest of crate
|
|
128
|
-
- Implementation details of a module group
|
|
129
|
-
- Test utilities for a module tree
|
|
130
|
-
|
|
131
|
-
## See Also
|
|
132
|
-
|
|
133
|
-
- [proj-pub-crate-internal](./proj-pub-crate-internal.md) - Crate visibility
|
|
134
|
-
- [proj-pub-use-reexport](./proj-pub-use-reexport.md) - Re-export patterns
|
|
135
|
-
- [proj-mod-by-feature](./proj-mod-by-feature.md) - Feature organization
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
# proj-pub-use-reexport
|
|
2
|
-
|
|
3
|
-
> Use pub use for clean public API
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
`pub use` re-exports items from submodules at the current module level. This creates a flat, ergonomic public API while keeping internal organization flexible. Users import from one place; you can reorganize internals without breaking their code.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// lib.rs - Deep module paths exposed
|
|
13
|
-
pub mod error;
|
|
14
|
-
pub mod config;
|
|
15
|
-
pub mod client;
|
|
16
|
-
pub mod types;
|
|
17
|
-
|
|
18
|
-
// Users must write:
|
|
19
|
-
use my_crate::error::MyError;
|
|
20
|
-
use my_crate::config::Config;
|
|
21
|
-
use my_crate::client::http::HttpClient;
|
|
22
|
-
use my_crate::types::request::Request;
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Good
|
|
26
|
-
|
|
27
|
-
```rust
|
|
28
|
-
// lib.rs - Flat public API
|
|
29
|
-
mod error;
|
|
30
|
-
mod config;
|
|
31
|
-
mod client;
|
|
32
|
-
mod types;
|
|
33
|
-
|
|
34
|
-
pub use error::MyError;
|
|
35
|
-
pub use config::Config;
|
|
36
|
-
pub use client::http::HttpClient;
|
|
37
|
-
pub use types::request::Request;
|
|
38
|
-
|
|
39
|
-
// Users write:
|
|
40
|
-
use my_crate::{Config, HttpClient, MyError, Request};
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## Pattern: Selective Re-export
|
|
44
|
-
|
|
45
|
-
```rust
|
|
46
|
-
// src/lib.rs
|
|
47
|
-
mod internal;
|
|
48
|
-
|
|
49
|
-
// Only re-export what users need
|
|
50
|
-
pub use internal::{
|
|
51
|
-
PublicStruct,
|
|
52
|
-
PublicTrait,
|
|
53
|
-
public_function,
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
// Keep implementation details hidden
|
|
57
|
-
// internal::helper_function is NOT exported
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## Pattern: Rename on Re-export
|
|
61
|
-
|
|
62
|
-
```rust
|
|
63
|
-
mod v1 {
|
|
64
|
-
pub struct Client { /* old implementation */ }
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
mod v2 {
|
|
68
|
-
pub struct Client { /* new implementation */ }
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Re-export with clear names
|
|
72
|
-
pub use v2::Client;
|
|
73
|
-
pub use v1::Client as LegacyClient;
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## Pattern: Prelude Module
|
|
77
|
-
|
|
78
|
-
```rust
|
|
79
|
-
// src/lib.rs
|
|
80
|
-
pub mod prelude {
|
|
81
|
-
pub use crate::{
|
|
82
|
-
Config,
|
|
83
|
-
Client,
|
|
84
|
-
Error,
|
|
85
|
-
Request,
|
|
86
|
-
Response,
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Users can glob import common items
|
|
91
|
-
use my_crate::prelude::*;
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Pattern: Feature-Gated Re-exports
|
|
95
|
-
|
|
96
|
-
```rust
|
|
97
|
-
// src/lib.rs
|
|
98
|
-
mod core;
|
|
99
|
-
mod serde_impl;
|
|
100
|
-
mod async_impl;
|
|
101
|
-
|
|
102
|
-
pub use core::*;
|
|
103
|
-
|
|
104
|
-
#[cfg(feature = "serde")]
|
|
105
|
-
pub use serde_impl::*;
|
|
106
|
-
|
|
107
|
-
#[cfg(feature = "async")]
|
|
108
|
-
pub use async_impl::*;
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
## Comparison: Module Structure vs Public API
|
|
112
|
-
|
|
113
|
-
```rust
|
|
114
|
-
// Internal structure (complex)
|
|
115
|
-
src/
|
|
116
|
-
├── transport/
|
|
117
|
-
│ ├── http/
|
|
118
|
-
│ │ └── client.rs // HttpClient
|
|
119
|
-
│ └── grpc/
|
|
120
|
-
│ └── client.rs // GrpcClient
|
|
121
|
-
├── auth/
|
|
122
|
-
│ └── token.rs // Token
|
|
123
|
-
└── lib.rs
|
|
124
|
-
|
|
125
|
-
// Public API (flat)
|
|
126
|
-
pub use transport::http::client::HttpClient;
|
|
127
|
-
pub use transport::grpc::client::GrpcClient;
|
|
128
|
-
pub use auth::token::Token;
|
|
129
|
-
|
|
130
|
-
// Users see:
|
|
131
|
-
my_crate::HttpClient
|
|
132
|
-
my_crate::GrpcClient
|
|
133
|
-
my_crate::Token
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## Re-export External Types
|
|
137
|
-
|
|
138
|
-
```rust
|
|
139
|
-
// Re-export dependencies users will need
|
|
140
|
-
pub use bytes::Bytes;
|
|
141
|
-
pub use http::{Method, StatusCode};
|
|
142
|
-
|
|
143
|
-
// Now users don't need to depend on these crates directly
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
## Glob Re-exports
|
|
147
|
-
|
|
148
|
-
Use sparingly:
|
|
149
|
-
|
|
150
|
-
```rust
|
|
151
|
-
// OK for internal modules
|
|
152
|
-
pub use internal::*;
|
|
153
|
-
|
|
154
|
-
// Careful with external crates - pollutes namespace
|
|
155
|
-
pub use serde::*; // Usually too broad
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
## See Also
|
|
159
|
-
|
|
160
|
-
- [proj-prelude-module](./proj-prelude-module.md) - Prelude pattern
|
|
161
|
-
- [proj-pub-crate-internal](./proj-pub-crate-internal.md) - Internal visibility
|
|
162
|
-
- [api-non-exhaustive](./api-non-exhaustive.md) - API stability
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
# proj-workspace-deps
|
|
2
|
-
|
|
3
|
-
> Use workspace dependency inheritance for consistent versions across crates
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Multi-crate workspaces often have dependency version drift—different crates using different versions of the same dependency. Workspace dependency inheritance (Rust 1.64+) lets you declare dependencies once in the workspace `Cargo.toml` and inherit them in member crates, ensuring consistency.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```toml
|
|
12
|
-
# crate-a/Cargo.toml
|
|
13
|
-
[dependencies]
|
|
14
|
-
serde = "1.0.150"
|
|
15
|
-
tokio = "1.25"
|
|
16
|
-
|
|
17
|
-
# crate-b/Cargo.toml
|
|
18
|
-
[dependencies]
|
|
19
|
-
serde = "1.0.188" # Different version!
|
|
20
|
-
tokio = "1.32" # Different version!
|
|
21
|
-
|
|
22
|
-
# Version drift leads to:
|
|
23
|
-
# - Larger binaries (multiple versions)
|
|
24
|
-
# - Compilation time increase
|
|
25
|
-
# - Subtle behavior differences
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Good
|
|
29
|
-
|
|
30
|
-
```toml
|
|
31
|
-
# Root Cargo.toml
|
|
32
|
-
[workspace]
|
|
33
|
-
members = ["crate-a", "crate-b", "crate-c"]
|
|
34
|
-
|
|
35
|
-
[workspace.dependencies]
|
|
36
|
-
serde = { version = "1.0", features = ["derive"] }
|
|
37
|
-
tokio = { version = "1.32", features = ["full"] }
|
|
38
|
-
thiserror = "1.0"
|
|
39
|
-
anyhow = "1.0"
|
|
40
|
-
tracing = "0.1"
|
|
41
|
-
|
|
42
|
-
# crate-a/Cargo.toml
|
|
43
|
-
[dependencies]
|
|
44
|
-
serde.workspace = true
|
|
45
|
-
tokio.workspace = true
|
|
46
|
-
|
|
47
|
-
# crate-b/Cargo.toml
|
|
48
|
-
[dependencies]
|
|
49
|
-
serde.workspace = true
|
|
50
|
-
tokio.workspace = true
|
|
51
|
-
thiserror.workspace = true
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Override Features
|
|
55
|
-
|
|
56
|
-
```toml
|
|
57
|
-
# Root Cargo.toml
|
|
58
|
-
[workspace.dependencies]
|
|
59
|
-
tokio = { version = "1.32", features = ["rt-multi-thread"] }
|
|
60
|
-
|
|
61
|
-
# crate-a/Cargo.toml - add extra features
|
|
62
|
-
[dependencies]
|
|
63
|
-
tokio = { workspace = true, features = ["net", "io-util"] }
|
|
64
|
-
# Gets both workspace features AND local features
|
|
65
|
-
|
|
66
|
-
# crate-b/Cargo.toml - minimal features
|
|
67
|
-
[dependencies]
|
|
68
|
-
tokio = { workspace = true } # Just workspace features
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Dev and Build Dependencies
|
|
72
|
-
|
|
73
|
-
```toml
|
|
74
|
-
# Root Cargo.toml
|
|
75
|
-
[workspace.dependencies]
|
|
76
|
-
criterion = "0.5"
|
|
77
|
-
proptest = "1.0"
|
|
78
|
-
trybuild = "1.0"
|
|
79
|
-
cc = "1.0"
|
|
80
|
-
|
|
81
|
-
# crate-a/Cargo.toml
|
|
82
|
-
[dev-dependencies]
|
|
83
|
-
criterion.workspace = true
|
|
84
|
-
proptest.workspace = true
|
|
85
|
-
|
|
86
|
-
[build-dependencies]
|
|
87
|
-
cc.workspace = true
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## Internal Crate Dependencies
|
|
91
|
-
|
|
92
|
-
```toml
|
|
93
|
-
# Root Cargo.toml
|
|
94
|
-
[workspace.dependencies]
|
|
95
|
-
# Internal crates
|
|
96
|
-
my-core = { path = "crates/core" }
|
|
97
|
-
my-utils = { path = "crates/utils" }
|
|
98
|
-
my-derive = { path = "crates/derive" }
|
|
99
|
-
|
|
100
|
-
# External crates
|
|
101
|
-
serde = "1.0"
|
|
102
|
-
|
|
103
|
-
# crate-a/Cargo.toml
|
|
104
|
-
[dependencies]
|
|
105
|
-
my-core.workspace = true
|
|
106
|
-
my-utils.workspace = true
|
|
107
|
-
serde.workspace = true
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
## Optional Dependencies
|
|
111
|
-
|
|
112
|
-
```toml
|
|
113
|
-
# Root Cargo.toml
|
|
114
|
-
[workspace.dependencies]
|
|
115
|
-
serde = { version = "1.0", optional = true } # Won't work!
|
|
116
|
-
|
|
117
|
-
# Optional must be set in member, not workspace
|
|
118
|
-
[workspace.dependencies]
|
|
119
|
-
serde = "1.0"
|
|
120
|
-
|
|
121
|
-
# crate-a/Cargo.toml
|
|
122
|
-
[dependencies]
|
|
123
|
-
serde = { workspace = true, optional = true }
|
|
124
|
-
|
|
125
|
-
[features]
|
|
126
|
-
serde = ["dep:serde"]
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## Complete Workspace Example
|
|
130
|
-
|
|
131
|
-
```toml
|
|
132
|
-
# Root Cargo.toml
|
|
133
|
-
[workspace]
|
|
134
|
-
members = ["crates/*"]
|
|
135
|
-
resolver = "2"
|
|
136
|
-
|
|
137
|
-
[workspace.package]
|
|
138
|
-
version = "0.1.0"
|
|
139
|
-
edition = "2021"
|
|
140
|
-
license = "MIT"
|
|
141
|
-
repository = "https://github.com/user/repo"
|
|
142
|
-
|
|
143
|
-
[workspace.dependencies]
|
|
144
|
-
# Internal
|
|
145
|
-
my-core = { path = "crates/core", version = "0.1" }
|
|
146
|
-
|
|
147
|
-
# Async
|
|
148
|
-
tokio = { version = "1.32", features = ["full"] }
|
|
149
|
-
futures = "0.3"
|
|
150
|
-
|
|
151
|
-
# Serialization
|
|
152
|
-
serde = { version = "1.0", features = ["derive"] }
|
|
153
|
-
serde_json = "1.0"
|
|
154
|
-
|
|
155
|
-
# Error handling
|
|
156
|
-
thiserror = "1.0"
|
|
157
|
-
anyhow = "1.0"
|
|
158
|
-
|
|
159
|
-
# Logging
|
|
160
|
-
tracing = "0.1"
|
|
161
|
-
tracing-subscriber = "0.3"
|
|
162
|
-
|
|
163
|
-
# Testing
|
|
164
|
-
proptest = "1.0"
|
|
165
|
-
criterion = { version = "0.5", features = ["html_reports"] }
|
|
166
|
-
|
|
167
|
-
# crates/core/Cargo.toml
|
|
168
|
-
[package]
|
|
169
|
-
name = "my-core"
|
|
170
|
-
version.workspace = true
|
|
171
|
-
edition.workspace = true
|
|
172
|
-
license.workspace = true
|
|
173
|
-
|
|
174
|
-
[dependencies]
|
|
175
|
-
serde.workspace = true
|
|
176
|
-
thiserror.workspace = true
|
|
177
|
-
|
|
178
|
-
[dev-dependencies]
|
|
179
|
-
proptest.workspace = true
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
## See Also
|
|
183
|
-
|
|
184
|
-
- [proj-lib-main-split](./proj-lib-main-split.md) - Workspace structure
|
|
185
|
-
- [api-serde-optional](./api-serde-optional.md) - Optional dependencies
|
|
186
|
-
- [lint-deny-correctness](./lint-deny-correctness.md) - Workspace lints
|