Batch was broken because it sent a single "batch" command to the Java
bridge, which rejected it. Now the Rust CLI parses each line of the
batch file as a sub-command and dispatches them individually through
execute_via_bridge, collecting results into a JSON response.
Also updated CI to install Java 21 (required by Ghidra 12.0.1).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit implements the daemon-only architecture where all query
operations (functions, strings, decompile, memory, summary, xrefs)
must go through the persistent daemon instead of spawning new Ghidra
processes per command.
Key changes:
- Wire IPC client in main.rs to route queries through daemon
- Add requires_daemon() to determine which commands need daemon
- Add execute_via_daemon() to translate CLI commands to IPC calls
- Deprecate HeadlessExecutor with migration notice
- Fix filter.pest hex number parsing order (hex before number)
- Add #[allow(dead_code)] to infrastructure modules for future use
- Mark E2E tests requiring daemon as #[ignore]
Architecture benefits:
- Faster queries: Ghidra stays loaded, no 5-30s startup per command
- Simpler code: One execution path instead of two
- Better UX: Clear daemon requirement with helpful error messages
When daemon is not running, users see:
Error: This command requires the daemon to be running.
Start the daemon with: ghidra daemon start --project <name>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>