---
name: dodaj-wpis
description: Dodaje nowy wpis nastroju do VIBEO (dziennik nastroju w Supabase) na konkretny dzień — domyślnie dzisiaj. Claude wnioskuje nastrój (1–5) z treści wpisu i po zapisie weryfikuje, czy wiersz faktycznie trafił do bazy. Używaj, gdy użytkownik prosi „dodaj wpis", „zapisz wpis na dany dzień", „wpisz do dziennika VIBEO", „dodaj nastrój".
---

# Dodaj wpis do VIBEO

Zapisuje wpis do tabeli `entries`, wnioskuje nastrój 1–5 z treści i weryfikuje zapis,
ponownie odczytując wiersz z bazy.

Autoryzacja: **klucz sekretny Supabase** (`sb_secret_…`, service role) + jawny **User UID**
właściciela. Cała logika jest w `scripts/add_entry.py` (tylko biblioteka standardowa
Pythona — bez `pip install`).

## Konfiguracja (raz)
Wartości żyją w `.env.local` (plik w `.gitignore` — sekret NIE trafia do repo):

```
VIBEO_SECRET_KEY=sb_secret_…            # klucz sekretny; OMIJA RLS — traktuj jak hasło
VIBEO_USER_ID=81c7f30f-…                # User UID z Supabase → Authentication → Users
```

> ⚠️ `VIBEO_SECRET_KEY` to klucz serwisowy z pełnym dostępem do bazy. Nigdy nie wpisuj go do
> `SKILL.md`, skryptu, argumentów wiersza poleceń ani commita — tylko przez zmienną środowiskową.

> 🇵🇱 **Pisz pełną polszczyzną — z ogonkami (ą ć ę ł ń ó ś ź ż).** Tekst wpisu NIGDY nie
> może być transliterowany na ASCII („żółć", nie „zolc"). Pilnuj tego **zwłaszcza przy
> generowaniu wielu wpisów naraz** — każdy z osobna ma mieć poprawne ogonki. UTF-8 przechodzi
> przez cały pipeline bez problemu.

## Wejście od użytkownika
- **Treść wpisu** — wymagana, **pełną polszczyzną z ogonkami**. Jeśli brak, dopytaj.
- **Dzień** — opcjonalny, domyślnie **dzisiaj**. `--date` przyjmuje wprost polskie słowa `dzisiaj` / `wczoraj` / `przedwczoraj` albo `YYYY-MM-DD`. Inne wyrażenia („3 czerwca", „w zeszły piątek") przelicz sam na `YYYY-MM-DD`. **Tylko dziś lub wstecz** — wpisów z przyszłości nie da się dodać (serwer odrzuca przyszłą datę, `400`). Jeśli użytkownik prosi o dzień w przyszłości, powiedz, że to niemożliwe.

## Kroki

### 1. Ustal datę (`entry_date`)
Domyślnie dzisiejsza data `YYYY-MM-DD`. Słowne wyrażenia przelicz na konkretną datę. Data nie może być **późniejsza niż dziś** — przyszłości nie logujemy (serwer zwróci `400`).

### 2. Wywnioskuj nastrój (1–5) z treści
Oceń wydźwięk wpisu i zmapuj na kolumny bazy:

| Ocena | Znaczenie  | `mood_level` | `mood` (suwak) |
|:-----:|------------|:------------:|:--------------:|
|   1   | BARDZO ŹLE |      0       |       10       |
|   2   | ŹLE        |      1       |       30       |
|   3   | NEUTRALNIE |      2       |       50       |
|   4   | DOBRZE     |      3       |       70       |
|   5   | ŚWIETNIE   |      4       |       90       |

`mood` MUSI mieścić się w 20-jednostkowym przedziale poziomu (progi w `src/lib/mood.js`); wartości środkowe wyżej są bezpieczne. Krótko uzasadnij wybór użytkownikowi.

### 3. Zapisz wpis — uruchom skrypt
Sekret i UID skrypt bierze z env (`.env.local`). Wystarczy podać treść, poziom nastroju i (opcjonalnie) datę:

```bash
set -a; source .env.local; set +a   # wczytaj VIBEO_SECRET_KEY i VIBEO_USER_ID
python3 .claude/skills/dodaj-wpis/scripts/add_entry.py \
  --text 'Treść wpisu użytkownika.' \
  --mood-level 3 \
  --date 2026-06-06
```

Skrypt: buduje HTML (`<p>…</p>`) i `text_plain`, wstawia wiersz z jawnym `user_id`, a potem **ponownie odczytuje go z bazy** i zwraca jako JSON.

### 4. Zweryfikuj zapis (obowiązkowo)
Sprawdź JSON na stdout:
- `"ok": true` + `"verified": "ponowny odczyt z bazy zgodny"` → zapis utrwalony.
- `entry_date`, `mood`, `mood_level`, `user_id` zgodne z krokami 1–2 i konfiguracją.
- `"ok": false` → pokaż użytkownikowi `error`/`verified` i **nie raportuj sukcesu** (częste: brak `VIBEO_SECRET_KEY` w env, brak sieci, zły UID).

### 5. Zaraportuj
Podsumuj: data, nastrój (1–5 + etykieta), `id` wpisu i potwierdzenie weryfikacji. Wpis pojawi się w aplikacji po zalogowaniu na to konto.

## Uwagi
- `id` i `created_at` ustawia baza (`gen_random_uuid()`, `now()`). `entry_date` = dzień wpisu (może różnić się od `created_at` przy backfillu).
- Klucz sekretny omija RLS — dlatego `user_id` jest podawany **jawnie**. Pilnuj, by UID był właściwy (Supabase → Authentication → Users).
- Schemat: `entries(id, user_id, text, text_plain, mood smallint, mood_level smallint, entry_date date, created_at timestamptz)`; mapowanie wiersza → aplikacja w `src/lib/storage.js#rowToEntry`.
