Raiju/CONTRIBUTING.md
2026-10-25 06:05:42 +03:00

61 lines
2.3 KiB
Markdown

# Contributing
Thank you for your interest in contributing to Raiju!
## How to Contribute
1. **Fork** the repository
2. Create a **feature branch** (`git checkout -b feature/my-feature`)
3. **Commit** your changes (`git commit -m 'Add my feature'`)
4. **Push** to the branch (`git push origin feature/my-feature`)
5. Open a **Pull Request**
## Code Standards
- PHP 8.1+ syntax; validate on a supported PHP release.
- Use consistent indentation (4 spaces)
- Follow existing naming conventions
- Add comments for complex logic
- Ensure security: validate inputs, sanitize outputs, use CSRF tokens
## Reporting Issues
- Use GitHub Issues
- Include steps to reproduce
- Include browser/PHP version if relevant
## Feature Requests
- Open an issue with the "enhancement" label
- Describe the use case
- Discuss before implementing large changes
## Releases
Follow [RELEASES.md](RELEASES.md) to keep `VERSION`, changelog dates, tested tags
and GitHub releases synchronized. Document compatibility changes in the upgrade
guide before publishing a release.
## Offline validation
Run `python3 tests/run-smoke.py` from the repository root. The runner needs PHP
(with mbstring, DOM, cURL and ZIP), Node.js and Python 3. It creates disposable
site copies, uses generated fixture accounts, and makes no paid AI calls or
external email deliveries. Live configuration and customer content are not copied.
The suite covers PHP/JavaScript syntax, translation JSON, permissions, sessions,
CSRF, safe HTML, routing, forms, backup/restore, concurrent file writes, and mocked
AI provider requests. Browser checks are separate from the offline runner.
Routing tests in this suite run on the PHP development server, not Apache.
For routing, login-destination or handler-directory changes, also complete the
[Apache routing checks](ROUTING.md#required-verification) and include that evidence
in the PR. The focused local regression command is `python3 tests/system-smoke.py`.
With Playwright and Chromium installed locally, run `python3 tests/browser-check.py`.
This also uses an isolated fixture and reports the location of its screenshots.
For shared JSON records use `includes/json-store.php`: `raijuJsonUpdate()` locks
the complete read/change/write transaction; `raijuJsonAtomicWrite()` alone only
prevents partially written files. Never remove a lock file after releasing it.