Conversation
|
I changed too many things. This is now obsolete... But please review the concept anyways |
|
I feel like we may need to have a discussion of the overall packaged/module structure. Question Answer Module Restructuring StrategyThe Core Problems1. 2. 3. Two lifecycle orchestrators are misplaced Phase 1 — Decouple
|
Moves to homebase-network |
Stays in homebase-storage (renamed from homebase-api) |
|---|---|
client/ — HTTP client, all drive API providers, WebSocket client |
sync/ — DriveSyncManager, OdinDatabase, SQLDelight schema |
crypto/ — AesCbc, AesGcm, EccKeyFunctions (these sign request headers) |
file/, image/, video/ — media utilities |
youauth/, browser/ — OAuth flow |
di/StorageModule.kt |
common/ — OdinId, SecureByteArray, UnixTimeUtc |
|
serialization/, exception/, util/, storage/ |
homebase-storage then declares api(project(":homebase-network")).
After this, homebase-common can use api(project(":homebase-network")) — exposing only credentials, OdinId, and drive HTTP providers needed for image loading. No more SQLDelight or FFmpeg in the UI library's transitive graph.
Key constraint: Keep package names as id.homebase.api.* even after moving files — avoids mass import rewrites across 300+ files.
Watch out for: homebase-core/build.gradle.kts iOS framework export — currently exports homebase-api, must be updated to export homebase-storage (which transitively exports homebase-network).
Phase 3 — Split homebase-chat (~2–3 weeks, higher risk)
homebase-chat/services/ (26 files) directly calls QueryBatch, DatabaseManager, OutboxSync — persistence logic disguised as business logic. Properly separating it requires repository interfaces first.
homebase-chat-domain — services/, data/ (depends on homebase-storage, homebase-network)
homebase-chat (UI) — screens/, widget/ (depends on homebase-chat-domain, homebase-common)
Design the interfaces before moving files — treat this as a separate architectural initiative.
Summary
| Phase | Effort | Risk | Benefit |
|---|---|---|---|
1: Move 2 files + change api() → impl() |
~1 day | Low | Stops SQLDelight/FFmpeg leaking through homebase-common |
2: Extract homebase-network |
~1–2 weeks | Medium | Correct naming; clean HTTP vs storage separation |
3: Extract homebase-chat-domain |
2–3 weeks | High | Testable services; smaller feature modules |
Start with Phase 1 — it's a 2-file move and a 1-line change that delivers the most structural improvement per unit of risk.
|
I like to take one step at a time though. here's another suggestion from Claude (that I deliberately didn't do first). It would probably have to go in before or as one of the very first items: Phase 4: Package Rename — homebase-commonContext
Scope constraint: Only touch files under Collision warning: Two package subtrees exist in BOTH modules. Class-specific sed rules are required for these — not package-level rules:
Step 1 — Git checkpointgit add -A && git commit -m "chore: pre-rename checkpoint (phase 4)"Step 2 — Update package declarations inside homebase-common/srcAnchored to find homebase-common/src -name "*.kt" \
-exec sed -i 's/^package id\.homebase\.core/package id.homebase.common/g' {} +Verify: should show ~215 modified files, zero unchanged grep -rn "^package id\.homebase\.core" homebase-common/src --include="*.kt"
# Expected: no outputStep 3 — Rename physical directories (all 6 source sets)Use for SS in commonMain androidMain jvmMain nativeMain webMain commonTest; do
SRC="homebase-common/src/${SS}/kotlin/id/homebase/core"
DST="homebase-common/src/${SS}/kotlin/id/homebase/common"
if [ -d "$SRC" ]; then
mkdir -p "$(dirname "$DST")"
git mv "$SRC" "$DST"
fi
done
Step 4 — Update intra-module imports inside homebase-commonFiles within homebase-common import from each other using No collision risk here — homebase-common never imports from homebase-core's collision classes. find homebase-common/src -name "*.kt" \
-exec sed -i 's/import id\.homebase\.core\./import id.homebase.common./g' {} +Verify: grep -rn "import id\.homebase\.core\." homebase-common/src --include="*.kt"
# Expected: no output (~59 imports updated)Step 5 — Update imports in all consuming files (outside homebase-common)5a — Unambiguous package-level replacementsThese packages exist only in homebase-common (not homebase-core), so a package-level sed is safe: find . -name "*.kt" ! -path "*/homebase-common/*" -exec sed -i \
-e 's/import id\.homebase\.core\.audio\./import id.homebase.common.audio./g' \
-e 's/import id\.homebase\.core\.auth\./import id.homebase.common.auth./g' \
-e 's/import id\.homebase\.core\.avatars\./import id.homebase.common.avatars./g' \
-e 's/import id\.homebase\.core\.clipboard\./import id.homebase.common.clipboard./g' \
-e 's/import id\.homebase\.core\.config\./import id.homebase.common.config./g' \
-e 's/import id\.homebase\.core\.emoji\./import id.homebase.common.emoji./g' \
-e 's/import id\.homebase\.core\.gallery\./import id.homebase.common.gallery./g' \
-e 's/import id\.homebase\.core\.image\./import id.homebase.common.image./g' \
-e 's/import id\.homebase\.core\.localization\./import id.homebase.common.localization./g' \
-e 's/import id\.homebase\.core\.logging\./import id.homebase.common.logging./g' \
-e 's/import id\.homebase\.core\.navigation\./import id.homebase.common.navigation./g' \
-e 's/import id\.homebase\.core\.notifications\./import id.homebase.common.notifications./g' \
-e 's/import id\.homebase\.core\.permissions\./import id.homebase.common.permissions./g' \
-e 's/import id\.homebase\.core\.settings\./import id.homebase.common.settings./g' \
-e 's/import id\.homebase\.core\.shapes\./import id.homebase.common.shapes./g' \
-e 's/import id\.homebase\.core\.sync\./import id.homebase.common.sync./g' \
-e 's/import id\.homebase\.core\.ui\.assets\./import id.homebase.common.ui.assets./g' \
-e 's/import id\.homebase\.core\.ui\.auth\./import id.homebase.common.ui.auth./g' \
-e 's/import id\.homebase\.core\.ui\.theme\./import id.homebase.common.ui.theme./g' \
-e 's/import id\.homebase\.core\.util\./import id.homebase.common.util./g' \
-e 's/import id\.homebase\.core\.widget\./import id.homebase.common.widget./g' \
-e 's/import id\.homebase\.core\.HomebaseConstants/import id.homebase.common.HomebaseConstants/g' \
-e 's/import id\.homebase\.core\.MainViewControllerRef/import id.homebase.common.MainViewControllerRef/g' \
{} +5b — Collision packages: class-specific replacementsThese two packages overlap with homebase-core, so replacements must be class-level to avoid renaming homebase-core's classes.
find . -name "*.kt" ! -path "*/homebase-common/*" -exec sed -i \
-e 's/import id\.homebase\.core\.share\.ShareCacheStorage/import id.homebase.common.share.ShareCacheStorage/g' \
-e 's/import id\.homebase\.core\.share\.ShareableConversation/import id.homebase.common.share.ShareableConversation/g' \
-e 's/import id\.homebase\.core\.share\.ShareContentProcessor/import id.homebase.common.share.ShareContentProcessor/g' \
-e 's/import id\.homebase\.core\.share\.ShareConversationCacheWriter/import id.homebase.common.share.ShareConversationCacheWriter/g' \
-e 's/import id\.homebase\.core\.share\.SharedContentDescriptor/import id.homebase.common.share.SharedContentDescriptor/g' \
{} +Homebase-core's
find . -name "*.kt" ! -path "*/homebase-common/*" -exec sed -i \
-e 's/import id\.homebase\.core\.ui\.navigation\.ObserveAsEvents/import id.homebase.common.ui.navigation.ObserveAsEvents/g' \
-e 's/import id\.homebase\.core\.ui\.navigation\.Routes/import id.homebase.common.ui.navigation.Routes/g' \
-e 's/import id\.homebase\.core\.ui\.navigation\.Route\b/import id.homebase.common.ui.navigation.Route/g' \
{} +Homebase-core's Step 5c — Fix implicit same-package resolution breakageAfter the rename, any file in
// homebase-core/src/commonMain/kotlin/id/homebase/core/ui/navigation/AppNavHost.kt
import id.homebase.common.ui.navigation.RouteGeneral rule: After running Steps 5a/5b, if compilation reports Step 6 — Sanity checks# 1. No homebase-common files should still declare id.homebase.core.* packages
grep -rn "^package id\.homebase\.core" homebase-common/src --include="*.kt"
# Expected: no output
# 2. homebase-core packages must be untouched
grep -rn "^package id\.homebase\.common" homebase-core/src --include="*.kt"
# Expected: no output
# 3. No stale id.homebase.core imports from homebase-common packages in consuming files
# (excludes homebase-common itself, and homebase-core's own share/ui.navigation classes)
grep -rn "import id\.homebase\.core\.\(audio\|auth\|avatars\|clipboard\|config\|emoji\|gallery\|image\|localization\|logging\|navigation\|notifications\|permissions\|settings\|shapes\|sync\|util\|widget\|HomebaseConstants\|MainViewControllerRef\)" \
. --include="*.kt" \
| grep -v "homebase-common/"
# Expected: no output
grep -rn "import id\.homebase\.core\.ui\.\(assets\|auth\|theme\)\." \
. --include="*.kt" \
| grep -v "homebase-common/"
# Expected: no output
# 4. Verify collision classes were handled correctly (homebase-common classes updated)
grep -rn "import id\.homebase\.core\.share\.Share\|import id\.homebase\.core\.share\.Shared" \
. --include="*.kt" | grep -v "homebase-common/"
# Expected: no output (all homebase-common share classes now use id.homebase.common.share)
grep -rn "import id\.homebase\.core\.ui\.navigation\.ObserveAsEvents\|import id\.homebase\.core\.ui\.navigation\.Route" \
. --include="*.kt" | grep -v "homebase-common/"
# Expected: no output
# 5. homebase-core's collision classes must still use id.homebase.core (not accidentally renamed)
grep -rn "import id\.homebase\.core\.share\.ShareHandlerRegistration\|import id\.homebase\.core\.share\.registerShareHandler\|import id\.homebase\.core\.share\.unregisterShareHandler" \
homebase-core/src --include="*.kt"
# Expected: lines present (these must NOT have been renamed)
grep -rn "import id\.homebase\.core\.ui\.navigation\.AppNavHost\|import id\.homebase\.core\.ui\.navigation\.AppViewModel" \
homebase-core/src --include="*.kt"
# Expected: lines present |
Recommendation from Claude. If you like it, please merge, or close it and do it another way. If you don't like it, just close it :-)