Code → Test → Debug
Built for Claude
Tired of approving find ~/.m2 searches?
Sick of extracting jars to /tmp?
Done approving javap for every class?
Wasting time adding and removing System.out.println?
Index
Find any class in any jar — project dependencies or ~/.m2. Search by name, the right version appears automatically.
find ~/.m2 ls jar tfClaude searches manifests with Grep. No permission prompts ever.
Decompile
Read decompiled source for any dependency. Entire jars cached as .java files on demand. One command, then direct file reads.
jar xf javap extracting to /tmpClaude reads .java files directly. No extraction, no approvals needed.
Instrument
Inject debug bytecode into dependencies while keeping your ~/.m2 clean. Args, return values, exceptions, timing — one JSON line per call.
System.out.println debug code, temp commitsStructured JSON Claude can parse. Return values go straight into assertEquals.
$ mvn jackknife:index \
-Dclass=com.fasterxml.jackson.databind.ObjectMapper
Found com.fasterxml.jackson.databind.ObjectMapper
in com.fasterxml.jackson.core:jackson-databind:2.20.1
Indexed jackson-databind-2.20.1.jarFind anything in your local repo
No more find ~/.m2, jar tf, jar xf, javap. One command finds the class, picks the latest version, indexes the jar. Search manifests with Grep — no permission prompts.
$ mvn jackknife:decompile \
-Dclass=com.fasterxml.jackson.databind.ObjectMapper
Decompiling com.fasterxml.jackson.core:jackson-databind-2.20.1.jar
Decompiled 1247 classes to .jackknife/source/
$ Read .jackknife/source/com.fasterxml.jackson.core/
jackson-databind-2.20.1/com/fasterxml/jackson/
databind/ObjectMapper.javaDecompile entire jars instantly
Every class in the jar is decompiled with Vineflower and written as a .java file. Cached for instant re-reads. Claude reads the files directly — no extraction to /tmp, no approvals.
$ mvn jackknife:instrument \
-Dclass=org.tomitribe.util.Join \
-Dmethod=join
$ mvn testInstrument, then test
Pick a class and method. Jackknife injects debug bytecode — your source stays untouched, your ~/.m2 stays clean. Run your tests normally and the debug output appears.
JACKKNIFE {"event":"call","time":"12.3us",
"class":"Join","method":"join",
"args":[", ",["x","y","z"]],
"return":"x, y, z"}
JACKKNIFE {"event":"call","time":"0.1ms",
"class":"Join","method":"join",
"args":["bad"],
"exception":{"type":"IllegalArgumentException",
"message":"bad input"}}Structured JSON, one line per call
Every instrumented call produces one JACKKNIFE-prefixed JSON line. Args, return values, exceptions, timing. Grep for failures. Copy return values straight into assertEquals.
## Jackknife
- When you need to inspect, decompile, or
find classes in jar dependencies, run
`mvn jackknife:index` in the project.
This generates `.jackknife/USAGE.md`
with full instructions.
Read that file — it has everything
you need.Add to your CLAUDE.md
Drop this in your ~/.claude/CLAUDE.md and every Claude session knows how to use Jackknife. No skill to install, no plugin to configure. Claude reads the generated USAGE.md and takes it from there.
<!-- ~/.m2/settings.xml -->
<settings>
<pluginGroups>
<pluginGroup>org.tomitribe.jackknife</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>jackknife</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
</settings>Use everywhere
Add Jackknife to your ~/.m2/settings.xml once and it's available in every Maven project. No per-project pom.xml changes needed. Just run mvn jackknife:index in any project.
All state lives in .jackknife/ at the project root — add it to .gitignore. Nothing touches your source, your jars, or your repo.
Explore the docs
Getting Started
Add Jackknife to your project and start exploring.
Index
Find any class in any jar — project dependencies or ~/.m2.
Decompile
Read decompiled source for any dependency — cached as .java files.
Instrument
Add debug output to any method — dependency or project code — without changing source.
Output
Structured JSON output — one line per call, parseable, copy-pasteable.
Goals
All Maven plugin goals — index, decompile, instrument, process, enhance, clean.