Skip to content

chore(claude): add .claude/ tree and Obsidian vault template

Import User requested to merge chore/claude-setup into main

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.

🤖 Generated with Claude Code

Merge request reports

Loading