# FIRST_SESSION.md — Pierwsza sesja deweloperska Vilmax Cockpit **Wersja:** 1.1 **Data:** 2026-08-25 **Cel:** Przeprowadzenie dewelopera/agenta AI przez pierwszą sesję implementacji Vilmax Cockpit — od zera do działającego forka z adapterem FR i testem E2E dry-run. **Zakres:** Faza 0 z `MVP_PLAN.md` v2.0 (Filar Fundament — Fork & Domain Swap). **Czas trwania:** 1 sesja (~2–4 godziny skupionej pracy). --- ## STATUS: FAZA 0 + FAZA 1 (MODUŁ 2) ZAKOŃCZONE (2026-08-25) **Faza 0 (Filar Fundament) wdrożona i zcommitowana.** Wszystkie 10 kroków wykonane. **Faza 1 (Moduł 2: Visual AI Studio) wdrożona.** Endpointy `remove-bg`, `stage`, `dimension-blueprint`, `fabrics`, `interiors` działają (zweryfikowane smoke curl). 14 nowych testów jednostkowych pass. Raport reużycia Repo-First w `docs/PROGRESS.md` §Faza 1. **Commity w `vilmax-cockpit/`:** - `68676d3` Faza 0.1: Fork dywanowy-bazar → vilmax-cockpit (przemianowanie) - `79ce5a4` Faza 0.2: Domain swap dywan → meble tapicerowane Vilmax - `1651ce6` Remove temporary commit message file - `7d85d70` Aktualizacja dokumentacji - *(Faza 1 — Moduł 2 — do zcommitowania przez użytkownika)* **Następna sesja:** MVP moduły 3-8 (patrz `MVP_PLAN.md` §1.3–§1.8). Sugerowana kolejność: 1. **⚠️ PRZEJŚCIE NA BOBOCHICPARIS.COM (PRZED Modułem 3)** — realny scraping `bobochicparis.com/fr/`, dostosowanie atrybutów, słownika FR→PL, promptów AI, mapowań BL. Patrz `AGENTS.md` §14.5 (10 kroków). To jest fundament danych — bez tego Moduł 3 testuje AI copy na stubie. 2. **Moduł 3 (Listing & Variant Generator)** — testy z realnymi danymi z Bobochic. `src/openai.js`, `descriptionAssembly.js`, `draft.js` po domain swap, ale wymagają weryfikacji z realnymi parametrami meblowymi (wymiary, pianki, mechanizm, tkanina). 3. **Moduł 4 (BaseLinker Push)** — testy z realnym BL Vilmax. `src/baselinker.js` po domain swap (SKU VIL-). Wymaga tokenów BL + weryfikacji category_id, producer, SKU. 4. **Moduł 5 (Social Media & Ads Studio)** — adaptacja kebabkiller. Endpointy: `POST /api/social/generate-post`, `POST /api/social/generate-reel`, `POST /api/social/schedule`. Kalendarz publikacji. 5. **Moduł 8 (Saturn ERP Ghost Adapter)** — webhook + outbox + worker. Endpoint: `POST /api/saturn/webhook`. Worker: `npm run worker:saturn`. Reuse: `slicehub_pro/core/` (OrderEventPublisher, WebhookDispatcher, outbox). 6. **Moduł 6 (Catalog & Print Studio)** — puppeteer PDF (Faza 3 wg AGENTS.md §14 — wymaga Approval Gate na nową dep). 7. **Moduł 7 (Prompt & Brand Studio)** — UI edycji config. **Prompt do nowej sesji:** `C:\xampp\htdocs\vilmax\NEW_SESSION_PROMPT.md` (zaktualizowany). **Instrukcja ręcznego testowania Modułu 2:** `C:\xampp\htdocs\vilmax\vilmax-cockpit\docs\MANUAL-TESTING.md`. --- ## 0. ZANIM ZACZNIESZ — OBOWIĄZKOWE CZYTANIE Przed pierwszą linijką kodu **musisz** przeczytać (w tej kolejności): 1. **`AGENTS.md`** — reguły projektowe (co wolno, czego nie, stack, zakazy). 2. **`MVP_PLAN.md`** §0 i §1.1 (Filar Fundament) — co robimy w tej sesji. 3. **`ARCHITECTURE_SPEC.md`** §2.3 (struktura katalogów) i §3.1 (Moduł 1: Spec Extractor). 4. **`_audit/dywanowy-bazar/README.md`** — jak działa aplikacja bazowa. 5. **`_audit/dywanowy-bazar/docs/ARCHITECTURE.md`** — architektura dywanowy-bazar. 6. **`_audit/dywanowy-bazar/docs/FLOW.md`** — przepływ: źródło → draft → AI → BL. 7. **`_audit/dywanowy-bazar/docs/STUDIO-PLAN.md`** — Studio UI (mobile-first). 8. **`_audit/dywanowy-bazar/.cursor/rules/base-com-automation-context.mdc`** — zasady automatyki BL. **Kluczowe zrozumienie:** `dywanowy-bazar` to **gotowa, działająca aplikacja**. My ją forkujemy, zmieniamy domenę (dywany → meble) i dopisujemy adapter FR. Nie piszemy od zera. --- ## 1. CEL PIERWSZEJ SESJI (DEFINITION OF DONE) Po zakończeniu sesji: - [x] Repo `vilmax-cockpit/` istnieje i jest kopią `dywanowy-bazar/` z przemianowanym package.json/README. - [x] `node server.js` startuje bez błędów na `http://127.0.0.1:8787`. - [x] Studio UI dostępne na `http://127.0.0.1:8787/editor`. - [x] Adapter `src/adapters/vilmaxFR.js` istnieje (wzorzec `taraCarpet.js`, stub z deterministycznym fallback z URL slug). - [x] `config/fr-pl-furniture-glossary.json` istnieje (słownik FR→PL meblarski). - [x] `config/badge-policy.json` zaktualizowany (dodane badge'e meblowe: Easy Clean, Pet Friendly, Martindale, Produkt Polski). - [x] `docs/Kategorie_BaseLinker.csv` zaktualizowany (kategorie meblowe Vilmax). - [x] Test E2E: `POST /api/draft-from-source` z URL mebla FR → draft z parametrami meblowymi (producer=Vilmax, preferredTitle="Narożnik 230x300 cm Madrid Salon Sypialnia") → `POST /api/build-payload` → poprawny envelope `addInventoryProduct` (dry-run). - [x] `npm test` nie crashuje (265 pass, 3 fail pre-existing tara-search legacy — niezwiązane z domain swap). - [x] Pierwszy commit: `79ce5a4` "Faza 0.2: Domain swap dywan → meble tapicerowane Vilmax". --- ## 2. PRZYGOTOWANIE ŚRODOWISKA ### 2.1 Wymagania - **Node.js ≥20** (`node --version` → v20.x+). - **npm** (`npm --version`). - **Sharp** — instaluje się automatycznie przez `npm install` (prebuilt binaria). - **FFmpeg** — opcjonalnie w pierwszej sesji (potrzebny dopiero w Fazie 4 dla Reels). Sprawdź: `ffmpeg -version`. Jeśli brak, nie blokuje Fazy 0. - **Git** — `git --version`. ### 2.2 Env vars (przygotuj przed sesją) Skopiuj `_audit/dywanowy-bazar/.env.example` → `vilmax-cockpit/.env` i uzupełnij: ```env # BaseLinker (do testu dry-run wystarczy token testowy; live = Faza 2) BASELINKER_API_TOKEN=twoj_token_baselinker BASELINKER_INVENTORY_ID=12345 BASELINKER_CATEGORY_ID=12345 # AI (do generowania opisów; bez tego AI fallback na mock) OPENAI_API_KEY=twoj_klucz_openai GEMINI_API_KEY=twoj_klucz_gemini # Webhook (Faza 5, ale ustaw teraz) BASELINKER_WEBHOOK_SECRET=wygeneruj_losowy_secret # Server PORT=8787 ``` **Uwaga:** Jeśli nie masz jeszcze tokenów, pierwsza sesja może przejść w trybie **mock/dry-run** (bez live BL, bez AI — sprawdzamy strukturę i pipeline). Tokeny uzupełnisz przed Fazą 2. --- ## 3. KROK PO KROKU — PIERWSZA SESJA ### Krok 1: Fork dywanowy-bazar → vilmax-cockpit (15 min) ```powershell # W C:\xampp\htdocs\vilmax\ Copy-Item -Recurse _audit\dywanowy-bazar vilmax-cockpit cd vilmax-cockpit ``` **Następnie w `vilmax-cockpit/`:** 1. **`package.json`** — zmień: - `"name": "vilmax-cockpit"` - `"description": "Vilmax Cockpit — studio przygotowania produktu i marketingu dla fabryki mebli Vilmax"` - Reszta bez zmian (deps, scripts). 2. **`README.md`** — zastąp opisem Vilmax Cockpit (zachowaj sekcję "Run" i "Endpointy" z oryginału, zmień tylko opis biznesowy). 3. **`.env.example`** — dodaj `BASELINKER_WEBHOOK_SECRET=...` (sekcja 2.2 wyżej). 4. **Usuń** `chrome-extension/` (niepotrzebne w MVP — to rozszerzenie do scrape'owania Tara). 5. **`git init`** + pierwszy commit: ```bash git add -A git commit -m "Faza 0.1: Fork dywanowy-bazar → vilmax-cockpit (przemianowanie)" ``` 6. **Test startu:** ```bash npm install npm start # Sprawdź: http://127.0.0.1:8787/editor — powinno działać Studio UI ``` **Checkpoint:** Studio UI działa. Dashboard się ładuje. To jest ta sama aplikacja co dywanowy-bazar, tylko przemianowana. --- ### Krok 2: Zbadaj strukturę dywanowy-bazar (30 min) **Nie pomijaj tego kroku.** Musisz zrozumieć, co już masz, zanim zaczniesz zmieniać. Przeczytaj te pliki (w tej kolejności): 1. **`server.js`** (72 KB) — główny serwer Express. Znajdź: - Endpointy API (`/api/draft-from-source`, `/api/drafts`, `/api/generate-ai`, `/api/build-payload`, `/api/save-to-base`, `/api/bulk-*`). - Routing UI (`/editor`, `/editor/wizard`, `/editor/legacy`). - Jak ładuje config (`mergeEditorConfigForSession`). 2. **`src/adapters/index.js`** (16 linii) — rejestr adapterów. Zrozum: - `resolveAdapter(url)` — matchuje po `hostname` (z URL), nie po kluczu. - Adapter musi eksportować `hostnames` (array) + `extractSourceProduct(url)`. 3. **`src/adapters/taraCarpet.js`** (24 KB) — adapter źródła. Zrozum: - `extractSourceProduct(url)` — fetch → JSON (Shopify `/products/{handle}.js`) → `sourceProduct`. - Format `sourceProduct`: `name`, `description` (HTML), `specs` (array), `price`, `sourceTags`, `images` (array URL), `ean`, `sourceHttpResponseFormat`. - Jak zwraca dane do `buildDraftFromSource.js`. 4. **`src/baselinker.js`** (17 KB) — klient BL. Zrozum: - `buildBaseLinkerEnvelope(draft)` — jak buduje payload `addInventoryProduct`. - `sendToBaseLinker(envelope, { dryRun })` — wysyłka (dry-run vs live). - `filterEnvelopeTagsToInventory()` — whitelist tagów. 5. **`src/draft.js`** (36 KB) — model draftu. Zrozum strukturę JSON draftu. 6. **`src/buildDraftFromSource.js`** — jak `sourceProduct` staje się draftem. 7. **`config/editor-config.json`** (40 KB) — prompty, kanały, kategorie. Przeskanuj strukturę (znajdź klucze: `prompts`, `channels`, `strategicCategories`, `defaults`). 8. **`config/badge-policy.json`** (708 B) — polityka badge'ów. Struktura: `copyRules`, `forbiddenPatterns`, `diversityGuards`, `channelCompliance`. 9. **`docs/Kategorie_BaseLinker.csv`** — słownik kategorii BL. **Checkpoint:** Rozumiesz przepływ: URL → adapter (match po hostname) → `sourceProduct` → `buildDraftFromSource` → draft → AI → `buildBaseLinkerEnvelope` → `sendToBaseLinker`. Wiesz gdzie są prompty, badge'e, kategorie. --- ### Krok 3: Adapter FR — `src/adapters/vilmaxFR.js` (60 min) **To jest kluczowy nowy kod tej sesji.** Reszta to domain swap configów. #### 3.1 Zrozum wzorzec `taraCarpet.js` `taraCarpet.js` czyta publiczne `/products/{handle}.js` (Shopify JSON) z hosta `tara-carpet.com`. Zwraca `sourceProduct` z polami: `name` (DE), `description` (HTML), `specs` (array), `price` (EUR), `sourceTags` (array), `images` (array URL), `ean`, `sourceHttpResponseFormat`. **Kluczowe:** `resolveAdapter(url)` w `src/adapters/index.js` matchuje adapter po `hostname` z URL. Adapter musi eksportować obiekt z `hostnames` (array) i `extractSourceProduct(url)`. #### 3.2 Napisz `vilmaxFR.js` Strona francuska Vilmax ma **inny format** niż Shopify JSON. Dwie ścieżki: **Ścieżka A (jeśli strona FR ma JSON API lub strukturalny JSON w `