Specyfikacja techniczna TellMyShop

1. Czym jest produkt

TellMyShop to moduł PrestaShop. Zainstalowany w sklepie wystawia go jako zdalny serwer MCP (Model Context Protocol). Właściciel dodaje go w aplikacji czatu jako własny konektor: w Claude albo w ChatGPT (własny konektor w trybie dewelopera). Od tej chwili asystent AI może czytać sklep, a po zatwierdzeniu podglądu przez właściciela także go zmieniać.

Z jednego kodu powstają dwie paczki (module/build/build.php):

PaczkaZawartośćLicencja
TellMyShop Pro (płatna; wariant pro, ZIP tellmyshop-<wersja>.zip)Wszystkie 71 narzędzi. Treści i SEO oraz Katalog zapisują od razu; Handel, Motyw, Moduły i Serwis zapisują, gdy właściciel włączy przełącznik. Jeden konektor, klucz awaryjny, kopie bazy, wszystkie grupy gotowych zadań, Konsultant TellMyShopKlucz licencji; bez aktywnej licencji czyta cały sklep, ale narzędzia zapisu są ukryte
TellMyShop Free (darmowa, z /free-audit; wariant free, ZIP tellmyshop-audyt-<wersja>.zip; w starszych dokumentach Audyt)24 narzędzia odczytu: rdzeń i raporty odczytu z Treści i SEO oraz Katalogu. Fizycznie bez narzędzi zapisu, bez narzędzi Handlu, Motywu, Modułów i Serwisu, bez ps_get_element_full i bez skryptu awaryjnego (pliki usuwane przy budowie). Gotowe zadania tylko z grupy FreeNiepotrzebna: klucza się nie wydaje ani nie wymaga (Edition::usesLicense() zwraca false dla darmowej paczki; panel mówi „TellMyShop Free – tylko odczyt. Zmiany w sklepie robi wersja Pro.”)

Obie mają nazwę techniczną tellmyshop, więc wgranie ZIP-a Pro na Free jest zwykłą aktualizacją; ustawienia i historia zostają. Dla PrestaShop 1.7.8 ten sam kod jest przebudowywany na osobne paczki PHP 7.4 (module/build/build-ps17.php, ZIP tellmyshop-ps17-<wersja>.zip i tellmyshop-audyt-ps17-<wersja>.zip); ta specyfikacja opisuje paczkę dla PrestaShop 8.1+/9. W kodzie jest też trzeci wariant dla PrestaShop Addons (tylko Treści i SEO, Katalog i Handel; src/Edition.php, addons), nieużywany.

Zasady, których trzyma się kod:

  1. Zapis działa jak kliknięcie „Zapisz” w panelu. Zmiany treści idą przez klasy ObjectModel PrestaShop (walidacja, hooki, indeks wyszukiwarki, cache). Bezpośredni zapis w bazie jest tylko w obszarze Serwis (ps_db_execute, z kopią wierszy, pkt 5.8) i w ps_update_element_field (jedno pole jednego wiersza, dla pól, których nie obsługują zwykłe narzędzia).
  2. Zapis w dwóch krokach. Każde narzędzie zapisujące najpierw zwraca podgląd i change_token. Dopiero drugie wywołanie z confirm=true i tym tokenem cokolwiek zapisuje.
  3. Wszystko jest logowane i, gdzie się da, odwracalne: historia zmian z nagraniem każdego wiersza bazy zmienionego przy zapisie, ps_revert_change dla danych, kopie i przywracanie dla plików, kopie wierszy dla SQL, codzienna kopia bazy, nowa zmiana adresu sprawdzona pod 301 dla URL. Wyjątki są nazwane w podglądzie.
  4. Bezpieczny start. Konektor wyłączony, dane klientów wyłączone, przełączniki Handel, Motyw, Moduły i Serwis wyłączone. Bez aktywnej licencji narzędzia zapisu są ukryte. Z aktywną licencją Treści i SEO oraz Katalog zapisują po podglądzie i zgodzie właściciela. Sklep i panel działają dalej.
  5. Asystent AI działa jako osobny, nieaktywny pracownik panelu tylko z jego uprawnieniami; SuperAdmin jest odrzucany.
  6. Właściciel się dowiaduje. Każde poluzowanie zabezpieczeń wysyła e-mail; jest codzienne podsumowanie i kontrola integralności plików.
  7. Dane idą ze sklepu do własnego konta czatu właściciela (Claude od Anthropic albo ChatGPT od OpenAI). Bez PrestaShop Account i Eventbus. Wywołania licencji nie niosą treści sklepu.
  8. Blokady stałe (src/Security/Blocklist.php) działają niezależnie od przełączników i licencji: bez dostępu do kont pracowników, haseł, uprawnień, kluczy API, plików z danymi do bazy ani samego konektora; bez zapisu podatków, metod i modułów płatności, zamówień i ich statusów.

2. Architektura i uwierzytelnienie

2.1 Składniki

SkładnikKod (2.7.2)Rola
Punkt dostępu MCPkontroler mcp, src/Endpoint.php, src/Mcp/Core.phpPrzyjmuje żądania MCP przez HTTPS, wykonuje zabezpieczenia z pkt 2.5, obsługuje tools/list, tools/call, prompts/list, prompts/get
Model dostępusrc/Access.php (AREA_OF_GROUP, blockFor(), blockedMessage(), dailyBackup())Grupa narzędzi → obszar zapisu; który przełącznik jest potrzebny przy zatwierdzeniu; komunikat z nazwą przełącznika; codzienna kopia bazy przed pierwszą zatwierdzoną zmianą
Menedżer tokenówsrc/Security/TokenManager.phpToken konektora i token testowy; zapisuje tylko skrót SHA-256 i prefiks
Kontrola IPsrc/Security/IpGuard.phpIP klienta (nagłówki proxy tylko od zaufanych proxy), dopasowanie CIDR IPv4/IPv6
Ustawieniasrc/Settings.php (GROUPS, BLOCKS, DEFAULTS, LEGACY_KEYS)Grupy narzędzi, przełączniki zapisu i ich czas działania, limity, listy IP, poziom danych klientów, alarmy, retencja. Wartości globalne
Blokady stałesrc/Security/Blocklist.phpTabele, pliki, ustawienia i moduły nigdy niedostępne albo nigdy do zapisu; korzystają z nich SqlGuard, ConfigWriter, Files\Zone, narzędzia modułów i narzędzia elementu
Rejestr narzędzisrc/Tools/ToolRegistry.php71 narzędzi (ToolRegistry::CLASSES). visible() pokazuje wszystkie grupy; bez aktywnej licencji ukrywa każde narzędzie zapisujące. Wyłączony przełącznik niczego nie ukrywa
Kontekst wykonaniaExecutionContext::boot(), requirePermissions()Ładuje pracownika konektora i sprawdza uprawnienia per zakładka i akcja
Warstwa zapisusrc/Write/ (ObjectWriter, WriteFlow, ChangeToken, Recorder, RecordingDb, RecordedRows, ProductPostSave, Reverter, CartRuleWriter, CatalogRuleWriter, StockWriter, StructureWriter, ConfigWriter, HookPositions, FeatureWriter, CategoryAssignment, RelatedProducts)Podgląd, change_token, zapis, nagrywanie zmienionych wierszy, historia zmian (pkt 5)
Limity godzinowe i pojemnośćsrc/Write/Capacity.php (status(), plan(), budget(), oldestInWindow())Użyte, pozostałe i limit wywołań, zapisów i zapisów plików z ostatnich 60 minut; plan dla ps_check_capacity; linia o limitach w każdym podglądzie i zapisie (WriteFlow) oraz limity w ps_get_shop_info
Plikisrc/Files/Zone.php, src/Files/PhpLint.php, src/Theme/*Strefy plików dla Motywu, Modułów i Serwisu, lista zakazów, sprawdzanie składni PHP, kontrola Smarty
SQLsrc/Server/SqlGuard.php, src/Server/SqlWriter.phpFiltr zapytań obszaru Serwis, kopie wierszy i cofanie
Dane klientówsrc/Privacy/PersonalData.phpRozpoznawanie tabel z danymi osobowymi, poziomy, maskowanie
Szyfrowaniesrc/Security/Crypto.phplibsodium secretbox dla historii, kopii plików i kopii bazy; klucz w pliku
Magazynsrc/Storage/ (ChangeHistory, FileBackup, DbBackup, CallLog, AuditLog, PrivateDir, Retention)Tabele modułu, katalog prywatny var/tellmyshop/, kopie bazy, retencja
Przekierowaniasrc/Redirects/RedirectRepository.php, hook actionFrontControllerInitBeforePrzekierowania dodane przez ps_manage_redirects (tabela tellmyshop_redirect), obsługiwane przez moduł
Bezpieczeństwo właścicielasrc/Security/Alerts.php, Integrity.php, RescueKey.phpE-maile, podsumowanie dzienne, integralność plików, skrypt awaryjny
Ekran konfiguracjisrc/Admin/ConfigPage.php, ConnectionTest.php, EmployeeSetup.php, views/templates/admin/configure.tpl, i18n/{pl,en,de,fr,es,it}.phpPanel w 6 językach (pkt 4.6)
Klient licencjisrc/License/ (LicenseManager, LicenseClient, LicenseToken, LicenseKey, DomainClassifier, Usage, ConsultantUpdate)Aktywacja, odświeżanie, zwolnienie, stan dla bramki; opcjonalne statystyki uruchomienia; aktualizacje wiedzy Konsultanta. Wpięty w src/Endpoint.php: bez trybu licencji full narzędzia zapisu są ukryte
Gotowe zadaniasrc/Jobs/JobRegistry.php, src/Jobs/Consultant.php: prompty MCP + narzędzie rdzenia tylko do odczytu ps_get_ready_job dla aplikacji bez menu promptówZadania w sześciu grupach i wiedza Konsultanta TellMyShop (pkt 4.7)
Serwer licencjihttps://tellmyshop.pl/api/v1Aktywacje, tokeny, wiedza Konsultanta. Nie dostaje treści sklepu
Aplikacja czatuClaude (Anthropic: claude.ai, aplikacje desktop i mobilne, Claude Desktop, Claude Code) albo ChatGPT (OpenAI, własny konektor w trybie dewelopera)Klient MCP. Wywołuje narzędzia w imieniu właściciela

2.2 Przebieg żądania

sequenceDiagram
    actor U as Właściciel
    participant C as Asystent AI (Claude albo ChatGPT)
    participant M as Moduł TellMyShop (sklep)
    participant PS as Rdzeń PrestaShop
    U->>C: „Napisz meta description dla Sof”
    C->>M: tools/call ps_search_products (HTTPS, token)
    M->>M: włącznik, HTTPS, blokada IP, lista IP, Origin, token, licencja, limity, uprawnienia
    M->>PS: zapytanie o produkty
    M-->>C: wynik (dane klientów filtrowane według poziomu)
    C->>M: tools/call ps_update_product_content (confirm=false)
    M-->>C: podgląd + change_token (30 min, jednorazowy)
    C-->>U: pokazuje podgląd, prosi o zgodę
    U->>C: „Tak, zapisz”
    C->>M: te same argumenty + confirm=true + change_token
    M->>M: przełącznik obszaru (jeśli obszar go ma), sprawdzenie tokenu (HMAC narzędzia, argumentów, stanu „przed”), codzienna kopia bazy
    M->>PS: zapis ObjectModel (walidacja, hooki, indeks, cache), nagranie każdego zmienionego wiersza
    M->>M: dziennik PrestaShop + historia zmian (change_id, operation_id)
    M-->>C: wynik z operation_id i kontrolą zmian spoza podglądu

2.3 Adres i transport

  • Adres: https://twoj-sklep.pl/module/tellmyshop/mcp. Krok 1 karty Start tworzy adres konektora i pokazuje go w całości raz.
  • Token idzie w adresie (?token=…) albo w nagłówku Authorization: Bearer ….
  • Transport: Streamable HTTP, JSON-RPC. Wersje protokołu: 2026-07-28 (nowa; _meta i nagłówek MCP-Protocol-Version muszą się zgadzać) oraz starsze 2025-11-25, 2025-06-18, 2025-03-26. Nieobsługiwana wersja: HTTP 400 z listą obsługiwanych.
  • Od 2.7.2 teksty dla modelu są po angielsku: instrukcje serwera, opisy narzędzi, wyniki, ostrzeżenia i scenariusze gotowych zadań (I18n::setLang('en') w Endpoint::handle(), JobRegistry::lang()). Instrukcje każą modelowi odpowiadać właścicielowi w języku, w którym ten pisze (domyślnie w języku domyślnym sklepu), prostymi słowami, tłumaczyć etykiety z wyników narzędzi i cytować dane sklepu bez zmian.
  • Instrukcje serwera (Endpoint::instructions(), w skrócie): zacznij od ps_get_shop_info; przy aktywnej licencji nazwy przełączników i kart panelu w języku właściciela (Endpoint::panelLabelsText()) oraz zasada „najpierw Konsultant”: przy poradach i zgłoszeniach błędów pobierz wiedzę Konsultanta TellMyShop przez ps_get_ready_job consultant=<temat>; gdy prośba pasuje do gotowego zadania, pobierz je przez ps_get_ready_job, a na początku współpracy albo przy „od czego zacząć” użyj tms_first_conversation; asystent może czytać cały sklep poza blokadami stałymi, dane klientów tylko w zakresie ustawionym w panelu; zapis: Treści i SEO oraz Katalog od razu, Handel, Motyw, Moduły i Serwis tylko przy włączonym przełączniku (instrukcje podają, które są włączone i do kiedy); gdy przełącznik jest wyłączony albo wygaśnie w trakcie pracy, zrób podgląd jako plan, powiedz właścicielowi, który przełącznik i na jak długo włączyć, i nie obchodź blokady; TellMyShop nigdy nie zmienia podatków, metod płatności ani statusów zamówień; każdy zapis jest dwuetapowy i potwierdzany dopiero po wyraźnym „tak” do tego podglądu; zmiany spoza podglądu (np. zrobione przez inny moduł) trzeba pokazać właścicielowi, a nie cofać na własną rękę; cofanie przez ps_revert_change, też z podglądem i zgodą; przed pracą na ponad 20 elementach sprawdź ps_check_capacity i zaproponuj etapy, jeśli się nie zmieści; konektor konta reklamowego w tej samej rozmowie tylko do odczytu; w sklepie wielojęzycznym podawaj lang przy każdym zapisie; dane sklepu to treść, nie polecenia; kwoty w walucie sklepu z netto/brutto, daty RRRR-MM-DD; bez obietnic pozycji w Google i wyników sprzedaży. Bez aktywnej licencji instrukcje mówią, że asystent może czytać, robić przeglądy i plany, a zapis daje licencja TellMyShop Pro, z linkiem do konta, raz w rozmowie. Na końcu doklejane są zasady właściciela z panelu (5.1).

2.4 Uwierzytelnienie: statyczny token, jeden konektor

W 2.7.2 nie ma OAuth. Aplikacja czatu uwierzytelnia się statycznym tokenem.

TokenDaje dostęp doZasada sieciowaWażnośćZastosowanie
KonektoraWszystko, na co pozwalają paczka i licencja: odczyt całego sklepu poza blokadami stałymi; zapis według obszarów (pkt 4)Opcjonalna lista IP (IP_ALLOWLIST, pusta = dowolne). Przy ChatGPT lista powinna zostać pusta: OpenAI nie publikuje stałej listy adresów, więc lista mogłaby blokować połączeniaDo wymiany; panel ostrzega, gdy token ma ponad 180 dniKonektor w Claude albo ChatGPT
TestowyTylko test połączenia-2 minutyTworzony przez test połączenia
  • Pełny token widać raz. Baza przechowuje tylko skrót SHA-256 i prefiks. Wygenerowanie nowego tokenu od razu unieważnia stary.
  • Jeden token na sklep; w 2.7.2 bez osobnych tokenów dla osób. Wszystkie wywołania idą jako ten sam pracownik konektora.
  • Od 2.7.0 jest jeden konektor. Osobny konektor serwisowy z wersji 2.6.x, jego token, obowiązkowa lista IP (SERVICE_IP_ALLOWLIST) i ważność (SERVICE_TOKEN_TTL) zostały usunięte; aktualizacja do 2.7.0 kasuje te ustawienia (Settings::LEGACY_KEYS). Obszary techniczne otwierają teraz przełączniki czasowe w panelu (pkt 4).
  • Ryzyko: token w adresie może trafić do logów serwera i proxy. Gdzie klient obsługuje nagłówki (Claude Code, konfiguracja Claude Desktop), używaj Authorization: Bearer. Po wycieku wygeneruj nowy token.
  • Plan rozwoju: logowanie OAuth, ważne też dla katalogu konektorów Claude.

2.5 Zabezpieczenia punktu dostępu

src/Endpoint.php i src/Mcp/Core.php wykonują przy każdym żądaniu, w tej kolejności:

#KontrolaDziałanie
1Włącznik konektora (ENABLED)Po instalacji wyłączony; każde żądanie odrzucane z 503
2Tylko HTTPSZwykły HTTP odrzucony (403)
3Blokada IP20 nieudanych uwierzytelnień z jednego IP w 10 minut (okno przesuwne): 429 do końca okna; alarm do właściciela raz na okno. Dotyczy tylko żądań bez prawidłowego tokenu, bo usługi czatu dzielą adresy IP między wielu użytkowników
4Lista IPIP_ALLOWLIST, opcjonalna (403). Przy ChatGPT pusta
5OriginŻądanie z nagłówkiem Origin musi pochodzić z https://claude.ai, https://claude.com, https://chatgpt.com albo https://chat.openai.com (dwa adresy ChatGPT od 2.7.2); bez Origin przechodzi (klienci serwer-serwer go nie wysyłają)
6TokenKonektora albo testowy; zły token = 401 i licznik blokady
7Bramka licencjiTryb licencji inny niż full = wszystkie grupy do odczytu, narzędzia zapisu ukryte (ToolRegistry::visible(..., $readOnly)). Zapis wywołany po wygaśnięciu licencji w trakcie rozmowy jest odrzucany z linkiem do konta (LicenseManager::writesAllowed())
8LimityRATE_LIMIT wywołań (domyślnie 300, 10–2000; limiter w Endpoint) i WRITE_LIMIT zapisów (domyślnie 150, 1–500; WriteFlow) na godzinę; FILE_WRITE_LIMIT zapisów plików (domyślnie 20, 1–200; Theme\FileWriter) dla plików motywu, modułów i sklepu. Wywołanie zapisu z paczką do 50 elementów to jeden zapis. Limit zapisów jest sprawdzany przed zapisem (WriteFlow::checkWriteLimit()), więc paczka nigdy nie urywa się w połowie. To, co zostało, pokazuje każdy podgląd i zapis oraz ps_get_shop_info; ps_check_capacity sprawdza zaplanowaną pracę (src/Write/Capacity.php)
9Przełącznik obszaruPrzy zatwierdzeniu (confirm=true) zapis w Handlu, Motywie, Modułach albo Serwisie jest odrzucany, gdy przełącznik jest wyłączony albo wygasł, z komunikatem podającym przełącznik i jego czas działania (Access::blockedMessage()); nic się nie zapisuje. Wywołanie bez confirm nadal zwraca podgląd z dopiskiem, że przełącznik jest wyłączony, więc podgląd działa jako plan. Przełącznik jest sprawdzany przy każdym wywołaniu, więc jego wygaśnięcie działa w trwającej rozmowie
10UprawnieniaExecutionContext::requirePermissions sprawdza zakładkę i akcję panelu pracownika konektora

Po tych kontrolach pierwszy zatwierdzony zapis danego dnia uruchamia kopię bazy (Access::dailyBackup()); nigdy nie blokuje zapisu w Treściach, Katalogu ani Handlu, a nieudana albo niedokończona kopia trafia jako uwaga do wyniku. Monitorowanie, które nigdy nie blokuje wywołania: kontrola integralności (najwyżej co 6 h) i podsumowanie dzienne, uruchamiane po poprawnym tokenie.

IP klienta: CF-Connecting-IP / X-Forwarded-For są brane pod uwagę tylko przy włączonym TRUST_PROXY i gdy REMOTE_ADDR jest w TRUSTED_PROXIES.

2.6 Dokąd płyną dane

  • Wyniki narzędzi idą ze sklepu do konta czatu właściciela: Claude (Anthropic) albo ChatGPT (OpenAI). Treść rozmów podlega warunkom dostawcy.
  • Dane osobowe klientów trafiają do czatu tylko na poziomie pseudo (zamaskowane) albo full (czasowo); zobacz pkt 6.5.
  • Bez PrestaShop Account i Eventbus.
  • Serwer licencji dostaje tylko to, co wysyła src/License/: przy aktywacji klucz licencji, produkt, znormalizowane domeny i adres sklepu, losowe ID instancji i wersje modułu, PrestaShop i PHP; przy odświeżeniu token licencji, ID instancji i wersje modułu i PrestaShop, a do tego statystyki uruchomienia, jeśli właściciel je włączył; przy zwolnieniu token i ID instancji (za każdym razem także IP wywołującego).
  • Statystyki uruchomienia (src/License/Usage.php, ustawienie USAGE_STATS, panel „Wysyłaj statystyki uruchomienia (same liczby)”): domyślnie wyłączone, wysyłane dopiero po włączeniu przez właściciela (od 2.6.5; aktualizacja do 2.6.5 wyłączyła je wszystkim). Idą z codziennym odświeżeniem: daty pierwszego wywołania narzędzia, pierwszego zadania i pierwszego cofnięcia, liczba zapisów i cofnięć, uruchomienia każdego gotowego zadania i wywołania w każdym obszarze. Bez treści rozmów, produktów i danych klientów.
  • Wiedza Konsultanta (src/License/ConsultantUpdate.php): gdy odświeżenie zgłasza nowszą paczkę wiedzy, moduł pobiera ją z POST /api/v1/konsultant z tokenem licencji, ID instancji i językiem, sprawdza podpis Ed25519 i zapisuje w var/tellmyshop/. Paczka to sam tekst, nigdy kod; nie zmienia narzędzi, uprawnień ani zasady podglądu. Przy każdym błędzie zostaje ostatnia dobra albo wbudowana wiedza.
  • Inne połączenia wychodzące: HttpProbe do własnych stron sklepu (sprawdzanie adresów, ps_inspect_page), ImageFetcher dla adresów zdjęć podanych do ps_manage_product_images (z ochroną SSRF), adres ZIP podany do ps_install_module. Treść sklepu nie trafia nigdzie poza aplikację czatu.

3. Wymagania

PozycjaWymaganieStan
PrestaShopOd 8.1.0 do 9.x (ps_versions_compliancy min 8.1.0, max 9.99.99). 2.7.2 testowane na PrestaShop 8.1.7 i 8.2.3 (sklepy testowe, PHP 8.1, 2026-10-10); 2.6.0 testowano na 9.2.0. PrestaShop 1.7.8: osobna paczka PHP 7.4 (pkt 1)Potwierdzone dla 8.1 i 8.2. 9.x z 2.7.2:. 8.0 i 1.6 bez wsparcia. Lista testów: pkt 14
PHP8.1 lub nowszy. tellmyshop.php parsuje się na PHP 7.2, żeby nie psuć listy modułów; instalacja poniżej 8.1 odmawia z komunikatemPotwierdzone
Rozszerzenia PHPsodium (szyfrowanie, podpis licencji), tokenizer (składnia PHP), json, mbstring, zlib (gzencode, kopie bazy); curl do HTTPS wychodzącego (licencja, test połączenia, HttpProbe; bez zapasowego allow_url_fopen)Potwierdzone
PrestaShop Account / EventbusNiepotrzebnePotwierdzone
HTTPSWażny publiczny certyfikat TLS. Punkt dostępu odrzuca HTTPWymagane
DostępnośćOsiągalny z internetu; bez basic auth; WAF przepuszcza POST. Przy ChatGPT bez listy IPWymagane dla Claude.ai i ChatGPT
Katalog prywatnyvar/tellmyshop/ z prawem zapisu i niedostępny z WWW; test połączenia sprawdza to na żywo plikiem próbnymWymagane
Miejsce na kopie bazyWolne miejsce co najmniej dwa razy większe od szacowanego rozmiaru bazy w var/tellmyshop/db-backups/ (DbBackup::freeSpaceOk()); bez niego Motywu, Modułów i Serwisu nie da się włączyćWymagane dla Motywu, Modułów, Serwisu
Sklepy lokalneKopie na localhost, w LAN albo za VPN tylko z lokalną konfiguracją Claude Desktop albo Claude Code, po HTTPSObsługiwane
Przyjazne adresyPotrzebne do ps_change_url. Przekierowanie kanoniczne 301Wymagane do zmian adresów
Moduł statystykpagesnotfound do ps_get_404_reportOpcjonalny
Moduł blogaSmartBlog, wykrywany automatycznie. Bez niego 5 narzędzi bloga jest ukrytychOpcjonalny
Moduł RODOpsgdpr, żeby usunięcie i eksport danych obejmowały historię konektoraOpcjonalny
Konto pracownikaTworzone w kroku 1 karty Start (nieaktywne, własny profil) albo wybrane ręcznie w Ustawieniach; SuperAdmin odrzucanyWymagane
HTTPS wychodzącyDo tellmyshop.pl (aktywacja i odświeżanie licencji, wiedza Konsultanta)Wymagane dla paczki Pro
Aplikacja czatuClaude (własny konektor) albo ChatGPT (własny konektor w trybie dewelopera)
MultistoreNarzędzia przyjmują shop_id; ustawienia są globalneNie obiecujemy (8.2)

4. Obszary i przełączniki

4.1 Obszary w kodzie

Od 2.7.0 Pro z aktywną licencją czyta cały sklep: widoczne są wszystkie grupy narzędzi, z wyjątkiem danych objętych blokadami stałymi (src/Security/Blocklist.php). Obszary różnią się zapisem. Grupy narzędzi są zdefiniowane w src/Settings.php (GROUPS), ich obszary zapisu w src/Access.php (AREA_OF_GROUP), przełączniki w Settings::BLOCKS. Numery bloków 0–5 zostają jako stałe klucze (docs/data/tools.json, pole block).

BlokObszar (kod / panel EN / panel PL)GrupyZapisDomyślnie po instalacjiNarzędzia
0rdzeń, zawsze włączonycore– (tylko odczyt)zawsze3: ps_get_shop_info, ps_check_capacity, ps_get_ready_job
1Content & SEO and Catalog / Content and SEO, Catalog / Treści i SEO, Katalogdiagnostics, catalog, seo, cms, blog, stats, history, supportod razu przy aktywnej licencji, po podglądzie i zgodzie; bez przełącznikawłączony (zapis wymaga aktywnej licencji)41: 22 odczyt, 19 zapis
2Commerce / Sales / Handelcommerceprzełącznik Handel, działa do wyłączeniawyłączony9: 1 odczyt, 8 zapis
3Theme / Theme / Motywtheme i wspólna grupa filesprzełącznik Motyw, 24 h, potem wyłącza się samwyłączony9: 3 odczyt, 6 zapis (7 theme + 2 files)
4Modules / Modules / Modułymodulesprzełącznik Moduły, 24 h, potem wyłącza się samwyłączony5: 5 zapis
5Service / Service / Serwisserverprzełącznik Serwis, 3 h, potem wyłącza się samwyłączony4: 1 odczyt, 3 zapis

Razem w 2.7.2: 71 narzędzi = 3 w rdzeniu + 41 + 9 + 9 + 5 + 4. 30 odczyt, 41 zapis. TellMyShop Free ma 24 z nich (same odczyty). Z aktywną licencją asystent widzi zaraz po instalacji 66; 5 narzędzi bloga wymaga SmartBloga. Liczba narzędzi wzrosła z 67 w 2.6.0 do 69 w 2.6.11 (ps_get_bought_together, ps_set_related_products) i do 71 w 2.7.0 (ps_get_element_full, ps_update_element_field). Wewnętrzna wersja 2.5.1 miała 63.

  • Odczyt działa w każdym obszarze bez przełącznika, także pliki motywu, ps_db_query i lista kopii plików.
  • Przełącznik jest sprawdzany dopiero przy zatwierdzeniu (confirm=true). Podgląd działa zawsze, więc asystent może zaplanować zmianę i powiedzieć właścicielowi, który przełącznik włączyć.
  • Obsługa klienta (support, obszar „Customer service” w Access::AREA_NAMES) działa tylko na poziomie danych klientów pseudo albo full (6.5).
  • ps_restore_file_backup wymaga przełącznika strefy przywracanego pliku: Motyw dla plików motywu, Moduły dla plików modułów, Serwis dla pozostałych plików sklepu (Settings::ZONE_BLOCK).
  • ps_update_element_field zapisuje od razu, ale pola cen i stanów wymagają przełącznika Handel.
  • ps_revert_change zapisuje od razu, ale cofnięcie zmiany z Handlu, Motywu, Modułów albo Serwisu wymaga przy zatwierdzeniu przełącznika tego obszaru; właściciel może cofnąć wszystko z panelu (karta Historia zmian).
  • Włączenie Motywu, Modułów albo Serwisu wymaga zaznaczenia potwierdzenia i gotowej kopii bazy: moduł używa kopii z ostatniej godziny albo robi nową, co w dużym sklepie może wymagać kilku kliknięć; bez miejsca na kopię przełącznik się nie włączy (ConfigPage::toggleBlock(), DbBackup). Handel wymaga tylko potwierdzenia.
  • Każde włączenie przełącznika trafia do dziennika audytu z nazwiskiem pracownika i wysyła e-mail do właściciela (block_on).

Licencja obejmuje wszystkie obszary; plany różnią się tylko liczbą domen produkcyjnych. Obszary sterują ryzykiem, nie ceną. Etykiety panelu pochodzą z i18n/*.php w 6 językach (pl, en, de, fr, es, it); angielski panel nazywa przełącznik Handel „Sales”.

4.2 Licencja, Pro bez licencji i TellMyShop Free

  • Pro z aktywną licencją (tryb licencji full) = czyta cały sklep i zapisuje tak, jak opisuje pkt 4.1.
  • Pro bez aktywnej licencji (brak klucza, klucz nieważny albo wygasły, inna domena lub instancja, albo token wersji darmowej; LicenseManager::effective() w trybie innym niż full) = czyta cały sklep, każde narzędzie zapisu jest ukryte, z gotowych zadań widać tylko grupę Free. Trybu tylko do odczytu jako ustawienia już nie ma (READ_ONLY usunięto w 2.7.0); decyduje sama licencja. W wewnętrznej wersji 2.5.1 bramka nie była wpięta (pkt 12).
  • TellMyShop Free = paczka zbudowana bez narzędzi zapisu, bez narzędzi bloków 2–5 i ps_get_element_full oraz bez skryptu awaryjnego. Panel i asystent mówią, co daje TellMyShop Pro, z linkiem.
  • ps_get_shop_info podaje wersję modułu, wariant (full, audit dla Pro bez aktywnej licencji, audit_free dla Free), tryb i stan licencji, obszary zapisu (write_areas: obszary zawsze włączone i każdy przełącznik z czasem działania i końcem), widoczne grupy i narzędzia, brakujące uprawnienia, poziom danych klientów i limity godzinowe, więc asystent wyjaśni, czemu zapis jest niedostępny.

4.3 Pozostałe ustawienia

Ustawienie (TELLMYSHOP_*)DomyślnieDziałanie
ENABLEDWyłączonyWłącznik konektora; włącza go krok 1 karty Start
EMPLOYEE_ID0Pracownik konektora; ustawia go krok 1 karty Start albo Ustawienia
BLOCK_COMMERCEWyłączonyPrzełącznik Handel, do wyłączenia
BLOCK_THEME_UNTIL, BLOCK_MODULES_UNTIL, SERVER_UNTIL0Koniec działania przełączników Motyw, Moduły (24 h) i Serwis (3 h)
CUSTOMER_DATA (+ _UNTIL, _PREV, _REASON)offoff / pseudo / full (6.5)
IP_ALLOWLISTPustaOpcjonalna; przy ChatGPT pusta
TRUST_PROXY, TRUSTED_PROXIESWyłączone, pustaIP klienta za proxy / Cloudflare
RATE_LIMIT, WRITE_LIMIT, FILE_WRITE_LIMIT300, 150, 20 na godzinę10–2000, 1–500, 1–200
OWNER_RULESPusteZasady właściciela dla asystenta, maks. 1000 znaków (5.1)
ALERTS, ALERT_EMAIL, DIGESTWłączone, pusty (= e-mail sklepu), włączoneAlarmy dla właściciela i podsumowanie dzienne (6.8)
BLOG_REDIRECTSWyłączone301 dla starych slugów SmartBlog; potrzebne do zmian adresów bloga
LOG_RETENTION, HISTORY_RETENTION30, 180 dni7–180, 30–730
KEEP_ON_UNINSTALLWłączonePrzy odinstalowaniu zostają historia, kopie plików, przekierowania, dziennik audytu, katalog prywatny (klucze) i licencja; wyłączone usuwa wszystko (11.4)
USAGE_STATSWyłączoneStatystyki uruchomienia wysyłane z odświeżeniem licencji (pkt 2.6); tylko Pro
INSTANCE_ID, LICENSE_*Generowane / pusteLicencja (pkt 7)

Usunięte w 2.7.0 (Settings::LEGACY_KEYS, kasowane przy aktualizacji i odinstalowaniu): READ_ONLY, GROUPS, BLOCK_THEME, BLOCK_MODULES, SERVICE_TOKEN_*, SERVICE_IP_ALLOWLIST, SERVICE_TOKEN_TTL.

4.4 Zachowanie przy wyłączonym przełączniku

  • Narzędzia za przełącznikiem zostają w tools/list i dalej czytają. Narzędzie zapisu zwraca podgląd z dopiskiem, że przełącznik jest wyłączony i że asystent ma pokazać podgląd jako plan i poprosić właściciela o włączenie przełącznika.
  • Przy zatwierdzeniu przełącznik jest sprawdzany ponownie, więc zapis zatwierdzony po wygaśnięciu przełącznika jest odrzucany z komunikatem, który podaje kartę panelu („Zapis w obszarach”), przełącznik i jego czas działania. Nic się nie zapisuje.
  • Przełączniki włącza tylko właściciel, w panelu. Ustawień konektora nie da się zmienić przez konektor.
  • Od 2.7.0 profil pracownika konektora utworzony przez moduł dostaje od razu uprawnienia panelu wszystkich obszarów (EmployeeSetup::BLOCK_GRANTS); o zapisie decydują przełączniki, nie profil. Role konfiguracji i odinstalowania modułów idą za przełącznikiem Moduły, także gdy wygaśnie sam (EmployeeSetup::reconcileModuleRoles()). Obszar Serwis działa poza uprawnieniami PrestaShop.
  • Blokady stałe, także przy wszystkich włączonych przełącznikach (Blocklist, w panelu „Zawsze zablokowane”): konta pracowników, hasła, sesje, uprawnienia i profile, konta API i webservice, tabele konektora, pliki z danymi do bazy (parameters.php, settings.inc.php, .env), katalog prywatny i sam moduł są niedostępne do odczytu i zapisu; podatki, moduły płatności z ich ustawieniami i plikami, zamówienia i ich statusy (w obsłudze klienta tylko prywatne notatki) oraz ustawienia wyglądające na sekrety nigdy nie są zapisywane.
  • Narzędzia bloga pojawiają się tylko przy wykrytym SmartBlogu.

4.5 Przypisanie narzędzi do obszarów

NarzędzieBlokGrupaZapisDostępW FreeNowe od 0.3.0
ps_get_shop_infocorecore–odczyt✓
ps_check_capacitycorecore–odczyt✓✓
ps_get_ready_jobcorecore–odczyt✓✓
ps_check_shop_health1diagnostics–odczyt✓
ps_diagnose_product_visibility1diagnostics–odczyt✓
ps_get_logs1diagnostics–odczyt✓
ps_list_modules1diagnostics–odczyt✓
ps_search_products1catalog–odczyt✓
ps_get_product1catalog–odczyt✓
ps_update_product_content1catalogod razuzapis
ps_get_category_tree1catalog–odczyt✓
ps_get_category1catalog–odczyt✓
ps_update_category_content1catalogod razuzapis
ps_set_product_categories1catalogod razuzapis
ps_list_features1catalog–odczyt✓
ps_set_product_features1catalogod razuzapis
ps_create_product1catalogod razuzapis✓
ps_manage_product_images1catalogod razuzapis✓
ps_manage_categories1catalogod razuzapis✓
ps_translate_catalog_items1catalogod razuzapis✓
ps_get_element_full1catalog–odczyt✓
ps_update_element_field1catalogod razu (pola cen i stanów: przełącznik Handel)zapis✓
ps_audit_seo1seo–odczyt✓
ps_inspect_page1seo–odczyt✓
ps_get_404_report1seo–odczyt✓
ps_change_url1seood razuzapis
ps_update_image_legends1seood razuzapis
ps_set_product_redirect1seood razuzapis✓
ps_list_redirects1seo–odczyt✓✓
ps_manage_redirects1seood razuzapis✓
ps_list_cms_pages1cms–odczyt✓
ps_get_cms_page1cms–odczyt✓
ps_update_cms_page1cmsod razuzapis
ps_create_cms_page1cmsod razuzapis✓
ps_list_blog_posts1blog (SmartBlog)–odczyt✓
ps_get_blog_post1blog (SmartBlog)–odczyt✓
ps_list_blog_categories1blog (SmartBlog)–odczyt✓
ps_save_blog_post1blog (SmartBlog)od razuzapis
ps_update_blog_category1blog (SmartBlog)od razuzapis
ps_get_product_sales1stats–odczyt✓
ps_get_bought_together1stats–odczyt✓✓
ps_list_changes1history–odczyt✓
ps_revert_change1historyod razu (zmiana z obszaru z przełącznikiem: ten przełącznik)zapis
ps_customer_service1supportod razuzapis✓
ps_update_prices2commerceprzełącznik Handelzapis
ps_manage_specific_prices2commerceprzełącznik Handelzapis
ps_manage_catalog_price_rules2commerceprzełącznik Handelzapis✓
ps_manage_cart_rules2commerceprzełącznik Handelzapis
ps_update_stock2commerceprzełącznik Handelzapis
ps_list_carriers2commerce–odczyt
ps_manage_combinations2commerceprzełącznik Handelzapis✓
ps_update_shipping2commerceprzełącznik Handelzapis✓
ps_set_related_products2commerceprzełącznik Handelzapis✓
ps_list_theme_files3theme–odczyt
ps_read_theme_file3theme–odczyt
ps_write_theme_file3themeprzełącznik Motywzapis
ps_clear_cache3themeprzełącznik Motywzapis
ps_create_child_theme3themeprzełącznik Motywzapis
ps_override_module_template3themeprzełącznik Motywzapis
ps_manage_hook_positions3themeprzełącznik Motywzapis
ps_list_file_backups3 (wspólne 3–5)files–odczyt
ps_restore_file_backup3 (wspólne 3–5)filesprzełącznik obszaru plikuzapis
ps_toggle_module4modulesprzełącznik Modułyzapis✓
ps_install_module4modulesprzełącznik Modułyzapis✓
ps_uninstall_module4modulesprzełącznik Modułyzapis✓
ps_module_config4modulesprzełącznik Modułyzapis✓
ps_module_file4modulesprzełącznik Modułyzapis✓
ps_server_file5serverprzełącznik Serwiszapis✓
ps_db_query5server–odczyt✓
ps_db_execute5serverprzełącznik Serwiszapis✓
ps_config5serverprzełącznik Serwiszapis✓

Parametry wszystkich 71 narzędzi są sprawdzone ze schematami wejścia zwracanymi przez tools/list modułu 2.7.2 (docs/data/tools.json, params_status: "code_2.7.2"; narzędzia bloga z kodu, bo sklepy testowe nie mają SmartBloga). Uwagi do wybranych narzędzi:

  • ps_check_capacity (odczyt, rdzeń, także bez licencji i we Free). items (wymagane, 0–100 000), batch_size (1–50, domyślnie 50), reads (0–100 000, domyślnie jedna lista na paczkę), files (0–1000). Kod: src/Tools/Shop/CheckCapacityTool.php na src/Write/Capacity.php (Capacity::plan()). Potrzebne wywołania to szacunek: odczyty + (paczki + pliki) × 3 (podgląd, zapis, sprawdzenie); potrzebne zapisy są dokładne: paczki + pliki. Zwraca limit, użyte, zostało i potrzeba dla wywołań, zapisów i zapisów plików, fits, items_now, frees_from (GG:MM) i suggest_limit (zaokrąglone w górę do dziesiątek); przy włączonym przełączniku Serwis także godzinę, o której sam się wyłączy (service_until).
  • ps_get_ready_job (odczyt, rdzeń, także bez licencji). Parametry job, args (obiekt z wartościami tekstowymi) i consultant. Bez job wypisuje zadania dostępne w tym sklepie, z oznaczeniem [switch off] tam, gdzie zadanie czyta i planuje, dopóki właściciel nie włączy przełącznika obszaru, z argumentami wymaganymi oznaczonymi *; z job zwraca scenariusz krok po kroku. Każda wartość argumentu jest obcinana do 200 znaków; brak wymaganego argumentu zwraca błąd. We Free i w Pro bez licencji lista obejmuje tylko grupę Free; zadanie Pro wywołane po nazwie zwraca jedno neutralne zdanie. Z consultant (bez job) zwraca wiedzę Konsultanta TellMyShop na jeden albo kilka tematów rozdzielonych przecinkami (approach, seo, ai_search, product_page, copy, pricing, categories, design, commerce, developer, ads; list wypisuje tematy), tylko przy aktywnej licencji. Scenariusze i wiedza są po angielsku (JobRegistry::lang()).
  • ps_get_element_full (odczyt, catalog, tylko Pro, 2.7.0). type (product | category | cms), id, lang, shop_id, table, max_chars (20–20 000; domyślnie 200, z table 2000), limit (domyślnie 20, maks. 200), offset. Wiersze każdej tabeli powiązanej z elementem (id_product, id_category, id_cms), także tabel innych modułów, oznaczone nazwą modułu; bez tabel z danymi klientów, zamówień i koszyków.
  • ps_update_element_field (zapis, catalog, 2.7.0). type, id, table, column, value (tekst albo null, maks. 1 000 000 znaków), where (pozostałe kolumny klucza; pasować musi dokładnie jeden wiersz), confirm, change_token. Bezpośredni zapis w bazie: inne moduły nie reagują, a PrestaShop niczego nie przelicza poza indeksem wyszukiwarki produktów. Nigdy nie zmienia kolumn klucza. Pola cen i stanów wymagają przełącznika Handel; tabele objęte blokadami stałymi są odrzucane. Nagrywane i odwracalne jak każda zmiana.
  • ps_list_redirects (odczyt, grupa seo, także bez licencji). search (maks. 200 znaków), active, sort = date | hits | last_hit (domyślnie date), shop_id, limit domyślnie 50, maks. 200, offset. Pokazuje tylko przekierowania dodane przez ps_manage_redirects; przekierowań produktów (ps_set_product_redirect) i reguł .htaccess w niej nie ma.
  • ps_manage_redirects (zapis, grupa seo, przy aktywnej licencji zapisuje od razu). action = add | disable | enable. items dla add, do 100: source (wymagane, maks. 1024 znaki), target (maks. 2048) albo target_type (product | category | cms) z target_id, code 301 (domyślnie) albo 302. redirect_ids dla disable i enable, do 100. Do tego lang, shop_id, confirm, change_token. Podgląd sprawdza na żywo: źródło musi teraz zwracać 404 albo 410 (aktywne przekierowanie tego samego źródła oznacza zmianę celu), cel 200 w domenie sklepu; łańcuchy i pętle są odrzucane, także w obrębie jednego wywołania; nie da się przekierować strony głównej ani adresów modułu i panelu. Po zapisie narzędzie sprawdza każdy stary adres. Bez akcji usuwania; ps_revert_change cofa dodanie albo włączenie przez wyłączenie przekierowania, a zmianę celu przez przywrócenie poprzedniego celu. Przekierowania obsługuje moduł; zostają po odinstalowaniu, chyba że odznaczono „Przy odinstalowaniu zachowaj historię, kopie i przekierowania”.
  • ps_get_404_report i ps_get_product_sales przyjmują days (ostatnie N dni zamiast date_from; 1–365 i 1–366).

Narzędzia z parametrem action (ps_manage_*, ps_customer_service, ps_server_file, ps_module_file, ps_module_config, ps_config) są liczone jako zapisujące; bez aktywnej licencji ich akcje listy i odczytu znikają razem z nimi.

4.6 Ekran konfiguracji (panel)

Panel w 6 językach (pl, en, de, fr, es, it; i18n/*.php; język pracownika, rezerwowo en). Nad kartami: etykieta wariantu (TellMyShop Free, TellMyShop Free (bez licencji), TellMyShop Pro, TellMyShop Pro (sprawdź licencję)) i jedno zdanie o stanie zapisu; po aktualizacji do 2.7.0 jednorazowa informacja o nowym modelu. Bez aktywnej licencji ramka mówi, co daje TellMyShop Pro. Karty w 2.7.2, w tej kolejności (views/templates/admin/configure.tpl):

Karta (PL / EN)Zawartość
Licencja / LicenceTylko paczka Pro. Klucz, stan, domena i jej typ (produkcyjna albo testowa), plan, aktualizacje do, ważność, ostatni błąd, odświeżenie i zwolnienie domeny
Start / Start„Uruchomienie w 3 krokach” / „Set up in 3 steps”: (1) Utwórz adres konektora / Create the connector address: jeden przycisk zakłada konto konektora, tworzy adres, włącza konektor, robi test połączenia i zaczyna kopię bazy; (2) Dodaj sklep w czacie / Add the shop in your chat app: Claude (Ustawienia → Konektory → Dodaj własny konektor) albo ChatGPT (Ustawienia → Aplikacje i konektory → Zaawansowane → Tryb dewelopera → Utwórz); (3) Zacznij pierwszą rozmowę / Start the first conversation, z tekstem startowym do wklejenia. Pod spodem lista stanu (konektor, token, pracownik, SSL, włączone przełączniki, ostatnia kopia bazy, poziom danych klientów, integralność, alarmy, ostatnie wywołanie)
Gotowe zadania / Ready-made tasksZwijana; zakładki sześciu grup zadań (4.7) z tytułem, opisem, przykładowym poleceniem do skopiowania, etykietą Free albo Pro i, przy grupach Pro, informacją, który przełącznik włączyć
Zapis w obszarach / Writing in areasTreści i SEO, Katalog: działa zawsze przy aktywnej licencji (bez niej asystent tylko czyta i planuje). Przełączniki Handel / Sales (do wyłączenia), Motyw / Theme (24 h), Moduły / Modules (24 h), Serwis / Service (3 h), każdy z opisem zmian, ryzykiem, potwierdzeniem, pozostałym czasem i przyciskiem Wyłącz. Lista „Zawsze zablokowane”. Sekcja Kopie bazy / Database backups: 2 ostatnie zaszyfrowane kopie, Zrób kopię teraz, Pobierz, jak przywrócić
Dane klientów (RODO) / Customer data (GDPR)Poziom, cel i koniec pełnego dostępu, rozpoznane tabele, stan szyfrowania i psgdpr, teksty pomocnicze do polityki prywatności i rejestru czynności; przycisk Pobierz dziennik audytu (CSV) / Download audit log (CSV)
Ustawienia: bezpieczeństwo, alarmy, limity / Settings: security, alerts, limitsPracownik konektora, zasady Twojego sklepu dla asystenta AI, limity godzinowe (domyślnie 300 wywołań / 150 zapisów / 20 zapisów plików, zakresy 10–2000, 1–500, 1–200), dozwolone adresy IP (przy ChatGPT puste), ustawienia proxy, przekierowania bloga (przy SmartBlogu), retencja, alarmy i odbiorca, podsumowanie dzienne, zachowanie danych przy odinstalowaniu, statystyki uruchomienia (Pro). Pod formularzem przycisk dodający adresy Anthropic do listy dozwolonych IP
Historia zmian i cofanie (ostatnie 30 operacji) / Change history and undo (last 30 operations)Operacje konektora z podglądem i cofaniem przez zalogowanego pracownika (ps_list_changes, ps_revert_change)
Dziennik połączeń (ostatnie 50) / Connection log (last 50)Ostatnie 50 wywołań konektora, działań w panelu i alarmów: czas, narzędzie, wynik, IP; bez treści zapytań i danych klientów
Awaryjne przywracanie (gdy sklep przestanie działać) / Emergency restore (if the shop stops working)Klucz i skrypt awaryjny (6.8); nie ma go we Free ani w wariancie addons
Kopie plików (ostatnie 30) / File backups (last 30)Kopie plików motywu, modułów i sklepu oraz ich przywracanie; nie ma ich we Free ani w wariancie addons

4.7 Gotowe zadania

Zdefiniowane w src/Jobs/JobRegistry.php (GROUPS, JOBS), podawane jako prompty MCP (prompts/list, prompts/get) w menu konektora w aplikacji czatu, oraz narzędzie rdzenia tylko do odczytu ps_get_ready_job, które w aplikacjach bez menu promptów (np. w ChatGPT) zwraca ten sam scenariusz. Argumenty promptów są obcinane do 200 znaków i wstawiane do scenariusza jako dane w cudzysłowie, nigdy jako polecenia. Gotowe zadania doszły w 2.6.0; od 2.7.1 są podzielone na grupy. Projekt: produkt/gotowe-zadania-2.7.1.md.

Grupa (klucz / panel EN / panel PL)Przełącznik do zapisuZadania (JobRegistry::JOBS)Free
free / Free / Free– (czytają; w Pro z aktywną licencją poprawki idą według zasad obszarów)tms_first_conversation, tms_shop_review, tms_morning_review, tms_product_not_selling, tms_sales_overview, tms_help✓
content / Content and SEO, Catalog / Treści i SEO, Katalogbrak: przy aktywnej licencji zapis od razutms_product_seo_batch, tms_category_pages, tms_fix_404, tms_translate_shop, tms_new_products, tms_features_cleanup
commerce / Sales / HandelHandeltms_prepare_promotion, tms_black_friday, tms_after_promotion, tms_price_change, tms_discount_code
theme / Theme / MotywMotywtms_theme_colors, tms_theme_notice_bar, tms_product_page_cro, tms_theme_mobile, tms_theme_homepage
plugins / Modules / ModułyModułytms_module_update, tms_module_cleanup, tms_module_settings, tms_module_conflict, tms_module_install
service / Service / SerwisSerwistms_service_error, tms_service_replace_text, tms_service_verification, tms_service_domain_move, tms_service_maintenance
  • tms_help nie ma karty w panelu; tms_features_cleanup nie ma ani karty, ani pozycji w menu promptów. Oba wypisuje ps_get_ready_job (tms_features_cleanup tylko przy aktywnej licencji).
  • Free (i Pro bez aktywnej licencji) pokazuje tylko grupę Free; scenariusze tylko czytają i kończą się linkiem do TellMyShop Pro. Pro z aktywną licencją pokazuje wszystkie grupy. Gdy przełącznik obszaru zadania jest wyłączony, zadanie działa w trybie switch: czyta, planuje i prosi właściciela o włączenie przełącznika przed jakimkolwiek zapisem.
  • Zadania Motywu, Modułów i Serwisu zaczynają się wspólnym scenariuszem obszaru (np. najpierw motyw potomny i custom.css, wyłączenie zamiast odinstalowania, odczyt i diagnoza przed bezpośrednią zmianą w bazie albo w plikach). Przy aktywnej licencji każdy scenariusz zawiera też pasującą wiedzę Konsultanta TellMyShop (Consultant::forJob()).
  • Każde zadanie: odczyt → plan dla właściciela → podgląd → zgoda → confirm → raport z ID operacji do cofnięcia; paczki do 50; bez obietnic efektów SEO i sprzedaży.
  • Karty w panelu są w języku panelu (6 języków); scenariusze dla modelu od 2.7.2 są po angielsku.

5. Ścieżka zapisu

5.1 Kroki (src/Write/WriteFlow.php)

  1. Wywołanie bez confirm (albo confirm=false). Narzędzie sprawdza argumenty, wczytuje stan i buduje podgląd: różnice per pole, liczby, przykładowe ceny, ostrzeżenia, skutki uboczne, warunki blokujące i informację, czy zmianę da się cofnąć. Moduły podpięte pod zapis tego obiektu są wymienione w ostrzeżeniu (Recorder::hookWarnings()). Gdy przełącznik obszaru jest wyłączony, podgląd o tym mówi. Nic się nie zapisuje.
  2. Token. Odpowiedź zawiera change_token = HMAC nazwy narzędzia, argumentów i skrótu stanu „przed”, podpisany kluczem modułu. Ważny 30 minut, jednorazowy (użyte tokeny są zapisywane).
  3. Zgoda. Asystent pokazuje podgląd i czeka na wyraźne „tak”. Instrukcje serwera zabraniają mu potwierdzania na własną rękę.
  4. Wywołanie z confirm=true, change_token i identycznymi argumentami. Odrzucane, gdy przełącznik obszaru jest wyłączony, licencja wygasła, tokenu brak, wygasł, był użyty albo wydano go dla innych argumentów, albo gdy stan „przed” zmienił się od podglądu. Dla ps_install_module token wiąże też SHA-256 pobranego ZIP-a. Pierwszy zatwierdzony zapis danego dnia uruchamia codzienną kopię bazy (5.6).
  5. Zapis przez ObjectWriter (5.2) albo wyspecjalizowane klasy zapisu (5.3). W trakcie zapisu Recorder nagrywa każdy wiersz bazy zmieniony przez narzędzie, przez PrestaShop i przez hooki innych modułów (5.4).
  6. Log: wpis w dzienniku PrestaShop z ID pracownika konektora, wpis historii per zmienione pole i jeden wpis z nagranymi wierszami (5.4). Operacje zbiorcze mają wspólny operation_id.
  7. Wynik z change_id / operation_id, kontrolą po zapisie („poza zmianami z podglądu nic innego w bazie się nie zmieniło” albo lista pozostałych zmian) i kontrolami, gdzie narzędzie je ma (301 po zmianie adresu, kompilacja Smarty, składnia PHP).
  8. Cofnięcie na prośbę: ps_revert_change, ps_restore_file_backup albo nowy ps_change_url.

Standard TellMyShop (rozmowa o zmianach). WriteFlow::risk() ocenia każdy podgląd jako low / medium / high (niskie, średnie, wysokie): obszary Motyw, Moduły i Serwis oraz grupa Handel to ryzyko wysokie (poza ps_set_related_products, które jest niskie); ps_change_url, ps_manage_redirects, ps_set_product_redirect, ps_manage_categories i ps_set_product_categories to średnie; cofnięcie, które usuwa obiekt utworzony przez konektor, to średnie; reszta niskie. Ponad 20 elementów podnosi poziom o jeden (maks. wysokie) i każe najpierw zrobić 2–3 próbki; ostrzeżenia podnoszą go co najmniej do średniego. WriteFlow::standard() dokleja do każdego podglądu blok „TellMyShop standard”: ile mówić na danym poziomie (wysokie = karta ryzyka do 5 linii), że zgodą jest tylko wyraźne „tak” do tego podglądu i że przy niepewności proponuje się próbę na jednym elemencie. Po confirm=true wynik każe asystentowi sprawdzić efekt, podać wynik z liczbami i powiedzieć, jak cofnąć (albo że cofnąć się nie da). Każdy podgląd i zapis kończy się też linią o pozostałych limitach godzinowych. Poziom to wskazówka dla rozmowy, nie blokada; blokują przełączniki, licencja i change_token. Standard jest też streszczony w instrukcjach serwera przy każdym initialize (Endpoint::instructions()).

Zasady właściciela. Ustawienie OWNER_RULES (panel: karta Ustawienia, pole „Zasady Twojego sklepu dla asystenta AI”, jedna zasada w linii, maks. 1000 znaków) jest doklejane do instrukcji serwera przez Endpoint::ownerRulesText() i widoczne w ps_get_shop_info. Zasady właściciela obowiązują, o ile nie łamią zasad bezpieczeństwa; podgląd i zgoda zostają zawsze.

5.2 „Jak Zapisz w panelu” (src/Write/ObjectWriter.php)

Dla każdego obiektu: wczytuje ObjectModel ze wszystkimi językami i id_shop_list; sprawdza każde zmienione pole regułami klasy (validateField, isCleanHtml, limity długości); wywołuje setFieldsToUpdate(), więc zapisuje tylko zmienione pola; wywołuje update(), które odpala actionObject<Klasa>UpdateBefore/After (dla produktów też actionProductSave, actionProductUpdate); zapisuje wpis w dzienniku PrestaShop przypisany do pracownika konektora i wpis historii zmian.

5.3 Kroki zależne od typu obiektu

ObszarCo się dziejeKod
ProduktyPrzebudowa indeksu wyszukiwarki, gdy zmieniły się pola indeksowaneProductPostSave
Nowy produkt / kopia (ps_create_product)Tworzony wyłączony (szkic); kopia przez Product::duplicate* PrestaShop (kategorie, dostawcy, kombinacje, cechy, ceny specjalne, akcesoria, tagi, pola personalizacji, zdjęcia), stan 0. Cofnięcie = usunięcie, chyba że produkt jest już w zamówieniuStructureWriter
Zdjęcia (ps_manage_product_images)Pobranie z publicznego adresu (ochrona SSRF), miniatury dla wszystkich typów i formatów zdjęć produktów, actionWatermark, czyszczenie cache miniatur. Dodanie, okładka i kolejność do cofnięcia; usunięcie wymaga confirm_delete i jest nieodwracalneImageFetcher
Kategorie (ps_manage_categories)Nowa kategoria wyłączona; przeniesienie w drzewie; pozycje produktówStructureWriter
Kategorie produktu (ps_set_product_categories)Zapis powiązań, czyszczenie cache i cache reguł cenCategoryAssignment
Tłumaczenia (ps_translate_catalog_items)Cechy i wartości, grupy atrybutów i atrybuty, opisy producentów i dostawców; do 200 w jednym podglądzieFeatureWriter, ObjectWriter
Dowolne pole elementu (ps_update_element_field)Jedno pole jednego wiersza w tabeli powiązanej z produktem, kategorią albo stroną CMS, także w tabeli innego modułu; bezpośredni zapis, bez hooków, przebudowywany jest tylko indeks wyszukiwarki produktów; kolumny klucza nigdy się nie zmieniająsrc/Tools/Element/*
Strona CMS (ps_create_cms_page)Tworzona wyłączona; cofnięcie = usunięcieStructureWriter
Przekierowanie produktu (ps_set_product_redirect)Natywne redirect_type (301/302 do kategorii albo produktu, 404, 410) i id_type_redirected, do 100 produktówObjectWriter
HandelCartRule, SpecificPrice, SpecificPriceRule (reguły cen katalogowych; PrestaShop stosuje je też do produktów dodanych później), Combination, StockAvailable z ruchem magazynowym i hookiemCartRuleWriter, CatalogRuleWriter, StockWriter
Produkty powiązane (ps_set_related_products)Lista akcesoriów produktu: set, add albo remove, do 50 produktów i 20 powiązań na produkt; wspólna dla wszystkich sklepów multistoreRelatedProducts
Wysyłka (ps_update_shipping)Próg darmowej dostawy (kwota / waga), opłata manipulacyjna, ceny w istniejących przedziałach przewoźnika, włączenie/wyłączenie przewoźnika. Bez nowych przewoźników i przedziałówConfigWriter, ObjectWriter
Obsługa klienta (ps_customer_service)draft_reply zapisuje prywatną CustomerMessage (klient jej nie widzi, nic nie jest wysyłane); set_status do 50 wątków. Historia szyfrowanaObjectWriter
Zmiana adresuZapis link_rewrite, adresy zależne, sprawdzenie starego adresu (5.7)ps_change_url
MotywKopia, kontrola Smarty, próbna kompilacja; motyw potomny; nadpisania szablonów modułów; pozycje modułówsrc/Theme/*, HookPositions
ModułyWłączanie i instalacja/aktualizacja przez ModuleManager PrestaShop (te same zdarzenia co w panelu); katalog modułu kopiowany przed aktualizacją; odinstalowanie wymaga confirm_name, pliki zostają na dysku. Moduły płatności i sam TellMyShop są odrzucane (Blocklist::assertModuleChangeable())src/Modules/*
Ustawienia modułów i PrestaShopJeden klucz na wywołanie; sekrety maskowane i nigdy nie zapisywane; PS_* tylko przez ps_config (Serwis); ustawienia podatków, płatności i statusów zamówień, ustawienia modułów płatności i ustawienia konektora nigdy (Blocklist::configWriteReason())ConfigWriter
Pliki (Moduły, Serwis)Kontrola strefy, kopia, sprawdzenie składni dla .phpFiles\Zone, PhpLint
SQL (Serwis)Pkt 5.8SqlWriter
Cachesmarty: skompilowane szablony, cache Smarty, pliki CCC. all: także cache Symfonyps_clear_cache

ps_check_shop_health wykrywa moduły podpięte pod zapisy i moduły reagujące tylko na formularz panelu. Warto go uruchomić przed większymi zmianami.

5.4 Historia zmian

PoleTreść
change_idLiczba, jedna na zmienione pole obiektu w danym języku
operation_id32 znaki hex, wspólne dla wszystkich zmian jednego wywołania
data, narzędzie, pracownikZnacznik czasu, nazwa narzędzia, ID pracownika konektora
object_type, object_id, lang, shop_id, fieldCel
before, afterPełne wartości; szyfrowane dla ChangeHistory::ENCRYPTED_TYPES (wiersze bazy i DDL, ustawienia PrestaShop i modułów, wątki i wiadomości klientów, nagrane wiersze) i warunków reguł koszyka; ps_list_changes pokazuje skrót

Nagrywanie wierszy (src/Write/Recorder.php, od 2.7.0). Podczas zatwierdzonego zapisu warstwa nagrywająca (RecordingDb, ta sama sesja MySQL) odczytuje przed zapytaniem i po nim każdy wiersz dotknięty przez INSERT, REPLACE, UPDATE i DELETE, niezależnie od tego, czy zmieniło go narzędzie, PrestaShop czy hook innego modułu. Wynik trafia do jednego zaszyfrowanego wpisu historii typu recorded_rows. Tabele ulotne (połączenia, statystyki, logi, cache) są pomijane; zapytania, których nie da się rozłożyć (UPDATE z JOIN, INSERT…SELECT, DDL), są wymieniane jako nienagrane; błąd nagrywania nigdy nie zatrzymuje zapisu. Wynik zapisu wymienia każdą zmianę spoza podglądu, a asystent pokazuje je właścicielowi zamiast samemu je cofać.

Zapis: tabela ps_tellmyshop_change. Retencja HISTORY_RETENTION, domyślnie 180 dni. Usunięcie w psgdpr kasuje wpisy klienta; eksport je wymienia bez wartości. ps_list_changes zawsze maskuje dane klientów w wartościach przed i po, niezależnie od bieżącego poziomu dostępu: historia to podsumowanie, a nie sposób odczytu danych klientów. Wewnętrzna wersja 2.5.1 pokazywała odszyfrowane wartości bez maskowania.

5.5 Cofanie

  • ps_revert_change po change_id albo operation_id. Dwuetapowe jak każdy zapis. Obejmuje Treści i SEO, Katalog, Handel, Moduły (włączanie, ustawienia) i Serwis (ps_config, ps_db_execute z kopią wierszy).
  • Operacja z nagranymi wierszami jest cofana przez nagranie: wiersze wracają dokładnie do stanu sprzed zapisu, bez ponownego zapisu obiektów i bez odpalania hooków innych modułów (RecordedRows::undo()).
  • Cofnięcie zmiany z obszaru Handel, Motyw, Moduły albo Serwis wymaga przełącznika tego obszaru w chwili zatwierdzenia (Reverter::blockFor()); podgląd cofnięcia działa zawsze. Karta Historia zmian w panelu pozwala zalogowanemu pracownikowi cofnąć każdą operację z jego własnymi uprawnieniami.
  • Jeśli obecna wartość różni się od zapisanej „po”, podgląd o tym mówi; cofnięcie nadpisze późniejszą edycję.
  • Samo cofnięcie jest logowane, więc też da się je cofnąć.
  • Nieodwracalne według typu obiektu (Reverter::NOT_REVERTABLE w src/Write/Reverter.php): theme (utworzenie motywu potomnego), db_ddl (ALTER, CREATE, DROP, TRUNCATE), module_install (instalacja, aktualizacja albo odinstalowanie modułu), image_file (usunięte zdjęcie). Podgląd podaje powód i co zrobić zamiast tego. Nieodwracalne są też: zmiany adresów (link_rewrite: nowy ps_change_url), edycje plików (kopie), czyszczenie cache, utworzony produkt, który jest już w zamówieniu, odtworzony kod rabatowy już użyty w zamówieniu. Zaszyfrowane wpisy wymagają pliku klucza.
  • Przekierowania (ps_manage_redirects): cofnięcie dodania albo włączenia wyłącza przekierowanie; cofnięcie zmiany celu przywraca poprzedni cel.
  • Reguły koszyka nie mają usuwania: kod się wyłącza, nigdy nie usuwa.

5.6 Kopie plików

  • Każdy zapis pliku w obszarach Motyw, Moduły i Serwis i każde przywrócenie najpierw kopiuje bieżący plik (albo zapisuje, że go nie było). ps_restore_file_backup kopiuje bieżącą wersję przed przywróceniem.
  • Miejsce: var/tellmyshop/backups/RRRR/MM/ i tabela tellmyshop_backup; katalogi modułów przed aktualizacją w backups/modules/. Wszystkie kopie szyfrowane. Retencja 90 dni, zawsze co najmniej 5 ostatnich kopii pliku.
  • Przywrócenie przez konektor wymaga przełącznika strefy pliku: Motyw dla plików motywu, Moduły dla plików modułów, Serwis dla pozostałych plików sklepu (Settings::ZONE_BLOCK). Przywrócenie w panelu wymaga uprawnienia pracownika do edycji motywów.
  • Motyw: .tpl, .css, .js, .json w aktywnym motywie; motyw nadrzędny tylko do odczytu (prefiks parent:); search musi wystąpić dokładnie raz. Moduły i pliki sklepu: rozszerzenia tekstowe (php, tpl, twig, css, js, json, yml, xml, txt, md, html, htaccess, scss, svg…), odczyt maks. 1 MB, treść maks. 500 000 znaków.
  • Kopie bazy (src/Storage/DbBackup.php, od 2.7.0, tylko Pro): pełny zrzut SQL tabel sklepu, zapisywany w częściach, które można wznowić, skompresowany gzip i zaszyfrowany (var/tellmyshop/db-backups/<id>.tmsdb, metadane w index.json, bez dodatkowej tabeli). Tabele ulotne (połączenia, statystyki, logi, cache) zachowują tylko strukturę. Kopia powstaje przy włączeniu konektora, raz dziennie przed pierwszą zatwierdzoną zmianą, przed włączeniem Motywu, Modułów albo Serwisu i po kliknięciu Zrób kopię teraz. Zostają 2 ostatnie; Pobierz odszyfrowuje kopię do pliku .sql.gz. Wszystkie kopie bazy są usuwane przy wyłączeniu konektora i przy odinstalowaniu. Zrzut nie jest migawką transakcyjną: duży sklep jest kopiowany w kilku żądaniach, a w tym czasie działa dalej.

5.7 Zmiana adresu URL

  1. Podgląd pokazuje stary i nowy adres w każdym języku, adresy zmienione przy okazji i to, czy stary adres przekieruje 301.
  2. Blokada, gdy przekierowanie kanoniczne to 302, włączony jest tryb deweloperski albo moduł nadpisuje trasy (src/Url/UrlGuard.php).
  3. Po zapisie narzędzie wywołuje stary adres, oczekuje 301 na nowy i podaje wynik.
  4. Cofnięcie = nowy ps_change_url na stary slug.
  5. Format sluga: ^[a-z0-9]+(?:-[a-z0-9]+)*$, maks. 128 znaków, SmartBlog maks. 45.
  6. Przekierowania z dowolnego starego adresu (do naprawy 404): ps_list_redirects je wyświetla, ps_manage_redirects je dodaje (301 albo 302), wyłącza i włącza; bez usuwania, cofanie przez historię zmian; źródło musi zwracać 404/410, cel 200 w domenie sklepu, bez łańcuchów i pętli (4.5).

5.8 SQL w obszarze Serwis (src/Server/)

  • ps_db_query (odczyt bez przełącznika): SELECT, SHOW, DESCRIBE, EXPLAIN w transakcji READ ONLY, maks. 200 wierszy, e-maile, telefony i adresy IP maskowane.
  • ps_db_execute (przełącznik Serwis): jedno polecenie INSERT, UPDATE, DELETE albo REPLACE. UPDATE/DELETE jednej tabeli: najpierw kopia pasujących wierszy (maks. 1000), cofnięcie = REPLACE tych wierszy; bez WHERE tylko z all_rows=true. INSERT jednego wiersza z autoinkrementacją: cofnięcie = usunięcie. Wykonanie w transakcji; więcej zmienionych wierszy niż zadeklarowano (max_rows) = ROLLBACK. DDL (ALTER, CREATE, DROP, TRUNCATE) tylko z allow_ddl=true: bez kopii, bez cofania, wyraźne ostrzeżenie w podglądzie.
  • SqlGuard: jedno polecenie, bez komentarzy ukrywających treść; tabele zawsze niedostępne (Blocklist::NO_ACCESS_TABLES): employee*, access, module_access, profile*, configuration*, webservice_*, api_client, api_access, authorized_application, authorization_role, customer_session, admin_filter i tabele konektora; tabele nigdy niezapisywalne (Blocklist::NO_WRITE_TABLES): podatki, powiązania modułów płatności, zamówienia i ich szczegóły, statusy, płatności, faktury, noty i zwroty; zablokowane operacje na plikach i użytkownikach MySQL. Tabele z danymi osobowymi (6.5) tylko na poziomie pseudo (z maskowaniem) albo full.
  • Uczciwie: filtr opiera się na wzorcach i chroni przed pomyłką, nie przed celowym obejściem. Obszar Serwis to pełne zaufanie, dlatego przełącznik działa 3 godziny, przed jego włączeniem powstaje kopia bazy, a właściciel dostaje alarm.
  • Nie ma narzędzia do uruchamiania dowolnego kodu PHP. Pliki PHP można zapisywać (pliki modułów z przełącznikiem Moduły, pliki sklepu z przełącznikiem Serwis) po sprawdzeniu składni.

6. Zabezpieczenia

6.1 Pracownik konektora i uprawnienia

Krok 1 karty Start („Utwórz adres konektora”) zakłada profil „Claude TellMyShop” i nieaktywnego pracownika „Claude TellMyShop” (nikt się na niego nie zaloguje), gdy ich nie ma, i od razu go wybiera (src/Admin/EmployeeSetup.php). Od 2.7.0 profil dostaje od razu uprawnienia panelu do wszystkich obszarów; o tym, co się zapisuje, decydują przełączniki. ExecutionContext::requirePermissions sprawdza zakładki i akcje panelu per narzędzie. Uprawnienia konfiguracji i odinstalowania modułów idą za przełącznikiem Moduły. SuperAdmin jest odrzucany. Wpisy w dzienniku są przypisane do tego pracownika, więc ps_get_logs(employee_only=true) pokazuje, co zrobił asystent. Odinstalowanie usuwa pracownika i profil utworzone przez moduł.

6.2 Limity

  • Do zmiany, na godzinę: 300 wywołań, 150 zapisów, 20 zapisów plików (pliki motywu, modułów i sklepu).
  • Limity operacji zbiorczych: pkt 11.1.

6.3 Zabezpieczenia handlu

  • Zapis każdej zmiany z obszaru Handel wymaga przełącznika Handel (działa do wyłączenia; włączenie wymaga zaznaczonego potwierdzenia i jest logowane z nazwiskiem pracownika).
  • ps_update_prices: cena 0 odrzucana; zmiana powyżej 30% wymaga allow_big_change.
  • ps_manage_specific_prices, ps_manage_catalog_price_rules: ostrzeżenie powyżej 50% rabatu; powyżej 90% wymagane allow_big_change; brak daty końca daje ostrzeżenie. Podgląd reguły katalogowej pokazuje liczbę produktów i przykładowe ceny.
  • ps_manage_cart_rules: nowe kody nieaktywne; brak akcji usuwania; reguła bez kodu wymaga auto_apply.
  • ps_update_stock: maks. 100 pozycji; zapis ruchu magazynowego.
  • ps_update_shipping: tylko istniejący przewoźnicy i przedziały.
  • Podatki, metody płatności i statusy zamówień nigdy nie są zmieniane (4.4).
  • Kwoty w podglądach są w walucie domyślnej sklepu (Text::money()). Wewnętrzna wersja 2.5.1 pokazywała „zł” w podglądzie ceny sklepów z inną walutą.

6.4 Zabezpieczenia motywu, modułów i plików

  • Kontrola Smarty przed zapisem: biała lista znaczników i modyfikatorów, potem próbna kompilacja. {php}, {include_php} i statyczne wywołania klas są odrzucane.
  • Sprawdzenie składni JSON; ostrzeżenia o nowych <script> i domenach zewnętrznych.
  • Nadpisania w motywie (ps_override_module_template) mają pierwszeństwo przed edycją plików modułu; zmiany w plikach modułu znikają przy jego aktualizacji i narzędzie to mówi.
  • ps_uninstall_module wymaga powtórzenia nazwy modułu w confirm_name; opis kieruje najpierw do wyłączenia.
  • Strefy plików: bez .., realpath() w obrębie strefy, dowiązania poza strefę odrzucane, lista zakazów (6.5), sam moduł nigdy do zapisu.
  • Motyw, Moduły i Serwis wyłączają się same po 24, 24 i 3 godzinach, a ich włączenie wymaga kopii bazy (4.1).
  • Klucz awaryjny przed włączeniem Modułów albo Serwisu (6.8).

6.5 Dane klientów (src/Privacy/PersonalData.php)

PoziomCo dostaje asystentUwagi
off (domyślnie)Żadnych tabel z danymi osobowymi; obsługa klienta odmawia; SQL odrzuca tabele osoboweZalecany
pseudoZamówienia, wątki, statystyki; kolumny osobowe zamaskowane; wolny tekst zamaskowany; bez zmian danych klientówE-mail do właściciela przy włączeniu
fullPełny odczyt i zmiany, tylko na 1/4/8/24 h z podanym celem i potwierdzeniem; potem powrót do poprzedniego poziomuE-mail do właściciela; cel zapisany w dzienniku i w alarmie
  • Rozpoznawanie. Stała lista KNOWN_TABLES (customer, address, guest, connections, orders i order_*, message, cart, newsletter i zapisy e-mail, powiadomienia o dostępności, dziennik maili, referrer cache, psgdpr, wishlist, opinie o produktach…) plus każda tabela z kolumną pasującą do wzorców e-mail, imię/nazwisko, telefon, adres, kod pocztowy, IP, data urodzenia, PESEL/NIP albo sekret, odczytana z information_schema, także w tabelach modułów innych firm. Tabele firmowe (contact, store, supplier, manufacturer, warehouse, shop, carrier) wyłączone.
  • Maskowanie (PersonalData::mask()). E-mail, telefon, adres i numery identyfikacyjne → pseudonim Klient-xxxxxx, ten sam przez jeden dzień (klucz pseudonimów zmienia się codziennie); imię i nazwisko → inicjały i pseudonim (J*** K*** (Klient-xxxxxx)); IPv4 → a.b.*.*, IPv6 → IPv6 ***, IP zapisane jako liczba → ***; data urodzenia → rok; sekrety → ***. W wolnym tekście (logi, wiadomości, pliki): e-maile j***@g***.com, telefony → 3 ostatnie cyfry, adresy IP oraz tokeny i klucze w postaci klucz=wartość i Bearer. W obsłudze klienta klient wątku to „Klient #ID” albo inicjały.
  • Stałe pseudonimy. HMAC-SHA256 z kluczem dziennym (HMAC daty z 32-bajtowym kluczem głównym w var/tellmyshop/keys/pseudonym.key): ta sama wartość ma to samo oznaczenie w ciągu doby, a następnego dnia inne, więc zestawień z różnych dni nie da się połączyć. Bez klucza wartość zmienia się w ***, nigdy nie jest jawna.
  • Pliki. Zawsze zablokowane (Files\Zone::DENY = Blocklist::NO_ACCESS_FILES, plus wzorzec): app/config/parameters.php|yml, config/settings*.inc.php, .env*, .htpasswd, *.key|pem|p12|crt|sql|gz|zip|tar|…|dump|bak, .git, .svn, var/logs, app/logs, log, logs, upload, download, katalog prywatny, kopie, moduł i jego skrypt awaryjny.
  • Szyfrowanie. Pkt 6.9.
  • psgdpr. actionDeleteGDPRCustomer usuwa klienta z zaszyfrowanej historii; actionExportGDPRData wymienia operacje konektora dotyczące klienta, bez wartości.
  • Obowiązki właściciela. Panel mówi wprost, że podstawa prawna, polityka prywatności, rejestr czynności, umowa powierzenia z dostawcą czatu i przekazywanie danych poza EOG należą do właściciela sklepu; daje teksty pomocnicze do sprawdzenia przez prawnika.
  • Nie piszemy „zgodny z RODO”. Dane pseudonimizowane to nadal dane osobowe (motyw 26 RODO); administratorem pozostaje sklep.
  • Luki znalezione w wewnętrznej wersji 2.5.1, poprawione w 2.6.0 i nadal obecne w kodzie 2.7.2: (1) ps_list_changes zawsze maskuje dane klientów (5.4); (2) ps_db_query maskuje IP w każdym formacie, także zapisane jako liczby, a przy pseudo dopuszcza kolumnę osobową tylko na liście wyników, nigdy w WHERE, JOIN, ORDER BY ani GROUP BY, odrzuca podzapytania i zmienne i ukrywa szczegóły błędów MySQL; (3) ps_get_logs pokazuje pracowników jako konektor albo pracownik #ID, maskuje e-maile, telefony, IP i tokeny i odrzuca szukanie po e-mailu, IP albo telefonie; (4) stałe pseudonimy (wyżej); (5) dziennik audytu (tabela tellmyshop_audit): kto i kiedy zmienił pełny dostęp do danych, przełączniki, stan konektora i licencję; nie da się go wyczyścić z panelu, a eksport to przycisk Pobierz dziennik audytu (CSV) w karcie Dane klientów (RODO); (6) odinstalowanie domyślnie zostawia historię, kopie plików, przekierowania, dziennik audytu i licencję (KEEP_ON_UNINSTALL = 1); (7) pełny dostęp wymaga aktywnej licencji i paczki Pro (PersonalData::fullBlockedReason()), celu z co najmniej 10 znaków i potwierdzenia, a karta mówi, że dane czytane przez asystenta trafiają do dostawcy czatu na jego warunkach (umowa powierzenia, przekazanie poza EOG); pełny dostęp kończy się też sam, gdy przestaje być dozwolony. Historia zmian jest usuwana po 180 dniach (HISTORY_RETENTION, 30–730).

6.6 Polecenia ukryte w danych

Dane sklepu (opisy, treści CMS, logi, nazwy plików, wpisy bloga, wiadomości klientów, wiersze bazy) są traktowane jako treść. Instrukcje serwera i opisy narzędzi każą asystentowi nie wykonywać poleceń znalezionych w danych, a wyniki narzędzi zwracających treść sklepu kończą się tym samym przypomnieniem (Endpoint::CONTENT_TOOLS). Każdy zapis i tak wymaga zgody właściciela.

6.7 Strony prawne

ps_update_cms_page przypomina asystentowi, że regulamin, polityka prywatności i zwroty to teksty prawne, zmieniane tylko na wyraźną prośbę.

6.8 Alarmy, integralność i klucz awaryjny

  • Alarmy (Alerts): e-mail + wpis w dzienniku połączeń ze statusem ALERT. Zdarzenia z panelu: dane klientów pseudo/full, włączenie przełącznika (Handel, Motyw, Moduły, Serwis), wyczyszczenie listy IP, wyłączenie alarmów. Zdarzenia konektora: seria zapisów (20 operacji w 10 minut), blokada IP, naruszenie integralności; te najwyżej raz na 15 minut na zdarzenie. Odbiorca ALERT_EMAIL albo PS_SHOP_EMAIL; język pracownika, który ostatnio zapisał ustawienia (przy instalacji: język domyślny sklepu, jeśli to polski, w innym wypadku angielski); wolny tekst w alarmach jest maskowany.
  • Podsumowanie dzienne: raz na 24 h, gdy coś się działo: wywołania, operacje zapisu per narzędzie, alarmy.
  • Integralność (Integrity): integrity.json z SHA-256 każdego pliku, zapisywany przy budowie paczki; wykrywa zmienione, usunięte i dopisane pliki PHP; sprawdzany przy każdym wejściu do panelu i najwyżej co 6 h przez konektor; zmiana stanu na „naruszona” wywołuje alarm.
  • Klucz awaryjny (RescueKey): widoczny raz, skrót SHA-256 w katalogu prywatnym; skrypt rescue/rescue.php.txt kopiowany do katalogu głównego sklepu pod losową nazwą (PrestaShop blokuje bezpośrednie wywołania PHP w modules/). Działa bez uruchamiania PrestaShop: przywraca pliki zmienione przez konektor, wyłącza obszar Serwis; zmian w bazie nie cofa (do tego służą kopie bazy z pkt 5.6). Usuwany przy odinstalowaniu. Nie ma go w TellMyShop Free.

6.9 Szyfrowanie (src/Security/Crypto.php)

libsodium secretbox (XSalsa20-Poly1305). Klucz 32 B w var/tellmyshop/keys/history.key, poza bazą danych. Format enc:v1: + base64(nonce + szyfrogram). Szyfrowane: historia zmian wierszy bazy, nagrane wiersze, ustawienia PrestaShop i modułów, wątki i wiadomości klientów, warunki reguł koszyka, wszystkie kopie plików i wszystkie kopie bazy. Gdy klucza nie da się utworzyć, nic nie jest zapisywane jawnie. Utrata klucza = zaszyfrowanych zmian nie da się cofnąć, a kopii bazy odczytać. Chroni przed wyciekiem samej bazy, nie przed przejęciem całego serwera.

7. Integracja licencji

7.1 Zasady (handlowe)

TematDziałanie
AktywacjaWłaściciel wkleja klucz (TMS-…) w karcie Licencja. POST https://tellmyshop.pl/api/v1/activations z kluczem, produktem, domenami, ID instancji, wersjami. Zwraca token podpisany Ed25519, związany z domeną i instancją
DomenaZ shop_url PrestaShop, nie wpisywana. Normalizacja: małe litery, bez www., bez portu i ścieżki, IDN na punycode. Multistore: wszystkie domeny, najpierw sklep domyślny
Produkcja czy testRozstrzyga serwer. Darmowe domeny testowe: localhost, 127.0.0.1, prywatne zakresy IP, *.local, *.localhost, *.test, *.example, *.invalid, subdomeny dev., staging., stage., test., demo., preprod., beta. i do 3 dodatkowych. *.dev nie jest darmowe
OdświeżaniePOST /activations/refresh raz na dobę w tle (także przy otwarciu panelu); nieudane ponawiane najwyżej co godzinę; limit czasu 3 sekundy; nigdy nie blokuje wywołania narzędzia
Bez połączeniaToken ważny 14 dni = okres łaski; ostrzeżenie o okresie łaski pojawia się dopiero po nieudanym odświeżeniu, 2 dni po wydaniu tokenu
Cofnięta, zawieszona, zwolniona, inna instancja, brak uprawnień, zły tokenToken usuwany przy najbliższym odświeżeniu: narzędzia zapisu od razu ukryte
Brak, nieważna albo wygasła licencjaOdczyt całego sklepu, narzędzia zapisu ukryte (tryb licencji none albo audit dla tokenu darmowej wersji). Sklep, panel i konektor działają dalej
TellMyShop FreeOsobny darmowy ZIP bez narzędzi zapisu; klucza się nie wymaga ani nie wydaje
Aktualizacje12 miesięcy w cenie; potem moduł działa w ostatniej pobranej wersji. W 2.7.2 bez powiadomienia o aktualizacji w module; nowa wersja jest widoczna na koncie TellMyShop
ZwolnieniePOST /activations/release z karty Licencja (zwolnienie domeny) albo z konta klienta. Odinstalowanie nie zwalnia domeny; przy włączonym „zachowaj” (domyślnie) ustawienia licencji zostają na wypadek ponownej instalacji
MultistoreJedna instalacja = jedna licencja

7.2 Wdrożenie w 2.7.2

PozycjaWewnętrzna wersja 2.5.12.7.2 (kod)
src/License/* (klient, menedżer, token Ed25519, format klucza, klasyfikacja domen)JestJest, plus Usage (statystyki uruchomienia) i ConsultantUpdate (wiedza Konsultanta)
Adres APIhttps://tellmyshop.com/api/v1https://tellmyshop.pl/api/v1 (LicenseClient::API_BASE)
Klucz publicznyTestowyk1 (LicenseToken::PUBLIC_KEYS)
Bramka w EndpointNiewpięta (groupsFor() zawsze z $licensed = true)Wpięta: bez trybu full każde narzędzie zapisu jest ukryte (ToolRegistry::visible(..., $readOnly)), odczyt całego sklepu zostaje; każde wywołanie zapisu jeszcze raz sprawdza LicenseManager::writesAllowed(). W 2.6.x bramka ograniczała też odczyt do bloku 1 i odrzucała konektor serwisowy
Karta Licencja w paneluBrakJest (paczka Pro)
INSTANCE_IDGenerowany przy instalacjiBez zmian (losowy UUID v4)
Licencja w ps_get_shop_info i instrukcjachCzęściowops_get_shop_info zwraca edition i license (tryb, stan, typ domeny, ważność, aktualizacje do, komunikat); bez licencji instrukcje linkują do https://tellmyshop.pl/en/account?from=module (PL: https://tellmyshop.pl/account?from=module)
Statystyki uruchomieniaBrakZa zgodą, domyślnie wyłączone (2.6)
OdinstalowanieKasuje klucz licencjiDomyślnie go zostawia

8. Języki i multistore

8.1 Języki

  • Narzędzia odczytu przyjmują lang (kod ISO). Bez niego listy używają języka domyślnego, a narzędzia „get” zwracają wszystkie aktywne języki.
  • Narzędzia zapisu zapisują jeden język na wywołanie; lang jest wymagany, gdy sklep ma więcej niż jeden aktywny język. ps_create_product i ps_create_cms_page przy tworzeniu wypełniają wszystkie języki; tłumaczenia dochodzą narzędziami aktualizacji.
  • Slugi są per język; ps_change_url zmienia jeden język.
  • Panel: pl, en, de, fr, es, it. Teksty dla modelu: angielski (2.3); asystent odpowiada w języku właściciela.

8.2 Multistore

  • Większość narzędzi przyjmuje shop_id; ObjectWriter wczytuje obiekty z id_shop_list.
  • Ustawienia modułu są globalne (getGlobalValue): jeden token, jeden zestaw przełączników i limitów dla wszystkich sklepów. Instalacja działa w CONTEXT_ALL.
  • Kontekst sklepu i trasy per sklep nie są sprawdzone. Dokumentacja mówi, że multistore nie jest obsługiwane.

9. Logi

LogGdzieZawartośćOdczyt
Historia zmiantellmyshop_changePrzed/po per pole i nagrane wiersze każdej operacji, szyfrowane dla danych klientów, ustawień i wierszy bazyps_list_changes, karta Historia zmian i cofanie
Kopie plikówKatalog prywatny + tellmyshop_backupZaszyfrowane kopie przed każdym zapisemps_list_file_backups, karta Kopie plików
Kopie bazyvar/tellmyshop/db-backups/ (index.json)2 ostatnie zaszyfrowane zrzuty bazyKarta Zapis w obszarach, sekcja Kopie bazy
Dziennik połączeńtellmyshop_logNarzędzie, status, czas, komunikat (z wyciętymi sekretami), IP, pracownik, sklep; nieudane logowania; działania w panelu (status ADMIN) i alarmy (status ALERT)Panel; retencja LOG_RETENTION 30 dni
Użyte tokeny zmiantellmyshop_token_usedJednorazowość tokenów-
Przekierowaniatellmyshop_redirectŹródło, cel, kod, aktywne, wejścia, ostatnie wejście, pracownik, operacjaps_list_redirects
Dziennik audytutellmyshop_auditZdarzenie, szczegóły, pracownik, IP: działania w panelu (włączenie/wyłączenie konektora, przełączniki, poziom danych klientów i cel, licencja, klucz awaryjny, pobranie kopii bazy) i koniec pełnego dostępu do danychPobierz dziennik audytu (CSV) w karcie Dane klientów (RODO)
Dziennik PrestaShopps_logWpisy ObjectWriter, SqlWriter i innych klas zapisu z ID pracownika konektora; zdarzenia kopii bazyps_get_logs
Zdarzenia licencjiSerwer licencjiAktywacje, odświeżenia, zwolnieniaKonto klienta

10. Kody błędów

2.7.2 nie ma własnych tekstowych kodów błędów. Błędy mają dwie postacie (src/Mcp/Core.php, src/Endpoint.php). Od 2.7.2 komunikaty są po angielsku; asystent tłumaczy je właścicielowi w jego języku. Sekrety (tokeny, klucze) są wycinane z każdego komunikatu (mcp_redact()).

1. Odrzucone żądanie (błąd JSON-RPC). Ustawiony jest status HTTP, a treść to {"jsonrpc": "2.0", "id": …, "error": {"code": …, "message": "…"}}, z data tam, gdzie zaznaczono. Odmowy z Endpoint::deny() nie mają id i trafiają do dziennika połączeń.

HTTPKod JSON-RPCKiedyŹródło
503-32600Konektor wyłączony (ENABLED)Endpoint::deny()
403-32600Żądanie przez zwykły HTTPEndpoint::deny()
429-3260020 nieudanych prób tokenu z tego IP w 10 minut (dotyczy tylko żądań bez ważnego tokenu)Endpoint::deny()
403-32600IP spoza IP_ALLOWLISTEndpoint::deny()
503-32600Brak pracownika konektora, pracownik nie istnieje albo ma profil SuperAdmin (ExecutionContext::boot())Endpoint::deny()
403-32600Nagłówek Origin inny niż https://claude.ai, https://claude.com, https://chatgpt.com albo https://chat.openai.com (Forbidden origin.)mcp_check_origin()
401-32600Brak albo zły token (Unauthorized.); liczony do blokadymcp_check_auth()
405-32600Metoda inna niż POSTmcp_run()
400-32700Treść nie jest JSON (Parse error)mcp_run()
400-32600Paczka JSON-RPC (batch) albo niepoprawne żądanie JSON-RPC 2.0mcp_run()
400-32022Nieobsługiwana wersja protokołu; data: supported, requestedmcp_context()
400-32020Niezgodne nagłówki (MCP-Protocol-Version, Mcp-Method, Mcp-Name)mcp_context()
404 (200 w starszych wersjach)-32601Nieznana metodamcp_dispatch()
400 / 404 (200 w starszych wersjach)-32602Prompt: brak wymaganego argumentu, nieznany promptmcp_get_prompt()
200-32602Nieznane narzędzie albo argumenty narzędzia nie są obiektemmcp_call_tool()
500-32603Nieoczekiwany wyjątek poza narzędziem (Internal error); szczegóły tylko w dzienniku modułumcp_run()

2. Błąd narzędzia (wynik MCP z isError: true). Samo wywołanie się udaje; wynik to {"content": [{"type": "text", "text": "Error: …"}], "isError": true}. Asystent czyta tekst i może poprawić wywołanie. Każdy błąd narzędzia trafia do dziennika połączeń ze statusem ERR.

Tekst zaczyna się odZgłaszany jakoTypowe przyczyny
Error: arguments.<pole>: …InvalidArgumentException z walidacji schematu (mcp_validate())Zły typ, wartość spoza listy, brak wymaganego pola, za długi tekst, za dużo pozycji
Error: …McpToolErrorPrzekroczony limit godzinowy (wywołania, zapisy, zapisy plików); przełącznik obszaru wyłączony albo wygasł przed zatwierdzeniem („Writing in the … area is off … Nothing was saved.”); zapis niedostępny (licencja, z linkiem do strony konta); blokada stała (tabela, ustawienie, plik albo moduł); brak uprawnienia w panelu; change_token brakujący, wygasły, użyty albo dla innych argumentów, albo dane zmieniły się od podglądu; dowolny błąd podglądu („Cannot run – fix:” z listą); cofnięcie niemożliwe (5.5); odmowa SqlGuard; za niski poziom dostępu do danych klientów
Internal server error: <klasa>: …Inny wyjątek wewnątrz narzędziaNieoczekiwany błąd; plik i linia trafiają do dziennika modułu

11. Wymagania niefunkcjonalne

11.1 Limity narzędzi

NarzędzieLimit
Wszystkie narzędzia (cały moduł)300 wywołań, 150 zapisów, 20 zapisów plików na godzinę (do zmiany)
ps_manage_redirects100 przekierowań (add) albo 100 ID (disable / enable) na wywołanie; źródło maks. 1024, adres celu maks. 2048 znaków
ps_list_redirectsDomyślnie 50 na stronę, maks. 200
ps_get_ready_jobWartości argumentów obcinane do 200 znaków każda
ps_check_capacityitems 0–100 000 (wymagane), batch_size 1–50, reads 0–100 000, files 0–1000
ps_update_product_content50 produktów na wywołanie, jeden język
ps_update_category_content20 kategorii na wywołanie
ps_update_cms_page1 strona; treść maks. 300 000 znaków
ps_update_image_legends100 zdjęć; alt maks. 128 znaków
ps_set_product_categories200 produktów; 20 kategorii do dodania, 20 do usunięcia
ps_set_product_features100 pozycji
ps_create_product1 produkt na wywołanie; do 30 kategorii; nazwa maks. 128
ps_manage_product_imagesDo 10 zdjęć dodanych na wywołanie; 100 pozycji
ps_manage_categories200 pozycji na wywołanie
ps_translate_catalog_items200 tłumaczeń w jednym podglądzie
ps_get_element_full200 wierszy na wywołanie (domyślnie 20); wartości obcinane do max_chars (domyślnie 200, z table 2000; maks. 20 000)
ps_update_element_field1 pole 1 wiersza na wywołanie; wartość maks. 1 000 000 znaków
ps_set_product_redirect100 produktów
ps_update_prices100 produktów; cena 0 odrzucana; powyżej 30% wymaga allow_big_change
ps_manage_specific_prices, ps_manage_catalog_price_rulesOstrzeżenie powyżej 50%; powyżej 90% wymaga allow_big_change; reguły katalogowe: do 50 kategorii/producentów na regułę
ps_manage_combinations100 kombinacji
ps_update_shipping50 pozycji
ps_set_related_products50 produktów, do 20 powiązań na produkt
ps_update_stock100 pozycji
ps_customer_serviceset_status 50 wątków; szkic maks. 10 000 znaków; listy 30 (maks. 100)
ps_write_theme_file, ps_module_file, ps_server_fileTreść maks. 500 000; search/replace maks. 100 000 każde
ps_db_query200 wierszy, transakcja READ ONLY
ps_db_executeKopia maks. 1000 wierszy; zadeklarowana liczba wierszy egzekwowana
ps_get_category_tree300 węzłów; głębokość maks. 10
Narzędzia list200 wierszy na wywołanie (domyślnie 50), stronicowanie przez offset
ps_list_features500 wierszy (domyślnie 100)
ps_list_modules300 wierszy (domyślnie 100)
ps_list_theme_files500 wierszy (domyślnie 200)
ps_read_theme_fileDomyślnie 400 linii na wywołanie
ps_get_productOpisy ponad 8 000 znaków ucinane, z adnotacją
ps_get_logsKomunikaty ucinane do 300 znaków
ps_get_product_salesOkres maks. 366 dni (days 1–366); domyślnie ostatnie 90 dni
ps_get_404_reportdays 1–365; domyślnie ostatnie 30 dni; maks. 200 wierszy
ps_get_bought_togetherOkres 7–730 dni, domyślnie 180; 100 produktów głównych (domyślnie 20), do 20 par na produkt
ps_inspect_pageTylko domeny sklepu; maks. 5 przekierowań
change_token30 minut, jednorazowy
Token testowy2 minuty
PrzełącznikiHandel do wyłączenia; Motyw i Moduły 24 h; Serwis 3 h

Limity narzędzi bloga i ps_list_carriers: zobacz tools.json.

11.2 Czas i wydajność

  • Wywołania licencji: krótkie limity czasu (odświeżanie w tle 3 s), nigdy nie blokują narzędzia.
  • ps_inspect_page, kontrola adresów po zmianie i pobieranie zdjęć/ZIP używają limitów HttpProbe / ImageFetcher.
  • Rozpoznawanie tabel osobowych raz na żądanie HTTP (cache).
  • Limit czasu: set_time_limit(120) na żądanie (mcp_run()), więc wywołanie może trwać do 120 sekund, jeśli hosting na to pozwala.
  • Kopie bazy są zapisywane w częściach (około 15 sekund na kliknięcie w panelu, wznawiane przy kolejnych żądaniach); kopia niedokończona przez 6 godzin zaczyna się od nowa.
  • Bez częściowego sukcesu: każdy błąd znaleziony przy budowie podglądu zatrzymuje całe wywołanie z listą problemów (WriteFlow), więc nic się nie zapisuje, dopóki wszystkie pozycje nie przejdą. Część narzędzi pomija pozycje, które nie wymagają zmiany, z ostrzeżeniem w podglądzie.

11.3 Formaty

  • UTF-8. Daty RRRR-MM-DD (strefa sklepu). Kwoty w walucie sklepu z oznaczeniem netto/brutto.
  • Identyfikatory produktu: id:123, ref:ABC-1, ean:5901234123457, adres w sklepie, samo ID (1-7 cyfr), EAN (8/12/13 cyfr) albo indeks.

11.4 Zgodność, aktualizacja i odinstalowanie

  • PrestaShop 8.1+ i 9.x, PHP 8.1+ (PrestaShop 1.7.8: osobna paczka PHP 7.4). Bez PrestaShop Account. Bez zmian w plikach rdzenia i bez nadpisań klas.
  • Aktualizacja zachowuje historię, kopie plików, token, przełączniki i licencję. Settings::installDefaults() dodaje tylko brakujące ustawienia z wartościami domyślnymi. Skrypty aktualizacji w upgrade/: upgrade-2.6.5.php wyłącza statystyki uruchomienia u wszystkich (od tej pory tylko za zgodą); upgrade-2.7.0.php przenosi na model obszarów: jeśli był włączony tryb tylko do odczytu, wszystkie przełączniki zostają wyłączone; w przeciwnym razie Handel zostaje włączony, włączone wcześniej Motyw i Moduły dostają świeże 24 h, a Serwis najwyżej 3 h; limity godzinowe rosną do co najmniej 300 wywołań i 150 zapisów; konektor serwisowy, lista grup i tryb tylko do odczytu są usuwane (Settings::LEGACY_KEYS); profil konektora dostaje uprawnienia wszystkich obszarów; panel pokazuje jednorazową informację.
  • Odinstalowanie (tellmyshop.php, sql/uninstall.php): zawsze usuwa pracownika i profil utworzone przez moduł, skrypt awaryjny i jego klucz, wszystkie kopie bazy, pobraną wiedzę Konsultanta, token konektora, klucz podpisu i ustawienie pracownika oraz tabele tellmyshop_log i tellmyshop_token_used. Przy włączonym KEEP_ON_UNINSTALL (domyślnie) reszta zostaje: tabele tellmyshop_change, tellmyshop_backup, tellmyshop_redirect, tellmyshop_audit, katalog prywatny var/tellmyshop/ z kluczami i pozostałe ustawienia, w tym licencja. Przy wyłączonym usuwane jest także to wszystko. Zatwierdzone zmiany zostają w sklepie.
  • Z wewnętrznych wersji claudemcp na tellmyshop (2.6.0 i nowsze) nie ma aktualizacji w miejscu ani migracji danych (inna nazwa techniczna; kod niczego nie czyta z claudemcp): trzeba odinstalować stary moduł i zainstalować tellmyshop.

12. Znane problemy w 2.5.1 (historia)

Problemy znalezione w wewnętrznej wersji 2.5.1 w testach na PrestaShop 9.0.0 (PHP 8.4), 2026-10-05. Ostatnia kolumna mówi, co z nimi zrobił kod 2.6.0; późniejsze zmiany są w nawiasach.

#ObszarProblem w 2.5.12.6.0
1LicencjaNiewpięta: bez klucza po wyłączeniu trybu tylko do odczytu widać było 39 narzędzi, także zapisującePoprawione: bramkę wpięto w src/Endpoint.php; bez licencji 2.6.0 działało tylko w odczycie i pokazywało tylko blok 1 (od 2.7.0 bez licencji cały sklep jest do odczytu, a narzędzia zapisu są ukryte)
2ps_update_pricesPodgląd pokazywał „zł” w sklepie w EUR (funkcja domyślnie wpisywała PLN)Poprawione: podglądy w walucie domyślnej sklepu (Text::money())
3ModułOstrzeżenie w dzienniku PrestaShop o niezdefiniowanym hooku registerGDPRConsentPoprawione: tellmyshop.php dostał obsługę hookRegisterGDPRConsent
4ps_get_product_salesWymagał daty początkowej; summary.net niezaokrąglone (od 0.3.0)Poprawione: obie daty opcjonalne (domyślnie ostatnie 90 dni); sumy zaokrąglone do 2 miejsc po przecinku (od 2.7.0 także days)
5ps_search_productsKolumna price nie mówiła, czy to netto czy brutto (od 0.3.0)Nagłówek kolumny brzmiał cena brutto (w walucie sklepu; od 2.7.2 gross price); pole w danych strukturalnych nadal nazywa się price
6PrywatnośćLuki 1–7 z pkt 6.5Poprawione, w tym dziennik audytu z eksportem CSV i stałe pseudonimy (4)
7Gotowe zadaniaBrakDodane jako prompty MCP + ps_get_ready_job (od 2.7.1 w grupach, pkt 4.7)

Potwierdzone na 9.0.0 z 2.5.1: instalacja, utworzenie konta Claude, wygenerowanie adresu i połączenie; wszystkie 17 narzędzi odczytu widocznych po instalacji; zapis w dwóch krokach dla opisu produktu i ceny. 2.6.0: kod sprawdzony, test zapisu i cofnięcia zaliczony na PrestaShop 9.2.0 (sklep testowy), 2026-10-05. 2.7.2: tools/list sprawdzone na PrestaShop 8.1.7 i 8.2.3, test zapisu i cofnięcia z nagrywaniem wierszy zaliczony na 8.2.3 (sklepy testowe), 2026-10-10.

13. Plan rozwoju

Poza 2.7.2. Nigdy nie opisujemy jako dostępnego.

PozycjaUwagi
OAuth dla konektoraZastępuje token w adresie; potrzebne do katalogu konektorów Claude. Claude i ChatGPT łączą się dziś tokenem
Powiadomienie o aktualizacji w paneluTekst changelogu już zasila releases.changelog_md; dziś nowa wersja jest widoczna na koncie TellMyShop
Tokeny per osobaJeśli agencje poproszą; z opisem osoby w historii zmian
Uruchamianie dowolnego kodu PHPNie planujemy; tylko zapis plików PHP ze sprawdzeniem składni i kopią (przełączniki Moduły i Serwis)
MultistoreUstawienia per sklep i licencja per domena
Wariant dla PrestaShop AddonsKod jest (Edition::isAddons), niewydany
Przegląd konkurencjips_mcp_server i ps_mcp_tools od PrestaShop SA

14. Pytania rozstrzygnięte w 2.6.0 i 2.7.2

Pytania otwarte do paczki 2.6.0 rozstrzygnięto na podstawie kodu 2.6.0 (2026-10-05); odpowiedzi poniżej są zaktualizowane do kodu 2.7.2 (2026-10-11). Wcześniej rozstrzygnięte przez kod 2.5.1: transport i wersje protokołu, Origin bez nagłówka, domyślna lista IP (pusta), czas blokady (okno 10 minut), limity do zmiany, wymiana tokenu (od razu), przełącznik danych klientów (trzy poziomy), retencja historii, retencja kopii.

  1. Etykiety panelu: w 6 językach w i18n/ (pl, en, de, fr, es, it); nazwy kart w pkt 4.6.
  2. Lista narzędzi: 71 narzędzi w 2.7.2 (67 w 2.6.0, 69 od 2.6.11, 71 od 2.7.0), bez zmian nazw; parametry każdego narzędzia sprawdzone z tools/list 2.7.2 (params_status: "code_2.7.2" w tools.json).
  3. Gotowe zadania: src/Jobs/JobRegistry.php, sześć grup, jako prompty MCP i przez ps_get_ready_job; karty w panelu w 6 językach, scenariusze dla modelu od 2.7.2 po angielsku.
  4. Bramka licencji: wpięta w src/Endpoint.php; bez trybu full narzędzia zapisu są ukryte; klucz publiczny k1; odinstalowanie nie zwalnia domeny.
  5. TellMyShop Free: nie wymaga klucza (Edition::usesLicense() zwraca false dla darmowej paczki).
  6. Dane klientów: wszystkie 7 poprawek jest w kodzie (6.5); stałe pseudonimy to HMAC z kluczem dziennym; historia jest usuwana po 180 dniach.
  7. Katalog i klucz: var/tellmyshop/; klucz szyfrowania var/tellmyshop/keys/history.key; kopie bazy w var/tellmyshop/db-backups/.
  8. Tabele i ustawienia: tellmyshop_log, tellmyshop_change, tellmyshop_backup, tellmyshop_token_used, tellmyshop_redirect, tellmyshop_audit (sql/install.php); prefiks ustawień TELLMYSHOP_.
  9. Pracownik i profil: pracownik „Claude TellMyShop”, profil „Claude TellMyShop” (src/Admin/EmployeeSetup.php).
  10. Kody błędów i format: pkt 10.
  11. Limit czasu i częściowy sukces: pkt 11.2.
  12. Nieodwracalne: Reverter::NOT_REVERTABLE w src/Write/Reverter.php (pkt 5.5).
  13. Liczniki użycia: statystyki uruchomienia są w kodzie (src/License/Usage.php); od 2.6.5 są wysyłane dopiero po włączeniu przez właściciela w Ustawieniach (pkt 2.6).
  14. ChatGPT: ten sam konektor działa w ChatGPT (własny konektor w trybie dewelopera); od 2.7.2 jego adresy Origin są akceptowane.

Nadal otwarte (kod na to nie odpowie):

  1. Pełna lista testów PrestaShop/PHP: 2.7.2 jest przetestowane na PrestaShop 8.1.7 i 8.2.3 (PHP 8.1) oraz na paczce 1.7.8. Jeszcze nie testowane z 2.7.2: PrestaShop 9.x; PHP 8.2–8.4.
  2. Jak gotowe zadania (prompty MCP) wyglądają w aplikacjach Claude na telefon.

PrestaShop jest zastrzeżonym znakiem towarowym PrestaShop SA. Claude jest znakiem towarowym Anthropic. ChatGPT jest znakiem towarowym OpenAI. TellMyShop nie jest powiązany z żadną z tych firm.

Aktualizacja: 2026-10-04