Your agent reads the whole build log. Almost none of it matters.

DotnetTokenKiller runs dotnet for you and hands back only the errors, warnings, and summary. Same information, 60–90% fewer tokens.

dotnet test35 lines
Restore complete (0.7s)
  SampleApp.Tests net10.0 succeeded (0.4s) → bin\Debug\net10.0\...dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.5+1b188a7b0a
[xUnit.net 00:00:00.17]   Discovering: SampleApp.Tests
[xUnit.net 00:00:00.28]   Discovered:  SampleApp.Tests
[xUnit.net 00:00:00.34]   Starting:    SampleApp.Tests
     Warning:
     The component "Fluent Assertions" is governed by the rules
     defined in the Xceed License Agreement and the Xceed Fluent
     Assertions Community License. You may use Fluent Assertions
     ... 7 more lines of licence notice
[xUnit.net 00:00:00.48]     IntentionallyFailingTests.AlwaysFails [FAIL]
[xUnit.net 00:00:00.48]       Intentional failure
[xUnit.net 00:00:00.48]       Stack Trace:
[xUnit.net 00:00:00.49]         D:\DotnetTokenKiller\samples\SampleApp
                                 .Tests\IntentionallyFailingTests.cs(8,0)
[xUnit.net 00:00:00.49]            at System.Reflection.MethodBaseInvoker
[xUnit.net 00:00:00.49]            at System.Reflection.MethodBaseInvoker
[xUnit.net 00:00:00.56]   Finished:    SampleApp.Tests
  SampleApp.Tests test net10.0 failed with 1 error(s) (0.5s)
    D:\DotnetTokenKiller\samples\...cs(8): error TESTERROR:
    ... 8 more lines repeating the same stack trace
Test summary: total: 4, failed: 1, succeeded: 3, skipped: 0
Build failed with 1 error(s) in 5.4s
dtk dotnet test5 lines
FAILURES (1):
  SampleApp.Tests.IntentionallyFailingTests.AlwaysFails [5 ms]
    Intentional failure
    at samples/SampleApp.Tests/IntentionallyFailingTests.cs:line 8
dotnet test: 1 failed, 3 passed (1 project, 0.07s)
30 lines removed

Everything dimmed on the left is discarded. The adapter banner, the licence notice, the reflection frames, and the duplicated stack trace carry no information your agent can act on — so dtk drops them and keeps the failure, the message, and the file it came from.

$ dotnet tool install -g DotnetTokenKiller
78%
build
84%
test
98%
clean
81%
list package

What gets filtered

Each command has its own filter, because each one is noisy in its own way.

build

Drops MSBuild headers and progress lines. Groups the remaining errors and warnings by file, with workspace-relative paths and a count of the most common codes.

test

Removes xUnit, NUnit, MSTest, and Reqnroll adapter banners, licence notices, and reflection stack frames. Passing tests collapse to a count; failures keep their message and source line.

restore & clean

Condenses per-project restore and clean chatter to one line, or to the errors when something goes wrong.

format

Prints only the violations, one per line, with paths relative to the workspace instead of absolute.

list package

Collapses the per-framework duplication that --outdated, --deprecated, and --vulnerable produce.

pipe

Runs the same filters over output dtk did not produce — a CI log, or a dotnet call that slipped past the hook.

Set up your coding agent

One command installs a hook that rewrites dotnet … to dtk dotnet …, so the filtering happens whether or not the agent remembers to ask for it.

Claude Code GitHub Copilot GitHub Copilot CLI Gemini CLI Codex CLI OpenCode Antigravity CLI pi oh-my-pi Cursor Windsurf Aider JetBrains AI
$ dtk init claude

Where to go next