Thank you for your interest in contributing to WriteScore!
- Fork the repository
- Clone your fork:
git clone https://github.com/YOUR_USERNAME/writescore.git
# Install Just (see README for OS-specific instructions)
just devOpen in VS Code and select "Reopen in Container" when prompted.
uv sync --extra dev
uv run python -m spacy download en_core_web_sm
uv run pre-commit install
uv run pre-commit install --hook-type commit-msg# Run all tests
pytest
# Run with coverage
pytest --cov=src/writescore --cov-report=html
# Skip slow tests
pytest -m "not slow"
# Run specific test file
pytest tests/unit/dimensions/test_perplexity.py -vThis project uses GitGuardian's ggshield for secret detection via pre-commit hook. Setup is required before your first commit:
- Create a free account at gitguardian.com
- Authenticate locally:
ggshield auth login
If you prefer not to use ggshield, you can skip it for individual commits:
SKIP=ggshield git commit -m "your message"Or disable it entirely in your local environment:
git config --local hooks.ggshield falseNote: GitHub's built-in secret scanning is also enabled for this repository as a backup.
We use ruff for linting:
ruff check src/Style Guidelines:
- Line length: 100 characters
- Target: Python 3.9+
- Use type hints for all public function signatures
- Follow Google-style docstrings
- Create a feature branch:
git checkout -b feature/your-feature - Make your changes
- Run tests and linting:
pytest && ruff check src/ - Commit with a clear message
- Push and create a Pull Request
When reporting bugs, please include:
- Python version (
python --version) - WriteScore version (
writescore --version) - Operating system
- Minimal reproduction steps
- Full error message/traceback
- Keep PRs focused on a single change
- Update tests for new functionality
- Ensure all tests pass
- Update documentation if needed
We use a structured label system to categorize and track work. When creating issues or PRs, apply appropriate labels from each category.
| Label | Description | Commit Prefix |
|---|---|---|
type: bug |
Bug fix | fix: |
type: feature |
New feature | feat: |
type: docs |
Documentation | docs: |
type: refactor |
Code refactoring | refactor: |
type: test |
Test changes | test: |
type: perf |
Performance improvement | perf: |
type: build |
Build/CI changes | build: |
| Label | Description |
|---|---|
scope: epic |
Multi-story theme or initiative |
scope: story |
User story, usually multiple PRs |
scope: spike |
Time-boxed research or investigation |
scope: tech-debt |
Technical debt to address |
| Label | Description |
|---|---|
area: cli |
CLI and command interface |
area: core |
Core analyzer and registry |
area: dimensions |
Dimension analyzers |
area: scoring |
Scoring system and calculation |
| Label | Description |
|---|---|
priority: high |
Urgent - address soon |
priority: medium |
Normal priority |
priority: low |
Backlog - address when time permits |
- Each issue should have exactly one
type:label matching the intended commit prefix - Apply
area:labels to indicate which part of the codebase is affected - Use
scope:labels for planning and tracking larger initiatives - Use
priority:labels during triage to indicate urgency good first issueandhelp wantedare available for community contributions
We track development progress on our GitHub Project Board.
| Column | Purpose |
|---|---|
| Backlog | Unprioritized items |
| To Do | Ready to work on |
| In Progress | Currently active |
| In Review | PRs awaiting review |
| Done | Completed |
When you start working on an issue:
- Assign yourself to the issue
- Move the card to "In Progress"
- Create a PR and move to "In Review"
- Card auto-moves to "Done" when PR merges
See docs/architecture.md for the dimension system architecture. New dimensions should:
- Inherit from
DimensionStrategy - Implement
analyze()andcalculate_score()methods - Include comprehensive tests
- Use 0-100 scoring (100 = most human-like)
Open an issue for questions or discussion.
This project follows the Contributor Covenant Code of Conduct. Please read it before participating.