-
Notifications
You must be signed in to change notification settings - Fork 627
Description
Summary
RTK's filtering engine and command classifier are valuable beyond CLI proxy use.
Several modules (filter.rs, discover/registry.rs, utils.rs) already have clean public APIs that return values; they just can't be consumed externally because there's no [lib] target and all modules are private.
i.e. they use mod not pub mod.
Proposal:
- Add a
[lib]target toCargo.toml - Create
src/lib.rswith curated public re-exports.
This will allow downstream crates to depend on rtk as a library (git dependency).
Motivation
Consuming rtk as a library enables:
- In-process output filtering: no subprocess overhead, call
filter.filter(content, lang)directly - Embedding in other tools: LLM agent frameworks, coding tools, etc. without complexity of downloading
rtk.
Current State (Why It Doesn't Work Today)
| Check | Result |
|---|---|
[lib] section in Cargo.toml |
Missing |
src/lib.rs |
Does not exist |
| Module visibility | All mod (not pub mod) |
| crates.io package | Name collision ("Rust Type Kit") |
Proposed Change
Modules ready for public exposure (no refactoring needed)
These already return values and avoid println! / std::process::exit():
filter:FilterStrategytrait,get_filter(level),Language::from_extension(),smart_truncate()discover::registry:classify_command(),rewrite_command()discover::rules: static pattern/rule data (PATTERNS,RULES,IGNORED_PREFIXES)utils:strip_ansi(),truncate(),format_tokens()
Changes needed
- Add
[lib]section toCargo.toml(name = "rtk",path = "src/lib.rs") - Create
src/lib.rswithpub modfor the modules listed above - Change
mod→pub modinsrc/main.rsfor those modules - Ensure
src/discover/mod.rssubmodules arepubwhere needed
The [lib] target coexists with the existing [bin]. cargo build produces both, no breaking change.
Out of scope for this issue
The 57+ *_cmd.rs modules (git.rs, cargo_cmd.rs, etc.) use println! and std::process::exit(). Refactoring those to return String is a separate effort that can be tracked in a follow-up issue.
Alternatives Considered
- Fork with lib support: works but fragments the ecosystem; you don't want forks if you can avoid it.
- Separate
rtk-libcrate: splits the codebase; inlining the[lib]target in the existing repo is simpler
Also a fork would require publishing under a different name to crates.io , which is undesireable.