Implements MVP v2 requirements from docs/UI-Contact-Management-MVP-v2.md: - Display all contact types (CLI, REP, ROOM, SENS) - Delete contacts with confirmation modal - Capacity counter with color-coded warnings (green/yellow/red) - Search by name or public key - Filter by contact type - Mobile-first responsive design Backend changes: - Add get_all_contacts_detailed() parser for meshcli contacts output - Handles Unicode characters, emoji, spaces in names - Backward parsing strategy using public_key_prefix as anchor - Returns detailed metadata for all contact types - Add delete_contact() wrapper for remove_contact command - Add GET /api/contacts/detailed endpoint - Add POST /api/contacts/delete endpoint Frontend changes: - Add Existing Contacts section to contacts.html - Real-time search input - Type filter dropdown (All/CLI/REP/ROOM/SENS) - Color-coded type badges - Capacity counter with pulse animation for critical levels - Add delete confirmation modal with danger styling - Add complete contact management logic to contacts.js - loadExistingContacts(), applyFilters(), confirmDelete() - Copy public key to clipboard functionality Documentation: - Update README.md with usage instructions - Add technotes/UI-Contact-Management-MVP-v2-completed.md - Add docs/UI-Contact-Management-MVP-v2.md (specification) - Add technotes/UI-Contact-Management-MVP-v1-completed.md (retroactive) Tested with 263 real contacts including Unicode and edge cases. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
4.6 KiB
Prompt dla Claude Code: Contact Management v2 (Existing Contacts + Delete + Counter)
Pracujesz w repo mc-webui. Mamy już działający moduł UI Contact Management (MVP v1): toggle manual_add_contacts + lista pending_contacts + approve. Teraz robimy etap v2: zarządzanie istniejącymi kontaktami.
Cel (v2)
Rozbuduj moduł Contact Management o:
-
Panel Existing Contacts
- wyświetla listę kontaktów, które są już na urządzeniu (CLI/REP/ROOM — wszystkie)
- umożliwia usuwanie wybranego kontaktu
- pokazuje licznik kontaktów
X / 350(limit MeshCore) - ma podstawowe filtrowanie i wyszukiwanie (lekko, bez frameworków)
-
UX:
- mobile-first (przyciski dotykowe, brak gęstych tabel)
- szybkie odświeżanie listy, spinner/placeholder
- potwierdzenie usunięcia (modal lub confirm), bo to operacja destrukcyjna
Wymagania techniczne / integracja
- Frontend: Flask templates + Bootstrap5 + vanilla JS.
- Backend: mc-webui komunikuje się z meshcore-bridge przez HTTP (nie przez lokalny meshcli).
- Mamy już wzorzec: mc-webui ma endpointy
/api/...i JS robi fetch do mc-webui, a mc-webui proxy’uje do bridge.
Dane i API
-
Pobranie listy kontaktów
-
Dodaj w mc-webui endpoint:
GET /api/contacts/list
-
On powinien pobierać listę kontaktów z bridge’a przez mechanizm CLI:
- albo istniejący endpoint w mc-webui (jeśli jest), który wykonuje
meshcli contactsi zwraca JSON, - albo dodaj nowy “proxy” do
/cliz komendącontactsi następnie sparsuj output.
- albo istniejący endpoint w mc-webui (jeśli jest), który wykonuje
-
Zależy mi na JSON po stronie mc-webui w formacie:
{ "success": true, "count": 123, "limit": 350, "contacts": [ { "name": "BBKr", "public_key_prefix": "efa30de66fce", "type_label": "CLI|REP|ROOM|UNKNOWN", "path_or_mode": "Flood|<path_hex>|", "raw_line": "..." } ] } -
Parser:
- ma być odporny na emoji i spacje w nazwach
- nie zakładaj stałej liczby spacji — użyj regex / split z głową
raw_linezachowaj do debugowania
-
-
Usuwanie kontaktu
-
Dodaj w mc-webui endpoint:
POST /api/contacts/deletebody:{ "name": "...", "public_key_prefix": "..." }
-
Na backendzie wywołaj komendę meshcli, która usuwa kontakt.
- Najpierw sprawdź w
meshcli -h/ dokumentacji projektu jak brzmi komenda (np.del_contact/rm_contact/remove_contact/contact_del— NIE zakładaj nazwy). - Jeśli usuwanie po nazwie jest niepewne (kolizje), użyj najbezpieczniejszego selektora dostępnego w CLI (prefiks klucza jeśli wspierany).
- Najpierw sprawdź w
-
Po sukcesie: zwróć
{success:true}i na froncie odśwież listę.
-
-
Licznik 350
-
count = len(contacts)po parsowaniu. -
limit = 350stała w UI (do ewentualnej zmiany później). -
UI ma pokazywać badge:
- OK: zielony/neutralny
- ostrzegawczy gdy
count >= 300 - alarm gdy
count >= 340(prosta logika, bez przesady)
-
UI: Contact Management v2
W istniejącym widoku Contact Management dodaj pod sekcją pending nową sekcję:
Existing Contacts
-
Toolbar:
- Search input (client-side filter po
nameipublic_key_prefix) - Filter dropdown: All / CLI / REP / ROOM / Unknown
- Refresh button
- Search input (client-side filter po
-
Lista (list-group/cards):
- name (bold)
- type_label badge (CLI/REP/ROOM)
- public_key_prefix + copy
- optional: “path_or_mode” (jeśli masz z outputu)
- Delete button (danger, ikonka kosza)
-
Delete flow:
- confirm (Bootstrap modal albo
confirm(); prefer modal) - po delete: toast + refresh
- confirm (Bootstrap modal albo
Ograniczenia / bezpieczeństwo
- Nie zmieniaj bridge’a jeśli nie musisz. Preferuj: mc-webui proxy do istniejącego
/cliw bridge. - Nie dodawaj WebSocketów. Refresh ręczny wystarczy.
- Wszystkie komentarze i nazwy w kodzie: po angielsku.
Test plan
Dodaj do README sekcję “Contact Management v2”:
- jak odświeżyć listę kontaktów
- jak filtrować
- jak usunąć kontakt
- jak sprawdzić w logach, że komenda delete poszła do bridge
Post-task checklist
- Update README.md
- Jeśli projekt ma plik notatek/technotes, dopisz krótką notkę o parsowaniu outputu
contacts - Conventional commit:
feat: contact management v2 (existing contacts + delete + counter)
Drobna wskazówka
Output meshcli contacts wygląda zwykle jak tabela (kolumny: name / type / pubkey_prefix / path lub “Flood”). Parser ma być “best effort”: nie musisz perfekcyjnie odtwarzać wszystkich pól, ale name + pubkey_prefix + type muszą być wiarygodne.