Build from source
Toolchain requirements per platform and the commands that build Sirio and sirioctl.
Requirements
- A current stable Rust toolchain.
- Zig exactly 0.15.2 on
PATH. The terminal crate builds libghostty-vt withzig build, and upstream pins that version. A newer install fails too. To skip the build’s download of Ghostty’s source, pointGHOSTTY_SOURCE_DIRat a local checkout. - Windows: the MSVC toolchain. Linux: GTK 3 and WebKitGTK 4.1 development packages.
- For the test gate: cargo-nextest, which
cargo install cargo-nextest --lockedputs on yourPATH.
Build
git clone https://github.com/ai-sirio/sirio
cd sirio/rust
cargo build -p sirio --release
cargo build -p sirio_control --bin sirioctl --releaseScripts/build-dev.sh builds a debug Sirio and sirioctl, stops the Sirio that is running and starts the new one. On macOS it first wraps the binary in an ad-hoc signed Sirio.app, and that step matters. A bare binary from cargo shows no tray icon, macOS files its notifications under Script Editor, and Settings → Permissions shows Notifications as “check manually”.
Verify
Iterate on one crate with cargo test -p <crate>. The whole-repository gate is Scripts/ci.sh, which prints CI OK when everything passes. It stops at once without Zig 0.15.2 or cargo-nextest, checks that the workspace version sits above the newest release tag, then builds every target and runs the tests through nextest.
Scripts/ci-linux.sh is the stricter tier on Linux. It adds formatting and clippy, compile checks for macOS and Windows, a headless smoke test, and end-to-end runs of the browser and of the pull and merge request views against fake forges.
Conventions
Commit messages follow Conventional Commits with a lower-case imperative subject. Tests come first. Design specs live in docs/superpowers/specs/ and their implementation plans in docs/superpowers/plans/: read the relevant one before changing behaviour it describes, and write one for anything that changes how the pieces fit. Every release carries its own notes in docs/release-notes/, and the release job refuses a tag whose file is missing.