Add Phase 5 Kotlin desktop app: Compose Multiplatform with gRPC client

Kotlin/Compose Desktop application under desktop/ with:
- Gradle build: Kotlin 2.1, Compose 1.8, gRPC/Protobuf codegen, detekt
- ExoClient: gRPC client for both ArtifactService and KnowledgeGraphService
- Obsidian-style layout: collapsible tree sidebar, contextual main panel
- Five view modes: artifact detail, note editor, search results, catalog,
  graph (stub)
- Unified search bar with selector prefix support
- Command palette (Ctrl+Shift+A) for quick actions
- Menu bar with keyboard shortcuts (Ctrl+I/L/F/Q)
- Dark Material 3 theme
- Detekt lint config with Compose/test naming exceptions
- Unit tests for AppState and model types

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-21 11:44:45 -07:00
parent 051a85d846
commit fa21dbaf98
18 changed files with 1342 additions and 2 deletions

View File

@@ -83,6 +83,30 @@ Tracks implementation progress against the phases in `PROJECT_PLAN.md`.
- `proto/exo/v1/kg.proto`, `proto/exo/v1/kg.pb.go`, `proto/exo/v1/kg_grpc.pb.go`
- `server/kg_server.go`
## Phase 5: Desktop Application — NOT STARTED (Kotlin, out of scope for Go backend)
## Phase 5: Desktop Application — COMPLETE
**Deliverables:**
- [x] Kotlin/Compose Multiplatform desktop application (`desktop/`)
- [x] Gradle build with Kotlin 2.1, Compose 1.8, gRPC, Protobuf code generation
- [x] gRPC client (`ExoClient`) connecting to exod for both ArtifactService and KnowledgeGraphService
- [x] Observable `AppState` model driving reactive Compose UI
- [x] Tree/outline sidebar (Obsidian-style) showing KG hierarchy and unlinked artifacts section
- [x] Contextual main panel: Artifact detail view, Note editor view, Search results view, Catalog view, Graph view stub
- [x] Unified search bar with selector prefix support (`artifact:`, `note:`, `tag:`, `doi:`, `author:`)
- [x] Command palette (Ctrl+Shift+A, IntelliJ-style): create note, import artifact, search, switch views
- [x] Menu bar with keyboard shortcuts: Ctrl+I (import), Ctrl+L (new note), Ctrl+F (search), Ctrl+Q (quit)
- [x] Dark theme (Material 3 dark color scheme)
- [x] Detekt static analysis (`detekt.yml`): strict config, Compose naming exceptions, test naming exceptions
- [x] Unit tests for AppState and model types (9 tests)
- [x] Proto files copied and generated for Kotlin (artifacts, kg, common)
**Files created:**
- `desktop/build.gradle.kts`, `desktop/settings.gradle.kts`, `desktop/detekt.yml`
- `desktop/src/main/proto/exo/v1/{common,artifacts,kg}.proto`
- `desktop/src/main/kotlin/dev/wntrmute/exo/Main.kt`
- `desktop/src/main/kotlin/dev/wntrmute/exo/client/ExoClient.kt`
- `desktop/src/main/kotlin/dev/wntrmute/exo/model/AppState.kt`
- `desktop/src/main/kotlin/dev/wntrmute/exo/ui/{App,Sidebar,MainPanel,SearchBar,CommandPalette}.kt`
- `desktop/src/test/kotlin/dev/wntrmute/exo/model/{AppStateTest,SearchResultTest}.kt`
## Phase 6: Remote Access & Backup — NOT STARTED