The Xberg workspace layout — the version source of truth (root Cargo.toml [workspace.package] version), the 19 workspace members and 3 excluded crates, the distribution packages under packages/, the tools/ directory, and the ignore-file allowlists a new workspace member must be added to. Load when navigating the repo, deciding where code belongs, or wiring a new crate or binding package.
77
96%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Version source of truth: root Cargo.toml [workspace.package] version.
crates/)xberg — core library: extraction engine, MIME detection, plugin system, OCR, chunking, embeddings, API/MCP serverxberg-cli — CLI binary. Defines no cli feature of its own; its core-cli feature is what forwards to the core xberg/clixberg-ffi — C FFI layer; opaque handles, cbindgen headers. Consumed by Go (cgo), C# (P/Invoke), Zig (C ABI), Swift (swift-bridge shim, which injects the dependency itself) and Java (Panama FFM)xberg-jni — JNI bindings backing packages/kotlin-android. The Java package does not go through this: alef.toml [crates.java] sets ffi_style = "panama", i.e. Panama FFM over xberg-ffixberg-node — NAPI-RS Node.js/TypeScript bindingsxberg-py — PyO3 Python bindingsxberg-php — ext-php-rs PHP bindingsxberg-wasm — wasm-bindgen WASM bindings; wasm-target feature setxberg-native-pdf — pure-Rust PDF engine, vendored into this workspace. Path dependency with no package = alias, so the extern crate name is xberg_native_pdf. Exports LOG_TARGET_ROOT = module_path!(); derive log-target filters from that constant, never a string literalxberg-pdfium-render — pdfium FFI backend behind the pdf-pdfium feature. Aliased: pdfium-render = { package = "xberg-pdfium-render", … }, so call sites still write pdfium_render::xberg-paddle-ocr — PaddleOCR; ORT and tract engines. On WASM only paddle-ocr-types is available, but paddle-ocr is in windows-targetxberg-tesseract — Tesseract OCR bindingsxberg-candle-ocr — candle VLM OCR backends (TrOCR, PaddleOCR-VL, GLM-OCR, DeepSeek-OCR)xberg-gliner — GLiNER NER inferencexberg-libheif — libheif bindings for HEIC/HEIFxberg-libwpd — libwpd bindings for WordPerfect (.wpd)Two members live outside crates/: packages/dart/rust and packages/swift/rust.
excluded — not members, and invisible to cargo check --workspace:
e2e/rust, packages/elixir/native/xberg_nif, packages/ruby/ext/xberg_rb.
default-members = ["crates/xberg", "crates/xberg-cli"].
packages/)python (PyPI/maturin), ruby (RubyGems/Magnus), php (Composer), go (cgo over xberg-ffi),
java (Maven, Panama FFM over xberg-ffi), csharp (NuGet, P/Invoke), elixir (Hex/Rustler),
dart (pub.dev, flutter_rust_bridge), kotlin-android (AAR; JNI over xberg-jni),
swift (SwiftPM, swift-bridge), zig (C ABI over xberg-ffi).
tools/)benchmark-harness (the only workspace member here), generate_test_fixtures, ocr-measure,
perf.
There is no tools/e2e-generator — e2e generation is alef e2e generate, configured in
alef.toml [crates.e2e]. See the alef-generated-bindings skill.
Adding to [workspace] members and to the Dockerfiles is not enough. Two ignore files use
"ignore everything, then allowlist", so a new crate is invisible to Docker and its vendor/
is never committed:
.dockerignore — * at the top, then a per-crate allowlist; add !crates/<name>/.
Missing it fails every image build with
failed to compute cache key: "/crates/<name>": not found..gitignore — bare vendor/ with per-crate un-ignores; add !crates/<name>/src/vendor/
if the crate vendors source. Missing it means git add -A commits nothing under vendor/
and a fresh clone will not build.docker/Dockerfile.* must either COPY crates/<name>/ or sed-exclude the member
from the workspace list.task verify:docker-crates. It checks (1) and (3) in both directions — it also catches
a COPY line naming a crate that no longer exists. It does not look at .gitignore;
verify that by hand.Deleting a crate is the same problem in reverse: a stale allowlist entry is what hides a real omission.
04336bd
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.