From 3ccec3be103d8b2584b3a23e38db9c3b6e8fb843 Mon Sep 17 00:00:00 2001 From: Ryan Malloy Date: Tue, 17 Feb 2026 18:42:28 -0700 Subject: [PATCH] Publish birdcage-tui to PyPI, document TUI extras Bumped version to 2026.02.17, added classifiers/keywords/URLs. Documented camera extra (Pillow + astropy) in CLAUDE.md. Added TUI section with uvx usage and extras table. --- CLAUDE.md | 36 ++++++++++++++++++++++++++++++++++++ tui/pyproject.toml | 23 +++++++++++++++++++---- tui/uv.lock | 2 +- 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index f304c16..49f51d4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -768,6 +768,42 @@ This captures 8 SVG + 8 PNG screenshots plus a 2×3 collage: or screen content. The script populates Craft search results and tracking state directly via widget API for deterministic screenshots. +## TUI + +| Property | Value | +|----------|-------| +| PyPI | [`birdcage-tui`](https://pypi.org/project/birdcage-tui/) | +| Source | `tui/src/birdcage_tui/` | +| Entry point | `birdcage_tui.app:main` | +| Framework | [Textual](https://textual.textualize.io/) | +| Screens | Dashboard (F1), Control (F2), Signal (F3), System (F4), Console (F5), Camera (F6) | + +### Running + +```bash +# Published package (from PyPI) — no clone needed +uvx birdcage-tui --demo # demo mode, base install +uvx birdcage-tui # hardware mode (needs serial port) + +# With camera capture support (Pillow + astropy) +uvx --with 'birdcage-tui[camera]' birdcage-tui --demo + +# Local development +uv run --directory tui birdcage-tui --demo +``` + +### Extras + +| Extra | Install | Packages | Purpose | +|-------|---------|----------|---------| +| *(base)* | `uvx birdcage-tui` | `winegard-birdcage`, `textual` | Full TUI, all screens, demo mode | +| `camera` | `uvx --with 'birdcage-tui[camera]' birdcage-tui` | `Pillow>=10.0`, `astropy>=6.0` | F6 camera overlay: JPEG capture frames with annotated demo images (Pillow), FITS export for radio astronomy pipelines (astropy) | + +**Graceful degradation:** The camera screen (F6) works without the `camera` extra — it +falls back to writing minimal JPEG headers directly. Pillow adds annotated demo frames +and proper image processing; astropy adds FITS file export for integration with DS9, +CASA, and other radio astronomy tools. + ## MCP Server | Property | Value | diff --git a/tui/pyproject.toml b/tui/pyproject.toml index c775b1c..d74fea4 100644 --- a/tui/pyproject.toml +++ b/tui/pyproject.toml @@ -4,18 +4,33 @@ build-backend = "hatchling.build" [project] name = "birdcage-tui" -version = "2026.02.13" -description = "Textual TUI for Winegard Carryout G2 satellite dish control" +version = "2026.02.17" +description = "Textual TUI for Winegard satellite dish control and amateur radio sky tracking" license = "MIT" requires-python = ">=3.11" authors = [{name = "Ryan Malloy", email = "ryan@supported.systems"}] +keywords = ["satellite", "antenna", "winegard", "amateur-radio", "ham", "tui", "textual"] +classifiers = [ + "Development Status :: 4 - Beta", + "Environment :: Console", + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering", + "Topic :: Communications :: Ham Radio", +] dependencies = [ - "winegard-birdcage", + "winegard-birdcage>=2026.2.17", "textual>=1.0.0", ] [project.optional-dependencies] -camera = ["Pillow>=10.0", "astropy>=6.0"] +camera = [ + "Pillow>=10.0", # JPEG capture frames, annotated demo images + "astropy>=6.0", # FITS file export for radio astronomy pipelines +] + +[project.urls] +Repository = "https://git.supported.systems/warehack.ing/birdcage" +Documentation = "https://birdcage.warehack.ing" [project.scripts] birdcage-tui = "birdcage_tui.app:main" diff --git a/tui/uv.lock b/tui/uv.lock index 43882ae..9a7e6d8 100644 --- a/tui/uv.lock +++ b/tui/uv.lock @@ -36,7 +36,7 @@ wheels = [ [[package]] name = "birdcage-tui" -version = "2026.2.13" +version = "2026.2.17" source = { editable = "." } dependencies = [ { name = "textual" },