kotlin/running_gradle_builds
> Executes and orchestrates Gradle builds with background management, surgical task output capturing, and structured failure diagnostics; ALWAYS use instead of `./gradlew` for core lifecycle tasks (build, assemble), dev servers, and troubleshooting. Do NOT use for running tests (use `running_gradle_tests`) or dependency graph auditing.
npx skills add https://github.com/Kotlin/kotlinx-rpc --skill running_gradle_builds
Executes Gradle builds with managed background orchestration and surgical failure diagnostics.
gradle tool instead of ./gradlew via shell.projectRoot.--rerun-tasks unless investigating project-wide cache-specific corruption; prioritize Gradle's native caching. Prefer --rerun for individual tasks to ensure they are executed even if up-to-date.captureTaskOutput when you need the isolated output of a specific task (e.g., help, dependencies).inspect_build()) to manage active processes and historical results.inspect_build for all diagnostics. It is more token-efficient than reading raw console logs and provides structured access to failures.stopBuildId to release resources when finished.inspect_buildThe inspect_build tool is your primary window into build results. Use it to move from high-level summaries to deep-dive diagnostics.
Call inspect_build() without arguments to see the Build Dashboard. This shows active background builds and recently completed builds with their BuildId, status, and failure counts.
inspect_build()Provide a buildId to get a summary of that specific build, including failures, problems, and test results. This summary also contains a guide on how to inspect specific details.
inspect_build(buildId="ID")mode="details")To get exhaustive information, ALWAYS use mode="details" combined with a specific target:
testName="FullTestName", mode="details" (REQUIRED for full output/stack trace).testName and taskPath support unique prefix matching. Providing a unique prefix (e.g., testName="com.example.MyTest" or taskPath=":app:compile") will automatically select the item if it'sunambiguous.
taskPath=":path:to:task", mode="details".failureId="ID", mode="details" (find IDs in the build summary).problemId="ID", mode="details" (find IDs in the build summary).consoleTail=true (last N lines) or consoleTail=false (first N lines).Use timeout, waitFor, or waitForTask to block until a condition is met in a background build.
inspect_build(buildId="ID", timeout=60, waitFor="Started Application")timeout is set without a wait condition (waitFor/waitForTask), the tool waits for the build to finish.While a build is running, the progress notification (and the inspect_build summary) provides real-time counts of passed, failed, and skipped tests. This gives immediate feedback on the health of the test suite.
inspect_build(buildId="ID", mode="summary") repeatedly to see updated test counts: (5 passed, 1 failed).immediately call inspect_build(timeout=...).
background: true ONLY for tasks that must remain active (e.g., bootRun, continuous builds) or when you explicitly intend to perform independent research while the build proceeds.inspect_build: Use inspect_build to check the status of background builds or to perform deep-dives into any historical build started by the server.projectRoot: Provide projectRoot as an absolute file system path to all Gradle MCP tools. Relative paths are not supported.inspect_build without arguments to view the build dashboard and ensure no orphaned background builds are consuming system resources.Gradle utilizes two primary ways to identify tasks from the command line. Precision here prevents running redundant tasks in multi-project builds.
Providing a task name without a leading colon (e.g., test, build) acts as a selector. Gradle will execute that task in every project (root and all subprojects) that contains a task with that name.
gradle(commandLine=["test"]) -> Executes test in all projects.Providing a task path with a leading colon (e.g., :test, :app:test) targets a single specific project.
gradle(commandLine=[":test"]) -> Executes test in the root project ONLY.gradle(commandLine=[":app:test"]) -> Executes test in the 'app' subproject ONLY.build, assemble, or clean with maximum reliability and clean, parseable output.bootRun) or continuous builds where background management and real-time log monitoring are required.inspect_build diagnostic suite. For test failures, ALWAYS use testName withmode="details".
help or properties) without the noise of the full build log.["clean", "build"]).gradle with the commandLine.inspect_build with the buildId for deeper diagnostics.background: true to receive a BuildId.inspect_build(buildId=ID, timeout=..., waitFor=...) to block until a specific state or log pattern is reached.inspect_build() (no arguments) to manage active jobs in the dashboard.gradle(stopBuildId=ID) once its utility is complete.{
"commandLine": ["build"]
}
// Reasoning: Using a task selector to verify build health across the entire multi-project structure.
{
"commandLine": [":app:test"]
}
// Reasoning: Using an absolute path to target a specific module, minimizing execution time and context usage.
{
"commandLine": [":app:help", "--task", "test"],
"captureTaskOutput": ":app:help"
}
// Reasoning: Using captureTaskOutput to retrieve clean, isolated documentation for the 'test' task without Gradle's general console noise.
// 1. Start the server in the background
{
"commandLine": [":app:bootRun"],
"background": true
}
// Response: { "buildId": "build_123" }
// 2. Wait for the 'Started Application' log pattern
{
"buildId": "build_123",
"timeout": 60,
"waitFor": "Started Application"
}
// Reasoning: Using background orchestration to allow the server to remain active while waiting for a specific readiness signal.
BuildId is not recognized, it may have expired from the recent history cache. Check the dashboard (inspect_build()) for valid active and historical IDs.captureTaskOutput matches exactly one of the tasks in the commandLine.invocationArguments: { envSource: "SHELL" } if Gradle cannot find expected env vars (e.g., JAVA_HOME).Take kotlin/running_gradle_builds from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.