# Contributing to auditmysite
## Development Setup
### Prerequisites
- Rust 1.70+ (install via [rustup](https://rustup.rs))
- Chrome or Chromium (auto-downloaded if not found)
### Build
```bash
git clone https://github.com/casoon/auditmysite.git
cd auditmysite
cargo build
```
### Run Tests
```bash
cargo test
```
### Run Locally
```bash
cargo run -- https://example.com
```
## Code Style
- Format with `cargo fmt`
- Lint with `cargo clippy`
- No warnings allowed in CI
## Adding a New WCAG Rule
1. Create a new file in `src/wcag/rules/`:
```rust
// src/wcag/rules/my_new_rule.rs
use crate::accessibility::tree::AXTree;
use crate::accessibility::styles::NodeStyle;
use crate::cli::WcagLevel;
use crate::wcag::types::{Severity, Violation};
/// WCAG X.X.X - Rule Name
///
/// Level: A/AA/AAA
///
/// https://www.w3.org/WAI/WCAG21/Understanding/rule-name
pub fn check(tree: &AXTree, _styles: &[NodeStyle], level: WcagLevel) -> Vec<Violation> {
let mut violations = Vec::new();
for node in tree.iter() {
// Your rule logic here
if has_violation(node) {
violations.push(
Violation::new(
"X.X.X",
"Rule Name",
level,
Severity::Serious,
"Description of the violation",
&node.node_id,
)
.with_role(node.role.clone())
.with_fix("How to fix this issue")
.with_help_url("https://www.w3.org/WAI/WCAG21/Understanding/rule-name")
);
}
}
violations
}
fn has_violation(node: &crate::accessibility::tree::AXNode) -> bool {
// Check logic
false
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_rule_metadata() {
// Test your rule
}
}
```
2. Register in `src/wcag/rules/mod.rs`:
```rust
pub mod my_new_rule;
```
3. Add to engine in `src/wcag/engine.rs`:
```rust
use super::rules::my_new_rule;
// In check_all():
if level >= WcagLevel::AA { // or A, AAA
violations.extend(my_new_rule::check(tree, styles, level));
}
```
4. Add tests and run:
```bash
cargo test my_new_rule
```
## Pull Request Process
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/my-feature`)
3. Make your changes
4. Run tests (`cargo test`)
5. Run lints (`cargo clippy`)
6. Format code (`cargo fmt`)
7. Commit with a descriptive message
8. Push and create a Pull Request
## Contributor License
By submitting a contribution, you agree that your contribution may be licensed
under the project's then-current license and any future license chosen by
Casoon for the project, including commercial, source-available, or open source
licenses. This keeps future relicensing possible.
For larger contributions, Casoon may require a signed Contributor License
Agreement before merging.
## Commit Message Format
```
type: short description
Longer description if needed.
- Bullet points for multiple changes
- Another change
```
Types:
- `feat`: New feature
- `fix`: Bug fix
- `docs`: Documentation
- `test`: Tests
- `refactor`: Code refactoring
- `chore`: Maintenance
## Reporting Issues
Please include:
- auditmysite version (`auditmysite --version`)
- Operating system
- Chrome/Chromium version (if relevant)
- Steps to reproduce
- Expected vs actual behavior
## Code of Conduct
Be respectful and inclusive. We welcome contributions from everyone.