Skip to content

Commit a8ba9fc

Browse files
committed
Restore Rio-free package variants
1 parent b43e507 commit a8ba9fc

15 files changed

Lines changed: 237 additions & 46 deletions

File tree

.beads/issues.jsonl

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ User-visible runtime changes for Yazelix Nova live here.
44

55
## Unreleased
66

7+
- Four composable `no-rio` package variants restore a terminal-free runtime.
8+
They omit Rio and its terminal-only closure, native config, icon, desktop
9+
entry, and Ratconfig surface. `yzx enter` remains fully managed in the host
10+
terminal; `yzx launch` exits with a direct instruction to use `enter`.
711
- Nova uses upstream Zellij `v0.45.0` as the exact fork base and packages Yazi
812
26.8.15. Yazi's released Zellij adapter uses native direct Kitty placements,
913
so the fork removes its Unicode-placeholder translator while retaining its

README.md

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,11 @@ outside the Nova v1 continuity contract.
270270

271271
## Packages and platforms
272272

273-
Package names follow `yazelix[-no-helix][-no-yazi]`. Each suffix
273+
Package names follow `yazelix[-no-rio][-no-helix][-no-yazi]`. Each suffix
274274
removes that managed package while retaining the integration around it.
275+
`no-rio` is terminal-free: `yzx enter` uses the current terminal, while
276+
`yzx launch` explains that Rio is unavailable. It installs no Rio config,
277+
icon, or desktop entry.
275278
`no-helix` uses the configured host editor; `no-yazi` requires matching host
276279
`yazi` and `ya` commands.
277280

@@ -285,6 +288,10 @@ as `yazelix` and do not multiply the capability-variant matrix.
285288
| `yazelix-no-helix` | Yes | No | Yes |
286289
| `yazelix-no-yazi` | Yes | Yes | No |
287290
| `yazelix-no-helix-no-yazi` | Yes | No | No |
291+
| `yazelix-no-rio` | No | Yes | Yes |
292+
| `yazelix-no-rio-no-helix` | No | No | Yes |
293+
| `yazelix-no-rio-no-yazi` | No | Yes | No |
294+
| `yazelix-no-rio-no-helix-no-yazi` | No | No | No |
288295

289296
See [Installation and packages](docs/installation.md) for package variants,
290297
platform support, SSH use, Home Manager, and updates.
@@ -435,8 +442,9 @@ If Yazelix is useful to you, you can support its development on
435442

436443
## LOC Scorecard
437444

438-
Yazelix owns **26,177 lines** of tracked text project files. The
445+
Yazelix owns **26,367 lines** of tracked text project files. The
439446
[reproducible scorecard](docs/development.md#loc-scorecard) excludes Beads,
440447
lockfiles, and binary assets.
441-
This remains 1,328 lines below the pre-Rio fork surface. The current increase
442-
also records the exact Zellij v0.45.0 fork boundary and Yazi 26.8.15 runtime.
448+
This remains 1,138 lines below the pre-Rio fork surface. The current increase
449+
also records the terminal-free package matrix, exact Zellij v0.45.0 fork
450+
boundary, and Yazi 26.8.15 runtime.

crates/yzx-config/src/file_actions.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ pub(crate) fn build_file_actions(paths: &ConfigPaths) -> Vec<ConfigUiFileAction>
5555
})
5656
.collect()
5757
}
58-
fn file_action_specs(paths: &ConfigPaths) -> impl IntoIterator<Item = FileActionSpec> {
58+
fn file_action_specs(paths: &ConfigPaths) -> impl Iterator<Item = FileActionSpec> + '_ {
5959
[
6060
FileActionSpec {
6161
source_id: SOURCE_CONFIG,
@@ -202,6 +202,8 @@ fn file_action_specs(paths: &ConfigPaths) -> impl IntoIterator<Item = FileAction
202202
starter: ZELLIJ_PLUGINS_STARTER,
203203
},
204204
]
205+
.into_iter()
206+
.filter(|spec| paths.rio_included || spec.source_id != SOURCE_RIO)
205207
}
206208
pub(crate) fn write_source_field(
207209
paths: &ConfigPaths,

crates/yzx-config/src/main.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ mod tests {
233233
)
234234
.unwrap();
235235
ConfigPaths {
236+
rio_included: true,
236237
store_root: temp.path.join("store"),
237238
root: temp.path.join("config.toml"),
238239
rio: temp.path.join("rio/config.toml"),
@@ -284,6 +285,25 @@ mod tests {
284285
}
285286
}
286287

288+
#[test]
289+
fn rio_free_model_has_no_rio_state_or_actions() {
290+
let temp = TempHome::new();
291+
let mut paths = temp_paths(&temp);
292+
paths.rio_included = false;
293+
let paths = ensure_config_sources_at(paths).unwrap();
294+
let model = build_model(&paths).unwrap();
295+
296+
assert!(!paths.rio.exists());
297+
assert!(!model.tabs.iter().any(|tab| tab == TAB_RIO));
298+
assert!(!model.sources.iter().any(|source| source.id == SOURCE_RIO));
299+
assert!(
300+
!model
301+
.file_actions
302+
.iter()
303+
.any(|action| action.source_id == SOURCE_RIO)
304+
);
305+
}
306+
287307
#[test]
288308
fn rio_appearance_projection_owns_only_force_theme() {
289309
let (_temp, paths) = temp_sources();

crates/yzx-config/src/model.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ pub(crate) fn build_model(paths: &ConfigPaths) -> Result<ConfigUiModel> {
120120
}
121121
let yazi_dir = paths.yazi_config.parent().expect("Yazi config directory");
122122
let advanced_dir = paths.nu_config.parent().expect("Nushell config directory");
123-
let sources = vec![
123+
let mut sources = vec![
124124
build_config_source(paths, SOURCE_CONFIG, "config.toml", &paths.root),
125125
build_config_source(paths, SOURCE_RIO, "rio/config.toml", &paths.rio),
126126
build_config_source(paths, SOURCE_ZELLIJ, "zellij/config.kdl", &paths.zellij),
@@ -161,6 +161,9 @@ pub(crate) fn build_model(paths: &ConfigPaths) -> Result<ConfigUiModel> {
161161
read_only: true,
162162
},
163163
];
164+
if !paths.rio_included {
165+
sources.retain(|source| source.id != SOURCE_RIO);
166+
}
164167
fields.extend(yazi);
165168
if !root_document_valid {
166169
block_source_fields(
@@ -198,17 +201,21 @@ pub(crate) fn build_model(paths: &ConfigPaths) -> Result<ConfigUiModel> {
198201

199202
Ok(ConfigUiModel {
200203
sources,
201-
tabs: vec![
202-
TAB_CONFIG.to_string(),
203-
TAB_POPUPS.to_string(),
204-
TAB_RIO.to_string(),
205-
TAB_ZELLIJ.to_string(),
206-
TAB_STARSHIP.to_string(),
207-
TAB_HELIX.to_string(),
208-
TAB_YAZI.to_string(),
209-
TAB_KEYS.to_string(),
210-
TAB_ADVANCED.to_string(),
211-
],
204+
tabs: [
205+
TAB_CONFIG,
206+
TAB_POPUPS,
207+
TAB_RIO,
208+
TAB_ZELLIJ,
209+
TAB_STARSHIP,
210+
TAB_HELIX,
211+
TAB_YAZI,
212+
TAB_KEYS,
213+
TAB_ADVANCED,
214+
]
215+
.into_iter()
216+
.filter(|tab| paths.rio_included || *tab != TAB_RIO)
217+
.map(str::to_string)
218+
.collect(),
212219
operational_tab: Some(TAB_ADVANCED.to_string()),
213220
tab_list_tables: BTreeMap::from([
214221
(TAB_HELIX.to_string(), helix.list_table),

crates/yzx-config/src/paths.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::{
2+
ffi::OsStr,
23
fs,
34
path::{Path, PathBuf},
45
};
@@ -15,6 +16,7 @@ pub(crate) enum RioAppearanceProjection {
1516
}
1617

1718
pub(crate) struct ConfigPaths {
19+
pub(crate) rio_included: bool,
1820
pub(crate) store_root: PathBuf,
1921
pub(crate) root: PathBuf,
2022
pub(crate) rio: PathBuf,
@@ -87,7 +89,9 @@ pub(crate) fn ensure_config_sources() -> Result<ConfigPaths> {
8789
ensure_config_sources_at(config_paths()?)
8890
}
8991
pub(crate) fn ensure_config_sources_at(paths: ConfigPaths) -> Result<ConfigPaths> {
90-
initialize_rio_config(&paths.rio)?;
92+
if paths.rio_included {
93+
initialize_rio_config(&paths.rio)?;
94+
}
9195
Ok(paths)
9296
}
9397
pub(crate) fn initialize_rio_config(path: &Path) -> Result<()> {
@@ -117,6 +121,9 @@ pub(crate) fn project_rio_appearance(
117121
if !matches!(mode, "dark" | "light") {
118122
return Err(error(format!("unsupported appearance mode: {mode}")));
119123
}
124+
if !paths.rio_included {
125+
return Ok(RioAppearanceProjection::NextLaunch);
126+
}
120127
initialize_rio_config(&paths.rio)?;
121128
if paths.reject_mutation(&paths.rio, SOURCE_RIO).is_err() {
122129
return Ok(RioAppearanceProjection::NextLaunch);
@@ -133,6 +140,7 @@ pub(crate) fn project_rio_appearance(
133140
pub(crate) fn config_paths() -> Result<ConfigPaths> {
134141
let home = config_home()?;
135142
Ok(ConfigPaths {
143+
rio_included: nonempty_env("YZX_RIO_INCLUDED").as_deref() != Some(OsStr::new("0")),
136144
store_root: option_env!("YAZELIX_NIX_STORE_ROOT")
137145
.map(PathBuf::from)
138146
.ok_or_else(|| error("yzx-config is missing its packaged Nix store root"))?,

docs/configuration.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ fine tuning and configured custom-popup fields. Normal-mode `a` switches between
1010
Overview and All only when Overview hides at least three fields and one quarter
1111
of the tab. Search spans All without changing the saved view
1212

13+
Packages with the `no-rio` suffix omit the Rio source, tab, native-file action,
14+
and initialization. Their remaining configuration surfaces are unchanged
15+
1316
On a free-form setting, `Enter` starts single-line inline editing and `e` opens
1417
the same staged value in `editor.command`. Inline editing supports Left/Right,
1518
Home/End, Backspace/Delete, Unicode text, and single-line paste; `Ctrl+e` opens

docs/development.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,15 @@ git ls-files | grep -Ev '^\.beads/|\.lock$|^assets/' | xargs wc -l
108108
| --- | ---: |
109109
| Ignore (`.gitignore`) | 19 |
110110
| License | 201 |
111-
| Markdown | 3571 |
111+
| Markdown | 3605 |
112112
| JSON | 117 |
113-
| Nix | 1728 |
113+
| Nix | 1828 |
114114
| Shell | 111 |
115115
| YAML | 431 |
116116
| TOML | 512 |
117117
| KDL | 252 |
118118
| Nu | 11 |
119119
| Lua | 245 |
120-
| Rust | 18909 |
120+
| Rust | 18964 |
121121
| Text | 71 |
122-
| Total | 26177 |
122+
| Total | 26367 |

docs/installation.md

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,30 @@ their exact immutable packages. Their running top bars identify that package as
3434

3535
## Package variants
3636

37-
Package names follow `yazelix[-no-helix][-no-yazi]`:
37+
Package names follow `yazelix[-no-rio][-no-helix][-no-yazi]`:
3838

3939
| Package | Rio | Managed Helix | Managed Yazi | Linux desktop channel |
4040
| --- | --- | --- | --- | --- |
4141
| `yazelix` | Yes | Yes | Yes | Stable |
4242
| `yazelix-no-helix` | Yes | No | Yes | Stable |
4343
| `yazelix-no-yazi` | Yes | Yes | No | Stable |
4444
| `yazelix-no-helix-no-yazi` | Yes | No | No | Stable |
45-
45+
| `yazelix-no-rio` | No | Yes | Yes | None |
46+
| `yazelix-no-rio-no-helix` | No | No | Yes | None |
47+
| `yazelix-no-rio-no-yazi` | No | Yes | No | None |
48+
| `yazelix-no-rio-no-helix-no-yazi` | No | No | No | None |
49+
50+
Rio-free packages omit Rio and its terminal-only closure, native config,
51+
icon, desktop entry, and Ratconfig tab. Use `yzx enter` from the host terminal;
52+
`yzx launch` exits with that instruction.
4653
Helix-free packages replace `yzx-hx` with a clear unavailable command, so set
4754
`editor.command` to an installed editor such as `nvim`. They neither evaluate
4855
managed Helix nor retain Helix, Steel, or the packaged grammar closure. Yazi-free
4956
packages retain the managed launcher, configuration, sidebar, popup, opener,
5057
and reveal integration but require host-provided `yazi` and `ya` commands with
5158
matching versions. A pair that differs from Nova's tested version warns and
52-
continues. The host installation owns optional Yazi preview dependencies. All
53-
four capability variants exist for `x86_64-linux`, `aarch64-linux`,
59+
continues. The host installation owns optional Yazi preview dependencies.
60+
All eight capability variants exist for `x86_64-linux`, `aarch64-linux`,
5461
`x86_64-darwin`, and `aarch64-darwin`. The full `yazelix-main` and
5562
`yazelix-edge` channel outputs exist on the same systems and differ only in
5663
their channel-qualified desktop and runtime identities
@@ -74,16 +81,24 @@ The modifiers compose mechanically:
7481
nix profile add --refresh github:Yazelix/nova/stable#yazelix-no-helix-no-yazi
7582
```
7683

84+
Install the terminal-free full-TUI variant with:
85+
86+
```sh
87+
nix profile add --refresh github:Yazelix/nova/stable#yazelix-no-rio
88+
```
89+
90+
Add `-no-helix`, `-no-yazi`, or both to compose the reduced variants.
91+
7792
## Capability matrix
7893

7994
| Surface | Linux | `aarch64-darwin` |
8095
| --- | --- | --- |
81-
| All four package variants | Build- and profile-tested on `x86_64-linux`, with flake outputs also covering `aarch64-linux` | Build-tested on a real GitHub macOS runner |
96+
| All eight package variants | Build- and profile-tested on `x86_64-linux`, with flake outputs also covering `aarch64-linux` | Exposed; Rio packages are build-tested on a real GitHub macOS runner, while Rio-free variants await hosted evidence |
8297
| Home Manager module | Activation closure build-tested on `x86_64-linux` | Activation closure build-tested on a real GitHub macOS runner |
8398
| `enter` with managed Zellij and Yazi plus the selected editor | Contract-tested and used interactively with managed Helix; host-editor delegation is contract-tested | Packaged, with interactive workflow unverified |
8499
| Full-package `launch` through Rio | Contract-tested and used interactively | Package build-tested, with Rio GUI unverified |
85100
| Host editor delegation | Contract-tested with the selected host editor remaining host-owned | Packaged, with interactive delegation unverified |
86-
| Desktop entry | Every package | None, as asserted by the macOS package and Home Manager builds |
101+
| Desktop entry | Packages that include Rio | None, as asserted by the macOS package and Home Manager builds |
87102

88103
`x86_64-darwin` remains an exposed, evaluated flake output rather than a
89104
build-tested target. The current label is **build-tested on macOS, with

0 commit comments

Comments
 (0)