From 34e63c41c4a22e2a9b837a89a6693ed1ef554a6f Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Sun, 11 Jan 2026 20:09:07 -0800 Subject: [PATCH] Add quack easter egg and development docs Add a hidden 'quack' command that displays DuckTales ASCII art of Launchpad McQuack. Also document the development workflow in README, including how to run tests with uv and the optional venv setup. Co-Authored-By: Claude Opus 4.5 --- README.md | 32 ++++++++++++++++++++++++++++++++ mcquack.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/README.md b/README.md index 6e90576..d71a06a 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,38 @@ The generated plist configures the script to: - Keep alive (restart if it exits) - Log stdout/stderr to `~/Library/Logs/mcquack..{out,err}.log` +## Development + +mcquack uses [uv](https://github.com/astral-sh/uv) for dependency management. Thanks to the +uv shebang at the top of `mcquack.py`, you can always run the script directly without any +setup: + +```bash +./mcquack.py list +``` + +This works for users and developers alike—no virtual environment activation or `python` +command needed. uv handles everything automatically. + +### Running Tests + +```bash +uv run pytest +``` + +### Virtual Environment (Optional) + +If you prefer working in a virtual environment (e.g., for IDE support or running +`python mcquack.py` directly), you can create and activate one: + +```bash +uv venv +source .venv/bin/activate +``` + +After activation, `python mcquack.py` will work as expected. But again, `./mcquack.py` +always works without this step. + ## License MIT diff --git a/mcquack.py b/mcquack.py index 76bf347..dd7c48b 100755 --- a/mcquack.py +++ b/mcquack.py @@ -272,5 +272,48 @@ def delete( typer.echo(f"Deleted: {plist_path}") +@app.command(hidden=True) +def quack() -> None: + """Quack!""" + art = r""" + ___ _ _____ _ +| \ _ _ __| |_|_ _|_ _| |___ ___ +| |) | || / _| / / | |/ _` | / -_|_-< +|___/ \_,_\__|_\_\ |_|\__,_|_\___/__/ + + '' .``,l" + "[}ll1)f/1I + !__YpQm+:]", + ~>. ,i,i `!>~1cXUXvcLbccL_{1! . +YM) + :U1. . + ";|XmkodUf{?_?{xCCZw\[{[~>">{}{]{i + `>]11[][[)UmYrz+fx1}{{}<_]{{{{{?. + "I<___]+^Qo**h)}}]}{{}1+}1{}{{{< + `+}{{{{}]<|8Mkou?{{{{{}1?,~][[[?l + ;{{}}}[[]?v0r?|{{{{{{{1?` `^` + ![}{{}[]i .?{{[]}}~' + .,;;,` i]_fC|> + "{vxfXQcv{, + .>/zJJJCUXXXJz] + '?vYCCUXcvvvcXJJU> + !XJJYv\?>l::,I[Yu' + )C/l.