%global pkgname up-tray %global srcname up_tray Name: %{pkgname} Version: 0.5.0 Release: 1%{?dist} Summary: Qt6 system-tray replacement for Upbound's up CLI License: Apache-2.0 URL: https://github.com/jboero/up-tray Source0: %{pkgname}-%{version}.tar.gz BuildArch: noarch BuildRequires: python3-devel BuildRequires: python3-hatchling BuildRequires: pyproject-rpm-macros BuildRequires: desktop-file-utils Requires: python3 Requires: python3-pyqt6 Requires: python3-requests Requires: python3-pyyaml Requires: python3-kubernetes Requires: hicolor-icon-theme Recommends: python3-keyring Suggests: python3-anthropic Suggests: python3-grpcio Suggests: python3-protobuf Suggests: python3-docker %description up-tray is a small native PyQt6 system tray application that replicates the features of Upbound's `up` CLI without bundling a 250 MB Go binary. It talks directly to api.upbound.io for cloud operations and to the Kubernetes API on your Spaces clusters for Crossplane operations. %prep %autosetup -n %{pkgname}-%{version} %generate_buildrequires # -R: don't pull the project's runtime deps (PyQt6, kubernetes, ...) into the # buildroot. This is a noarch package and %check only does `import up_tray` # (which imports no GUI code), so the GUI stack need not be present to build. # Without -R the build fails on chroots that don't package PyQt6 (e.g. Amazon # Linux 2023, EL9). The runtime deps are still enforced via explicit Requires:. %pyproject_buildrequires -R %build %pyproject_wheel %install %pyproject_install %pyproject_save_files %{srcname} install -Dm0644 packaging/up-tray.desktop \ %{buildroot}%{_datadir}/applications/up-tray.desktop install -Dm0644 resources/up-logo.png \ %{buildroot}%{_datadir}/icons/hicolor/64x64/apps/up-tray.png desktop-file-validate %{buildroot}%{_datadir}/applications/up-tray.desktop %check %{python3} -c "import up_tray; print(up_tray.__version__)" %files -f %{pyproject_files} %license LICENSE %doc README.md %{_bindir}/up-tray %{_bindir}/up-tray-gui %{_datadir}/applications/up-tray.desktop %{_datadir}/icons/hicolor/64x64/apps/up-tray.png %post /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : %postun if [ $1 -eq 0 ] ; then /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : %{_bindir}/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : fi %posttrans %{_bindir}/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %changelog * Mon Aug 17 2026 Johnny Boero - 0.5.0-1 - AI assistant can now look things up itself: a new, separate opt-in lets it run read-only `up` and `kubectl` commands (including `up ctx` + `up ctp list` for Upbound Spaces and managed control planes) and read the real output instead of asking you to paste it. Enforced by an allowlist in the worker: anything that creates, deletes, applies, logs in, pipes or shells out is refused, and those runs use a throwaway kubeconfig so they cannot move your current context. - The AI snapshot now includes Upbound context — organizations, your role in each, and the active org's spaces — fetched with the profile's own token, so it works with no local cluster at all. - Model is a combobox pre-loaded from the provider (Anthropic Models API, or /v1/models on an OpenAI-compatible endpoint), still free-text for unlisted IDs. - Organization is picked from the organizations you actually belong to instead of free text, in both Create Profile and every Cloud action; a stored value the API does not recognise now offers the right one rather than failing with "no org by that name". - The three AI opt-ins are relabelled as a numbered ladder (read snapshot / run read-only commands / apply changes) — they were mutually confusable. - Fix: `up` subcommands were absent from the destructive-command scanner, so `up ctp delete` was reported as making no changes before deleting a hosted control plane. - Fix: AI-proposed commands were not actually pinned to the intended kube context (the exported variable was one nothing reads). - Fix: up-tray silently stripped the up CLI's `id`/`profileType` keys from the shared ~/.up/config.json on every login, and a stale keyring credential could shadow a fresh `up login` indefinitely. - Fix: the chat transcript no longer jumps to the top mid-reply; it stays pinned to the bottom while text streams, and stops following only if you scroll away. - Fix: all 16 locale files contained invalid JSON, so every translation had been falling back to English. - Known issue: Cloud > Control planes (list/create/delete/get kubeconfig) is broken — the REST paths return 404 against the current API. The assistant routes around it with `up ctp list`. * Tue Jul 14 2026 Johnny Boero - 0.4.0-1 - AI assistant: "Ask a Crossplane expert" chat (now a top-level tray entry) and per-resource "AI Help" that diagnoses an unhealthy resource and proposes a fix. Works with Claude (your own API key, via the optional python3-anthropic) or any OpenAI-compatible endpoint (vLLM/Ollama/llama.cpp) for airgapped and local use. Streams replies, supports reasoning models, answers in up-tray's configured language, and redacts secrets/tokens before anything is sent. - One-click remediation actions for unhealthy managed resources and packages. - Read access is opt-in and read-only by default; a separate, clearly-labelled opt-in enables cluster-modify mode. There the model proposes a kubectl command or manifest as a code block, generation halts on a stop marker (so it can't hallucinate the change already applied), and up-tray runs it only after you confirm — feeding the real output back into the conversation. * Fri Jul 10 2026 Johnny Boero - 0.3.0-1 - Deploy board: drag Marketplace packages onto one or more kube contexts to install them, fanning a Configuration/Provider/Function out to several clusters at once without switching the active context. - Fix marketplace listing: the /v2/search API ignores its packageType filter and pages at 500, so Configurations/Functions were shown as Providers. Paginate the full catalog (~800 pkgs) and filter by kind client-side. - Defer menu rebuilds while a modal dialog is open (fixes a SIGSEGV). - Translate all v0.2.2 strings (incl. the Modelplane guide) across 16 locales and add a CI coverage gate for missing keys / broken placeholders. * Tue Jul 07 2026 Johnny Boero - 0.2.2-1 - Modelplane guide: tri-state health checks and additional authoring starters (InferenceClass / InferenceCluster), plus a kind setup note. - New marketplace browse dialog. - Expand in-app translations to 16 languages. - Sync up_tray.__version__ to 0.2.2 (it lagged at 0.2.1). * Thu Jul 02 2026 Johnny Boero - 0.2.1-1 - Add a second Getting Started guide for Modelplane (AI inference), and split the in-app walkthrough into "Getting Started: Crossplane" and "Getting Started: Modelplane". The Modelplane guide covers GPU capacity, including the run-ai fake-gpu-operator fallback for CPU-only clusters. - Fix Getting Started help popups that ran off the right of the screen: render the long rich-text explainers in a bounded, word-wrapping, scrollable dialog instead of QMessageBox. * Wed Jul 01 2026 Johnny Boero - 0.2.0-2 - Build on Python 3.9 chroots (EL9, Amazon Linux 2023): lower requires-python to >=3.9 (code is already 3.9-compatible) and build with %%pyproject_buildrequires -R so the GUI runtime stack is not required at build time. * Fri Jun 26 2026 Johnny Boero - 0.2.0-1 - Modelplane support: managed-resource inventory, health monitor, in-app triage. - Fix blank tray icon in installed builds (bundle icon as package data). * Tue Apr 28 2026 Johnny Boero - 0.1.0-1 - Initial package: native Qt6 tray, no `up` binary required.