1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
[]
# NOT `jdwp-client`, and the reason is a fact about crates.io rather than a preference: that name was
# registered on 2025-09-10 by <https://github.com/bonk-dev/jdwp-client>, an unrelated project. It is the
# same collision `scripts/semver-check.sh` was written around — there it makes the default baseline answer
# from a stranger's package, here it makes the name simply unavailable. Prefixed with the repository name
# so a searcher who finds the crate finds this project.
#
# `[lib] name` below keeps the RUST path `jdwp_client`, so this rename touches no source file. The two
# names are independent on purpose: the registry name has to be globally unique, the import path only has
# to be unique within a dependency graph.
= "java-debugging-jdwp-client"
= true
= true
= true
= true
= true
# The description is the one line a stranger reads in crates.io search results, before any decision to
# click, so the "not a supported API" part belongs in it rather than only on the docs.rs front page.
= "JDWP protocol client for Java debugging — implementation detail of jdwp-mcp, not a supported API"
= true
# NOT `readme.workspace = true`, which is the root README.md — an install-and-configure guide for the
# jdwp-mcp MCP server. crates.io renders the readme as the crate's landing page, so inheriting it would
# greet someone who found the *library* with instructions for adding a debugger to Claude Code, which
# contradicts the sentence directly above it.
= "README.md"
= true
= true
# Without this the lib target would be named after the package and every `use jdwp_client::...` in both
# crates would have to become `use java_debugging_jdwp_client::...`.
[]
= "jdwp_client"
= "src/lib.rs"
[]
= true
= true
= true
= true
= true
[]
= true
# `test-util` is not part of tokio's "full", and the event loop's reply budget is 30s. Paused time lets
# that budget be asserted on at its real value instead of either waiting it out or reaching for
# `Instant::now() - 30s`, which underflows on a freshly started runtime.
= { = true, = ["test-util"] }
[[]]
= "probe_heap_queries"
= "examples/probe_heap_queries.rs"
# EVERY `../examples/` target below is silently dropped from the published `.crate`, because `cargo
# package` copies nothing from outside the package root. It warns once per target and packages anyway —
# twelve lines of `warning: ignoring example ... as ... is not included in the published package`, which
# scroll past looking like a lint. That is the intended outcome, not a defect to fix: these are manual
# probes you point at a live JVM, they are useless to someone consuming the library from crates.io, and
# `cargo test` locally still builds them because a local build reads this manifest rather than a tarball.
# Recorded here so the warnings are recognised rather than re-investigated at the one moment — a release —
# when nobody has time to.
[[]]
= "test_connection"
= "../examples/test_connection.rs"
[[]]
= "test_vm_commands"
= "../examples/test_vm_commands.rs"
[[]]
= "test_find_class"
= "../examples/test_find_class.rs"
[[]]
= "test_breakpoint"
= "../examples/test_breakpoint.rs"
[[]]
= "test_stack_inspection"
= "../examples/test_stack_inspection.rs"
[[]]
= "test_manual_stack"
= "../examples/test_manual_stack.rs"
[[]]
= "test_string_values"
= "../examples/test_string_values.rs"
[[]]
= "test_static_field"
= "../examples/test_static_field.rs"
[[]]
= "test_deferred_bp"
= "../examples/test_deferred_bp.rs"
[[]]
= "test_exception_bp"
= "../examples/test_exception_bp.rs"
[[]]
= "test_set_field"
= "../examples/test_set_field.rs"
[[]]
= "test_trace_bp"
= "../examples/test_trace_bp.rs"