Aplikacja na pasek menu macOS

Twoje MR-y, PR-y i zadania z Jiry. Zawsze na wierzchu.

MR Jira Menu Bar pokazuje na pasku menu, ile masz otwartych merge requestów, ile z nich czeka już na merge i co dzieje się z Twoimi zadaniami w Jirze — bez przełączania się do przeglądarki.

Darmowa · kod na GitHubie · macOS 13 Ventura lub nowszy · plik DMG

Pasek menu macOS z licznikami aplikacji i rozwiniętym menu: GitLab — 4 otwarte MR, 2 gotowe do mergu; GitHub — 3 otwarte PR, 1 approved; Jira — backlog 7, w toku 2, w testach 3, zaakceptowane 12, odrzucone 1.

Status pracy rozrzucony po trzech kartach przeglądarki

Kod leży w GitLabie albo na GitHubie, zadania w Jirze. Żeby sprawdzić, czy coś już można zmergować albo czy tester odbił zadanie, trzeba otworzyć kilka zakładek i przeklikać filtry.

Review, które czeka

Merge request dostał już dwa approve, a Ty nie wiesz o tym, dopóki sam nie zajrzysz do GitLaba.

Zadania, które wracają

Tester przeniósł zadanie z powrotem do „In Progress”. Łatwo to przegapić, a potem trudno policzyć, ile razy się zdarzyło.

Ciągłe przełączanie kontekstu

Każde „tylko sprawdzę” to wyjście z edytora. Liczby na pasku menu odpowiadają na to pytanie jednym spojrzeniem.

Co potrafi

Aplikacja działa w tle, bez ikony w Docku. Co 5 minut pobiera liczniki z włączonych źródeł i pokazuje je na pasku menu.

Liczniki prosto na pasku menu

Każdy licznik ma własną ikonę. Najedź kursorem, a zobaczysz podsumowanie w jednej linijce. Do wyboru:

  • GitLab — Twoje otwarte merge requesty i te gotowe do mergu (co najmniej 2 approve).
  • GitHub — Twoje otwarte pull requesty i te z approve.
  • Jira — backlog („To Do” / „Backlog”), zadania w toku, czekające w testach, zaakceptowane i odrzucone.
Liczniki na pasku menu: 4 otwarte MR, 2 gotowe do mergu, 3 otwarte PR, 1 approved, backlog 7, w toku 2, w testach 3, zaakceptowane 12, odrzucone 1.

Jedno kliknięcie do właściwej listy

Kliknięcie ikony rozwija menu z rozbiciem na źródła. Każda pozycja otwiera w przeglądarce odpowiedni widok: panel Twoich merge requestów w GitLabie, wyszukiwanie PR-ów na GitHubie albo gotowy filtr JQL w Jirze.

W menu widać też godzinę ostatniego odświeżenia. Skrót R odświeża dane od razu.

Rozwinięte menu aplikacji z sekcjami GitLab — moje MR, GitHub — moje PR i Jira, godziną ostatniego odświeżenia oraz pozycjami Odśwież teraz, Ustawienia i Zakończ.

Licznik odrzuceń, który nie znika

„Odrzucone” liczy każde zadanie, które kiedykolwiek wróciło z testów do poprawki — także jeśli później zostało zaakceptowane. Zadanie liczy się, gdy:

  • to Ty przeniosłeś je do statusu „Internal testing”,
  • następną zmianą statusu był powrót do „In Progress” wykonany przez kogoś innego,
  • przy włączonym GitLabie: istnieje Twój merge request z kluczem zadania, utworzony przed tym powrotem.

Nazwy statusów („To Do”, „Backlog”, „In Progress”, „Code review”, „Internal testing”) są wpisane w kod — aplikacja zakłada taki workflow w Jirze.

Skrócony pasek menu z czterema licznikami: 4 otwarte MR, 2 gotowe do mergu, 2 zadania w toku, 1 odrzucone.

Pokazujesz tylko to, czego potrzebujesz

W ustawieniach podajesz host i token dla każdego źródła. GitLab i GitHub możesz wyłączyć jednym przełącznikiem, a każdy z dziewięciu liczników osobno ukryć z paska — w menu nadal będzie widoczny.

  • Działa z własną instancją GitLaba, GitHub.com i GitHub Enterprise oraz Jirą w wersji Server / Data Center (token PAT).
  • Tokeny trafiają do pęku kluczy macOS (Keychain), zapisane w jednym zaszyfrowanym wpisie.
  • Opcja „Uruchamiaj przy starcie systemu”.
Okno ustawień z sekcjami Ogólne, GitLab, Jira, GitHub i Liczniki na pasku. Hosty gitlab.example.com i jira.example.com, tokeny ukryte.

Od razu widzisz, gdy coś nie działa

Jeśli źródło jest skonfigurowane, ale połączenie się nie udało, jego liczniki na pasku zmieniają się w czerwony symbol ostrzeżenia, a na górze menu pojawia się komunikat. Wygasły token rozpoznasz po czytelnym opisie błędu 401.

Pozostałe źródła działają dalej — awaria jednego nie blokuje reszty.

Pasek menu, na którym liczniki GitLaba zastąpiono czerwonymi symbolami ostrzeżenia z kreską. Menu z czerwonym komunikatem „Nie udało się połączyć (mimo konfiguracji)” i błędem „GitLab 401 — token wygasł lub został zmieniony”.

Aktualizacje bez szukania

Co 6 godzin aplikacja sprawdza najnowsze wydanie na GitHubie. Gdy pojawi się nowsza wersja, w menu zobaczysz pozycję „Nowa wersja … — pobierz”, która ściąga plik DMG do folderu Pobrane i od razu go otwiera.

Menu z dodatkową pozycją na górze: „Nowa wersja 1.5.0 — pobierz” z ikoną strzałki w dół.

Jak to działa

Trzy kroki od pobrania do pierwszych liczników.

  1. Zainstaluj

    Pobierz plik DMG z najnowszego wydania i przeciągnij aplikację do folderu Aplikacje.

  2. Podaj hosty i tokeny

    Przy pierwszym uruchomieniu na pasku pojawia się ikona zębatki i otwierają się ustawienia. Uzupełnij dane przynajmniej jednego źródła i kliknij „Zapisz”.

  3. Zerkaj na pasek

    Liczniki odświeżają się co 5 minut. Kliknij ikonę, żeby zobaczyć szczegóły albo przejść do listy w GitLabie, na GitHubie lub w Jirze.

Obecne wydanie (v1.4.0) nie jest podpisane certyfikatem Developer ID ani notaryzowane, więc macOS zablokuje pierwsze uruchomienie. Otwórz wtedy Ustawienia systemowe → Prywatność i ochrona i kliknij „Otwórz mimo to” (na starszych wersjach macOS: prawy przycisk na aplikacji → „Otwórz”).

Dla developerów

Natywna aplikacja w Swifcie, bez zewnętrznych zależności. Logika jest oddzielona od interfejsu i pokryta testami jednostkowymi.

  • Swift 5.9
  • AppKit (NSStatusItem)
  • SwiftUI
  • Swift Package Manager
  • CryptoKit
  • ServiceManagement
  • XCTest
  • GitHub Actions

Uruchomienie lokalne

Wymagany macOS 13+ i Xcode (Swift 5.9+).

git clone https://github.com/jash90/mr-jira-menubar.git
cd mr-jira-menubar
swift run MRJiraMenuBar      # tryb deweloperski
swift test                   # testy MenuBarCore
scripts/build-app.sh         # .app + DMG w dist/

Aplikacja nie ma zmiennych środowiskowych — hosty i tokeny podajesz w oknie ustawień. Zakończysz ją z menu ( Q).

Struktura i API

Sources/MenuBarCore — logika oparta tylko na Foundation (klienty API, StatusStore, StatusFormatter, ustawienia, aktualizacje). Sources/MRJiraMenuBar — interfejs AppKit/SwiftUI.

ŹródłoAPI i autoryzacja
GitLabREST API v4, nagłówek PRIVATE-TOKEN
GitHubSearch API, token Bearer; dla GitHub Enterprise ścieżka /api/v3
JiraREST API v2 (wyszukiwanie JQL i changelog), token PAT jako Bearer

Wydania buduje workflow release.yml i dołącza DMG do release na GitHubie. Podpis Developer ID i notaryzacja włączają się, gdy w sekretach repozytorium jest certyfikat — bez niego build jest podpisany ad hoc.