SeaMeet Desktop jest tutaj — Nagrywaj wszystko, nie przegap niczego. Pobierz za darmo →

Konfiguracja GitHub Sync

Rozdział 38: Konfiguracja GitHub Sync

GitHub Sync zamienia Twoje środowisko pracy SeaMeet w prywatne, kontrolowane wersjami drzewo Markdown, które żyje w Twoim własnym repozytorium GitHub. Za każdym razem, gdy edytujesz notatkę, zmieniasz nazwę nagrania lub poprawiasz stronę wiki, SeaMeet po cichu commituje zmianę w tle i wypycha ją do GitHub. Otwórz SeaMeet na innym laptopie, a Twoje notatki zostaną pobrane przy pierwszym uruchomieniu — bez Dropboxa pośrodku, bez serwera Seasalt w pętli. Repo jest Twoje, dane są Twoje i możesz je przeglądać bezpośrednio na github.com, jeśli kiedykolwiek zechcesz.

Model jest prosty: Twoje repozytorium GitHub to magazyn. SeaMeet nie uruchamia usługi synchronizacji. Instaluje małą aplikację GitHub na Twoim koncie, otrzymuje per-użytkownik token OAuth i używa tego tokenu do wypychania i pobierania commitów Git bezpośrednio. Ponieważ magazyn to darmowy poziom GitHub — który daje Ci nieograniczone prywatne repozytoria — synchronizacja jest praktycznie darmowa. A ponieważ każde środowisko pracy SeaMeet to własne repozytorium, możesz całkowicie oddzielić środowiska pracy i osobiste.


Cele rozdziału

Po przeczytaniu tego rozdziału będziesz w stanie:

  • Zainstalować SeaMeet GitHub App na swoim koncie lub organizacji
  • Autoryzować SeaMeet przez OAuth i pozwolić mu utworzyć prywatne repozytorium synchronizacji
  • Przeczytać pasek statusu synchronizacji i zrozumieć każdy stan w maszynie stanów synchronizacji
  • Rozpoznać, kiedy OAuth automatycznie się odświeżył w tle i kiedy musisz ręcznie ponownie autoryzować
  • Rozwiązać konflikt synchronizacji, gdy ta sama notatka została edytowana na dwóch urządzeniach
  • Dostroić panel Sync Settings (auto-sync, interwał synchronizacji, sync on startup)
  • Rozwiązać najczęstsze tryby awarii

Wymagania wstępne

Przed rozpoczęciem upewnij się, że masz:

  • Konto GitHub — darmowy poziom jest w porządku; nie potrzebujesz GitHub Pro
  • Aktywne uprawnienie sync — dołączone do poziomów BYOK Pro i Sync Pro. Jeśli Twój poziom rozliczeniowy nie obejmuje synchronizacji, ekran ustawień Sync pokaże baner "Subscribe to enable sync". Zobacz Rozdział 35: Subskrypcja i rozliczenia dla szczegółów planu.
  • Środowisko pracy otwarte w SeaMeet — synchronizacja przyłącza się do aktywnego środowiska pracy, nie do aplikacji jako całości. Jeśli masz wiele środowisk pracy, każde to własne repozytorium GitHub.
  • Działający dostęp do internetu — przepływ konfiguracji otwiera GitHub w domyślnej przeglądarce

Jedno repo na środowisko pracy. SeaMeet tworzy osobne prywatne repozytorium dla każdego środowiska pracy, które łączysz. To utrzymuje notatki służbowe i osobiste czysto oddzielone i oznacza, że możesz odłączyć jedno bez wpływu na drugie.


Konfiguracja krok po kroku

Pierwsza konfiguracja zajmuje około 90 sekund: autoryzuj SeaMeet na GitHub, pozwól mu utworzyć repo, zaczekaj na początkowe przesłanie i gotowe.

Krok 1: Otwórz ustawienia Sync

  1. Kliknij ikonę koła zębatego Settings
  2. Otwórz kartę Sync w lewej szynie
  3. Zobaczysz kartę nagłówka "Sync with GitHub"

Jeśli nie widzisz karty Sync, Twój poziom subskrypcji nie obejmuje synchronizacji — zobacz Rozdział 35, aby uaktualnić.

Jeśli widzisz baner, który mówi "Back up your notes to a private GitHub repo with BYOK Pro", masz darmowe konto. Kliknij baner, aby otworzyć paywall, lub pomiń resztę tego rozdziału, dopóki nie zasubskrybujesz.

Krok 2: Kliknij "Set Up GitHub Sync"

Pusty stan Sync Settings pokazuje trzy kafelki z korzyściami ("Free & private", "Effectively unlimited", "One repo per workspace") i główny przycisk Set Up GitHub Sync na dole.

Kliknij go. Twoja domyślna przeglądarka otwiera stronę autoryzacji GitHub.

Krok 3: Zainstaluj SeaMeet GitHub App (jednorazowo)

Pierwszy raz, gdy autoryzujesz SeaMeet, GitHub poprosi Cię o zainstalowanie SeaMeet GitHub App na Twoim koncie. To jednorazowy krok na konto GitHub (lub na organizację, jeśli chcesz synchronizować do repo organizacji).

Na stronie instalacji GitHub:

  1. Wybierz konto lub organizację, do której chcesz pozwolić SeaMeet pisać
  2. Wybierz albo "All repositories", albo "Only select repositories" — SeaMeet App potrzebuje uprawnień contents: write i administration: write, aby mógł utworzyć repo synchronizacji w Twoim imieniu
  3. Kliknij Install & Authorize

GitHub odsyła Cię z powrotem do SeaMeet. Panel Sync Settings pokazuje teraz:

┌──────────────────────────────────────────────────────┐
│   ✓ Authorized                                       │
│   ⟳ Creating repository & uploading...               │
└──────────────────────────────────────────────────────┘

Dlaczego GitHub App, a nie zwykły token OAuth? GitHub Apps mają drobnoziarniste uprawnienia per-repo i rotujące refresh tokens. SeaMeet ma zawsze dostęp do zapisu tylko do repozytoriów, które jawnie wybrałeś, a token dostępu OAuth wygasa co 8 godzin — nawet jeśli wycieknie, okno byłoby małe. (Zobacz sekcję OAuth Auto-Refresh poniżej, jak SeaMeet utrzymuje to niewidocznym dla Ciebie.)

Krok 4: Tworzenie repozytorium (automatyczne)

SeaMeet teraz wywołuje API GitHub w Twoim imieniu i:

  1. Tworzy prywatne repo nazwane po Twoim środowisku pracy (np. seameet-work-notes)
  2. Inicjuje lokalne repo Git wewnątrz folderu środowiska pracy, jeśli jeszcze nie istnieje
  3. Uruchamia git init, pisze .gitignore, który wyklucza pliki audio/wideo/zrzutów ekranu, i wykonuje początkowy commit
  4. Dodaje nowe repo GitHub jako origin
  5. Wypycha początkowy commit

Zobaczysz pasek statusu na dole paska bocznego przechodzący przez:

Creating repository...  →  Syncing...  →  Synced · just now

To wszystko. Twoje środowisko pracy jest teraz wspierane przez GitHub.

Krok 5: Pierwsza synchronizacja działa automatycznie

Od teraz SeaMeet auto-commituje co 5 minut (domyślnie), gdy masz niezapisane zmiany, i wypycha do GitHub natychmiast po każdym commicie. Przy następnym uruchomieniu SeaMeet aplikacja pobiera z GitHub, zanim zaczniesz edytować — więc zmiany dokonane na innym urządzeniu pojawiają się w chwili otwarcia aplikacji.


Maszyna stanów synchronizacji

SyncManager SeaMeet uruchamia małą maszynę stanów i transmituje swój aktualny stan do renderera. Pasek boczny SyncStatusBar i panel Sync Settings oba czytają z tego stanu. Zrozumienie stanów pomaga dokładnie czytać UI.

                      ┌─────────────┐
                      │    idle     │ ◄──────┐
                      └──────┬──────┘        │
                             │ file change   │
                             ▼               │
                      ┌─────────────┐        │
                ┌────►│   pending   │        │
                │     └──────┬──────┘        │
       file     │            │ commit timer  │
       change   │            ▼               │
                │     ┌─────────────┐        │
                │     │ committing  │        │
                │     └──────┬──────┘        │
                │            ▼               │
                │     ┌─────────────┐        │
                │     │   pushing   │        │
                │     └──────┬──────┘        │
                │            ▼               │
                │     ┌─────────────┐        │
                │     │   synced    │── 5s ──┘
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤   pulling   │  (startup or push-rejected)
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤  conflict   │  → user resolves → syncing → synced
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤   offline   │  → network back → retry
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤   timeout   │  → user clicks Retry
                │     └─────────────┘
                │
                │     ┌────────────────┐
                └─────┤ token-expired  │ → re-authorize card
                      └────────────────┘

Oto, co oznacza każdy stan w UI:

StanEtykieta paska statusuCo to znaczy
idle"Synced · 2 min ago"Nic w toku, ostatni commit był czysty
pending"Pending..."Masz niezapisane zmiany; timer commit uruchomi się w następnym interwale
committing"Syncing..."Commit Git jest w trakcie lokalnie
pushing"Pushing..."Lokalny commit kompletny; wypychanie do GitHub
pulling"Pulling..."Albo synchronizacja startowa, albo push został odrzucony i najpierw pobieramy
syncing"Syncing..."Kończenie rebase po rozwiązaniu konfliktu
synced"Synced · just now"Właśnie ukończony sukces; pokazywane przez 5 sekund, potem wraca do idle
conflict"Sync conflict"Lokalny i zdalny edytowali tę samą plik. UI pokazuje przepływ rozwiązywania konfliktów.
error"Sync error"Awaria nie-sieciowa, nie-konfliktowa (np. awaria git). Auto-ponawia z wykładniczym backoff do 5 razy.
offline"Offline"Sieć nieosiągalna. Ponowi przy następnej zmianie pliku lub po 60 sekundach.
timeout"Sync timed out"Komenda git zajęła dłużej niż 60 sekund (zobacz Sync Timeout Protection poniżej)
token-expired"Re-authorize"Odświeżenie OAuth zawiodło i użytkownik musi ręcznie autoryzować ponownie
installing-app"Installing GitHub App..."Czekanie, aż użytkownik zakończy krok instalacji GitHub App w swojej przeglądarce
creating-repo"Creating repository..."Przepływ konfiguracji tworzy repo GitHub i wypycha początkowy commit

Jeśli pasek statusu pokazuje spinner, to normalna aktywność w tle. Jeśli jest bursztynowy lub czerwony, zobacz sekcję Rozwiązywanie problemów poniżej.


Auto-odświeżanie OAuth

GitHub Apps wydają tokeny dostępu użytkownika, które wygasają co 8 godzin, plus refresh token, który jest ważny przez 6 miesięcy. SeaMeet zarządza tym za Ciebie, więc prawie nigdy nie musisz o tym myśleć.

Jak to działa:

  1. Gdy SeaMeet ma zamiar wypchnąć lub pobrać, SyncManager._refreshTokenIfNeeded() sprawdza, czy aktualny token wygasa w ciągu następnych 5 minut.
  2. Jeśli tak, SeaMeet wywołuje endpoint /login/oauth/access_token GitHub z zapisanym refresh tokenem. GitHub zwraca nowy access token i rotuje refresh token. SeaMeet zapisuje oba z powrotem do zaszyfrowanego pliku tokenu na dysku.
  3. Komenda Git następnie uruchamia się ze świeżo odświeżonym tokenem. Nic nie widzisz na ekranie — całe odświeżenie zajmuje dobrze poniżej sekundy.

Obsługa awarii przejściowych: Jeśli wywołanie odświeżenia zawiedzie, ponieważ sieć jest niestabilna lub GitHub zwrócił 5xx (a REFRESH_NETWORK_ERROR), SeaMeet nie wyrzuca istniejącego tokenu. Zamiast tego synchronizacja przechodzi w stan offline i próbuje ponownie później. To ma znaczenie, ponieważ istniejący token może być nadal ważny przez kilka minut — odrzucanie go przy przejściowej usterce sieciowej niepotrzebnie wylogowałoby Cię z synchronizacji.

Łączenie współbieżnych odświeżeń: GitHub rotuje refresh token za każdym razem, gdy go używasz, więc dwa współbieżne odświeżenia ścigałyby się, a jedno unieważniłoby drugie. SeaMeet zwija współbieżne wywołania odświeżenia w pojedynczy in-flight Promise (_refreshPromise), więc startup-sync i push-with-retry nigdy nie walczą o rotujący token.

Kiedy odświeżenie naprawdę zawodzi: Jeśli GitHub zwróci REFRESH_TOKEN_EXPIRED — co oznacza, że 6-miesięczny refresh token wygasł lub został odwołany — SeaMeet:

  1. Usuwa zaszyfrowany plik tokenu z dysku
  2. Wchodzi w terminal stan token-expired
  3. Pokazuje bursztynową kartę w Sync Settings:
┌──────────────────────────────────────────────────────┐
│ ⚠  GitHub authorization has expired. Please           │
│    re-authorize to resume syncing.                    │
│                                                       │
│  [ ↻ Re-authorize GitHub ]                            │
└──────────────────────────────────────────────────────┘

Kliknij Re-authorize GitHub. Zostaniesz odesłany z powrotem przez przepływ OAuth — ale ponieważ GitHub App jest już zainstalowane, to pojedyncze kliknięcie do potwierdzenia i zajmuje około 10 sekund. SeaMeet następnie usuwa zaktualne tokeny z Twojego lokalnego git config (stary token może być wbudowany w URL origin) przed następnym push, więc nie zapętlasz się na martwych poświadczeniach.


Ochrona przed Timeout synchronizacji

Komendy Git mogą zawiesić się na zawsze, jeśli sieć ucichnie w trakcie transferu — gniazdo TCP może siedzieć w stanie half-open bez podnoszenia błędu. SeaMeet zawija każde Git push i pull w 60-sekundowy timeout AbortController.

Jeśli push lub pull nie zakończy się w 60 sekund, SeaMeet:

  1. Przerywa subproces git
  2. Wchodzi w stan timeout
  3. Pokazuje bursztynową kartę w Sync Settings:
┌──────────────────────────────────────────────────────┐
│ ⚠  Sync timed out. This may be caused by a network   │
│    issue or expired GitHub authorization.             │
│                                                       │
│  [ ↻ Retry Sync ]   [ Re-authorize GitHub ]           │
└──────────────────────────────────────────────────────┘

Retry Sync uruchamia commitNow ponownie. To jest właściwy przycisk do kliknięcia, jeśli myślisz, że Twoja sieć właśnie krótko spadła. Re-authorize GitHub ponownie uruchamia przepływ OAuth; kliknij to, jeśli timeout się powtarza, co zwykle oznacza, że Twój token jest problemem, a nie sieć.

Status wraca do idle automatycznie po około 30 sekundach, nawet jeśli niczego nie klikniesz — synchronizacja ponowi przy następnej zmianie pliku.


Rozwiązywanie konfliktów

Konflikt zdarza się, gdy ten sam plik został edytowany na dwóch urządzeniach od ostatniej synchronizacji. Przykład: napisałeś akapit w meetings/2026-06-03-standup.md na swoim laptopie, potem później edytowałeś ten sam akapit na maszynie przyjaciela. Gdy drugie urządzenie wypycha, GitHub odrzuca push, ponieważ historie się rozchodzą.

SeaMeet obsługuje to przez:

  1. Pobranie zdalnych zmian z rebase
  2. Wykrycie markerów konfliktu scalania
  3. Wejście w stan conflict
  4. Pokazanie konfliktu w pasku statusu paska bocznego (który staje się klikalny) i w panelu konfliktu Sync Settings

Kliknięcie paska statusu, gdy synchronizacja jest w conflict, otwiera Modal rozwiązywania konfliktów:

┌──────────────────────────────────────────────────────────┐
│  ⚠  Sync Conflict                    1 / 2          [×]  │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  "2026-06-03-standup.md" was changed on another device.  │
│                                                          │
│  ┌────────────────────────┐  ┌────────────────────────┐  │
│  │ ✎  Edit manually       │  │ ✦  Agent merge         │  │
│  └────────────────────────┘  └────────────────────────┘  │
│                                                          │
└──────────────────────────────────────────────────────────┘

Masz dwie opcje:

Edit manually — otwiera plik konfliktu w domyślnym edytorze systemu ze standardowymi markerami Git <<<<<<< / ======= / >>>>>>> na miejscu. Edytuj plik, aby je rozwiązać, zapisz, potem wróć do SeaMeet i kliknij Done. SeaMeet stage'uje rozwiązany plik i kontynuuje rebase.

Agent merge (tylko BYOK Pro, wymaga skonfigurowanego AI Agent) — wysyła obie wersje do skonfigurowanego AI Agent (GitHub Copilot lub Claude Code, zobacz Rozdział 36: Przewodnik konfiguracji BYOK) i prosi go o wyprodukowanie scalonej wersji, która zachowuje intencję obu stron. Wyjście agenta jest stage'owane automatycznie; zobaczysz spinner "Finishing sync..." podczas kończenia rebase.

Jeśli jest wiele konfliktów naraz, modal pokazuje licznik (1 / 2, 2 / 2) i strzałki chevron w panelu konfliktu Sync Settings, więc możesz przejść przez nie jeden po drugim.

Opcje "Keep mine" / "Keep theirs" / "Keep both" pojawiają się jako naturalne wybory, gdy jesteś wewnątrz manualnego edytora: pozostaw tylko tekst Twojej wersji między markerami, tylko tekst zdalnej wersji lub przepleć oba. Przycisk Agent merge efektywnie robi "keep both, intelligently."

Co jeśli popełnisz błąd? Konflikty synchronizacji są nieniszczące. Git zachowuje oryginalną zawartość "ours" i "theirs" w indeksie, a getConflictVersions(filePath) może odzyskać każdą z nich w dowolnym momencie podczas rozwiązywania. Nie stracisz przypadkowo pracy.


Panel Sync Settings

Gdy jesteś już połączony, Sync Settings (Ustawienia → Sync) daje Ci jeden ekran ze wszystkim w jednym miejscu:

┌─────────────────────────────────────────────────────────────┐
│  ✓ Sync & Backup                                            │
│  Your notes and wiki are automatically synced to GitHub.    │
│  Audio recordings, video recordings, and screenshots are    │
│  not synced.                                                │
├─────────────────────────────────────────────────────────────┤
│  ⓘ  https://github.com/you/seameet-work-notes                │
│  🕒 Last sync: 4 minutes ago                                 │
├─────────────────────────────────────────────────────────────┤
│  Auto-sync                                       [ ON  ◉ ]  │
│  Sync interval                                  [ 5 min ▾ ] │
│  Branch                                              main   │
│  Last synced                                  4 minutes ago │
├─────────────────────────────────────────────────────────────┤
│  Auto-sync on changes                            [ ON  ◉ ]  │
│  Sync on startup                                 [ ON  ◉ ]  │
├─────────────────────────────────────────────────────────────┤
│  [ ⤓ Sync Now ]                                             │
├─────────────────────────────────────────────────────────────┤
│  [ ↗ View on GitHub ]    [ Disconnect ]                     │
└─────────────────────────────────────────────────────────────┘

Kontrolki, od góry do dołu:

  • Auto-sync — główny przełącznik dla timera commit w tle. Wyłączony oznacza, że SeaMeet commit tylko po kliknięciu Sync Now.
  • Sync interval — jak często timer commit się uruchamia. Wybory to 1 / 5 / 10 / 30 minut. Domyślnie 5 minut. 1-minutowy interwał jest w porządku dla aktywnego robienia notatek; 30 minut jest dobre dla środowisk pracy o niskiej liczbie edycji, gdzie wolałbyś wsadowo wykonywać commity.
  • Branch — gałąź Git, do której SeaMeet synchronizuje. Prawie zawsze main. Tylko do odczytu w UI.
  • Last synced — względny znacznik czasu ostatniego udanego push.
  • Auto-sync on changes — gdy włączone, push odbywają się natychmiast po każdym lokalnym commicie (typowy przypadek). Gdy wyłączone, SeaMeet commit lokalnie, ale wypycha tylko po kliknięciu Sync Now. Przydatne, jeśli chcesz wsadowo wykonywać push (np. na mierzonym połączeniu).
  • Sync on startup — gdy włączone, SeaMeet pobiera z GitHub w momencie uruchomienia aplikacji. Zalecane, chyba że masz bardzo wolne połączenie.
  • Sync Now — wymusza natychmiastowy cykl commit-and-push. Nie czeka na timer. Przydatne przed zamknięciem laptopa.
  • View on GitHub — otwiera repo w przeglądarce.
  • Disconnect — czyści zapisany token OAuth, usuwa zaszyfrowany plik tokenu i usuwa origin z lokalnego repo Git. Twoje lokalne pliki Markdown i historia Git są nietknięte — tylko link do GitHub jest przerwany.

Co jest synchronizowane (a co nie)

To jest udokumentowane w indeksie części, ale warto powtórzyć tutaj:

SynchronizowaneNie synchronizowane
Notatki (pliki .md)Nagrania audio (.webm, .mp3)
Strony wiki (pliki .md)Nagrania wideo (.webm, .mp4)
Manifesty nagrań (JSON metadanych)Zrzuty ekranu (.png, .jpg)
Podsumowania AI i transkrypcjeBuforowane generacje AI
Wykres WikilinkówUstawienia aplikacji
.gitignoreStan brudnopisu edytora

.gitignore, który pisze SeaMeet, wyklucza wszystkie duże kategorie binarne. To jest celowe: prywatne darmowe repozytoria GitHub mają limit 1 GB, a 30-minutowy film zjadłby to samodzielnie. SeaMeet trzyma media na lokalnym dysku i synchronizuje tylko lekki Markdown.

Jeśli chcesz pełną synchronizację mediów, to poziom Sync Pro — zobacz Rozdział 35.


Rozwiązywanie problemów

"Authorization failed" zaraz po kliknięciu Set Up GitHub Sync

Przyczyny i poprawki:

  • Bloker pop-up — jeśli żadne okno przeglądarki się nie otworzyło, Twój OS lub przeglądarka mogły zablokować uruchomienie. Kliknij Set Up GitHub Sync ponownie i potwierdź wszelkie monity pop-up.
  • Odrzuciłeś uprawnienia GitHub App — wróć przez przepływ i zaakceptuj zakresy contents: write + administration: write. Bez administration: write SeaMeet nie może utworzyć dla Ciebie repo.
  • Błąd niezgodności stanu — zamknij wszelkie inne okna SeaMeet, które mogą ścigać się w tym samym przepływie OAuth, następnie ponów.

Błąd "Repo permissions" podczas konfiguracji

Błąd brzmi mniej więcej "GitHub App has 'contents: read' permission, but needs 'contents: write'." To oznacza, że zainstalowałeś starszą wersję App.

Napraw:

  1. Otwórz github.com/settings/installations
  2. Znajdź SeaMeet na liście i kliknij Configure
  3. W sekcji Repository permissions zmień Contents i Administration na Read and write
  4. Zapisz, następnie odinstaluj i ponownie zainstaluj aplikację — GitHub stosuje nowe uprawnienia tylko przy ponownej instalacji
  5. Ponownie uruchom Set Up GitHub Sync w SeaMeet

"Could not reach GitHub" / synchronizacja utknęła na "Offline"

Awaria sieci. SeaMeet automatycznie ponowi, gdy:

  • Wykonasz dowolną zmianę pliku (uruchamia natychmiastową próbę ponowienia)
  • Mija 60 sekund od ostatniej próby ponowienia

Jeśli Twoja sieć wróciła i synchronizacja nadal pokazuje Offline po kilku minutach:

  1. Kliknij Sync Now, aby wymusić ponowienie
  2. Jeśli to przekracza limit czasu: sprawdź, czy zapora nie blokuje github.com
  3. W ostateczności zrestartuj SeaMeet — synchronizacja startowa uruchomi się przy starcie

Synchronizacja utknęła na "Pending"

To zwykle oznacza, że timer auto-commit jeszcze się nie uruchomił. Domyślnie uruchamia się co 5 minut. Nie chcesz czekać? Kliknij Sync Now.

Jeśli Sync Now nie ruszy synchronizacji poza Pending, sprawdź:

  • Czy jesteś na poziomie rozliczeniowym, który obejmuje synchronizację? Otwórz Sync Settings — jeśli widzisz baner subskrybuj, synchronizacja jest wyłączona na poziomie uprawnień.
  • Czy są niezatwierdzone zmiany poza drzewem Markdown? Timer auto-commit uruchamia się tylko, gdy _pendingChanges jest niepuste.

"Widzę kartę token-expired"

To oczekiwany koniec cyklu życia odświeżania OAuth — Twój 6-miesięczny refresh token wygasł, albo odwołałeś GitHub App, albo zmieniłeś hasło GitHub (co unieważnia wszystkie tokeny OAuth).

Napraw: kliknij Re-authorize GitHub w karcie. Przepływ jest taki sam jak początkowa konfiguracja, ale pomija krok instalacji GitHub App (już go masz zainstalowany). Zajmuje około 10 sekund.

Panel rozwiązywania konfliktów nie zamknie się

Panel zamyka się dopiero po rozwiązaniu wszystkich konfliktów na liście. Jeśli widzisz licznik (1 / 3), użyj strzałek chevron w panelu konfliktu Sync Settings, aby przejść przez pozostałe pliki. Każdy potrzebuje jawnego rozwiązania (manualna edycja + Done lub Agent merge).

Jeśli panel utrzymuje, że są konflikty, ale nie widzisz żadnych markerów w plikach, kliknij Sync Now — zaktualny stan conflict zostanie wyczyszczony przy następnej udanej próbie synchronizacji.

Pętle "Push rejected"

Jeśli synchronizacja na przemian pushing i pulling wielokrotnie, GitHub odrzuca Twoje push, ponieważ zdalny ciągle idzie do przodu. To może się zdarzyć, jeśli:

  • Inna instancja SeaMeet działa przeciwko temu samemu repo i wypycha szybciej niż ta może nadążyć — zamknij drugą instancję.
  • Ktoś (lub jakieś narzędzie) commituje do repo GitHub spoza SeaMeet — wstrzymaj zewnętrzne narzędzie, aż lokalny klon nadrobi zaległości.

Uwagi bezpieczeństwa

Gdzie jest przechowywany token OAuth: w pęku kluczy OS przez API safeStorage Electrona. Na Windows to DPAPI, na macOS to Keychain Services, na Linux to libsecret. Zaszyfrowany blob jest zapisywany w <userData>/github-token.enc z trybem pliku 0o600. Plik zawiera access token, refresh token, znacznik czasu wygaśnięcia oraz client ID, client secret i slug GitHub App.

Czego nie ma w argv: token OAuth nigdy nie jest przekazywany jako argument -c http.extraHeader=... do git, ponieważ argv jest widoczne dla innych użytkowników przez ps aux. Zamiast tego nagłówek Authorization jest wstrzykiwany przez zmienną środowiskową GIT_CONFIG_PARAMETERS, która jest prywatna dla procesu. Inni użytkownicy tej samej maszyny nie mogą zobaczyć Twojego tokenu.

Co kończy się na dysku w repo: zwykłe pliki Markdown. Bez tokenów, bez sekretów, bez poświadczeń. .gitignore wyklucza pliki mediów, ale nadal powinieneś unikać wklejania sekretów do treści notatek — te będą synchronizowane.

Odwoływanie dostępu: aby natychmiast odciąć dostęp SeaMeet do repo, odinstaluj SeaMeet GitHub App w github.com/settings/installations. Następna próba synchronizacji zawiedzie z token-expired, a SeaMeet wyczyści swój lokalny token. Twoje lokalne notatki pozostają nietknięte.


Szybkie odniesienie

┌─────────────────────────────────────────────────────────────┐
│                   GITHUB SYNC                               │
│                   Quick Reference                           │
├─────────────────────────────────────────────────────────────┤
│  Open Sync Settings    │ Settings → Sync                    │
│  First-time setup      │ Click "Set Up GitHub Sync"         │
│  Required scopes       │ contents: write, admin: write      │
│  Repo naming           │ One private repo per workspace     │
├─────────────────────────────────────────────────────────────┤
│  Default sync interval │ 5 minutes (1 / 5 / 10 / 30)        │
│  Force a sync          │ "Sync Now" button                  │
│  Auto-sync on push     │ On (toggle in Sync Settings)       │
│  Sync on startup       │ On (toggle in Sync Settings)       │
├─────────────────────────────────────────────────────────────┤
│  OAuth refresh margin  │ 5 minutes before expiry            │
│  Git command timeout   │ 60 seconds (AbortController)       │
│  Auto-retry limit      │ 5 attempts, exp. backoff           │
│  Token storage         │ OS keychain (safeStorage)          │
├─────────────────────────────────────────────────────────────┤
│  Conflict UI           │ Click status bar when in conflict  │
│  Manual resolve        │ Edit markers → Done                │
│  Agent merge           │ BYOK Pro + AI Agent configured     │
├─────────────────────────────────────────────────────────────┤
│  Disconnect            │ Sync Settings → Disconnect         │
│  Revoke from GitHub    │ github.com/settings/installations  │
│  View repo             │ "View on GitHub" link              │
└─────────────────────────────────────────────────────────────┘

Last updated: 2026-06-04

Rozdział 37: GitHub Copilot Provider | (koniec instrukcji — wróć do Index)

Published: