Exposed Bug Fix Workflow
JetBrains/Exposed
Takes a GitHub or YouTrack issue for the Exposed project through reproduction, a failing test, a fix, validation and a pull request.
Control a running Compose Desktop application via HTTP. An agent skill from JetBrains/skills.
$ npx skills add JetBrains/skills --skill compose-ui-control -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install JetBrains/skills compose-ui-control --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/compose-ui-test-server .claude/skills/compose-ui-control && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "compose-ui-control" agent skill from https://github.com/JetBrains/skills/tree/main/compose-ui-test-server into .claude/skills/compose-ui-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui-control", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/JetBrains/skills/tree/main/compose-ui-test-serverType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add JetBrains/skills --skill compose-ui-control -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install JetBrains/skills compose-ui-control --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/compose-ui-test-server .agents/skills/compose-ui-control && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "compose-ui-control" agent skill from https://github.com/JetBrains/skills/tree/main/compose-ui-test-server into .agents/skills/compose-ui-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui-control", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add JetBrains/skills --skill compose-ui-control -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install JetBrains/skills compose-ui-control --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/compose-ui-test-server .cursor/skills/compose-ui-control && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "compose-ui-control" agent skill from https://github.com/JetBrains/skills/tree/main/compose-ui-test-server into .cursor/skills/compose-ui-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui-control", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/JetBrains/skills.git --path compose-ui-test-server--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add JetBrains/skills --skill compose-ui-control -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install JetBrains/skills compose-ui-control --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/compose-ui-test-server .gemini/skills/compose-ui-control && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "compose-ui-control" agent skill from https://github.com/JetBrains/skills/tree/main/compose-ui-test-server into .gemini/skills/compose-ui-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui-control", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install JetBrains/skills compose-ui-controlInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add JetBrains/skills --skill compose-ui-control -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/compose-ui-test-server .github/skills/compose-ui-control && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "compose-ui-control" agent skill from https://github.com/JetBrains/skills/tree/main/compose-ui-test-server into .github/skills/compose-ui-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui-control", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add JetBrains/skills --skill compose-ui-control -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install JetBrains/skills compose-ui-control --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/compose-ui-test-server .opencode/skills/compose-ui-control && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "compose-ui-control" agent skill from https://github.com/JetBrains/skills/tree/main/compose-ui-test-server into .opencode/skills/compose-ui-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui-control", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
compose-ui-controlControl a running Compose Desktop application via HTTP. An agent skill from JetBrains/skills.
Compose UI Control is an agent skill from JetBrains/skills, published by the product's own GitHub organization. Control a running Compose Desktop application via HTTP. Use when you need to interact with UI elements, click buttons, enter text, wait for elements to appear, or capture screenshots in a Compose Desktop app that has compose-ui-test-server enabled.
Its SKILL.md is about 1.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 38 other files (for example `.github/dependabot.yml`, `.github/workflows/build.yml` and `.github/workflows/junie.yml`).
It works with Gradle and GitHub. The repository describes itself as: Curated agent skills collection verified by JetBrains. The licence is MIT.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e0f258b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (Batch, from the files we listed), which the agent can run.
Shell commands in SKILL.md call:
curlFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Compose UI Control loads about 1.5k tokens when it runs. Until then it costs about 67 tokens; SKILL.md has 339 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from JetBrains/skills at commit e0f258b, republished under its MIT licence (© JetBrains). 339 words, ~1,535 tokens.
.claude/skills/compose-ui-control/SKILL.md (or your agent's skills folder). This skill also uses 33 other files; get the full folder from GitHub.A library that enables AI coding agents to control Compose Desktop applications at runtime via HTTP.
io.github.forketyfork:compose-ui-test-serverBefore setting up, check if the project already has the library:
grep -r "compose-ui-test-server\|composeuittest" --include="*.gradle*" --include="*.kt" .Look for:
io.github.forketyfork:compose-ui-test-serverio.github.forketyfork.composeuittestIf found, skip to Starting the Application.
Find the app's build.gradle.kts and locate the desktop source set dependencies. Add compose-ui-test-server and compose.uiTest:
kotlin {
sourceSets {
val desktopMain by getting {
dependencies {
// Existing dependencies...
// Add these two:
implementation("io.github.forketyfork:compose-ui-test-server:0.2.0")
@OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class)
implementation(compose.uiTest)
}
}
}
}For projects using version catalogs, add to gradle/libs.versions.toml:
[libraries]
compose-ui-test-server = { module = "io.github.forketyfork:compose-ui-test-server", version = "0.2.0" }Then reference in build.gradle.kts:
implementation(libs.compose.ui.test.server)Find the application's main() function (usually in Main.kt or similar). Replace the standard Compose Desktop launcher with runApplication:
Before (typical Compose Desktop main):
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
fun main() = application {
Window(onCloseRequest = ::exitApplication, title = "My App") {
App()
}
}After (with agent control support):
import io.github.forketyfork.composeuittest.WindowConfig
import io.github.forketyfork.composeuittest.runApplication
fun main() =
runApplication(
windowConfig = WindowConfig(
title = "My App",
minimumWidth = 1024,
minimumHeight = 768,
),
) {
App()
}The app now runs normally by default, but supports agent control when launched with COMPOSE_UI_TEST_SERVER_ENABLED=true.
For agents to interact with specific UI elements, add test tags:
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
Button(
onClick = { /* ... */ },
modifier = Modifier.testTag("login_button")
) {
Text("Login")
}
TextField(
value = username,
onValueChange = { username = it },
modifier = Modifier.testTag("username_field")
)# Normal mode (no server)
./gradlew run
# Agent-controlled mode (server enabled)
COMPOSE_UI_TEST_SERVER_ENABLED=true ./gradlew run
# With custom port (default is 54345)
COMPOSE_UI_TEST_SERVER_ENABLED=true COMPOSE_UI_TEST_SERVER_PORT=8080 ./gradlew runAlways check health first:
curl http://localhost:54345/health
# Expected: "OK"| Endpoint | Description |
|---|---|
GET /health | Health check |
GET /onNodeWithTag/{tag}/performClick | Click element by test tag |
GET /onNodeWithTag/{tag}/performTextInput?text=... | Enter text (URL-encode the text!) |
GET /onNodeWithText/{text}/performClick | Click element by display text |
GET /waitUntilExactlyOneExists/tag/{tag}?timeout=5000 | Wait for element by tag |
GET /waitUntilExactlyOneExists/text/{text}?exact=true&timeout=5000 | Wait for element by text |
GET /waitForIdle | Wait for UI to stabilize |
GET /captureScreenshot?path=screenshot.png | Capture screenshot |
Follow this sequence for reliable interactions:
# 1. Verify server is running
curl http://localhost:54345/health
# 2. Wait for UI to be ready
curl http://localhost:54345/waitForIdle
# 3. Perform action
curl "http://localhost:54345/onNodeWithTag/username/performTextInput?text=myuser"
# 4. Wait for UI to settle
curl http://localhost:54345/waitForIdle
# 5. Perform next action
curl http://localhost:54345/onNodeWithTag/login_button/performClick
# 6. Wait for result
curl "http://localhost:54345/waitUntilExactlyOneExists/tag/dashboard?timeout=10000"
# 7. Capture screenshot to verify
curl "http://localhost:54345/captureScreenshot?path=result.png"Search the codebase for existing test tags:
grep -r "testTag\|Modifier.testTag" --include="*.kt" .Also check:
CLAUDE.md for documented test tagssrc/*Test/ directories%20, @→%40, &→%26waitForIdle between operations for stabilityIf an endpoint returns an error:
waitForIdle)/health)© JetBrains, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 33 other files in compose-ui-test-server of JetBrains/skills.
Open the folder on GitHubat commit e0f258b
Compose UI Control next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Compose UI Control this skillJetBrains/skills | 364 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Exposed Bug Fix WorkflowJetBrains/Exposed | 9.3k | — | ~3.8k | Automated safety check: Pass | Apache-2.0 | |
| Test Metro LocallyZacSweers/metro | 1.4k | — | ~1.2k | Automated safety check: Pass | Apache-2.0 | |
| Release New Versionniki914/zafiro | 227 | — | ~2k | Automated safety check: Pass | MIT | |
| Minecraft CI ReleaseJahrome907/minecraft-agent-skills | 166 | — | ~3.6k | Automated safety check: Pass | MIT | |
| Releasesol4k/sol4k | 135 | — | ~949 | Automated safety check: Pass | Apache-2.0 |
JetBrains/Exposed
Takes a GitHub or YouTrack issue for the Exposed project through reproduction, a failing test, a fix, validation and a pull request.
ZacSweers/metro
Publish the current Metro checkout to Maven Local and verify it in an external consumer or reproducer.
niki914/zafiro
A skill your agent uses when the user wants to release a new Zafiro version — drafting bilingual release notes, deciding the next version number, bumping app/build.gradle.kts, tagging, and…
Jahrome907/minecraft-agent-skills
Set up and review CI, artifact publishing, versioning, and release management for Minecraft 26.x or legacy 1.21.x mods and Paper plugins.
sol4k/sol4k
Bump the sol4k library version everywhere, open a release PR, and draft GitHub release notes.
afkT/DevUtils
对 DevUtils 工程(DEPSROOT=file/gradle、DEPSMANIFEST=file/deps)中定义的第三方库 GAV 依赖做版本查证与升级;结合 Maven Central、Google Maven、Gradle Plugin Portal、 JitPack 与 GitHub Releases/README 交叉校验「最新可用版本」;必要时修正…
JetBrains/skills
A skill your agent uses when the task requires automating a real browser from the terminal (navigation, form filling, snapshots, screenshots, data extraction, UI-flow debugging) via playwright-cli…
JetBrains/skills
Guide for creating effective skills. An agent skill from JetBrains/skills.
JetBrains/skills
Transcribe audio files to text with optional diarization and known-speaker hints.
JetBrains/skills
A skill your agent uses when the user asks to generate or edit images via the OpenAI Image API (for example: generate image, edit/inpaint/mask, background removal or replacement, transparent…
JetBrains/skills
A skill your agent uses when the user asks for text-to-speech narration or voiceover, accessibility reads, audio prompts, or batch speech generation via the OpenAI Audio API; run the bundled CLI…
JetBrains/skills
A skill your agent uses when the user explicitly asks for a desktop or system screenshot (full screen, specific app or window, or a pixel region), or when tool-specific capture capabilities are…
Control a running Compose Desktop application via HTTP. An agent skill from JetBrains/skills. Compose UI Control is an agent skill from JetBrains/skills, published by the product's own GitHub organization. Control a running Compose Desktop application via HTTP.
Compose UI Control fits situations like: you need to interact with UI elements; wait for elements to appear; capture screenshots in a Compose Desktop app that has compose-ui-test-server enabled.
Run `npx skills add JetBrains/skills --skill compose-ui-control -a claude-code`. Or copy the skill folder (compose-ui-test-server in JetBrains/skills) into .claude/skills/compose-ui-control in your project. Claude Code loads it when a task matches its description.
Run `npx skills add JetBrains/skills --skill compose-ui-control -a codex`. Or copy the skill folder (compose-ui-test-server in JetBrains/skills) into .agents/skills/compose-ui-control in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add JetBrains/skills --skill compose-ui-control -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/compose-ui-control, .gemini/skills/compose-ui-control, .github/skills/compose-ui-control and .opencode/skills/compose-ui-control in your project.
Going by SKILL.md and its folder, Compose UI Control needs Windows cmd for the scripts in its folder and the command-line tools its instructions call (curl).
SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Compose UI Control is published under the MIT licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.5k tokens (SKILL.md is roughly 6.1k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Compose UI Control: Exposed Bug Fix Workflow (JetBrains/Exposed, 9.3k stars), Test Metro Locally (ZacSweers/metro, 1.4k stars), Release New Version (niki914/zafiro, 227 stars) and Minecraft CI Release (Jahrome907/minecraft-agent-skills, 166 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
JetBrains (a GitHub organization, an official publisher) maintains it in JetBrains/skills, which has 364 GitHub stars. The repository holds 77 skills in this directory. The repository was last updated on June 29, 2026.
Source: JetBrains/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.