test_camera was the only Catch2 target missing the `if(TARGET glm::glm)`
link block — every other test linked glm but this one didn't, so the
macOS arm64 builder failed to find `glm/glm.hpp` from camera.hpp.
Five fopen call sites in tools/editor/cli_* passed
fs::directory_entry::path().c_str() — that's wchar_t* on Windows.
Routed them through `.string().c_str()` so MSYS2 GCC and clang both
accept the const char* parameter.
Continues the modularization. Moves the four per-zone inventory
handlers into their own file:
--list-zone-meshes (WOM stats)
--list-zone-audio (WAV header parse)
--list-zone-textures (texture-ref histogram)
--info-zone-summary (BOOTSTRAPPED/PARTIAL/EMPTY status)
Each consumes a trailing --json flag the same way; consolidated
that check into a consumeJsonFlag helper at the top.
main.cpp drops 27,445 → 27,200 lines (-245). Per-zone inventory
behavior unchanged (re-verified all 4 commands).
A pre-existing duplicate --list-zone-meshes handler (the older
detailed per-mesh listing, similar to the --list-project-meshes
collision fixed in 976549fe) is now dead code in the in-line
chain since the extracted module dispatches first. Will rename
or remove that duplicate in a follow-up cleanup.