Go CLI · wraps Gradle · MIT license

Gradle output, distilled.

build-brief sits in front of Gradle, keeps the full raw log on disk, and cuts terminal output down to the parts that actually matter — failed tasks, test names, warnings, and build status.

  • Made for humans, scripts, and agent loops.
  • Works with Spring Boot, Ktor, Android, KMP, and plain JVM builds.
  • Available via Homebrew on macOS and Linux.
summary mode

$ build-brief test

 

failed tasks :app:test

failed tests 2

- ExampleServiceTest > returns 500 on timeout

- CacheLayerTest > evicts stale entry

warnings     6

status      FAILED

 

raw log: /tmp/build-brief/myproject.latest.log

Go Pure stdlib, no deps
6 Platform binaries
brew macOS + Linux
5 AI tool targets
How it works

Three steps. Nothing hidden.

01

Wraps Gradle

Prefers ./gradlew when present, falls back to system gradle. Injects --console=plain unless you already set a console mode. Preserves the Gradle exit code.

02

Logs everything to disk

Streams the full raw output to a reusable per-project log file. Nothing is thrown away. Memory use stays steady regardless of output size.

03

Returns the signal

Default output shows failed tasks, failed test names, warnings, and build status. Clean successes are especially short. Full log path is always printed.

Before & after

Same build. Less to read.

raw gradle output

> Configure project :app

> Task :app:compileKotlin

w: Service.kt:14:9 Parameter 'ttl' is never used

w: Cache.kt:28:5 Variable 'result' is never used

> Task :app:processResources UP-TO-DATE

> Task :app:classes

> Task :app:compileTestKotlin

> Task :app:processTestResources NO-SOURCE

> Task :app:testClasses

> Task :app:test

 

ExampleServiceTest > returns 200 on valid input PASSED

ExampleServiceTest > returns 500 on timeout FAILED

java.lang.AssertionError: expected 500 but was 503

    at ExampleServiceTest.kt:42

 

CacheLayerTest > caches valid response PASSED

CacheLayerTest > evicts stale entry FAILED

java.lang.AssertionError: expected null

    at CacheLayerTest.kt:67

 

4 tests completed, 2 failed

 

> Task :app:test FAILED

 

FAILURE: Build failed with an exception.

 

BUILD FAILED in 34s

7 actionable tasks: 5 executed, 2 up-to-date

build-brief

$ build-brief test

 

failed tasks :app:test

failed tests 2

- ExampleServiceTest > returns 500 on timeout

- CacheLayerTest > evicts stale entry

warnings     2

status      FAILED

 

raw log: /tmp/build-brief/myproject.latest.log

Why it helps

Less noise. Same information.

Readable by default

Successful builds stay short. Failing builds surface the failed tasks, test names, and warnings without making you scroll through pages of task output and daemon noise.

Built for agent loops

When coding agents run Gradle repeatedly, they dump all output into their context window. build-brief reduces that to a concise summary while preserving signal.

Raw log always available

The full log is streamed to disk and the path is printed after every run. When the summary is not enough, the complete output is right there.

Gradle-stack agnostic

Operates at the Gradle process level. Designed for Spring Boot, Ktor, Android, Kotlin Multiplatform, plain JVM, and multi-project builds.

Install

Homebrew, binary, or source.

brew tap static-var/tap
brew install static-var/tap/build-brief

Works with Homebrew on macOS and Linuxbrew on Linux.

Download the latest release archive for your platform:

https://github.com/static-var/build-brief/releases/latest

Archives follow this naming pattern:

  build-brief_<version>_darwin_arm64.tar.gz
  build-brief_<version>_darwin_amd64.tar.gz
  build-brief_<version>_linux_arm64.tar.gz
  build-brief_<version>_linux_amd64.tar.gz
  build-brief_<version>_windows_arm64.zip
  build-brief_<version>_windows_amd64.zip
git clone https://github.com/static-var/build-brief.git
cd build-brief
go build -o build-brief ./cmd/build-brief

Then move the binary onto your PATH.

Quick start

Commands you will actually use.

Run tests
build-brief test
Run a build
build-brief build
Pin daemon reuse
build-brief --daemon-mode on \
  --gradle-user-home /tmp/bb-gradle test
Pass flags to Gradle
build-brief -- --stacktrace test
Check token savings
build-brief gains --history
Full help
build-brief --help
Agent integration

Teach your tools to use it.

build-brief can install instructions into AI coding tools so they route Gradle commands through it. Agents that follow these instructions will use build-brief instead of calling Gradle directly.

Local install

Updates AGENTS.md in the current project.

build-brief --install
build-brief --install-force

--install-force creates the file if it does not exist.

Global install

Detects which AI tools you have installed and updates their global instruction files. Interactive — you choose which tools to update.

build-brief --global
GitHub Copilot CLI ~/.copilot/copilot-instructions.md
Claude Code ~/.claude/CLAUDE.md
Codex CLI ~/.codex/AGENTS.md
OpenCode config + managed plugin
Gemini CLI ~/.gemini/GEMINI.md
Scope

What it covers.

build-brief works at the Gradle process and log level. It is not tied to any particular plugin stack or framework.

Spring Boot Ktor Android Kotlin Multiplatform Plain JVM Multi-project builds
Token tracking

Operational feedback

build-brief gains reports rough token savings using a chars-divided-by-4 estimate. Useful when agents hit noisy builds repeatedly. Not billing-grade.

build-brief gains --history
build-brief gains --format json
build-brief gains --reset
FAQ

Common questions.

Does it replace Gradle?

No. It wraps Gradle, preserves the exit code, and keeps the raw output. The goal is a better default terminal view, not a new build system.

Does it hide stack traces or failures?

No. Failures stay visible in the summary. If the short output is not enough, the raw log path is printed so you can inspect the full output.

Is this only for one type of Gradle project?

No. It works at the Gradle process level, so it handles Spring Boot, Ktor, Android, KMP, plain JVM, and multi-project builds.

Why use this with coding agents?

Agents tend to re-run noisy commands in a loop. Shorter summaries make it easier for them (and for you) to spot what changed without flooding the context window.

How accurate is the token tracking?

Approximate. It uses a chars-divided-by-4 estimate and is meant as operational feedback, not precise accounting. Some commands save more than others.

How does daemon reuse work?

build-brief does not implement its own daemon. It leans on Gradle's normal daemon behavior. Use --daemon-mode on and a shared --gradle-user-home for more reliable reuse across repeated runs.

How do updates work?

If you installed with Homebrew, run brew upgrade build-brief. Otherwise, grab the newest build from the latest release.