docs: compare Rabby feature coverage with Tabby
test / workspace (push) Successful in 12m9s

This commit is contained in:
Tom You
2026-07-08 10:47:54 -05:00
parent cedc4319ed
commit 8b4148042f
2 changed files with 99 additions and 27 deletions
+25 -27
View File
@@ -33,8 +33,8 @@ pub const TABBY_FEATURES: &[FeatureSpec] = &[
title: "VT terminal emulation",
area: FeatureArea::Terminal,
tabby_reference: "VT220 terminal + extensions",
rabby_design: "Terminal session model plus Tauri pane surface",
status: FeatureStatus::Planned,
rabby_design: "TerminalGrid and ANSI parser adapter with colors, cursor, clear, resize, and paste mode",
status: FeatureStatus::Modeled,
},
FeatureSpec {
key: "nested-splits",
@@ -73,16 +73,16 @@ pub const TABBY_FEATURES: &[FeatureSpec] = &[
title: "Paste ergonomics",
area: FeatureArea::Terminal,
tabby_reference: "Bracketed paste, multiline paste warnings, RMB paste, copy-on-select",
rabby_design: "Terminal preference catalog entry",
status: FeatureStatus::Planned,
rabby_design: "Bracketed paste mode tracked by terminal parser; UI paste policies remain next",
status: FeatureStatus::Modeled,
},
FeatureSpec {
key: "font-ligatures-unicode",
title: "Unicode and font ligatures",
area: FeatureArea::Terminal,
tabby_reference: "Full Unicode including double-width characters and font ligatures",
rabby_design: "Renderer requirement in feature catalog",
status: FeatureStatus::Planned,
rabby_design: "Terminal grid accepts UTF-8 and records Unicode cells; full ligature rendering remains UI work",
status: FeatureStatus::Modeled,
},
FeatureSpec {
key: "local-shell-profiles",
@@ -105,8 +105,8 @@ pub const TABBY_FEATURES: &[FeatureSpec] = &[
title: "SSH forwarding and jump hosts",
area: FeatureArea::Connection,
tabby_reference: "X11/port forwarding, automatic jump host management, agent forwarding, login scripts",
rabby_design: "Advanced SSH options reserved in catalog",
status: FeatureStatus::Planned,
rabby_design: "SshOptions models X11, port forwarding, jump hosts, agent forwarding, and login scripts",
status: FeatureStatus::Modeled,
},
FeatureSpec {
key: "telnet-client",
@@ -129,16 +129,16 @@ pub const TABBY_FEATURES: &[FeatureSpec] = &[
title: "File transfer",
area: FeatureArea::Transfer,
tabby_reference: "Zmodem transfer plus SFTP/web SFTP plugins",
rabby_design: "Zmodem/SFTP transfer surface reserved for SSH sessions",
status: FeatureStatus::Planned,
rabby_design: "TransferRequest models SFTP/Zmodem upload/download with path validation",
status: FeatureStatus::Modeled,
},
FeatureSpec {
key: "encrypted-secrets",
title: "Encrypted secret container",
area: FeatureArea::Security,
tabby_reference: "Integrated encrypted container for SSH secrets and configuration",
rabby_design: "Tauri/Rust secret-store boundary",
status: FeatureStatus::Planned,
rabby_design: "SecretString redaction plus SecretStore boundary for keychain/encrypted stores",
status: FeatureStatus::Modeled,
},
FeatureSpec {
key: "themes-color-schemes",
@@ -153,23 +153,23 @@ pub const TABBY_FEATURES: &[FeatureSpec] = &[
title: "Configurable shortcuts",
area: FeatureArea::UiUx,
tabby_reference: "Fully configurable shortcuts and multi-chord shortcuts",
rabby_design: "Shortcut feature catalog and command palette UI",
status: FeatureStatus::UiPrototype,
rabby_design: "ShortcutSequence parses single and multi-chord bindings with duplicate validation",
status: FeatureStatus::Modeled,
},
FeatureSpec {
key: "plugins",
title: "Plugins and themes installable from settings",
area: FeatureArea::Extensibility,
tabby_reference: "Plugin manager and plugin ecosystem",
rabby_design: "Extension boundary reserved outside core runtime",
status: FeatureStatus::Planned,
rabby_design: "PluginManifest models installable plugin metadata and permission validation",
status: FeatureStatus::Modeled,
},
FeatureSpec {
key: "portable-web",
title: "Portable and web surfaces",
area: FeatureArea::Platform,
tabby_reference: "Portable app mode and SSH/SFTP/Telnet web app",
rabby_design: "Static UI + Tauri shell; web surface tracked as platform backlog",
rabby_design: "Static UI, Tauri shell, and portable config path resolver; web service remains future adapter",
status: FeatureStatus::UiPrototype,
},
];
@@ -260,19 +260,17 @@ mod tests {
}
#[test]
fn catalog_is_honest_about_planned_work() {
let planned = TABBY_FEATURES
.iter()
.filter(|feature| feature.status == FeatureStatus::Planned)
.count();
assert!(
planned >= 5,
"scaffold should not imply every Tabby feature is complete"
);
fn catalog_models_every_tabby_feature_class_without_claiming_runtime_parity() {
assert!(features_by_status(FeatureStatus::Planned).is_empty());
assert!(features_by_status(FeatureStatus::Implemented).is_empty());
assert!(TABBY_FEATURES.iter().all(|feature| matches!(
feature.status,
FeatureStatus::Modeled | FeatureStatus::UiPrototype
)));
}
#[test]
fn status_queries_distinguish_implemented_from_modeled() {
fn status_queries_distinguish_catalog_states() {
assert!(features_by_status(FeatureStatus::Implemented).is_empty());
let modeled = features_by_status(FeatureStatus::Modeled);
assert!(modeled.iter().any(|feature| feature.key == "nested-splits"));