React Router Bug Fix Workflow
remix-run/react-router
Fixes a React Router bug reported in a GitHub issue end to end: fetching the issue, validating the reproduction, writing a failing test and implementing the fix on a new branch.
Takes a GitHub or YouTrack issue for the Exposed project through reproduction, a failing test, a fix, validation and a pull request.
$ npx skills add JetBrains/Exposed --skill fix-bug -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install JetBrains/Exposed fix-bug --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/Exposed.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/fix-bug .claude/skills/fix-bug && 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 "fix-bug" agent skill from https://github.com/JetBrains/Exposed/tree/main/.claude/skills/fix-bug into .claude/skills/fix-bug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-bug", 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/Exposed/tree/main/.claude/skills/fix-bugType 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/Exposed --skill fix-bug -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install JetBrains/Exposed fix-bug --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/Exposed.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/fix-bug .agents/skills/fix-bug && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fix-bug" agent skill from https://github.com/JetBrains/Exposed/tree/main/.claude/skills/fix-bug into .agents/skills/fix-bug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-bug", 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/Exposed --skill fix-bug -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install JetBrains/Exposed fix-bug --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/Exposed.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/fix-bug .cursor/skills/fix-bug && 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 "fix-bug" agent skill from https://github.com/JetBrains/Exposed/tree/main/.claude/skills/fix-bug into .cursor/skills/fix-bug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-bug", 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/Exposed.git --path .claude/skills/fix-bug--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/Exposed --skill fix-bug -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install JetBrains/Exposed fix-bug --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/Exposed.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/fix-bug .gemini/skills/fix-bug && 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 "fix-bug" agent skill from https://github.com/JetBrains/Exposed/tree/main/.claude/skills/fix-bug into .gemini/skills/fix-bug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-bug", 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/Exposed fix-bugInstalls 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/Exposed --skill fix-bug -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/JetBrains/Exposed.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/fix-bug .github/skills/fix-bug && 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 "fix-bug" agent skill from https://github.com/JetBrains/Exposed/tree/main/.claude/skills/fix-bug into .github/skills/fix-bug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-bug", 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/Exposed --skill fix-bug -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/Exposed fix-bug --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/Exposed.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/fix-bug .opencode/skills/fix-bug && 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 "fix-bug" agent skill from https://github.com/JetBrains/Exposed/tree/main/.claude/skills/fix-bug into .opencode/skills/fix-bug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-bug", 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.
fix-bugTakes a GitHub or YouTrack issue for the Exposed project through reproduction, a failing test, a fix, validation and a pull request.
You provide a GitHub issue number such as #123, a YouTrack ID in the EXPOSED- format, or a YouTrack URL. The agent fetches GitHub issues with gh and YouTrack issues through the YouTrack MCP, and if that server is not configured it tells you how to add it with a bearer token. From the issue it extracts the title, steps to reproduce, expected versus actual behavior, the affected Gradle module and databases, the comments and the issue ID to use in branch and commit names.
For YouTrack issues only, the agent assigns the issue to the current user and sets its state to In Progress, and carries on even if those calls fail because issue tracking is not blocking. The overall flow in the description is to create a failing reproducer test, commit it on a new branch, implement the fix, validate it and open a PR.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit be0b6eb. 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.
Shell commands in SKILL.md call:
gitghclaudeFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
youtrack.jetbrains.comclaude.comAlso links to:
conventionalcommits.orgFrom 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.
Exposed Bug Fix Workflow loads about 3.8k tokens when it runs. Until then it costs about 117 tokens; SKILL.md has 1,710 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/Exposed at commit be0b6eb, republished under its Apache-2.0 licence (© JetBrains). 1,710 words, ~3,811 tokens.
.claude/skills/fix-bug/SKILL.md (or your agent's skills folder).Automates the full bug-fix lifecycle for the Exposed project: understand issue, reproduce, fix, validate, and open a PR.
The user provides one of:
#123 — GitHub issue in jetbrains/exposedEXPOSED-1234 — YouTrack issue IDhttps://youtrack.jetbrains.com/issue/EXPOSED-5678 or https://youtrack.jetbrains.com/issue/EXPOSED-9012/some-slug — YouTrack URLParse the input to determine the source:
gh issue view NUMBER --repo jetbrains/exposedEXPOSED-XXXX): Fetch via the YouTrack MCP (see below)EXPOSED-XXXX ID from the URL, then fetch via the YouTrack MCP (see below)Use the YouTrack MCP tools to fetch issue details. Call mcp__youtrack__get_issue with the issue ID (e.g., EXPOSED-1234).
If the YouTrack MCP server is not configured (tool calls fail), instruct the user to set it up:
claude mcp add --header "Authorization: Bearer <token>" --transport http youtrack https://youtrack.jetbrains.com/mcpThe permanent token can be created in JetBrains Hub account security settings (linked from YouTrack profile).
From the issue, extract:
EXPOSED-1234 or #123)For YouTrack issues only, update the issue status to reflect that work is starting:
mcp__youtrack__get_current_user to get the current user's login.mcp__youtrack__change_issue_assignee to assign the issue to the current user.mcp__youtrack__update_issue with customFields: {"State": "In Progress"} to mark work as started.If any of these calls fail because the YouTrack MCP is not configured, inform the user how to set it up (see "Fetching YouTrack Issues" section above) and continue with the rest of the workflow — issue tracking updates are not blocking.
Skip this step for GitHub-only issues.
Save the issue as a json file under issues directory.
Github issues should be saved in the /issues/github/ directory. The json file of the issue should be named as the issue number github-<id>.json
Youtrack issues should be saved in the /issues/youtrack/ directory. The json file of the issue should be named as the issue number youtrack-<id>.json
Before creating a branch, understand the affected area:
Use the Explore agent or direct file reads to understand:
Determine the base branch:
main branch for creating new branch that will be used for the PR with the fixgit checkout <base-branch> && git pull && git checkout -b claude/<issue-id>-<short-description>Branch naming rules:
claude/EXPOSED-1234-short-descriptionclaude/123-short-descriptionWrite a test that demonstrates the bug as described in the issue. The goal is:
`requestWithEmptyBodyDoesntCausesNPE`)/* EXPOSED-9352 request with empty body causes NPE */)Place the test appropriately:
exposed-tests (JDBC) and exposed-r2dbc-tests (R2DBC)exposed-java-time, exposed-jodatime, exposed-kotlin-datetime for date/time issuesexposed-json for JSON column type issuesexposed-crypt for encrypted column issuesexposed-money for monetary amount issuesexposed-migration-jdbc, exposed-migration-r2dbc for migration issuesexposed-spring-boot-starter, spring-transaction for Spring integration issuesexcludeSettings parameter in test helper functionsAfter writing the test, run it to confirm it fails:
./gradlew gradle :exposed-tests:test --tests "fully.qualified.TestClassName.methodName"
./gradlew gradle :exposed-r2dbc-tests:test --tests "fully.qualified.TestClassName.methodName"Tests for specific databases could be run in isolation. For example for the H2 it will be the following commands:
./gradlew gradle :exposed-tests:test_h2_v2 --tests "fully.qualified.TestClassName.methodName"
./gradlew gradle :exposed-r2dbc-tests:test_h2_v2 --tests "fully.qualified.TestClassName.methodName"You must verify that the tests are compiled without errors. The tests should fail according to the test assertions only.
If the test passes (bug is already fixed or test doesn't reproduce correctly):
Stage and commit the failing test. All the commit message should follow the Conventional Commits format:
git add <test-file>
git commit -m "fix: <ISSUE-ID> Add failing test for <short bug description>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"For GitHub issues, use #NUMBER in the commit message. For YouTrack, use EXPOSED-XXXX.
Analyze the bug based on what you learned from the issue and the reproducer test:
Present your analysis and plan to the user for review. Include:
Wait for user approval before implementing.
If user provides additional context, concerns, or feedback, take it into account, and repeat Step 6 with the new input
After receiving user approval, implement the planned fix. Keep changes minimal and focused:
Run the reproducer test to confirm it now passes. Use the same test commands from Step 4:
# For JDBC tests
./gradlew :exposed-tests:test_h2_v2 --tests "fully.qualified.TestClassName.methodName"
# For R2DBC tests
./gradlew :exposed-r2dbc-tests:test_h2_v2 --tests "fully.qualified.TestClassName.methodName"After confirming the reproducer passes, optionally run the broader test suite for the affected module:
# Run all H2 tests for the module
./gradlew :exposed-tests:test_h2_v2
./gradlew :exposed-r2dbc-tests:test_h2_v2
# Or test against specific database if the fix is database-specific
./gradlew :exposed-tests:test_postgres
./gradlew :exposed-r2dbc-tests:test_postgresRefer to Step 4 for the full list of available test commands and database-specific test tasks.
If any tests fail, investigate and fix. Do not skip or disable tests.
Exposed uses Detekt for code style validation. Run the linter to check for any issues:
./gradlew detektThis validates code style across all modules according to the rules defined in detekt/detekt-config.yml.
If Detekt reports any issues, fix them before proceeding. The build requires zero issues (max issues: 0).
If the fix changed any public or protected API (new methods, changed signatures, etc.), update the API documentation:
./gradlew apiDumpThis command updates the Dokka API documentation files to reflect the public API changes.
Stage any updated API files (.api files) along with the fix:
git add <api-files>If no public API changed, skip this step.
If the PR introduces a new feature or changes existing public API behavior, update the documentation website to reflect these changes.
Update documentation when:
Skip this step when:
The documentation website is located in the documentation-website directory:
documentation-website/Writerside/topics/ - XML files for each documentation pageIdentify the relevant topic:
Update the content:
Test locally (if possible):
Prefer modifying existing documentation files over creating new ones. Ask for user approval before creating new files in the documentation website.
Exposed uses Conventional Commits for commit messages. If the fix
has no breaking changes the prefix is fix:. If it introduces a breaking change, use fix!:.
Be aware that the commit message will be validated on CI by the following regex:
"^(build|chore|ci|deprecate|docs|feat|fix|perf|refactor|revert|style|test)(!)?(\([^\)]*\))?:\s?(EXPOSED-[0-9]+\s?)?.+$"
(it's defined in .github/workflows/commit-message-validation.yml file)
Stage and commit the fix:
git add <changed-files>
git commit -m "fix: <ISSUE-ID> <Imperative description of the fix>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"Push the branch and create a PR:
git push -u origin claude/<issue-id>-<short-description>Create the PR targeting the base branch chosen in Step 3. The title should follow the Conventional Commits format and the the commit message should have the following structure:
gh pr create --title "fix: <ISSUE-ID> <Short fix description>" --body "$(cat <<'EOF'
#### Description
**Summary of the change**: Provide a concise summary of this PR. Describe the changes made in a single sentence or short paragraph.
**Detailed description**:
- **Why**: Explain the reasons behind the changes. Why were they necessary?
- **What**: Detail what changes have been made in the PR.
- **How**: Describe how the changes were implemented, including any key aspects of the code modified or new features added.
---
#### Type of Change
Please mark the relevant options with an "X":
- [ ] Bug fix
- [ ] New feature
- [ ] Documentation update
Updates/remove existing public API methods:
- [ ] Is breaking change
Affected databases:
- [ ] MariaDB
- [ ] Mysql5
- [ ] Mysql8
- [ ] Oracle
- [ ] Postgres
- [ ] SqlServer
- [ ] H2
- [ ] SQLite
#### Checklist
- [ ] Unit tests are in place
- [ ] The build is green (including the Detekt check)
- [ ] All public methods affected by my PR has up to date API docs
- [ ] Documentation for my change is up to date
---
#### Related Issues
🤖 Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"The Closes line auto-closes the issue when the PR is merged for GitHub issues only:
Closes #NUMBEREXPOSED-XXXX as a plain cross-reference (GitHub will not close YouTrack tickets automatically)Report the PR URL to the user when done.
After the PR is created, for YouTrack issues only, update the issue state:
Call mcp__youtrack__update_issue with customFields: {"State": "Ready for Review"} to signal the fix is ready for code review.
If the YT MCP call fails, skip silently — the status update is not blocking.
Assess whether the fix changes behavior that users rely on or that is described in the Exposed documentation. A documentation update is needed when:
If none of the above apply (e.g., an internal-only fix, a crash fix with no API change), skip this step.
When documentation is needed, update the documentation in documentation-website directory.
© JetBrains, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/fix-bug of JetBrains/Exposed.
Open the folder on GitHubat commit be0b6eb
Exposed Bug Fix Workflow 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 |
|---|---|---|---|---|---|---|
| Exposed Bug Fix Workflow this skillJetBrains/Exposed | 9.3k | — | ~3.8k | Automated safety check: Pass | Apache-2.0 | |
| React Router Bug Fix Workflowremix-run/react-router | 57k | — | ~1.3k | Automated safety check: Pass | MIT | |
| Issue TracerZaxbyHub/opencode-swarm | 490 | — | ~4.4k | Automated safety check: Pass | MIT | |
| Coffee GB Compatibility Fixtrekawek/coffee-gb | 1.2k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Stewardyschimke/compose-ai-tools | 117 | — | ~2k | Automated safety check: Pass | Apache-2.0 | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 |
remix-run/react-router
Fixes a React Router bug reported in a GitHub issue end to end: fetching the issue, validating the reproduction, writing a failing test and implementing the fix on a new branch.
ZaxbyHub/opencode-swarm
Drives a bug report from validation and root-cause tracing through a critic-reviewed plan, an approved minimal fix and a PR-ready closure, never merging without recorded human approval.
trekawek/coffee-gb
Takes a Coffee GB compatibility issue from reproduction through a tested fix to an isolated pull request, with issue follow-up and screenshot evidence when possible.
yschimke/compose-ai-tools
Drive a pull request on this repository to green — which fast checks to run before pushing, how to read a red check, and what to do about a review comment.
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
jamiepine/voicebox
Sorts a backlog of open pull requests into must-merge, candidate, superseded and deferred, writes a triage doc and works the merge loop before a release.
Categories
Takes a GitHub or YouTrack issue for the Exposed project through reproduction, a failing test, a fix, validation and a pull request. You provide a GitHub issue number such as #123, a YouTrack ID in the EXPOSED- format, or a YouTrack URL. The agent fetches GitHub issues with gh and YouTrack issues through the YouTrack MCP, and if that server is not configured it tells you how to add it with a bearer token.
Exposed Bug Fix Workflow fits situations like: fixing a bug reported in a JetBrains Exposed GitHub or YouTrack issue; turning an issue's repro steps into a failing test before changing code; opening a PR for a bug fix with the issue ID in branch and commit names.
Run `npx skills add JetBrains/Exposed --skill fix-bug -a claude-code`. Or copy the skill folder (.claude/skills/fix-bug in JetBrains/Exposed) into .claude/skills/fix-bug in your project. Claude Code loads it when a task matches its description.
Run `npx skills add JetBrains/Exposed --skill fix-bug -a codex`. Or copy the skill folder (.claude/skills/fix-bug in JetBrains/Exposed) into .agents/skills/fix-bug 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/Exposed --skill fix-bug -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fix-bug, .gemini/skills/fix-bug, .github/skills/fix-bug and .opencode/skills/fix-bug in your project.
Going by SKILL.md and its folder, Exposed Bug Fix Workflow needs the command-line tools its instructions call (git, gh and claude). Our summary lists: The GitHub CLI (gh); A configured YouTrack MCP server for YouTrack issues; A checkout of JetBrains/Exposed.
SKILL.md names 3 domains. In commands or code: youtrack.jetbrains.com and claude.com; the agent is likely to contact these when it follows the instructions. As links in the text: conventionalcommits.org. 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.
Exposed Bug Fix Workflow is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.8k tokens (SKILL.md is roughly 15k 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 Exposed Bug Fix Workflow: React Router Bug Fix Workflow (remix-run/react-router, 57k stars), Issue Tracer (ZaxbyHub/opencode-swarm, 490 stars), Coffee GB Compatibility Fix (trekawek/coffee-gb, 1.2k stars) and Steward (yschimke/compose-ai-tools, 117 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/Exposed, which has 9,297 GitHub stars. The repository was last updated on October 7, 2026.
Source: JetBrains/Exposed on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.