---
name: client-offer
description: Workflow generowania i wysyłki oferty SEO/pozycjonowania dla klienta (raport HTML o sytuacji strony na podstawie Semstorm + planera Google Ads). Użyj gdy użytkownik prosi o `oferta-klienta`, ofertę pozycjonowania, ofertę SEO, raport ofertowy o stronie, analizę pod ofertę, albo wysyłkę oferty na adspro.projectpro.pl.
---

# Oferta klienta (SEO / pozycjonowanie)

## Core Rule

Pisz po polsku. Prowadź użytkownika etapami: typ oferty → domena → analiza strony → dane → treść → generowanie HTML → akceptacja → upload.

Nigdy nie wysyłaj oferty na serwer bez jasnej zgody użytkownika po wygenerowaniu HTML.

## Start — o co zapytać

Na początku ustal dwie rzeczy (jeśli użytkownik nie podał ich w wiadomości):

1. **Typ oferty.** Zapytaj, jakiej oferty dotyczy zlecenie.
   - Obecnie obsługiwany jest **tylko typ „pozycjonowanie / SEO”**.
   - Jeśli użytkownik wskaże inny typ (np. Google Ads, social media, strona WWW) — poinformuj, że na razie szablon obejmuje wyłącznie pozycjonowanie, i zapytaj, czy kontynuować jako ofertę SEO. Strukturę można w przyszłości rozbudować o nowe typy (osobne wpisy w generatorze).
2. **Domena.** Zapytaj o adres strony, której dotyczy oferta (np. `kobiecesesje.pl`).
   - Dopytaj o **zasięg**: lokalny (jakie miasto?) czy ogólnopolski / usługi online. To wpływa na dobór fraz i treść strategii.

Można zapytać o oba naraz przez `AskUserQuestion`.

## Krok 1 — Analiza strony

Wejdź na stronę (`WebFetch`) i wypisz: oferowane usługi, rodzaje produktów/usług, lokalizację, nazwę firmy/osoby, główne frazy w treści. To podstawa do doboru słów kluczowych i opisu w ofercie. Uwzględnij obszary, o których wspomniał klient.

## Krok 2 — Dane Semstorm (obecna widoczność)

```powershell
python scripts/reports/fetch_semstorm_data.py --domain <domena>
```

Działa dla dowolnej domeny (także spoza `config/clients.toml`). Zapisuje historię do `clients/<domena>/semstorm_history.json` — generator czyta ją stamtąd. Jeśli zwróci pustkę, domena jest praktycznie niewidoczna w Google (start „od zera”) — to ważny wniosek do oferty, nie błąd.

## Krok 3 — Planer słów kluczowych (Google Ads)

Dobierz 8–12 fraz seed na podstawie analizy strony (Krok 1) i zasięgu. Dla zasięgu lokalnego dodaj frazy z nazwą miasta. Następnie:

```powershell
python scripts/reports/fetch_keyword_ideas.py --keywords "fraza1,fraza2,..." --output "oferty/<domena>/keyword_ideas.json"
```

Uwagi:
- Język polski w API to **1030** (domyślny w skrypcie); bez języka API nie rozszerza fraz.
- Geolokalizacja domyślna: Polska (`2616`). Dla raportu lokalnego i tak pokazujemy wolumeny ogólnopolskie + frazy z miastem.
- Idee są darmowe (nie generują kosztów). Konto do uwierzytelnienia bierze się z `KEYWORD_IDEAS_CUSTOMER_ID` w `.env` lub pierwszego klienta w `config/clients.toml`.

Przejrzyj top frazy (posortowane po wolumenie) i wybierz grupy tematyczne do oferty.

## Krok 4 — Treść oferty (konfiguracja w generatorze)

Treść strategiczna jest w słowniku `OFFERS` w `scripts/reports/generate_offer_html.py`. Dla nowej domeny **dodaj nowy wpis** `"<domena>": { ... }` z polami:

- `owner` — nazwa firmy / osoby,
- `branza` — branża (np. „Fotografia kobieca”),
- `geo_label` — opis zasięgu (np. „Kraków — pozycjonowanie lokalne” / „Cała Polska — usługi online”),
- `url` — adres strony,
- `lead` — 2–4 zdania podsumowania sytuacji (uwzględnij wnioski z Semstorm: ma widoczność vs start od zera),
- `services` — lista usług ze strony,
- `groups` — grupy fraz: `{"name", "match": [podciągi szukane w treści frazy, lowercase], "note"}`. Grupy filtrują dane z `keyword_ideas.json`,
- `strategy` — lista `(tytuł, opis)` kroków „na czym się skupimy”,
- `scope` — zakres abonamentu (sekcja domyślnie ukryta, patrz niżej).

Pisz konkretnie i decyzyjnie, z perspektywy osoby prowadzącej pozycjonowanie. Używaj poprawnych polskich znaków.

Uwaga: flaga `SHOW_SCOPE` na górze pliku steruje sekcją „Zakres abonamentu” + wyceną. Domyślnie `False` (ukryta). Włącz tylko gdy użytkownik tego chce.

## Krok 5 — Generowanie HTML

```powershell
python scripts/reports/generate_offer_html.py <domena>
```

Bez argumentu generuje wszystkie zdefiniowane domeny. Wynik: `oferty/<domena>/oferta.html`. Pokaż użytkownikowi ścieżkę. Warto zweryfikować wygląd zrzutem ekranu (lokalny serwer HTTP + Playwright) — `file://` jest blokowane.

## Krok 6 — Akceptacja

Pokaż użytkownikowi podsumowanie (kluczowe liczby, grupy fraz, strategia) i zapytaj o akceptację. Zapytaj **osobno**, czy wysłać na serwer.

## Krok 7 — Upload na adspro (dopiero po zgodzie)

Wyślij **tylko plik strony** jako `index.html` (nie wysyłaj `keyword_ideas.json` — to dane wewnętrzne). Przygotuj staging i uruchom upload **przez PowerShell** (Git Bash mangluje ścieżki `/oferty/...`):

```powershell
$slug = "<domena bez .pl, kropki→myślniki>"   # np. kobiecesesje.pl → kobiecesesje
$dest = "oferty\_upload\$slug"
New-Item -ItemType Directory -Force -Path $dest | Out-Null
Copy-Item "oferty\<domena>\oferta.html" "$dest\index.html" -Force
python scripts/reports/upload_report_ftp.py --local-dir $dest --remote-path "/oferty/$slug/"
Remove-Item -Recurse -Force "oferty\_upload"
```

Po wysyłce podaj URL z `index.html`:

```text
https://adspro.projectpro.pl/oferty/<slug>/index.html
```

**Ważne — krótkie URL-e:** `.htaccess` adspro serwuje statycznie istniejące pliki oraz katalog `/raporty/`, ale nie `/oferty/`. Dlatego adres bez `index.html` (`…/oferty/<slug>/`) przekierowuje na logowanie adsPRO. Podawaj link z `index.html`. Krótkie URL-e zadziałają dopiero po dopisaniu do `/public_html/.htaccess` reguły bliźniaczej do raportów (`RewriteCond %{REQUEST_URI} ^/oferty/ [NC]` + `RewriteRule ^ - [L]`) — rób to tylko na wyraźne życzenie, z backupem, bo to plik sterujący całym adsPRO.

## Rozbudowa o nowe typy ofert

Na dziś szablon = pozycjonowanie. Aby dodać kolejny typ (np. Google Ads), utwórz analogiczny generator / sekcje treści i rozszerz pytanie startowe o nowy typ. Zachowaj ten sam przepływ: pytanie o typ i domenę → dane → treść → HTML → akceptacja → upload.
