rs-mrxvt/CONTRIBUTING.md

109 lines
3.7 KiB
Markdown
Executable File

# Contributing to rs-mrxvt
Thanks for your interest! This doc covers the practical bits: getting a
build going, the code style we use, and how to land a PR.
## Build from source
You need:
- Rust 1.75 or newer (1.97+ recommended; we test against latest stable).
- A POSIX shell (`/bin/sh`).
- Python 3.10+ (only if you want to run the stress harness).
That's it. The MVP backend is a TUI (ratatui + crossterm), so no Vulkan,
Wayland, or X11 dev headers are required.
```bash
git clone <your-fork-url> rs-mrxvt
cd rs-mrxvt
cargo build # debug build
cargo build --release # optimized build (~5MB stripped binary)
./target/debug/rs-mrxvt # run
```
## Running the tests
```bash
cargo test # full suite (~10s)
cargo test --lib # unit tests only
cargo test --test integration # PTY round-trip tests
cargo test --test broadcasting # broadcast routing tests
python3 scripts/stress_test.py # 50-instance stress harness
```
All 71 Rust tests + the stress harness must pass before a PR can merge.
## Code style
- **Edition 2021**, `rustfmt` defaults, `clippy` clean.
- Module-level docs at the top of every file. Explain *why*, not *what*.
- Public items get doc comments. Private items get them when non-obvious.
- Tests live inline (`#[cfg(test)] mod tests`) for unit tests, in
`tests/` for integration tests.
- No `unwrap()` in production code paths — use `anyhow::Result` and
propagate. `unwrap()` is fine in tests.
- Imports grouped: std → external crates → crate-local.
Run before pushing:
```bash
cargo fmt --all
cargo clippy --all-targets -- -D warnings
cargo test
```
## Architecture orientation
Read [`ARCHITECTURE.md`](ARCHITECTURE.md) first. The 30-second version:
- `App` owns `TerminalManager` + `InputRouter` + `PaletteState`.
- `TerminalManager` owns the `Vec<TerminalTab>` and routes input bytes
based on `BroadcastTarget` (Active / All / Group).
- Each `TerminalTab` owns a `PtySession` + `alacritty_terminal::Term` +
a dedicated reader thread.
- `Renderer` is a trait; `TuiRenderer` is the default impl. A future
`WgpuRenderer` will slot in via the same trait.
- `Command` is the single source of truth for user actions. Palette and
keybindings both consume it.
## Where help is wanted
These are the planned-but-unimplemented features. Each is sized for a
focused PR:
| Feature | Difficulty | Where to start |
|---|---|---|
| wgpu/Wayland GUI backend | Hard | New `WgpuRenderer` impl of `Renderer` trait |
| Lua config | Medium | `mlua` impl of `ConfigSource` trait |
| | | |
| Per-tab fading in TUI | Easy | `TabState` lerp in `TuiRenderer::draw` |
| Sixel image protocol | Hard | Hook `alacritty_terminal`'s Handler trait |
| Hyperlink (OSC 8) clickable URLs | Medium | ratatui `Paragraph` + mouse hit-testing |
| Command palette for macros | Easy | Add macro entries to `Command::defaults()` |
## Pull request checklist
- [ ] `cargo fmt --all -- --check` clean
- [ ] `cargo clippy --all-targets -- -D warnings` clean
- [ ] `cargo test` green (71+ tests)
- [ ] If you added a feature, added a test for it
- [ ] If you changed public API, updated `ARCHITECTURE.md`
- [ ] If you added a CLI flag, added a test in `tests/integration.rs`
- [ ] Commit messages follow [Conventional Commits](https://www.conventionalcommits.org/)
## Reporting bugs
Open an issue with:
1. rs-mrxvt version (`rs-mrxvt --version`)
2. Distro + desktop environment (e.g. "Arch + Sway 1.10")
3. Repro steps
4. What you expected vs what happened
5. `RUST_LOG=debug` output if it's a behavior bug
## License
By contributing, you agree your contributions are licensed under the MIT
license covering the project.