chore(claude): add .claude/ tree and Obsidian vault template
Summary
Part of the global Ildam Claude Code setup rebuild (2026-04-15). Adds a grounded `.claude/` tree for yalla-sip-phone based on a full audit of the live repo state.
Key facts verified against the repo
- Entry point: `Main.kt` (not `App.kt`)
- PJSIP code: lives in `src/main/kotlin/uz/yalla/sipphone/data/pjsip/` (no `sip/` directory)
- PJSIP wrappers: `PjsipEngine`, `PjsipAccount`, `PjsipCall`, `PjsipAccountManager`, `PjsipCallManager`, `PjsipEndpointManager`, `PjsipSipAccountManager` (7 classes, all in `data/pjsip/`)
- Lifecycle: `PjsipEngine` uses `AtomicBoolean destroyed` + `shutdown()` / `close()`. Per-object wrappers use `AtomicBoolean deleted` + `destroy()`
- `SipAccountManager`: interface in `domain/`, impl is `PjsipSipAccountManager` in `data/pjsip/`
- SWIG bindings: prebuilt `libs/pjsua2.jar` (package `org.pjsip.pjsua2.*`) — no SWIG source dir
- DI: 7 Koin modules (`networkModule`, `sipModule`, `settingsModule`, `authModule`, `featureModule`, `webviewModule`, `updateModule`) + `appModules` list aggregator in `AppModule.kt`
-
Testing: JUnit 4 runtime (via `kotlin("test")` + `compose.desktop.uiTestJUnit4`), kotlin.test assertions, kotlinx-coroutines-test, Turbine, ktor-client-mock. No MockK, no JUnit 5, no
@Nested, no@Tag.259 test methods / 38 files / ~5,536 LOC - Compose UI: `LocalStrings.current` (camelCase keys), `LocalYallaColors.current`, `LocalAppTokens.current` — all data classes via CompositionLocals
- Error handling: `Result` and sealed classes (Arrow/Either is not a dependency)
- Gradle: `packageDistributionForCurrentOS`, `packageDmg`, `packageMsi`, `packageDeb`, `run`, `runDemo`, `test` all exist. `ktlint` / `detekt` / `jacoco` / tag-based test filters are not wired up
What's added
``` .claude/ ├── CLAUDE.md # Project overview, PJSIP context, servers, real layout ├── settings.json # ktlint format-on-save hook (no-op until ktlint installed) ├── rules/ │ ├── pjsip-threading.md # pjDispatcher, SWIG invalidation, destroyed vs deleted │ ├── swig-interop.md # callback safety, lifecycle (scoped to data/pjsip/) │ ├── compose-desktop.md # LocalStrings, LocalYallaColors, Popup vs Dialog │ └── testing.md # JUnit 4, Turbine, ktor-client-mock, no MockK ├── skills/ │ ├── build-desktop/ # dmg/msi/deb │ ├── publish-release/ # cert-free distribution flow │ ├── debug-audio/ # PJSIP media pipeline troubleshooting │ ├── test-sip/ # test runner │ ├── add-sip-account/ # multi-SIP scaffolding │ ├── commit/, pr/, branch/ # git workflow └── agents/ ├── pjsip-expert/ # Opus C/SWIG specialist ├── compose-desktop-expert/ # Desktop UI specialist └── audio-debugger/ # audio routing / codec / conference bridge
docs/obsidian/ # Per-project sub-vault template ├── README, 00-overview (with current audio blocker context) ├── 01-architecture/, 02-patterns/, 03-decisions/, 04-features/, 05-operations/, 06-sessions/ └── .gitignore # excludes per-user .obsidian/ config ```
Not touched
- `libs/pjsua2.jar` is left as pre-existing uncommitted work and not included here
- Existing `docs/architecture.md`, `pjsip-guide.md`, `testing.md`, `js-bridge-api.md`, `windows-build.md` remain the authoritative long-form reference
Test Plan
-
All rules / skills / CLAUDE.md ground against real repo state (verified via parallel audit) -
Symlink from `~/Ildam-Brain/projects/yalla-sip-phone` resolves -
Start a new Claude Code session in this repo, verify auto-routing skills load (e.g. `debug-audio`, `build-desktop`) -
Run `./gradlew test` — confirm 259 tests still pass
Notes
Paired with sibling PRs in YallaClient (#303) and yalla-sdk.