The Usage section showed the old argparse `./smileyface.py -h` output
(underscored command names, 'optional arguments', a stray 'Invalid
command' line) from before the Click rewrite. Replace it with the
actual Click command list - server build/deploy commands and the
scrape subgroup - plus a note on env/.env configuration.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add Python 3.8-3.13 multi-version support: pytest smoke-test suite,
uv+nox version matrix, importlib_resources backport for 3.8, declared
the previously-undeclared selenium dependency, Gitea Actions CI matrix,
and supporting docs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Address code review: the previous uv venv + uv pip + uv run sequence could run pytest in a different environment than the matrix Python. Use a single uv run --python ... --with . --with pytest invocation (mirrors noxfile). Also correct the stale Black target-version note in CLAUDE.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Document the project overview, commands, code style, and architecture
in CLAUDE.md, update the README for the Poetry/Click workflow, and add
local Claude Code permission settings.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drop the config.spec/configobj configuration in favour of an
AppSettings pydantic-settings model (settings.py) loaded from
SMILEYFACE_-prefixed env vars or a .env file. Introduce AppContext
(context.py) to carry settings plus logging, dispatch commands through
a Click CLI (cli.py), and centralise log setup (logging_setup.py).
Update hub_machine, datalayer, and scraping modules to consume the new
context. Add .env.example and ignore .env.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace setuptools/setup.py with Poetry as the build backend and
dependency manager. Bump the target runtime from Python 3.8 to 3.13
across .python-version, pre-commit, and the black/isort config.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>