Groovy 5 Developer Guide
apache/grails-core
Guidance for Groovy 5 work in Grails projects: syntax, closures, traits, DSLs, metaprogramming, Spock tests, static compilation and Java 21 integration.
Debugger-first runtime root-cause analysis for JVM code in IntelliJ IDEA.
$ npx skills add xpinjection/test-driven-spring-boot --skill ij-debugger -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install xpinjection/test-driven-spring-boot ij-debugger --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/xpinjection/test-driven-spring-boot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/ij-debugger .claude/skills/ij-debugger && 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 "ij-debugger" agent skill from https://github.com/xpinjection/test-driven-spring-boot/tree/master/.claude/skills/ij-debugger into .claude/skills/ij-debugger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ij-debugger", 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/xpinjection/test-driven-spring-boot/tree/master/.claude/skills/ij-debuggerType 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 xpinjection/test-driven-spring-boot --skill ij-debugger -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install xpinjection/test-driven-spring-boot ij-debugger --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xpinjection/test-driven-spring-boot.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/ij-debugger .agents/skills/ij-debugger && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ij-debugger" agent skill from https://github.com/xpinjection/test-driven-spring-boot/tree/master/.claude/skills/ij-debugger into .agents/skills/ij-debugger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ij-debugger", 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 xpinjection/test-driven-spring-boot --skill ij-debugger -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install xpinjection/test-driven-spring-boot ij-debugger --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xpinjection/test-driven-spring-boot.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/ij-debugger .cursor/skills/ij-debugger && 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 "ij-debugger" agent skill from https://github.com/xpinjection/test-driven-spring-boot/tree/master/.claude/skills/ij-debugger into .cursor/skills/ij-debugger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ij-debugger", 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/xpinjection/test-driven-spring-boot.git --path .claude/skills/ij-debugger--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 xpinjection/test-driven-spring-boot --skill ij-debugger -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install xpinjection/test-driven-spring-boot ij-debugger --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xpinjection/test-driven-spring-boot.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/ij-debugger .gemini/skills/ij-debugger && 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 "ij-debugger" agent skill from https://github.com/xpinjection/test-driven-spring-boot/tree/master/.claude/skills/ij-debugger into .gemini/skills/ij-debugger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ij-debugger", 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 xpinjection/test-driven-spring-boot ij-debuggerInstalls 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 xpinjection/test-driven-spring-boot --skill ij-debugger -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/xpinjection/test-driven-spring-boot.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/ij-debugger .github/skills/ij-debugger && 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 "ij-debugger" agent skill from https://github.com/xpinjection/test-driven-spring-boot/tree/master/.claude/skills/ij-debugger into .github/skills/ij-debugger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ij-debugger", 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 xpinjection/test-driven-spring-boot --skill ij-debugger -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install xpinjection/test-driven-spring-boot ij-debugger --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xpinjection/test-driven-spring-boot.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/ij-debugger .opencode/skills/ij-debugger && 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 "ij-debugger" agent skill from https://github.com/xpinjection/test-driven-spring-boot/tree/master/.claude/skills/ij-debugger into .opencode/skills/ij-debugger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ij-debugger", 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.
ij-debuggerDebugger-first runtime root-cause analysis for JVM code in IntelliJ IDEA.
Ij Debugger is an agent skill from xpinjection/test-driven-spring-boot. Debugger-first runtime root-cause analysis for JVM code in IntelliJ IDEA. Use when runtime state or control-flow evidence is needed (values, branches, call order, reachability), when the question spans long call chains across many files, or when the user explicitly requests the debugger. Evidence comes from logpoints/breakpoints, stepping, stacks, runtime values, expression evaluation, and control-flow observations.
Its SKILL.md is about 6.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file.
It sits in Development, covering Root cause analysis, Responsive design and Backend development. It works with JetBrains IDEs, Spring Boot and Java. The repository describes itself as: Sample project for "Test-driven Spring Boot applications" training. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 9c68aa7. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
execute_toolFrom allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From 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.
Ij Debugger loads about 6.4k tokens when it runs. Until then it costs about 108 tokens; SKILL.md has 3,113 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 xpinjection/test-driven-spring-boot at commit 9c68aa7, republished under its MIT licence (© xpinjection). 3,113 words, ~6,396 tokens.
.claude/skills/ij-debugger/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.All debugger and run-configuration tools are invoked through the universal router:
execute_tool(command="<tool> --arg value ..."). Do not call the underlying handles directly.
Router argument rules:
--param must be followed by a value; bare flags are not supported.true/false (e.g. --isLogStack true).command on whitespace, so an unquoted multi-token value is misread as extra arguments and the call fails with an error like Invalid argument format: '+'. Expected '--paramName value' format. Wrap the whole value in single quotes so it stays one token:--logExpression 'a.getCount() + 1' (not --logExpression a.getCount() + 1)--condition 'id == 42 && name != null'--expression 'user.getName().trim()'char/String literal), wrap the outer value in double quotes instead: --logExpression "name == 'tax_rate'". Do not escape quotes with backslashes and do not JSON-encode the value."", "/", ".", "__omit__", or other sentinels.Use debugger evidence to answer concrete runtime questions when static code reading is not enough, or to confirm ideas from static analysis — including whether execution reaches or does not reach agent-selected code locations. Gather this evidence with minimal runtime disturbance: by default observe without stopping threads and without editing source code.
Use this skill when at least one holds:
Manual activation by the user means launch and use the debugger when tools are available — do not reduce it to a conceptual discussion. Do not treat domain identifiers named debug/debugger in the user's own code as a debugger request; reason about what the user actually means.
Use this skill only when the debugger router tools are available. Minimum required set (each invoked via execute_tool):
xdebug_set_breakpoint (important: sets logpoints, via --logExpression)xdebug_start_debugger_sessionxdebug_control_sessionxdebug_get_stackxdebug_get_frame_values, xdebug_get_value_by_path, or xdebug_evaluate_expressionget_run_configurationsIf the minimum set is unavailable: state the blocker explicitly, do not force a debugger workflow, and switch to the best fallback. Run execute_tool(command="<tool> --help") to inspect a tool's exact current contract.
Logpoints are the primary way to communicate with the IntelliJ debugger. A logpoint is a non-suspending breakpoint that does not stop execution: when the line is reached it evaluates an expression and logs the result. Reach for a logpoint first for almost every runtime question; treat suspending breakpoints, stepping, and expression evaluation as escalations you must justify, not as the default. Logpoints give runtime evidence without freezing threads — which matters for concurrent code, long-running services, flaky/timing-sensitive tests, and multi-agent workflows.
Logpoint output is dumped to debugger events, and you read it back from there. Each logpoint hit is captured as an event in the debug session's event buffer — not printed to your console and not written to any file. You collect that output by draining events: execute_tool(command="xdebug_control_session --action DRAIN_EVENTS") returns the accumulated logpoint output in tracepointOutputsTail. So the logpoint loop is: install logpoint(s) → run the scenario → drain events → map each event back to source. Reading events is the normal, expected way to get logpoint results; if you find yourself wanting to write a file or add a print statement to capture output, drain events instead.
Prefer the least disruptive tool that answers the question, in this priority order:
execute_tool(command="xdebug_set_breakpoint --filePath <p> --line <n> --logExpression '<expr>' --suspendPolicy NONE"). A logpoint is just xdebug_set_breakpoint with a --logExpression; add --suspendPolicy NONE so it does not stop execution. Providing the --logExpression is the most important thing you do.
Use for runtime values, branch evidence, counts, identifiers, and path/reachability confirmation. This is the default first probe.--condition '<expr>' to filter, and --isLogStack true for a call path.
Use when events are too frequent, only specific cases matter, or a call path is needed.execute_tool(command="xdebug_get_threads") + execute_tool(command="xdebug_get_stack ...").
These read a paused session: if the program is running, suspend it first with execute_tool(command="xdebug_control_session --action PAUSE"), then read threads/stack. Use for hangs, concurrency issues, deadlocks, thread-state questions, or unclear call paths.execute_tool(command="xdebug_set_breakpoint --filePath <p> --line <n>") (the same tool without --logExpression, keeping the default --suspendPolicy ALL).
Use only when you must inspect live object graphs, evaluate multiple expressions interactively, step through code, or modify state.execute_tool(command="xdebug_evaluate_expression ..."), execute_tool(command="xdebug_set_variable ...").
Use only in a suspended context and only with explicit justification; these can alter what you are investigating.Escalate down this list only when the cheaper option cannot answer the question, and say why you escalated.
--logExpression and --condition are evaluated inside the running program and can change its behavior. By default restrict them to side-effect-free reads: field/local/parameter access, non-mutating getters, arithmetic, toString() on trusted values, identity/hashCode checks.
Do not use expressions that mutate state, perform I/O, advance iterators/streams, trigger side-effecting lazy initialization, or call methods with observable side effects — unless the user explicitly asked to enter a controlled mutation/debugging mode and accepted that program behavior may change.
A logpoint evaluates its --logExpression at the moment execution reaches the line, before that line's statement runs. Every symbol the expression references must already be assigned and in scope at that point, or evaluation fails (you will see an error such as Variable 'x' has not been initialized / Cannot find local variable 'x' in breakpointErrorsTail, and no value is logged).
Rules for picking the line:
List<String> configured = jdbc.sql("…") // line 20 ← declaration starts here
.query(String.class) // line 21
.list(); // line 22 ← assignment completes here
this.rate = new BigDecimal(configured.get(0)); // line 23configured.get(0) fails — configured is assigned only after line 22. Place it on the first line after the statement's terminating ; (here line 23), where configured is initialized.breakpointErrorsTail. If you see an uninitialized/unresolved-variable error, move the logpoint to a later line (or pick an expression whose inputs are already available) and rerun.Start with minimal static triage (error text, stack trace, nearby source). Start debugger work when: static analysis leaves multiple plausible runtime hypotheses; deciding between them requires concrete values or exact control flow; stepping is cheaper than reading a large cross-file path; or the user explicitly asked. Install the first logpoint(s) early and collect evidence before changing runtime behavior.
Before editing code for a runtime-behavior issue when debugger evidence is available, capture:
xdebug_get_frame_values / xdebug_get_value_by_path / xdebug_evaluate_expression;xdebug_get_stack.Do not assert runtime conclusions before this evidence is captured unless a clear blocker is already stated.
Logpoints are cheap and non-suspending, so prefer installing a batch derived from your hypotheses, then run the scenario once:
execute_tool(command="xdebug_start_debugger_session ...").execute_tool(command="xdebug_control_session --action DRAIN_EVENTS") and map each line back to its source location and hypothesis.AUTO: you can run/rerun the scenario directly. Use xdebug_start_debugger_session to launch with debugging, or execute_run_configuration for a non-debug run when you only need output/exit code.ASSISTED: reproduction needs a user-only action (UI flow, auth, external dependency, hardware).HYBRID: try AUTO once or twice, then switch to ASSISTED if it does not reproduce.If the candidate target is a test, default to AUTO. Never ask the user to reproduce before logpoints/breakpoints are prepared.
execute_tool(command="xdebug_start_debugger_session --filePath <p> --line <n>") pointing at the test method, or --configurationName <name> for an existing test run configuration. To run without debugging (e.g. confirm it fails first): execute_tool(command="execute_run_configuration ...") with the same targeting modes.execute_tool(command="xdebug_get_debugger_status") and continue inside the resulting session."", "/", "__omit__", ".", or fake paths.execute_tool(command="xdebug_get_debugger_status").sessionId from status/start and reuse it in all session-scoped calls (--sessionId <id>).sessionId; refresh via xdebug_get_debugger_status first. After the paused location changes, re-read frameIndex/path from a fresh xdebug_get_stack.configurationName only from execute_tool(command="get_run_configurations"); do not pass a test method name or other derived identifier.supportsDynamicLaunchOverrides from get_run_configurations as the source of truth for --programArguments, --workingDirectory, and --envs.execute_tool(command="xdebug_list_breakpoints") and treat returned owner as source of truth (user/agent). Logpoints appear here too.enabled, logExpression, condition, isLogMessage, isLogStack, suspendPolicy, and temporary (all returned by xdebug_list_breakpoints). You need this because a breakpointId-mode update rewrites the whole breakpoint (see Targeting Modes).xdebug_remove_breakpoint defaults to --owner agent; global cleanup needs two calls: --owner agent then --owner user.xdebug_set_breakpoint (whether or not you pass --logExpression) has two mutually exclusive modes — never mix in one call:
--filePath + --line (1-based); omit --breakpointId.breakpointId mode: pass --breakpointId <id> (an opaque canonical id from a prior xdebug_set_*/xdebug_list_breakpoints).breakpointId mode rewrites the whole breakpoint, it does not patch it. Treat an update as "write the full breakpoint", never "tweak one flag".
After each call, inspect the returned lineText and confirm the excerpt matches the intended line. A successful response does not prove --condition/--logExpression are valid; verify via breakpointErrorsTail / tracepointOutputsTail after the next run.
execute_tool(command="xdebug_get_debugger_status") → reuse a relevant session or plan a new one; pick AUTO/ASSISTED/HYBRID; install logpoints first and verify each lineText.execute_tool(command="xdebug_start_debugger_session ...") and let the scenario run (logpoints do not suspend).execute_tool(command="xdebug_control_session --action DRAIN_EVENTS"); map each output line to source + hypothesis.--action WAIT_FOR_PAUSE and inspect stack + values.--action RESUME of a suspended session, always execute_tool(command="xdebug_control_session --action WAIT_FOR_PAUSE").--action PAUSE, re-check enabled breakpoints and the expected path; after 2 consecutive timeouts on the same wait, stop retrying and expand logpoint coverage.For a reproducible runtime issue:
execute_tool(command="xdebug_get_debugger_status")execute_tool(command="xdebug_set_breakpoint --filePath <p> --line <n> --logExpression '<expr>' --suspendPolicy NONE")execute_tool(command="xdebug_start_debugger_session ...")execute_tool(command="xdebug_control_session --action DRAIN_EVENTS") to read logpoint outputxdebug_get_stack / xdebug_get_frame_values only if logpoints are insufficientInvoke each via execute_tool(command="<tool> ..."). The router schema (execute_tool(command="<tool> --help")) is the source of truth for exact parameters and constraints.
xdebug_set_breakpoint [--filePath <p> --line <n>] [--breakpointId <id>] [--logExpression '<expr>'] [--condition '<expr>'] [--isLogMessage true|false] [--isLogStack true|false] [--temporary true|false] [--suspendPolicy ALL|THREAD|NONE] [--enabled true|false]:
the single tool for breakpoints and logpoints. To set a logpoint (the preferred default probe), pass --logExpression '<expr>' --suspendPolicy NONE — it evaluates the expression and logs the result on every hit without suspending; read output via xdebug_control_session --action DRAIN_EVENTS. Keep --logExpression side-effect-free. Without --logExpression it is an ordinary suspending breakpoint; --isLogMessage/--isLogStack (+ --suspendPolicy NONE) make a position/stack tracepoint. Providing --logExpression is the most important input. In --breakpointId mode this call rewrites the whole breakpoint, so re-pass its complete state (omitted fields are reset — see Targeting Modes).xdebug_start_debugger_session [--configurationName <name>] | [--filePath <p> --line <n>] [--timeout <ms>] [--graceWaitMs <ms>] [--programArguments <s>] [--workingDirectory <p>] [--envs <map>]:
start debugging a run configuration or a code location. Use exactly one target mode.xdebug_get_debugger_status: list sessions/states; bind the current sessionId and refresh it after stopped/disappearance.xdebug_control_session --action <STEP_INTO|STEP_OVER|STEP_OUT|RESUME|PAUSE|STOP|WAIT_FOR_PAUSE|DRAIN_EVENTS> [--sessionId <id>] [--timeout <ms>] [--eventsLimit <n>]:
control the session; DRAIN_EVENTS returns logpoint/tracepoint output in tracepointOutputsTail. A paused result includes frameValues.xdebug_get_threads [--sessionId <id>] [--limit <n>] [--offset <n>]: list threads (suspended session).xdebug_get_stack [--sessionId <id>] [--threadId <id>] [--limit <n>] [--offset <n>]: call stack; frameIndex consumers use the current paused result only.xdebug_get_frame_values [--sessionId <id>] [--frameIndex <n>] --depth <n>: locals/values in a frame.xdebug_get_value_by_path [--sessionId <id>] [--frameIndex <n>] --path <list> --depth <n>: drill into nested values.xdebug_evaluate_expression [--sessionId <id>] [--frameIndex <n>] --expression '<expr>' --depth <n>: evaluate in the current frame (suspended session).xdebug_remove_breakpoint [--breakpointId <id>] [--filePath <p> --line <n>] [--owner agent|user]: remove breakpoints/logpoints filtered by owner.xdebug_list_breakpoints [--filePath <p>]: list breakpoints and logpoints with ownership.xdebug_run_to_line [--sessionId <id>] --filePath <p> --line <n> [--timeout <ms>]: continue to a line (suspended session).xdebug_set_variable [--sessionId <id>] [--frameIndex <n>] --path <list> --newValue '<expr>': mutate a value (explicit justification only).get_run_configurations [--filePath <p>]: list run configurations (with supportsDynamicLaunchOverrides), or discover runnable entry points/line numbers in a file.execute_run_configuration [--configurationName <name>] | [--filePath <p> --line <n>] [--timeout <ms>] [--waitForExit true|false] [--programArguments <s>] [--workingDirectory <p>] [--envs <map>]: run without debugging.Logpoint and tracepoint output is buffered as debugger events on the session; you consume it by draining, not by reading a console or file.
execute_tool(command="xdebug_control_session --action DRAIN_EVENTS") returns the buffered output in tracepointOutputsTail (xdebug_set_breakpoint --logExpression, and --isLogMessage/--isLogStack).message, plus breakpointId, filePath, line, and a timestamp — use these to attribute every line to the logpoint and hypothesis that produced it. Distinguish logpoints by their location/expression so concurrent or interleaved hits stay separable.--eventsLimit <n> to cap how many are returned per call.xdebug_control_session response carries breakpointErrorsTail with breakpoint/logpoint validation or runtime errors (e.g. a bad --logExpression). After installing any logpoint/condition/tracepoint, do not trust it until you have drained and read both tails.--logExpression and --condition run in the program; keep them side-effect-free (see Safe Logpoint Expressions).--expression (xdebug_evaluate_expression) runs in the current paused frame; pass raw expression text in that frame's language.--newValue (xdebug_set_variable) must be a raw expression assignable to the target value.+, ==, &&, method args), so they MUST be quoted as a single token (see Router argument rules). An unquoted expression fails with Invalid argument format: '<token>'. Do not pass JSON-escaped or backslash-escaped quoted text into expression params. The router parses the outer command with a shell-like splitter: when the expression contains single quotes wrap the outer string in double quotes, and vice versa.--condition, --logExpression, and --expression to avoid unresolved-reference errors from missing imports.xdebug_evaluate_expression before relying on it.print/log statements to source (or trying to capture logpoint output to a file) instead of installing a logpoint and draining its events;DRAIN_EVENTS), or assuming a re-drain will return output already consumed by an earlier drain;execute_tool;sessionId/frameIndex/path after the paused location changes;breakpointId mode in one call;logExpression/condition or resetting its log/suspend flags;RESUME without a justified expected next stop;read_file.After debugging:
execute_tool(command="xdebug_remove_breakpoint --owner agent"), restore disabled user breakpoints to baseline, and execute_tool(command="xdebug_control_session --action STOP") if the session is no longer needed.© xpinjection, 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 1 other file in .claude/skills/ij-debugger of xpinjection/test-driven-spring-boot.
Open the folder on GitHubat commit 9c68aa7
Ij Debugger 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 |
|---|---|---|---|---|---|---|
| Ij Debugger this skillxpinjection/test-driven-spring-boot | 112 | — | ~6.4k | Automated safety check: Pass | MIT | |
| Groovy 5 Developer Guideapache/grails-core | 2.9k | — | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Omk CodingKaimingWan/oh-my-kiro | 107 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Java Coding Standardsaffaan-m/ECC | 274k | 1 repos | ~2.9k | Automated safety check: Pass | MIT | |
| Java Coding Standardsvibeeval/vibecosystem | 531 | 3 repos | ~877 | Automated safety check: Pass | MIT | |
| Javaericrisco/rsc-harness | 156 | — | ~4.6k | Automated safety check: Pass | MIT |
apache/grails-core
Guidance for Groovy 5 work in Grails projects: syntax, closures, traits, DSLs, metaprogramming, Spock tests, static compilation and Java 21 integration.
KaimingWan/oh-my-kiro
Enforces coding best practices: deep-read before modify, LSP-first navigation, TDD red-green-refactor, minimal changes, self-review, verification.
affaan-m/ECC
Java coding standards for Spring Boot and Quarkus services: naming, immutability, Optional usage, streams, exceptions, generics, CDI, reactive patterns, and project layout.
vibeeval/vibecosystem
Java coding standards for Spring Boot services: naming, immutability, Optional usage, streams, exceptions, generics, and project layout.
ericrisco/rsc-harness
A skill your agent uses when writing, reviewing or refactoring modern Java (21+, 25 LTS) — records and sealed interfaces as algebraic data types, exhaustive pattern-matching switch over instanceof…
xu-xiang/everything-claude-code-zh
Spring Boot 服务的 Java 编码规范:命名、不可变性、Optional 使用、流(streams)、异常、泛型以及项目布局。
xpinjection/test-driven-spring-boot
You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior.
Works with
Categories
Debugger-first runtime root-cause analysis for JVM code in IntelliJ IDEA. Ij Debugger is an agent skill from xpinjection/test-driven-spring-boot. Debugger-first runtime root-cause analysis for JVM code in IntelliJ IDEA.
Ij Debugger fits situations like: control-flow evidence is needed (values; the question spans long call chains across many files; the user explicitly requests the debugger.
Run `npx skills add xpinjection/test-driven-spring-boot --skill ij-debugger -a claude-code`. Or copy the skill folder (.claude/skills/ij-debugger in xpinjection/test-driven-spring-boot) into .claude/skills/ij-debugger in your project. Claude Code loads it when a task matches its description.
Run `npx skills add xpinjection/test-driven-spring-boot --skill ij-debugger -a codex`. Or copy the skill folder (.claude/skills/ij-debugger in xpinjection/test-driven-spring-boot) into .agents/skills/ij-debugger 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 xpinjection/test-driven-spring-boot --skill ij-debugger -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ij-debugger, .gemini/skills/ij-debugger, .github/skills/ij-debugger and .opencode/skills/ij-debugger in your project.
SKILL.md names no scripts, command-line tools or credentials: Ij Debugger is instructions for the agent only. Its frontmatter pre-approves these tools: execute_tool.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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.
Ij Debugger is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.4k tokens (SKILL.md is roughly 26k 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 Ij Debugger: Groovy 5 Developer Guide (apache/grails-core, 2.9k stars), Omk Coding (KaimingWan/oh-my-kiro, 107 stars), Java Coding Standards (affaan-m/ECC, 274k stars) and Java Coding Standards (vibeeval/vibecosystem, 531 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
xpinjection (a GitHub user) maintains it in xpinjection/test-driven-spring-boot, which has 112 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on August 12, 2026.
Source: xpinjection/test-driven-spring-boot on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.