繁體中文 · English
Issues, PRs, and Discussions are welcome. This document only spells out hard requirements; it does not dictate process.
This project is maintained by a single maintainer (@aqua5230) under a benevolent-dictator model: every PR is reviewed and merged at the maintainer's discretion. Discussion is welcome, but the final call rests with the maintainer.
- Bug report: use the
.github/ISSUE_TEMPLATE/bug_report.mdtemplate. Please include macOS version, Python version,git rev-parse --short HEAD, and which mode you were running (menu bar / TUI / mock). - Feature request: use the
.github/ISSUE_TEMPLATE/feature_request.mdtemplate.
source .venv/bin/activate
uv run ruff check
uv run mypy .
uv run pytest -vAll three must be green to merge. CI runs the same three (.github/workflows/check.yml).
- When changing prod modules, add tests alongside. Pick the closest existing file under
tests/as a style reference. Tests must never touch real~/.claude/or~/.codex/— usemonkeypatchto redirect path constants. - Keep internal and public naming unified as
usage. File paths, settings keys, binary names, environment variables, and the LaunchAgent label all use theusageprefix. - Be deliberate with
menubar.pyUI constants (CARD_HEIGHT,CARD_RADIUS,SECTION_GAP, etc.); they are part of the popover's visual design.
- For every change, add an entry to the
## Unreleasedsection ofCHANGELOG.md, and also update the corresponding section inCHANGELOG.en.md(this project keeps the README, CHANGELOG, and release notes bilingual). - Releases are cut by the maintainer (bump version in
pyproject.toml, rename## Unreleasedto## X.Y.Z — YYYY-MM-DD, commitRelease vX.Y.Z, push tag).
Match the existing git log: imperative subject line; add a body explaining why (not what — the diff already shows what) when useful. Example:
Fix AttributeError: drop stale tracker.sample() call
072a088 removed UsageRateTracker.sample() but missed the lone caller in
menubar.py:435...