macOS desktop companion
Glina Desktop is a separate SwiftUI client in the glina-desktop repository. It does not reimplement pipeline jobs and keeps no Glina process running: every operation is one finite run of the installed glina CLI.
Command lifecycle
GlinaCommand searches PATH first, then:
~/.stado/bin/glina~/.local/bin/glina/opt/homebrew/bin/glina/usr/local/bin/glina
For each operation the app starts one glina process, streams stdout and stderr into the live log, and waits for it to exit. The exit status and final JSON document are the result. A failed workspace import shows the JSON report's reason; other failures show stderr or the failed doctor checks. A missing executable is reported as Glina is not installed. and the panel offers Retry.
Client mappings
| Window action | Command |
|---|---|
| Check config | glina config check |
| Doctor | glina doctor |
| Setup | glina setup [--check] [--dry-run]; the two toggles are the two flags, check-only on by default so a click installs nothing |
| Export Config | glina config export --out <path> |
| Sculpt | glina sculpt <prompt> --rounds <n> |
| Create | glina create <prompt> [--race <race>] |
| Verify | glina verify <path> |
| Animate | glina animate [<path>] --preset <name>; an empty path animates the active imported asset |
| Showcase | glina showcase <asset> |
| Declarations | glina showcases|presets list, … add <name> <file.json>, … remove <name> |
| Animation preview | glina preview anim <path> [--clip <name>] |
| Import | glina import <file.glb> [--variant-of <base-id>]; the Assets and Check Config screens accept the optional base id |
| Workspace | glina workspace list|select <id>|remove <id>; variants are shown with variantOf, and base removal refuses while variants remain |
| Scene preview | glina preview scene <file.glb>; Assets offers Preview in scene on a GLB, displays a decoded PNG, and reports a refused Blender render, missing path or unreadable image instead of claiming success |
A failed doctor check exits 1 with the report on stdout; the window shows the failed checks, each as <name>: <error>, taken from the report itself rather than from the bridges' stderr chatter.
Import existing assets
Import runs glina import, so the window and CLI verify and activate the same asset. A variant names an existing base id; a refused parent or failed gate leaves existing data untouched and displays the report's reason. The accepted destination becomes the Assets directory, animation selection and Verify input. The Assets gallery renders a selected GLB on neutral ground through the same Blender bridge, then retains the decoded image for display; animation preview remains a separate GIF operation.