modularization
Installation
SKILL.md
Modularization
Declare everything at the lowest visibility that still compiles. Start private; widen to internal only when another file in the same module needs it; widen to public only when a different module actually consumes it. Kotlin defaults to public, and in a multi-module project that default is usually wrong — a public symbol joins the module's API surface: it leaks implementation across the boundary and you are then obliged to keep it stable.
- Public interface as the module's API → the interface is
public; its implementation class staysinternal(DI-bound, never named from another module). - Mapper / helper / extension / constant / UI-state holder used only inside the module →
internal(orprivateif a single file uses it). "Rendered by a composable in this module" does not requirepublic—internalis visible to the whole module. - Member used only within its class →
private.
Widening a symbol to public is a decision, not a default: confirm a real cross-module consumer first.