원클릭으로
verify
How to verify Livewire changes by running the apps and capturing evidence (offscreen Compose renders, demo client + host).
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
How to verify Livewire changes by running the apps and capturing evidence (offscreen Compose renders, demo client + host).
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | verify |
| description | How to verify Livewire changes by running the apps and capturing evidence (offscreen Compose renders, demo client + host). |
Plugin UI is remote: plugins emit serializable LayoutNodes on the guest
(demo app); the desktop host deserializes and renders them as real
Material3 Compose via LayoutNodeContent in the :host-ui module
(host-ui/src/commonMain/kotlin/com/livewire/host/ui/, package
com.livewire.host.ui). Verifying a widget/renderer change means
rendering the host side.
./gradlew :demo:desktop:run (window "Livewire Client",
Rick & Morty screen fires real JSON API calls — good for the network plugin)../gradlew :host:run.osascript/System Events times out (no accessibility permission). Don't
plan on clicking through the host app headlessly.Render the real host pipeline to PNGs with ImageComposeScene:
fun main() into
demo/desktop/src/main/kotlin/com/livewire/ (this module sees :ui,
all plugins, and compose.desktop.currentOs — but NOT :host-ui,
which holds LayoutNodeContent; temporarily add
implementation(projects.hostUi) to demo/desktop/build.gradle.kts).LayoutNodeSerializationStrategy.Default (the real wire format), then
render LayoutNodeContent(node, ...) inside
MaterialTheme(lightColorScheme()/darkColorScheme()) in an
ImageComposeScene(width, height, Density(2f)).while (frame < 60 && (scene.hasInvalidations() || frame < 10)) { Thread.sleep(50); scene.render(frame*100_000_000L); frame++ }image.encodeToData(EncodedImageFormat.PNG)!!.bytes → write file → Read
the PNG to inspect visually.mainClass in
demo/desktop/build.gradle.kts at the scratch file:
./gradlew :demo:desktop:run.git checkout demo/desktop/build.gradle.kts
(reverts both the mainClass and the temporary :host-ui dependency).Scene width/height are px; content lays out at density, so budget
~2x the dp sum or the bottom gets clipped.
Interaction in headless scenes:
scene.sendPointerEvent(PointerEventType.Press/Release, Offset(px, px))
works for clicks/focus.scene.sendKeyEvent(KeyEvent(key, type, ...)) works for shortcuts and
Enter/arrows — needs @file:OptIn(androidx.compose.ui.InternalComposeUiApi::class).Toolkit.getDefaultToolkit().systemClipboard.setContents(StringSelection("..."), null)),
focus the field with a click, then send Meta+V — paste goes through the
key mapping and inserts text fine.To verify a plugin's remote UI end-to-end without the WebSocket, bridge both sides in one process:
NetworkEventCollector.recordRequest/ recordResponse) with fakes.CoroutineScope(Dispatchers.Default):
livewireFlow(strategy, resyncFlow) { rememberLivewireActionController() → SideEffect { ref.set(it) } → CompositionLocalProvider( LocalLivewireActionObserver provides controller) { LivewireTheme( CustomLivewireTheme, false) { plugin.Content() } } } — collect
LivewireOutput.FullTree, re-encode/decode via the strategy, publish
to a MutableStateFlow<LayoutNode?>.ImageComposeScene: collect the tree flow, render
LayoutNodeContent(tree) under MaterialTheme + provide
LocalLivewireActionDispatcher (an object delegating to the guest
controller via the AtomicReference) and LocalSnackDispatcher
(rememberSnackbarDispatcher(SnackbarHostState()), from
com.livewire.ui.snackbar in :ui).sendPointerEvent clicks dispatch real actions to the
guest presenter; after each click emit to resyncFlow to get a fresh
FullTree (skips patch application). Capture PNGs between steps../gradlew :ui:jvmMainClasses :host-ui:jvmMainClasses :plugins:network:core:jvmMainClasses :host:jvmMainClasses
./gradlew :ui:compileKotlinIosArm64 :host-ui:compileKotlinIosArm64 # commonMain must compile for iOS
./gradlew :demo:android:assembleDebug # Android target
./gradlew :ui:jvmTest # serialization round-trip tests