Thanks for taking a look. PRs welcome — please keep them focused and small.
git clone https://github.com/brooksomics/claude-evernote-sync.git
cd claude-evernote-sync
uv sync
pre-commit install # installs the git hook so checks run on every commituv run pytest # tests + coverage report (must be >= 80%)
uv run ruff check src/ tests/ # lint
uv run ruff format src/ tests/ # format
uv run mypy src/ # strict type-check
pre-commit run --all-files # runs all pre-commit hooks against the whole treeCI runs all of the above on every push and pull request. PRs that don't pass CI won't be merged.
One hook (beads-leak-scan) guards the maintainer's beads
issue tracker data; it skips automatically when bd isn't installed, so contributors don't need
beads to commit.
Enforced in CI; the relevant settings live in pyproject.toml:
| Constraint | Limit |
|---|---|
| Lines per function | 20 |
| Parameters per function | 3 |
| Nesting depth | 2 |
| Lines per file | 200 |
| Functions per file | 10 |
| Test coverage | 80% (branch coverage) |
| Line length | 100 |
| Python | 3.13+ |
If you bump a limit because the existing one no longer fits, say so in the PR description — usually it means the file/function should be split.
Follow RED-GREEN-VALIDATE:
- RED — write a failing test first that captures the desired behavior
- GREEN — minimum code to make it pass
- VALIDATE — run
pre-commit run --all-files && uv run pytest
Tests should fail first to prove they actually exercise the requirement.
- Use the imperative mood (
Add X,Fix Y, notAdded X) - One logical change per commit
- Subject line ≤ 72 chars
- Body wraps at 100, explains why not what (the diff shows the what)
Open an issue with:
- What you tried (
claude-evernote-sync --dry-run -voutput is gold) - What you expected
- What happened
- Your Evernote plan + macOS version
For security issues, see SECURITY.md.