A lottery CLI tool built with Python for fun. Installed command: lucky.
Supports Powerball (5 numbers 1–69 + special 1–26) and Mega Millions (5 numbers 1–70 + special 1–25).
uv sync
uv run lucky --help| Command | Description |
|---|---|
lucky pick <game> [--count N] |
Generate N valid random tickets |
lucky check <game> <n1..n5> --special <s> |
Check a ticket against the latest draw |
lucky show <game> |
Show the latest draw (date, numbers, special, jackpot) — default view |
lucky show <game> --history [--limit N] |
Show the last N draws |
lucky show <game> --stats |
Show number frequency, hot/cold numbers, odd/even distribution |
lucky --version |
Show the installed version |
Example:
lucky check powerball 12 18 33 44 61 --special 9On every run, lucky checks for new draws and updates its local SQLite cache (~/.lucky-cli/lucky.db) before executing your command. If offline, it silently falls back to the cached data.
src/lucky/
├── cli.py # Typer app entrypoint
├── commands/ # one module per subcommand
├── lottery/ # game rules + ticket generator
├── database/ # SQLAlchemy models/repository
├── updater/ # remote source + sync logic
└── console/ # Rich rendering helpers
tests/
See CLAUDE.md for the full architecture spec.
uv sync # install deps
uv run pytest # run tests
uv run lucky <cmd> # exercise the CLI locally- Commits follow Conventional Commits:
feat:,fix:,docs:,refactor:,test:,chore:. Usefeat!:or aBREAKING CHANGE:footer for breaking changes. - Versioning is automated from git tags (
setuptools-scm) — never hand-edit a version string. - Route all CLI output through
src/lucky/console/; avoid rawprint(). - Add/update tests under
tests/for any change to generator, stats, checker, or database logic. - CI publishes to PyPI on
v*tags via.github/workflows/release.yml.
Version numbers are never hand-edited — they're derived from git tags via setuptools-scm. To cut a release:
- Find the last release tag (skip if this is the first release):
git describe --tags --abbrev=0
- Review commits since that tag:
git log <last-tag>..HEAD --oneline
- Classify them by Conventional Commits prefix to decide the version bump:
feat:→ MINORfix:→ PATCHfeat!:or aBREAKING CHANGE:footer → MAJOR- (first release with no prior tag: start at
v0.1.0)
- Add a new section to
CHANGELOG.md, grouped by category:## v0.3.0 ### Features - add stats command ### Fixes - fix check logic
- Commit the changelog update, then create and push the tag:
git add CHANGELOG.md git commit -m "chore: release v0.3.0" git tag v0.3.0 git push origin main v0.3.0 - Pushing the tag triggers
.github/workflows/release.yml, which runs the test suite, builds the package, and publishes to PyPI using thePYPI_API_TOKENsecret — nothing else to do manually.
This project is built with Claude Code using the Superpowers plugin as its development framework — brainstorming a design spec, writing an implementation plan, then executing it task-by-task with subagent-driven TDD and code review before each merge.
MIT — see LICENSE.