diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..b2973e1 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,122 @@ +# Agent Guidelines for opencode-testing + +This is a Rust project using Edition 2024. + +## Build/Test Commands + +```bash +# Build the project +cargo build + +# Build for release +cargo build --release + +# Run the application +cargo run + +# Run all tests +cargo test + +# Run a specific test (e.g., test named `test_calculate_area`) +cargo test test_calculate_area + +# Run tests in a specific module +cargo test module_name:: + +# Run with output visible +cargo test -- --nocapture + +# Check for compilation errors without building +cargo check + +# Watch mode for development (requires cargo-watch) +cargo watch -x "run" +``` + +## Code Quality Commands + +```bash +# Format code (rustfmt) +cargo fmt + +# Check formatting without making changes +cargo fmt -- --check + +# Run clippy lints +cargo clippy + +# Run clippy with all features and warnings as errors +cargo clippy --all-features -- -D warnings +``` + +## Code Style Guidelines + +### Formatting +- Use `cargo fmt` with default settings +- Max line width: 100 characters (default) +- Use 4 spaces for indentation (default) +- Trailing commas in multi-line lists + +### Naming Conventions +- Variables, functions, modules: `snake_case` +- Types (structs, enums, traits): `CamelCase` +- Constants, statics: `SCREAMING_SNAKE_CASE` +- Lifetimes: `'lowercase` +- Generic type parameters: `CamelCase` (single uppercase letter preferred: `T`, `K`, `V`) +- Macros: `snake_case!` + +### Import Organization +Group imports in this order, separated by blank lines: +1. Standard library imports (`std::`, `core::`, `alloc::`) +2. External crate imports +3. Internal crate imports (`crate::`) +4. Super module imports (`super::`) +5. Current module imports (`self::`) + +Use `use` statements not `extern crate`. + +### Types and Type Safety +- Prefer explicit types over `impl Trait` in public APIs +- Use `Option` and `Result` for fallible operations +- Avoid `unwrap()` and `expect()` in production code; handle errors properly +- Use `?` operator for error propagation +- Prefer `&str` over `&String`, `&[T]` over `&Vec` for function parameters + +### Error Handling +- Define custom error types using `thiserror` or `enum` for complex error cases +- Use `anyhow` for application code error handling +- Propagate errors with `?` operator +- Provide context with `map_err()` when needed + +### Functions +- Keep functions small and focused on a single task +- Max 5-7 parameters; use structs for more complex parameter sets +- Document public functions with `///` doc comments +- Use early returns to reduce nesting + +### Comments and Documentation +- Use `//` for inline comments +- Use `///` for public API documentation +- Use `//!` for module-level documentation +- Document panics, unsafe code, and complex algorithms + +### Unsafe Code +- Avoid unsafe code unless absolutely necessary +- Document all safety invariants with `// SAFETY:` comments +- Keep unsafe blocks as small as possible + +### Testing +- Write unit tests in the same file as the code: `#[cfg(test)]` module +- Use descriptive test names: `test__` +- Use `assert!`, `assert_eq!`, `assert_ne!` for assertions +- Organize tests with submodules for different scenarios + +### Memory Management +- Prefer ownership and borrowing over cloning when possible +- Use `.clone()` explicitly when needed +- Consider `Cow<'_, T>` for data that may be borrowed or owned + +### Performance +- Avoid premature optimization; write clear code first +- Use iterators instead of loops when appropriate +- Profile before optimizing