yoo is a single Rust binary. src/main.rs parses arguments through args.rs,
then passes the command to app::execute. Parse errors exit with code 2;
execution errors exit with code 1. app.rs coordinates collection and display.
| Concern | Files |
|---|---|
| Commands, options, help | src/args.rs, src/app.rs |
| Shell completion generation | src/completions.rs |
| Project metadata and source counting | src/project.rs, src/fetch.rs |
| Git status | src/git.rs |
| Development tool checks | src/doctor.rs |
| Configuration and themes | src/config.rs, src/ui.rs |
| Saved project reports | src/snapshot.rs |
| Subprocess execution and cleanup | src/process.rs, src/process_tree.rs |
| Editor launch | src/editor.rs |
| Timers and tip packs | src/timer.rs, src/tips.rs, src/content.rs |
Keep command coordination in app.rs and collection logic in the relevant
module. Preserve structured JSON output when changing display behavior.
Subprocess collection uses timeouts, bounded captured output, and platform
specific process cleanup; preserve those guarantees when adding tool checks.
Interactive editor launches have different lifecycle requirements.
- Update argument parsing and help text in
args.rs. - Connect execution in
app.rsand implement the behavior in its module. - Update completion generation in
completions.rsand regenerate the packaged scripts usingcargo build --release --lockedfollowed bybash scripts/package-completions.sh. - Add tests for observable behavior, including failure exit codes and JSON
output where applicable. Use
tests/cli.rsfor compiled binary coverage. - Update
docs/commands.mdand the changelog when users will notice the change.
The website in site/ and npm installer in packages/npm/ are separate Node.js
projects. The website's installer route is generated from the root install.sh.
Package definitions live in packaging/, with generation and publication scripts
in scripts/. Signed repositories under site/public/ contain release artifacts;
edit their source tooling instead of hand-editing signed metadata.
Cargo.toml uses an explicit package include list so website dependencies,
build output, and hosted packages stay out of the crate. Review
cargo package --list --locked when changing that boundary.