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.
This commit is contained in:
Ryan Malloy 2026-02-17 18:42:28 -07:00
parent 5a26dce075
commit 3ccec3be10
3 changed files with 56 additions and 5 deletions

View File

@ -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 or screen content. The script populates Craft search results and tracking state
directly via widget API for deterministic screenshots. 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 ## MCP Server
| Property | Value | | Property | Value |

View File

@ -4,18 +4,33 @@ build-backend = "hatchling.build"
[project] [project]
name = "birdcage-tui" name = "birdcage-tui"
version = "2026.02.13" version = "2026.02.17"
description = "Textual TUI for Winegard Carryout G2 satellite dish control" description = "Textual TUI for Winegard satellite dish control and amateur radio sky tracking"
license = "MIT" license = "MIT"
requires-python = ">=3.11" requires-python = ">=3.11"
authors = [{name = "Ryan Malloy", email = "ryan@supported.systems"}] 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 = [ dependencies = [
"winegard-birdcage", "winegard-birdcage>=2026.2.17",
"textual>=1.0.0", "textual>=1.0.0",
] ]
[project.optional-dependencies] [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] [project.scripts]
birdcage-tui = "birdcage_tui.app:main" birdcage-tui = "birdcage_tui.app:main"

2
tui/uv.lock generated
View File

@ -36,7 +36,7 @@ wheels = [
[[package]] [[package]]
name = "birdcage-tui" name = "birdcage-tui"
version = "2026.2.13" version = "2026.2.17"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "textual" }, { name = "textual" },