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

63
desktop/detekt.yml Normal file
View File

@@ -0,0 +1,63 @@
# Detekt configuration for exo-desktop.
# Strict: treat issues as errors, not warnings.
build:
maxIssues: 0
complexity:
LongMethod:
threshold: 60
LongParameterList:
functionThreshold: 8
constructorThreshold: 10
ComplexCondition:
threshold: 5
TooManyFunctions:
thresholdInFiles: 25
thresholdInClasses: 20
thresholdInInterfaces: 15
naming:
FunctionNaming:
# Compose uses PascalCase for @Composable functions.
# Tests use backtick names.
excludes: ['**/ui/**', '**/test/**']
MatchingDeclarationName:
active: false
TopLevelPropertyNaming:
constantPattern: '[A-Z][A-Za-z0-9_]*'
style:
MagicNumber:
ignoreNumbers:
- '-1'
- '0'
- '1'
- '2'
- '5'
- '100'
- '9090'
ignorePropertyDeclaration: true
ignoreCompanionObjectPropertyDeclaration: true
ignoreAnnotation: true
ignoreEnums: true
MaxLineLength:
maxLineLength: 120
excludeCommentStatements: true
WildcardImport:
active: true
excludeImports:
- 'kotlinx.coroutines.*'
ReturnCount:
max: 4
UnusedPrivateMember:
allowedNames: '(_|ignored|expected)'
exceptions:
TooGenericExceptionCaught:
active: true
exceptionNames:
- 'Exception'
- 'RuntimeException'
- 'Throwable'