First off — thank you for considering contributing to cora-cli! 🎉 This guide will help you get started.
- Code of Conduct
- Getting Started
- Development Workflow
- Pull Request Process
- Coding Standards
- Reporting Bugs
- Feature Requests
Be respectful, constructive, and inclusive. We follow the Rust Code of Conduct.
- Rust 1.85+ (stable toolchain recommended)
- Git for version control
- An LLM API key (OpenAI, Anthropic, etc.) for testing review features
# Clone the repository
git clone https://github.com/codecoradev/cora-cli.git
cd cora-cli
# Build in debug mode
cargo build
# Run tests
cargo test
# Run linter
cargo clippy -- -D warningscora-cli/
├── src/
│ ├── main.rs # CLI entry point + clap args
│ ├── cli.rs # Argument parsing (clap)
│ ├── commands/ # CLI subcommands
│ │ ├── review.rs # cora review
│ │ ├── scan.rs # cora scan
│ │ ├── config_cmd.rs # cora config show/set
│ │ ├── auth.rs # cora auth login/logout
│ │ └── init.rs # cora init
│ ├── config/
│ │ ├── loader.rs # Config resolution chain (global → project → env → CLI)
│ │ ├── schema.rs # YAML config structs + merge logic
│ │ └── providers.rs # Provider presets (OpenAI, Anthropic, etc.)
│ ├── engine/
│ │ ├── review.rs # LLM review + SARIF generation
│ │ ├── scanner.rs # File scanning and diff generation
│ │ ├── types.rs # Issue, Severity, ScanResponse types
│ │ └── llm.rs # LLM API abstraction
│ └── formatter/
│ └── mod.rs # Output formatting (pretty, compact, json, sarif)
├── .github/
│ └── workflows/ # CI, release, deploy workflows
├── tests/ # Integration tests
├── Cargo.toml
└── README.md
- Fork the repository on GitHub
- Create a branch for your change:
git checkout -b feature/your-feature-name
- Make your changes and commit with meaningful messages:
git commit -m "feat: add support for SARIF output format" - Push to your fork and open a Pull Request
We follow Conventional Commits:
| Prefix | Purpose |
|---|---|
feat: |
New feature |
fix: |
Bug fix |
docs: |
Documentation changes |
test: |
Adding or updating tests |
refactor: |
Code changes without feature/fix |
chore: |
Maintenance tasks |
ci: |
CI/CD changes |
- Update documentation if your change affects user-facing behavior
- Add tests for any new functionality
- Ensure
cargo testpasses - Ensure
cargo clippy -- -D warningsis clean - Ensure
cargo fmthas been applied - Keep PRs focused — one logical change per PR
- Formatting: Run
cargo fmtbefore committing - Linting: Run
cargo clippy -- -D warnings— no warnings allowed - Errors: Use
anyhowfor application errors, define custom error types for library code - Testing: Write unit tests for core logic, integration tests for CLI commands
- Documentation: Add doc comments to all public items (
///)
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_severity_from_str() {
use crate::engine::types::Severity;
assert_eq!(Severity::from_str_lossy("critical"), Severity::Critical);
assert_eq!(Severity::from_str_lossy("info"), Severity::Info);
}
}Please open a GitHub Issue with:
- Description — What happened vs. what you expected
- Steps to reproduce — Minimal reproduction steps
- Environment — OS, Rust version, cora-cli version
- Logs — Output with
RUST_LOG=debug cora review
We love hearing your ideas! Open an issue with:
- Problem — What problem does this solve?
- Proposed solution — How should it work?
- Alternatives considered — Other approaches you thought about
Feel free to open an issue tagged with question or reach out on GitHub Discussions.
Thank you for helping make cora-cli better! 🦀