Przejdź do treści

MemPalace na Windows (dual boot z Linuksem)

Ten dokument opisuje, jak w Claude Code na Windows korzystać z tego samego pałacu, który żyje na Linuksie. Nie zakładamy drugiego pałacu ani kopii: kopia żyje własnym życiem i rozjeżdża się z oryginałem. Dokument uzupełnia Konfigurację MemPalace, która opisuje stronę Linuksa.

Warunek wstępny: partycja Linuksa jest widoczna w Windows z włączonym zapisem, zgodnie z Partycją Linuksa (btrfs) z Windows. ChromaDB zapisuje w bazie już przy jej otwarciu, więc dostęp tylko do odczytu nie wystarczy.

Znaczniki użyte w dokumencie

Znacznik Co to jest Przykład postaci
<litera_btrfs> Litera partycji Linuksa w Windows F
<użytkownik_linux> Konto na Linuksie —
<pałac_linux> Ścieżka pałacu na Linuksie /home/<użytkownik_linux>/AI/MemPalace
<pałac_win> Ta sama ścieżka widziana z Windows <litera_btrfs>:\home\<użytkownik_linux>\AI\MemPalace
<python_win> Pełna ścieżka do python.exe na Windows %LOCALAPPDATA%\Programs\Python\Python3XX\python.exe
<wersja_…> Wersja pakietu odczytana na Linuksie patrz punkt 1

0. Zasady

  • Jeden pałac. Windows wskazuje bezpośrednio na katalog pałacu na partycji Linuksa.
  • Nigdy oba systemy naraz. Przy dual boocie to się dzieje samo, ale nie montuj tej partycji w maszynie wirtualnej, kiedy Linux działa.
  • Backup przed pierwszym otwarciem z Windows. Na Linuksie, przy zatrzymanym procesie mempalace, skopiuj cały katalog pałacu (cp -a). Sam chroma.sqlite3 nie jest backupem.

1. Wersje muszą być identyczne

To najważniejszy punkt tego dokumentu. Windows i Linux pracują na tych samych plikach bazy, więc muszą używać tych samych wersji bibliotek. Nie instaluj „najnowszych”, tylko dokładnie te, które są na Linuksie:

Pakiet Dlaczego wersja musi się zgadzać
mempalace Format metadanych, logika szuflad i closetów, ścieżki pomocnicze
chromadb Nowsza wersja potrafi po cichu zmigrować schemat bazy przy otwarciu. Po takiej migracji starsza wersja na Linuksie może już bazy nie otworzyć.
onnxruntime, tokenizers Liczą embeddingi. Inna wersja może dać inne wektory dla tego samego tekstu.
huggingface-hub Pobiera model embeddingów i układa go w cache. Różne wersje używają różnego układu cache, a nie każdy działa z danym onnxruntime (objaw w punkcie 6).

Ta sama zasada dotyczy wersji Pythona, przynajmniej major.minor, np. 3.14.

Odczyt wersji na Linuksie:

python3 --version
python3 -m pip list 2>/dev/null | grep -iE '^(mempalace|chromadb|onnxruntime|tokenizers|huggingface.hub) '

Po każdej aktualizacji MemPalace na Linuksie powtórz instalację z punktu 3 na Windows, z nowymi wersjami.

2. Python na Windows

Zainstaluj Pythona w tej samej wersji major.minor co na Linuksie, z python.org, tylko dla bieżącego konta. Najprościej przez winget:

winget install --id Python.Python.<major.minor> --scope user
  • Używaj pełnej ścieżki <python_win>, a nie samego python. Na Windows python może wskazywać na alias ze sklepu Microsoft Store, na inną wersję albo na aktywny venv.
  • Serwer MCP działa niezależnie od venvów projektów: Claude Code uruchamia go poleceniem zapisanym w konfiguracji, czyli właśnie pełną ścieżką.

3. Instalacja pakietów

Tak jak na Linuksie, instalacja „systemowa” dla użytkownika (--user), bez venv, z wersjami z punktu 1:

& "<python_win>" -m pip install --user `
    mempalace==<wersja_mempalace> chromadb==<wersja_chromadb> `
    onnxruntime==<wersja_onnxruntime> tokenizers==<wersja_tokenizers> `
    huggingface-hub==<wersja_huggingface_hub>
& "<python_win>" -m pip check

Ostrzeżenia o katalogu Scripts spoza PATH można zignorować, bo serwer uruchamiamy przez python -m.

⚠ Pakiety --user znikają przy python -I, python -s i przy ustawionej zmiennej PYTHONNOUSERSITE. Nie używaj tych opcji w konfiguracji MCP ani w testach.

4. Konfiguracja ~/.mempalace

Ścieżka %USERPROFILE%\.mempalace\config.json jest w MemPalace zaszyta na sztywno. Flaga --palace jej nie zmienia, a z tego pliku pochodzi m.in. model embeddingów.

  1. Skopiuj config.json z Linuksa (/home/<użytkownik_linux>/.mempalace/config.json) do %USERPROFILE%\.mempalace\config.json i zmień tylko palace_path na <pałac_win>. Klucz embedding_model musi zostać taki sam jak na Linuksie.
  2. Skopiuj known_entities.json. To lista osób i projektów używana przy indeksowaniu i sprawdzaniu faktów. Plik nie synchronizuje się sam.

Czego nie kopiować z ~/.mempalace na Linuksie:

Plik / katalog Dlaczego
locks/, hook_state/, wal/ Stan lokalny maszyny
palace/ Domyślny pałac demo, nieużywany przy --palace
knowledge_graph.sqlite3 Przy uruchomieniu z --palace graf wiedzy leży w <pałac>/knowledge_graph.sqlite3, czyli w samym pałacu, wspólny dla obu systemów. Plik w ~/.mempalace jest używany tylko bez --palace.

5. Rejestracja serwera MCP

Globalnie, dla wszystkich projektów, odpowiednik wpisu w ~/.claude.json z setup.md:

claude mcp add --scope user mempalace -- "<python_win>" -m mempalace.mcp_server --palace "<pałac_win>"
claude mcp get mempalace

Oczekiwany status to ✔ Connected. Sprawdź też, czy żaden projekt nie ma lokalnego nadpisania (.mcp.json albo projects.*.mcpServers.mempalace w ~/.claude.json), bo lokalna konfiguracja po cichu wygrywa z globalną.

Narzędzia mcp__mempalace__* są widoczne dopiero w nowej sesji albo po /mcp → Reconnect. Po każdej zmianie pakietów zrestartuj serwer tak samo, bo działający proces ma stare biblioteki w pamięci.

6. Model embeddingów

Przy pierwszym wyszukiwaniu serwer pobiera model (dla embeddinggemma ok. 330 MB) do %USERPROFILE%\.cache\huggingface\hub.

Objaw rozjechanego huggingface-hub: wyszukiwanie zwraca

[ONNXRuntimeError] : 1 : FAIL : External data path validation failed for initializer ...
External data path: "model_quantized.onnx_data" (resolved path: "...\hub\blobs\xx\...")
escapes both model directory: "...\snapshots\...\onnx" and real model directory: "...\hub\blobs\yy"

Przyczyna: wersja huggingface-hub układa cache we wspólnym magazynie hub\blobs\xx\, z podwójnymi dowiązaniami symbolicznymi. Plik modelu i plik z wagami trafiają wtedy do różnych katalogów, a onnxruntime ze względów bezpieczeństwa wymaga, żeby wagi leżały obok modelu.

Naprawa:

  1. Zainstaluj huggingface-hub w tej samej wersji co na Linuksie (punkt 1).
  2. Usuń z %USERPROFILE%\.cache\huggingface\hub katalogi pobrane przez złą wersję. Sprawdź najpierw daty, czy nie ma tam modeli innych programów.
  3. Pobierz model ponownie i sprawdź embeddingi bez otwierania pałacu:

    import numpy as np
    from mempalace.embedding import get_embedding_function, current_model_name
    print("model:", current_model_name())
    a, b, c = get_embedding_function()(["jeden wspólny pałac dla wszystkich projektów",
                                        "one shared palace for all projects",
                                        "przepis na pierogi z kapustą"])
    cos = lambda x, y: float(np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y)))
    print("wymiar:", len(a), "| PL~EN:", round(cos(a, b), 3), "| PL~inne:", round(cos(a, c), 3))
    

    Model wielojęzyczny daje wysokie podobieństwo zdania polskiego do jego tłumaczenia i wyraźnie niższe do zdania niezwiązanego. 4. Zrestartuj serwer MCP (/mcp → Reconnect).

7. Weryfikacja

  1. mempalace_status: zgodny palace_path, sqlite_integrity.ok = true, wersje w library_versions takie jak na Linuksie.
  2. Liczba wpisów. status liczy tylko szuflady, a pełną liczbę daje zapytanie do obu kolekcji, w trybie tylko do odczytu:

    import sqlite3
    db = sqlite3.connect(r"file:<pałac_win>/chroma.sqlite3?mode=ro", uri=True)
    for name, n in db.execute("""select c.name, count(e.id) from collections c
            join segments s on s.collection = c.id join embeddings e on e.segment_id = s.id
            group by c.name"""):
        print(name, n)
    

    Wynik musi się zgadzać z tym samym zapytaniem na Linuksie. 3. Zapytanie w języku treści, bez filtra wing, o coś, co na pewno jest w pałacu. Trafienie na #1 i niezerowy closet_boost przy wynikach z closetów. Zły model daje dla closetów po cichu cosine_sim = 0.0, bez błędu.

8. Praca na co dzień — pułapki

  • ChromaDB zapisuje przy samym otwarciu bazy: chroma.sqlite3 i pliki segmentów HNSW zmieniają się nawet przy samym czytaniu. Na Linuksie z SELinux te pliki dostają typ unlabeled_t, więc po sesji z Windows uruchom na Linuksie:

    restorecon -R <pałac_linux>
    
  • Nie indeksuj (mine) z Windows. source_file zapisałby się jako ścieżka windowsowa, a mempalace sync --apply na Linuksie uznałby te pliki za zniknięte i skasował ich szuflady. Indeksowanie rób na Linuksie. Zapis pojedynczych wpisów (add_drawer, kg_add, diary_write) z Windows jest w porządku.

  • Nie weryfikuj pałacu przez md5. Pliki zmieniają się przy każdym odczycie, a to zachowanie ChromaDB, nie uszkodzenie.

9. Pliki kontekstowe asystenta (wzór)

Zasady pracy z pałacem są w ~/.claude/CLAUDE.md na Linuksie (zob. setup.md). Na Windows nie kopiuj ich, tylko importuj. Claude Code obsługuje w CLAUDE.md składnię @ścieżka, więc jedno źródło zasad obsługuje oba systemy. %USERPROFILE%\.claude\CLAUDE.md:

# Środowisko AI — Windows

Zasady wspólne z Linuksem są na partycji Linuksa i są tu importowane, a nie kopiowane:

@<litera_btrfs>:/home/<użytkownik_linux>/.claude/CLAUDE.md

Jeśli powyższy import nie dał treści, partycja Linuksa nie jest zamontowana. Wtedy pałac
też jest niedostępny. Zgłoś to zamiast działać bez zasad.

## Mapowanie ścieżek Linux → Windows

| Linux | Windows |
|---|---|
| `/home/<użytkownik_linux>/...` | `<litera_btrfs>:\home\<użytkownik_linux>\...` |

## MemPalace na Windows

- Serwer MCP: `<python_win> -m mempalace.mcp_server --palace <pałac_win>`.
  Pakiety `--user`. Bez `python -I`/`-s` i bez `PYTHONNOUSERSITE`.
- Wersje pakietów takie same jak na Linuksie, także `huggingface-hub`.
- Nie indeksować (`mine`) z Windows. Po sesji z zapisami: `restorecon -R <pałac_linux>` na Linuksie.
- Nigdy nie przemontowywać partycji btrfs w locie (`fsutil volume dismount`): BSOD.

Przy pierwszym uruchomieniu Claude Code może zapytać o zgodę na import pliku spoza projektu. Załadowane pliki pokazuje polecenie /memory.

Edycja linuksowego CLAUDE.md z Windows też odbiera mu etykietę SELinux. Po takiej zmianie uruchom restorecon także na nim.