gradle-run — Claude Code skill: quiet Gradle runs
Runs Gradle builds through a compact-output wrapper and keeps a workflow ledger, so the agent never floods its context with a full build log.
npx skills add chrisbanes/skills --skill gradle-run -a claude-codeWhat gradle-run does
The skill intercepts every Gradle command the agent issues. Instead of calling ./gradlew directly, it goes through scripts/gradle_run.py, which supplies --console=plain and --no-scan on its own. Full build output counts as a temporary, sensitive artifact: no streaming, no tee, no reopening the log later. The agent only sees a bounded JSON summary.
Four calls make up the lifecycle: create, run, status, finish. Each one has to be a standalone shell command. Add &&, a pipe, a variable assignment or a follow-up ls, and the lifecycle evidence is void even if Gradle succeeded. status returns at most 16 KiB of JSON and never opens logs. An uncertain status means an abandoned run or an incomplete ledger, so the next move is figuring out who owns the process rather than assuming the build finished.
You need python3 and scripts/gradle_run.py inside the skill directory. Without them the skill stops and says so; it will not fall back to running Gradle directly. When the same source or compiler fingerprint shows up again, stop rebuilding and read the cited line with its nearby declarations and imports.
What it helps with
- run a Gradle build without dumping the full log into agent context
- recover a workflow's status after a tool session disappears
- group warnings and failures by fingerprint
- verify a narrow task like
:module:testafter an edit - tell an abandoned run apart from a completed one
Example prompts for the agent
- Run
./gradlew :module:testthrough the gradle-run skill and tell me whether the test passes after my change - The build fails with the same fingerprint — inspect the source line instead of rebuilding
- Check the workflow status by its ID: did it finish or is it stuck?
How to install gradle-run
1Skills CLI (Vercel)
npx skills add chrisbanes/skills --skill gradle-run -a claude-code2Manually: put the files in place
~/.claude/skills/gradle-run/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/gradle-run/
1Skills CLI (Vercel)
npx skills add chrisbanes/skills --skill gradle-run -a codex2Manually: put the files in place
.agents/skills/gradle-run/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add chrisbanes/skills --skill gradle-run -a cursor2Manually: put the files in place
.cursor/skills/gradle-run/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install chrisbanes/skills gradle-run2Manually: put the files in place
.github/skills/gradle-run/SKILL.md1Skills CLI (Vercel)
npx skills add chrisbanes/skills --skill gradle-run -a gemini-cli2Platform CLI
gemini skills install https://github.com/chrisbanes/skills --path skills/gradle-runManually: put the files in place
.devin/skills/gradle-run/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add chrisbanes/skills --skill gradle-run -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about gradle-run
How do I install gradle-run in Claude?
Run npx skills add chrisbanes/skills --skill gradle-run -a claude-code. The skill lands at ~/.claude/skills/gradle-run/SKILL.md.
What does gradle-run do?
It runs Gradle commands through a compact-output wrapper and keeps a workflow ledger. The agent gets a bounded summary instead of the full build log.
What does the skill need to work?
python3 and the scripts/gradle_run.py file in the skill directory. Without them the skill stops and does not run Gradle directly.
Source text
SKILL.md · Apache-2.0
---
name: gradle-run
description: Use when planning to execute Gradle through `gradle`, `./gradlew`, or a custom `gradlew*` wrapper script, or diagnosing a Gradle build, recovering a workflow's status, compact workflow ledger, repeated failure fingerprint, check, test, lint, warning, or failure even when no new Gradle run is appropriate.
---
# Gradle run
## Core principle
Treat complete Gradle output as a temporary, sensitive artifact. Every
agent-initiated Gradle command runs through the compact-output wrapper; never
stream, `tee`, paste, or reopen a full build log.
Every `create`, `run`, `status`, and `finish` invocation is the entire shell command for
that tool call. Prefixes, assignments, conditionals, pipes, command chains, and
follow-up inspection invalidate lifecycle evidence even when Gradle succeeds.
## Procedure
1. Classify the request. Reuse a current successful result when unchanged
source and inputs already answer the question. A focused task that validates
another change is incidental; build/check/warning/failure work is a
Gradle-centered workflow.
2. Resolve this skill directory. If `python3` or `scripts/gradle_run.py` is
unavailable (a failing standalone `create` shows this), stop and report that
prerequisite; never run Gradle directly as a fallback. Invoke the project's
designated entrypoint (normally `./gradlew`) as provided; do not read its
source to second-guess it or substitute another launcher script.
3. Create one workflow before its first command and retain its opaque ID:
```sh
python3 <skill-dir>/scripts/gradle_run.py create
```
Run `create`, each `run`, and `finish` as standalone shell commands. Do not
combine one with `ls`, `test`, variable setup, `git`, `rg`, `&&`, `;`, a
pipe, or a newline containing another command. If `create` fails, retry a fresh
standalone `create` before any `run`. Use the wrapper exclusively; it
supplies `--console=plain` and `--no-scan` unless console behavior was
selected or the user authorized `--scan`. Add `--warning-mode all` only for
warning discovery or an explicit request. If `run` or `finish` reports
`workflow is busy`, inspect status and wait for the owner; keep one execution
owner and avoid a duplicate build.
If a tool session disappears or the run's outcome is unknown, use the same
workflow ID (and the same global `--root` if one was supplied):
```sh
python3 <skill-dir>/scripts/gradle_run.py status --workflow <id>
```
Status is read-only and returns immediately with at most 16 KiB of JSON.
`run` identifies the active or latest run by sequence, wrapper/child PIDs,
start time, working directory, command and question. `result` is the latest
stored bounded terminal summary, identified by `result_sequence`; while a
new run is active it may describe the previous run. Status never opens logs.
Poll status on `running`; a held lock specific to that run supplies activity
evidence, while PIDs are identity only. Unrelated workflow lock contention
leaves an abandoned run `uncertain`. `completed` includes failed builds and launch
errors: check `result.exit_status`. `interrupted` requires a recorded signal.
`uncertain` covers abandoned active records, missing locks, incomplete/legacy
ledgers and transitions without sufficient evidence. Report that uncertainty;
the next action is an ownership investigation, not completion inferred from
a PID, a rerun (even conditional or later), cleanup, `finish`, or process
termination. A new workflow is `idle`; after
`finish` it is `finished` and its result has been removed. Unknown IDs fail
closed. Finish only after retrieving the needed result.
4. For incidental validation, stay in the current agent and run the narrowest
task that answers a non-empty verification question:
```sh
python3 <skill-dir>/scripts/gradle_run.py run \
--workflow <id> --scope targeted \
--question "Does :module:test pass after this change?" -- \
./gradlew :module:test
```
Do not substitute compilation for requested fixture tests, or skip a
requested run because it may find no tests; run it and report that caveat.
Read only the bounded JSON summary; report both the managed wrapper and
nested Gradle task, the question, and its bounded answer.
5. For Gradle-centered work, keep diagnosis, repository edits, and wrapper
execution with the current implementation owner by default. Delegate a
bounded read-only investigation only when it offers useful independent
analysis. Select and brief an optional helper using the shared
[selection and handoff reference](references/subagent-selection.md).
Keep one wrapper execution owner at a time; a helper reports evidence and
recommendations to that owner. Continue directly when no helper is available.
6. Reuse actionable summaries, group warnings/failures by
fingerprint, and return source/line evidence plus the narrowest next command.
Run broad only for an aggregate question that targeted evidence cannot
answer. On a repeated primary source/compiler fingerprint, stop rebuilding;
inspect the cited source line and nearby declaration, import, or receiver
context before revising the diagnosis. Verify each source change with the
same wrapper and narrowest applicable task. In the final diagnosis, name the
focused inspection as the next action; do not claim a source fix before it.
A new question does not permit a blind repeat: rerunning an unchanged task
under a relabeled question is still a repeat.
7. Treat the full log as raw sensitive material even though summaries and
ledgers redact common credentials. Never expose it in model-visible context.
On interruption, use the wrapper's recorded signal and bounded partial
diagnostics; it owns process-group/process-tree cleanup and durable ledger
updates. Only logs still represented by the bounded recent-run ledger remain.
If a bounded result reports cache access denied before Gradle starts, report
the exact path and recommend only an explicit writable-root entry for that
existing cache directory, for the user to authorize. Stop there: do not
apply it, plan a follow-up rerun, `finish`, or new workflow, disable the
sandbox, or relocate caches.
8. Finish after the last requested validation (targeted or broad) passes, or
report unresolved fingerprints and why validation cannot continue. In the
final response, quote each non-empty `--question` and give its bounded
answer; command history is not a substitute for reported evidence. Then run:
```sh
python3 <skill-dir>/scripts/gradle_run.py finish --workflow <id>
```
Report that finish removed only wrapper-owned logs. A finished known ID is
idempotent; an unknown ID or active workflow fails closed and leaves files in
place. This skill does not constrain unrelated review, implementation, or
subagents.
© chrisbanes · Apache-2.0 · chrisbanes/skills