Files
crmPRO/.paul/phases/06-task-title-ai/06-01-PLAN.md
Codex 3b1ba1b5ed feat(06-task-title-ai): complete OpenAI task title suggestions
Phase 6 complete:

- add AI title generator service using gpt-5-nano

- add task popup button for biuro@project-pro.pl

- add AJAX endpoint returning title suggestions without auto-save
2026-05-04 23:45:54 +02:00

8.1 KiB

phase, plan, type, wave, depends_on, files_modified, autonomous, delegation
phase plan type wave depends_on files_modified autonomous delegation
06-task-title-ai 01 execute 1
config.php
autoload/Domain/Tasks/TaskTitleGenerator.php
autoload/controls/class.Tasks.php
templates/tasks/task_popup.php
false off
## Goal Dodac w popupie edycji zadania przycisk generowania propozycji tytulu zadania przez OpenAI na podstawie tresci zadania.

Purpose

Uzytkownik biuro@project-pro.pl ma szybciej nadawac czytelne tytuly zadaniom bez recznego streszczania opisu.

Output

  • Przycisk AI obok istniejacego przycisku edycji tytulu w task_popup.
  • Osobny endpoint AJAX zwracajacy wygenerowana propozycje tytulu.
  • Serwis domenowy do komunikacji z OpenAI, uzywajacy taniego i szybkiego modelu gpt-5-nano.
  • Konfiguracja modelu tytulow niezalezna od importu maili.
- **[Widocznosc]** - Czy `biuro@project-pro.pl` oznacza zalogowanego uzytkownika czy zadania przypisane do tego uzytkownika? -> Odpowiedz: tylko zalogowany uzytkownik z tym emailem widzi przycisk. - **[Zapis]** - Czy AI ma od razu nadpisac tytul w bazie czy tylko wstawic propozycje do pola? -> Odpowiedz: opcja A, wstawic propozycje do pola tytulu i zapisac dopiero istniejacym przyciskiem. - **[Model]** - Czy uzyc `gpt-5-nano` jako tani/szybki model? -> Odpowiedz: tak.

Project Context

@.paul/PROJECT.md @.paul/ROADMAP.md @.paul/STATE.md

Source Files

@config.php @autoload/Domain/Tasks/MailToTaskImporter.php @autoload/controls/class.Tasks.php @templates/tasks/task_popup.php @templates/tasks/main_view.php

External References

<acceptance_criteria>

AC-1: Przycisk widoczny tylko dla biuro

Given zalogowany uzytkownik ma email biuro@project-pro.pl
When otwiera popup zadania
Then obok przycisku edycji tytulu widzi przycisk generowania tytulu AI

AC-2: Brak przycisku dla innych uzytkownikow

Given zalogowany uzytkownik ma inny email niz biuro@project-pro.pl
When otwiera popup zadania
Then przycisk generowania tytulu AI nie jest renderowany
And endpoint generowania odrzuca zadanie bez wywolania OpenAI

AC-3: AI generuje propozycje bez zapisu do bazy

Given uzytkownik biuro@project-pro.pl otwiera popup zadania z trescia
When klika przycisk generowania tytulu AI
Then system pobiera tresc zadania i zwraca krotka propozycje tytulu
And propozycja trafia do pola edycji tytulu
And tytul w bazie nie zmienia sie przed kliknieciem istniejacego przycisku zapisu

AC-4: Obsluga bledow OpenAI jest czytelna

Given brakuje klucza API OpenAI albo OpenAI zwroci blad
When uzytkownik klika generowanie tytulu
Then popup pokazuje czytelny komunikat bledu
And aktualny tytul zadania nie zostaje zmieniony

</acceptance_criteria>

Task 1: Dodac serwis generowania tytulu przez OpenAI config.php, autoload/Domain/Tasks/TaskTitleGenerator.php Dodac konfiguracje `openai_task_title_model` z domyslna wartoscia `gpt-5-nano`. Utworzyc klase domenowa `Domain\Tasks\TaskTitleGenerator`, ktora: - przyjmuje klucz API i model z konfiguracji, - usuwa HTML z tresci zadania przed wyslaniem, - wysyla krotki prompt do `https://api.openai.com/v1/chat/completions`, - wymusza pojedynczy, krotki tytul bez JSON i bez dodatkowego komentarza, - ogranicza dlugosc wejscia i wyjscia, - zwraca tablice sukces/blad bez rzucania nieobslugiwanych wyjatkow. Reuzyc wzorce z `MailToTaskImporter`, ale nie uzalezniac nowej funkcji od importera maili. Dla modeli `gpt-5*` uzyc parametru `max_completion_tokens`; dla pozostalych zostawic kompatybilny fallback. C:\xampp\php\php.exe -l autoload/Domain/Tasks/TaskTitleGenerator.php AC-3 i AC-4 maja pokrycie po stronie integracji OpenAI Task 2: Dodac endpoint AJAX dla propozycji tytulu autoload/controls/class.Tasks.php Dodac metode kontrolera np. `task_generate_title`, ktora: - wymaga zalogowanego uzytkownika, - sprawdza `strtolower($user['email']) === 'biuro@project-pro.pl'`, - pobiera `task_id` jako int i odczytuje zadanie przez `factory\Tasks::task_details`, - odrzuca brak zadania lub pusta tresc komunikatem JSON, - wywoluje `TaskTitleGenerator`, - zwraca JSON `{status: "success", title: "..."}` albo `{status: "error", msg: "..."}`. Endpoint nie moze zapisywac `tasks.name`; zapis pozostaje w istniejacym `/tasks/task_change_title/`. Uzyc medoo/prepared statements przez istniejace metody lub medoo API, bez skladania SQL. C:\xampp\php\php.exe -l autoload/controls/class.Tasks.php AC-2, AC-3 i AC-4 spelnione po stronie backendu Task 3: Dodac przycisk i obsluge UI w popupie zadania templates/tasks/task_popup.php Rozszerzyc widok tytulu w popupie: - wyrenderowac przycisk AI tylko gdy `$this->user['email']` to `biuro@project-pro.pl`, - ustawic przycisk obok istniejacego przycisku edycji tytulu, - po kliknieciu pokazac stan ladowania i wywolac `/tasks/task_generate_title/`, - po sukcesie otworzyc inline edycje tytulu i wpisac propozycje do `.task-title-input`, - nie klikac automatycznie `.task-title-save`, - po bledzie pokazac komunikat i zostawic aktualny tytul bez zmian. Zachowac istniejacy mechanizm recznej edycji i zapisu tytulu. Escapowac dane w widoku; nie wprowadzac logiki OpenAI do widoku. C:\xampp\php\php.exe -l templates/tasks/task_popup.php AC-1, AC-2 i AC-3 spelnione w UI Przycisk AI w popupie zadania oraz generowanie propozycji tytulu do pola edycji. 1. Zaloguj sie jako `biuro@project-pro.pl`. 2. Otworz liste zadan i popup zadania z niepusta trescia. 3. Kliknij przycisk AI obok edycji tytulu. 4. Potwierdz, ze pole edycji tytulu wypelnia sie propozycja, ale tytul zapisuje sie dopiero po kliknieciu istniejacego przycisku zapisu. 5. Sprawdz u innego uzytkownika, ze przycisk nie jest widoczny. Napisz "approved", jesli dziala, albo opisz blad do poprawy.

DO NOT CHANGE

  • Nie zmieniac istniejacego endpointu /tasks/task_change_title/ poza ewentualna minimalna walidacja, jesli bedzie konieczna.
  • Nie zmieniac importu maili w MailToTaskImporter.
  • Nie dodawac nowych bibliotek ani zaleznosci Composer.
  • Nie zmieniac schematu bazy danych.

SCOPE LIMITS

  • Funkcja dotyczy tylko popupu zadania, nie pelnego formularza task_edit.
  • AI generuje tylko propozycje tytulu; nie generuje ani nie zmienia tresci zadania.
  • Przycisk jest dostepny tylko dla zalogowanego biuro@project-pro.pl.
  • Brak automatycznego zapisu tytulu po generowaniu.
Before declaring plan complete: - [ ] `C:\xampp\php\php.exe -l config.php` - [ ] `C:\xampp\php\php.exe -l autoload/Domain/Tasks/TaskTitleGenerator.php` - [ ] `C:\xampp\php\php.exe -l autoload/controls/class.Tasks.php` - [ ] `C:\xampp\php\php.exe -l templates/tasks/task_popup.php` - [ ] Reczna proba jako `biuro@project-pro.pl`: przycisk widoczny i generuje propozycje do pola. - [ ] Reczna proba jako inny uzytkownik: przycisk niewidoczny, endpoint odrzuca dostep. - [ ] Reczna proba potwierdza, ze baza zmienia tytul dopiero po istniejacym zapisie. - [ ] Wszystkie AC spelnione.

<success_criteria>

  • biuro@project-pro.pl moze wygenerowac krotki tytul z tresci zadania w popupie.
  • Wygenerowany tytul jest tylko propozycja w polu edycji, bez automatycznego zapisu.
  • Inni uzytkownicy nie widza przycisku i nie moga uzyc endpointu.
  • Bledy OpenAI nie psuja popupu i nie zmieniaja danych. </success_criteria>
Po wykonaniu utworz `.paul/phases/06-task-title-ai/06-01-SUMMARY.md`.