# Developing RCL
This chapter explains the tools and workflows involved in hacking on RCL.
To get started, clone the repository from one of the two mirrors:
git clone https://codeberg.org/ruuda/rcl.git
git clone https://github.com/ruuda/rcl.git
## Building
RCL is written in Rust and builds with Cargo:
cargo build
target/debug/rcl --help
See the [building chapter](building.md) for more details and alternative build
configurations.
## CI and automated tests
Almost all of the checks that are part of the RCL development
process are automated, and included in [the Nix flake][flake]. These checks are
verified on CI by [Garnix], but you can run them locally as well:
nix flake check
This means that you can reproduce and debug any CI run locally.
While it is convenient to be able to run all checks in one command, if you know
what parts of RCL you changed, you can run just the relevant
checks. They are listed in [the section below](#individual-checks).
## Development environment
For the tools used for development, the Nix flake includes a devshell with the
right version of development dependencies (Python, MkDocs, Tree-sitter, ets.)
that you can enter with:
nix develop --command $SHELL
Sourcing your tools elsewhere (e.g. your system package manager) will probably
work, but only the Nix flake is continuously tested on CI.
[flake]: installation.md#as-a-nix-flake
[Garnix]: https://app.garnix.io/repo/ruuda/rcl
## Individual checks
Run the [golden tests](testing.md#golden-tests):
cargo build
golden/run.py
View coverage of the golden tests:
nix build .#coverage --out-link result
xdg-open result/index.html
Run unit tests and lints:
cargo test --workspace
cargo clippy --workspace
Typecheck Python sources:
mypy --strict --exclude pyrcl .
mypy --strict pyrcl
Autoformat Rust, Python, and RCL code:
```sh
cargo fmt
black .
fd . --extension .rcl --exclude golden --exec-batch rcl format --in-place
```
Build and preview the manual:
mkdocs serve
Build crate documentation and check for issues:
RUSTFLAGS="--deny warnings" cargo doc --no-deps --workspace
## Fuzz tests
After implementing a feature, run the fuzzers to ensure the code still respects
all invariants and is free of crashes. See [the fuzzing section in the testing
chapter][fuzz].
[fuzz]: testing.md#running-the-fuzzers