Cross-platform native app (Rust + GPUI) for orchestrating parallel AI coding agent CLI sessions with Git worktree isolation. Ships on Windows, macOS (arm64 + x64), and Linux x64.
The original .NET 10 / WPF implementation was retired on 2026-05-14; see ADR-0022 and docs/MIGRATION-csharp-to-rust.md. The last buildable C# tree is tagged
legacy/v0.2.6-final. If you are reading historical PRs, expectsrc/CodeScope.*/references that no longer exist onmain.
- Rust (stable toolchain) — workspace at repo-root
Cargo.toml - GPUI for the application shell — do not suggest egui, iced, or web frontends
codescope-terminal(GPUI-native ConPTY/PTY) for terminal hosting — do not suggest xterm.js + WebView2 or wrapping VS Code's terminal- Shell out to
git— do not suggestgit2/libgit2 bindings serde_jsonfor on-disk state — do not introduce other JSON cratesself_updatecrate for in-app update detection + apply; Inno Setup for the Windows installer. Velopack was retired in #244 after three release-cycle crashes; do not reintroduce it.
UI/UX decisions live in docs/DESIGN.md and docs/DECISIONS.md.
Mirror established patterns in the existing GPUI views and the
AppShell / MainViewModel parallel when adding features; document
intentional deviations in docs/DECISIONS.md.
- Idiomatic Rust 2024 (workspace pins
edition = "2024"— needs Rust 1.85+). Runcargo fmtbefore committing cargo clippy --workspace --all-targetsclean on changed files- Prefer
?overmatch/unwrapfor error propagation; reserveunwrapfor proven invariants with a one-line// SAFETY:style comment explaining why - Module names
snake_case, typesCamelCase - 4-space indent, 100 char line length guideline (Rust default)
The user develops CodeScope inside CodeScope — the installed build hosts the sessions that work on this repo, so closing it to test a dev build would kill every other project's session. Dev runs therefore need to coexist with the installed app.
Start the dev build with the CODESCOPE_DEV env var set:
# Windows (PowerShell)
$env:CODESCOPE_DEV = "1"
cargo run --bin codescope# macOS / Linux
CODESCOPE_DEV=1 cargo run --bin codescopecodescope_core::paths::AppPaths::detect() resolves the env var once
at process start and redirects (paths come from AppPaths accessor
methods — projects_file(), layout_file(), window_file(),
settings_file()):
- single-instance mutex →
Global\CodeScope.SingleInstance.Dev(Windows only) - Windows:
%APPDATA%\CodeScope\→%APPDATA%\CodeScope.Dev\(projects.json,settings.json);%LOCALAPPDATA%\CodeScope\→%LOCALAPPDATA%\CodeScope.Dev\(layout.json,window.json,console.log,crash.log) - Linux:
~/.config/CodeScope/→~/.config/CodeScope.Dev/(config);~/.local/state/CodeScope/→~/.local/state/CodeScope.Dev/(state) - macOS:
~/Library/Application Support/CodeScope/→~/Library/Application Support/CodeScope.Dev/(both config and state — Apple's HIG keeps them together) - window title →
CodeScope [dev] — …
The Dev store is independent — projects opened in the dev build are
separate from the installed build's projects. Typical loop: keep the
installed build running with real work, launch dev with a subset of
projects (or different ones) to exercise changes. Claude telemetry
tails at ~/.claude/projects/… are shared by design — two
FSWatchers, no state conflict.
When adding new on-disk state, thread it through the paths module so
dev-mode separation keeps working.
- First, on any fresh session, read
docs/HANDOFF.md— it holds the cursor (what we were doing), current build/test status, roadmap state, open rough edges, and suggested next entry points. It is updated at the end of each session. - Read
docs/DECISIONS.mdbefore proposing architecture changes - Write the test first for
codescope-coreservices (TDD for logic, not UI). Tests live next to the code they cover, behind#[cfg(test)] - Keep commits focused; one concern per commit
- Never commit new work directly to
main— always create a feature branch and open a PR (even for small changes).mainis protected; pushing to it bypasses review - At the end of every working session, update
docs/HANDOFF.mdwith the new cursor, commit SHAs, and anything a fresh session would need - Never leave
TODO/FIXMEwithout a linked issue number