Prompt 0 użyć

Globalny rejestr projektów Claude Code

Prompt, po którym Claude Code sam zbuduje na Windowsie jeden, wspólny indeks wszystkich Twoich projektów, serwerów i integracji MCP, z przeglądarką HTML sortowaną od ostatnio używanego. Hook przy starcie każdej sesji pilnuje, żeby rejestr był aktualny: przypomina o nowych projektach i wyłapuje niezarejestrowane serwery MCP.

Zobacz odcinek na YouTube
Zbuduj mi globalny rejestr moich projektów Claude Code, żebym wiedział, co i gdzie mam, niezależnie od katalogu, z którego uruchamiam Claude. Windows, PowerShell 5.1 (bez zależności: bez modułów, bez Node/Pythona).

Najpierw zapytaj mnie o dwie rzeczy: gdzie ma leżeć rejestr (<ROOT>, np. D:\Projekty\.claude-registry — wspólny dla wszystkich kont Windows na tym komputerze) i w jakich katalogach trzymam projekty. Potem wykonaj wszystko bez dalszych pytań.

## 1. Format wpisów
Jeden plik .md na wpis, frontmatter `klucz: wartość` między liniami `---`, listy jako `[a, b]`, komentarze po ` #`. Pod frontmatterem 2–3 zdania: co to jest i do czego służy. Slug = nazwa pliku (małe litery, myślniki). Daty YYYY-MM-DD.
- projects/<slug>.md: name, path (pełna ścieżka katalogu), user (konto Windows), stack [..], servers [slugi z servers/], status (active|paused|archived), updated
- integrations/<slug>.md (MCP, deploy, cron, service, webhook): name, type, mcp (dla type: mcp — nazwa serwera dokładnie jak w konfiguracji), host (local albo slug serwera), user, installed_by (slug projektu), config_path, status (used|unused|removed), remove (komenda usuwająca), updated
- servers/<slug>.md: name, host, ssh (np. `ssh ovh`), provider, status, updated
- README.md w <ROOT> z tym formatem i przykładem każdego typu.
- NIGDY nie zapisuj sekretów (tokeny, hasła, klucze API, wartości env, nagłówki Authorization) — najwyżej ścieżkę, gdzie leżą.

## 2. bin/build.ps1
- Da się go uruchomić bezpośrednio i dołączyć przez dot-sourcing (`. build.ps1`); przy dot-sourcingu nic nie wykonuje (`if ($MyInvocation.InvocationName -ne '.')`). Eksportuje funkcje Get-Registry i Build-Registry.
- Własny parser frontmattera (bez modułów YAML); ścieżki względem `Split-Path -Parent $PSScriptRoot`.
- Na początku `Remove-TypeData System.Array -ErrorAction SilentlyContinue` (inaczej ConvertTo-Json w PS 5.1 psuje tablice).
- Dla każdego projektu:
  - `missing: true`, gdy katalog z path nie istnieje;
  - `last_used` = najnowszy LastWriteTime dowolnego pliku (rekurencyjnie) w `C:\Users\*\.claude\projects\<enc>`, dla wszystkich kont, z pominięciem katalogów bez dostępu (try/catch). `<enc>` = path bez końcowego `\`, w którym każdy znak spoza [A-Za-z0-9] zamieniasz na `-` (np. `C:\Users\jan\Projekty\Moja Apka` → `C--Users-jan-Projekty-Moja-Apka`). Format `yyyy-MM-dd HH:mm`.
- Sortowanie projektów: najpierw te z last_used (malejąco), potem bez niego (alfabetycznie po slugu).
- Wynik: `{projects, integrations, servers, generated}` jako JSON wstrzyknięty do bin/template.html w miejsce `/*DATA*/null` (w JSON zamień `</` na `<\/`), zapis do <ROOT>\index.html w UTF-8 bez BOM, atomowo (plik tymczasowy + File.Replace).
- Wypisuje: `<ścieżka>: N projektów, N integracji, N serwerów`.

## 3. bin/template.html
Jeden plik, zero zewnętrznych zasobów, działa z file://. `const D=/*DATA*/null;`. Zakładki Projekty/Integracje/Serwery (stan w location.hash), wyszukiwarka pełnotekstowa, filtr po user i status (+ opcja „brak katalogu”, gdy jakiś projekt ma missing). Karty z kotwicami `#<typ>/<slug>` i linkami krzyżowymi: projekt → jego serwery i integracje (po installed_by), integracja → host i projekt, serwer → projekty i integracje. Na karcie projektu: ścieżka (wyróżniona czerwono, gdy missing), stack jako tagi, user, „ostatnio użyty” (last_used), „aktualizacja” (updated), opis. Jasny i ciemny motyw (prefers-color-scheme). Wszystkie wartości escapowane przed wstawieniem do HTML.

## 4. bin/check.ps1 — hook SessionStart
- Pierwsze linie: `$ErrorActionPreference='Stop'`, `[Console]::InputEncoding` i `[Console]::OutputEncoding` = UTF8 bez BOM, dot-source build.ps1. Całość w `try { Main } catch {}` — hook nigdy nie może wywalić sesji.
- cwd czyta z JSON-a na stdin (`[Console]::In.ReadToEnd() | ConvertFrom-Json`, pole cwd), fallback Get-Location.
- Wywołuje Build-Registry (przy błędzie Get-Registry), więc index.html odświeża się przy każdym starcie sesji.
- Dopasowuje cwd do projektu po najdłuższym prefiksie path (porównanie po GetFullPath, bez końcowego `\`, lowercase).
- Komunikaty:
  - dopasowany projekt → „Ten katalog to projekt '<slug>' (<plik>)”. Jeśli path ma .git i jest git: `git -C <path> rev-list --count --since=<updated> HEAD` ≥ 20 → poproś o przegląd opisu albo podbicie updated;
  - brak dopasowania i katalog nieignorowany → „Katalog X nie jest zarejestrowany. Jeśli to projekt, gdy go poznasz w tej sesji, dodaj wpis wg <ROOT>\README.md (user: $env:USERNAME), bez pytania i bez komentowania tego użytkownikowi. Wpisz też jego integracje/serwery.”;
  - rozjazd MCP: skonfigurowane = klucze `mcpServers` w `%USERPROFILE%\.claude.json` (globalne oraz w `projects.<ścieżka>.mcpServers`) + `.mcp.json` w cwd i w katalogu projektu. Plik .claude.json bywa duży → parsuj przez `System.Web.Script.Serialization.JavaScriptSerializer` z MaxJsonLength = int.MaxValue. Zgłoś serwery bez wpisu w integrations/ (type: mcp, user = bieżące konto, dopasowanie po polu mcp albo slugu) oraz wpisy z config_path wskazującym .claude.json, których nie ma już w konfiguracji (→ ustaw status: removed).
- Ignorowane (bez przypomnienia o rejestracji): katalog domowy, Downloads, Desktop, Documents, katalog nadrzędny <ROOT>, sam dysk (`X:`), dokładnie; prefiksowo: TEMP, Windows, Program Files (oba), <ROOT> oraz ścieżki z <ROOT>\ignore.txt (jedna na linię, `#` = komentarz).
- Wyjście tylko wtedy, gdy jest co powiedzieć, dokładnie w tym formacie (jedna linia JSON na stdout, bez BOM):
  `{"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext":"REJESTR PROJEKTÓW: <komunikaty> Nigdy nie zapisuj w rejestrze sekretów."}}`

## 5. bin/install.ps1 -User <konto>
- Profil konta ustalaj przez `Get-CimInstance Win32_UserProfile` (nie zgaduj C:\Users\<konto>). Dla innego konta niż bieżące wymaga PowerShella jako administrator — napisz to w README.
- `<profil>\.claude\settings.json`: kopia `.bak`, potem dopisz do `hooks.SessionStart` wpis `{"hooks":[{"type":"command","command":"powershell -NoProfile -ExecutionPolicy Bypass -File \"<ROOT ze slashami />/bin/check.ps1\""}]}`. Wcześniej usuń stare wpisy zawierające `.claude-registry` (idempotencja). Nie ruszaj pozostałych ustawień. ConvertTo-Json z -Depth 20.
- `<profil>\.claude\CLAUDE.md`: blok między `<!-- claude-registry:begin -->` i `<!-- claude-registry:end -->` (podmień, jeśli istnieje, inaczej dopisz na końcu):
  „Rejestr projektów: <ROOT>. Utrzymuj go bez pytania: nowy projekt → projects/<slug>.md (2–3 zdania); istotna zmiana charakteru → popraw opis i updated; instalacja/usunięcie MCP, deploy, usługa/cron/webhook na serwerze → integrations/; nowy serwer → servers/. NIGDY nie zapisuj sekretów — najwyżej gdzie leżą. Po zmianach uruchom build.ps1.”

## 6. Techniczne wymagania
- Wszystkie .ps1 zapisz w UTF-8 Z BOM (PowerShell 5.1 inaczej psuje polskie znaki). Pliki .md, .html i JSON-y w UTF-8 bez BOM (`New-Object System.Text.UTF8Encoding $false`).
- Czytaj pliki przez `[IO.File]::ReadAllText(..., [Text.Encoding]::UTF8)`.
- Po napisaniu przetestuj: build.ps1 generuje index.html; `'{"cwd":"<jakiś katalog projektu>"}' | powershell -NoProfile -File bin\check.ps1` zwraca poprawny JSON; to samo dla niezarejestrowanego katalogu; install.ps1 uruchomiony dwa razy nie dubluje hooka ani bloku w CLAUDE.md.

## 7. Wypełnienie
Uruchom install.ps1 dla mojego konta. Przejrzyj moje katalogi z projektami i `%USERPROFILE%\.claude\projects` (nazwy katalogów to zakodowane ścieżki — odkoduj je po zawartości dysku) i utwórz wpisy dla znalezionych projektów: opis na podstawie README/kodu, stack z plików konfiguracyjnych. Dodaj wpisy integrations/ dla MCP z .claude.json i servers/ dla hostów z `~/.ssh/config`, które projekty faktycznie używają. Uruchom build.ps1 i otwórz index.html.