--- description: Generează un Product Requirements Document (PRD) structurat pentru o funcționalitate nouă. Folosește acest skill când utilizatorul vrea să planifice și documenteze cerințele pentru un feature înainte de implementare. --- # Skill: PRD Generator Generează un Product Requirements Document (PRD) detaliat prin detecție automată a contextului și întrebări adaptive. ## Când să folosești acest skill - Utilizatorul vrea să adauge o funcționalitate nouă - Vrea să planifice înainte de a implementa - Menționează "PRD", "requirements", "cerințe", "planifică feature" ## Workflow ### FAZA 1: Detecție Context Proiect **Verifică existența fișierelor de config pentru a determina modul:** ``` package.json → Node.js/JavaScript ecosystem pyproject.toml → Python requirements.txt → Python (legacy) go.mod → Go Cargo.toml → Rust pom.xml → Java (Maven) build.gradle → Java (Gradle) composer.json → PHP Gemfile → Ruby ``` **DACĂ găsit config file:** 1. Citește fișierul de config pentru a extrage: - Dependențe principale (framework-uri, librării) - Scripturi disponibile (pentru package.json) - Versiuni 2. Analizează structura directoarelor: - `src/`, `app/`, `components/`, `pages/`, `api/` - Identifică patterns: Next.js, React, Express, etc. 3. Raportează utilizatorului: ``` Am detectat un proiect existent: - Stack: Next.js 14, TypeScript, Prisma, TailwindCSS - Structură: App Router (app/), API routes (app/api/) - Scripts: dev, build, lint, typecheck ``` 4. Setează: **FEATURE_MODE** **DACĂ NU găsit config file:** 1. Raportează: "Nu am detectat un proiect existent. Vom crea PRD pentru proiect nou." 2. Setează: **NEW_PROJECT_MODE** --- ### FAZA 2: Întrebări Adaptive cu AskUserQuestion **IMPORTANT**: Folosește tool-ul `AskUserQuestion` pentru întrebări interactive, NU text simplu. --- #### IF NEW_PROJECT_MODE: **Întrebarea 1** (AskUserQuestion): ```json { "question": "Ce tip de proiect vrei să creezi?", "header": "Tip proiect", "options": [ {"label": "Web Application", "description": "Frontend + Backend, UI interactiv"}, {"label": "API / Backend", "description": "REST/GraphQL API, servicii backend"}, {"label": "CLI Tool", "description": "Command-line application"}, {"label": "Library / SDK", "description": "Cod reutilizabil pentru alți developeri"} ], "multiSelect": false } ``` **Întrebarea 2** (AskUserQuestion): ```json { "question": "Cine sunt utilizatorii țintă?", "header": "Audiență", "options": [ {"label": "End users", "description": "Clienți finali, public larg"}, {"label": "Developers", "description": "API/SDK consumers, tehnici"}, {"label": "Admin / Staff", "description": "Utilizatori interni, back-office"}, {"label": "Sistem automatizat", "description": "Integrări machine-to-machine"} ], "multiSelect": false } ``` **Întrebarea 3** (AskUserQuestion): ```json { "question": "Ce tech stack preferi?", "header": "Stack", "options": [ {"label": "Next.js + TypeScript (Recommended)", "description": "Full-stack React, App Router, API routes"}, {"label": "Node.js + Express", "description": "Backend flexibil, REST API"}, {"label": "Python + FastAPI", "description": "API modern, async, type hints"}, {"label": "Go", "description": "Performance, simplitate, concurrency"} ], "multiSelect": false } ``` **Întrebarea 4** (AskUserQuestion): ```json { "question": "Ce arhitectură de date preferi?", "header": "Database", "options": [ {"label": "PostgreSQL + Prisma (Recommended)", "description": "Relațional, ORM type-safe"}, {"label": "MongoDB", "description": "Document store, schema flexibilă"}, {"label": "SQLite", "description": "Simplitate, embedded, local-first"}, {"label": "Fără persistență", "description": "In-memory, stateless"} ], "multiSelect": false } ``` **Întrebarea 5** (AskUserQuestion): ```json { "question": "Cum va arăta interfața?", "header": "UI/UX", "options": [ {"label": "Dashboard / Admin Panel", "description": "Tabele, grafice, forms complexe"}, {"label": "Landing + App simplu", "description": "Marketing + funcționalitate core"}, {"label": "API only (no UI)", "description": "Doar backend, documentație API"}, {"label": "CLI interface", "description": "Terminal-based interaction"} ], "multiSelect": false } ``` **Întrebarea 6** (AskUserQuestion): ```json { "question": "Ce tip de autentificare e necesar?", "header": "Auth", "options": [ {"label": "Email + Password", "description": "Classic login, JWT sessions"}, {"label": "OAuth / Social login", "description": "Google, GitHub, etc."}, {"label": "API Keys", "description": "Pentru servicii și integrări"}, {"label": "Fără autentificare", "description": "Public access"} ], "multiSelect": true } ``` **Întrebarea 7** (AskUserQuestion): ```json { "question": "Ce integrări externe sunt necesare?", "header": "Integrări", "options": [ {"label": "Payment (Stripe)", "description": "Procesare plăți, subscriptions"}, {"label": "Email (Resend/SendGrid)", "description": "Trimitere emails tranzacționale"}, {"label": "Storage (S3/Cloudflare)", "description": "Upload fișiere, imagini"}, {"label": "Niciuna", "description": "Self-contained, fără dependențe externe"} ], "multiSelect": true } ``` **Întrebarea 8** (AskUserQuestion): ```json { "question": "Care e prioritatea acestui proiect?", "header": "Prioritate", "options": [ {"label": "MVP rapid", "description": "Funcționalitate minimă, lansare rapidă"}, {"label": "Produs complet", "description": "Feature-complete, production-ready"}, {"label": "Proof of concept", "description": "Validare idee, poate fi refăcut"}, {"label": "Learning project", "description": "Experimentare, nu contează calitatea"} ], "multiSelect": false } ``` **Întrebarea 9** (AskUserQuestion): ```json { "question": "Cum definim succesul? Ce criterii trebuie îndeplinite?", "header": "Success", "options": [ {"label": "Funcționalitate completă", "description": "Toate features funcționează conform spec"}, {"label": "Performance targets", "description": "Timp răspuns < X ms, throughput > Y"}, {"label": "User adoption", "description": "N utilizatori activi, engagement"}, {"label": "Code quality", "description": "Test coverage > 80%, no critical bugs"} ], "multiSelect": true } ``` **Întrebarea 10** (text liber - cere descriere): ``` Descrie pe scurt proiectul în 2-3 propoziții: - Ce problemă rezolvă? - Care e funcționalitatea principală? ``` **Întrebarea 11 - Web Research** (AskUserQuestion): ```json { "question": "Vrei să cercetez best practices și patterns pentru acest stack?", "header": "Research", "options": [ {"label": "Da, cercetează", "description": "WebSearch pentru patterns și recomandări"}, {"label": "Nu, continuă", "description": "Am experiență cu acest stack"} ], "multiSelect": false } ``` **DACĂ utilizatorul alege "Da, cercetează":** - Folosește `WebSearch` pentru: "[stack] best practices 2026" - Integrează findings în secțiunea "Considerații Tehnice" din PRD --- #### IF FEATURE_MODE: **Întrebarea 1** (text liber): ``` Descrie feature-ul pe care vrei să-l adaugi: - Ce funcționalitate nouă? - Care e scopul principal? ``` **Întrebarea 2** (AskUserQuestion): ```json { "question": "Ce tip de feature este acesta?", "header": "Tip feature", "options": [ {"label": "Funcționalitate nouă", "description": "Ceva ce nu există în app"}, {"label": "Îmbunătățire UX", "description": "Flow mai bun, mai intuitiv"}, {"label": "Performance", "description": "Optimizare viteză, eficiență"}, {"label": "Integrare externă", "description": "Conectare cu alt sistem/serviciu"} ], "multiSelect": false } ``` **Întrebarea 3** (AskUserQuestion): ```json { "question": "Implică modificări de UI?", "header": "UI changes", "options": [ {"label": "Da - componente noi", "description": "Pagini sau secțiuni noi"}, {"label": "Da - modificări existente", "description": "Update la UI existent"}, {"label": "Nu - doar backend", "description": "Logic, API, fără UI"} ], "multiSelect": false } ``` **Întrebarea 4** (AskUserQuestion): ```json { "question": "Necesită modificări în baza de date?", "header": "DB changes", "options": [ {"label": "Da - tabele noi", "description": "Noi entități de stocat"}, {"label": "Da - coloane noi", "description": "Câmpuri noi pe tabele existente"}, {"label": "Da - relații noi", "description": "Legături între tabele"}, {"label": "Nu", "description": "Schema rămâne neschimbată"} ], "multiSelect": true } ``` **Întrebarea 5** (AskUserQuestion): ```json { "question": "Sunt necesare integrări noi cu servicii externe?", "header": "Integrări", "options": [ {"label": "Da - API extern", "description": "Conectare la serviciu terț"}, {"label": "Da - Webhooks", "description": "Primire/trimitere events"}, {"label": "Nu", "description": "Self-contained în app"} ], "multiSelect": true } ``` **Întrebarea 6** (AskUserQuestion): ```json { "question": "Există considerații speciale de security?", "header": "Security", "options": [ {"label": "Autorizare/permisiuni", "description": "Cine poate accesa ce"}, {"label": "Date sensibile", "description": "PII, payment, credentials"}, {"label": "Rate limiting", "description": "Protecție abuse"}, {"label": "Nu, standard", "description": "Fără cerințe speciale"} ], "multiSelect": true } ``` **Întrebarea 7** (text liber): ``` Cum verificăm că feature-ul funcționează corect? Descrie acceptance criteria (ce trebuie să se întâmple când e gata): ``` --- ### FAZA 3: Generează PRD-ul După răspunsuri, creează documentul în `/tasks/prd-[feature-name].md`: ```markdown # PRD: [Feature Name] ## 1. Introducere [Context și motivație pentru feature - 2-3 propoziții bazate pe răspunsuri] ## 2. Context Tehnic [DOAR pentru FEATURE_MODE - include stack-ul detectat] - **Stack**: [detectat din config] - **Structură**: [detectat din directoare] - **Comenzi disponibile**: [din package.json scripts] ## 3. Obiective ### Obiectiv Principal - [Ce problemă rezolvă - din răspunsuri] ### Obiective Secundare - [Beneficii adiționale] ### Metrici de Succes - [Din răspunsul la întrebarea despre success criteria] ## 4. User Stories ### US-001: [Titlu Descriptiv] **Ca** [tip utilizator - din răspunsuri] **Vreau** [funcționalitate] **Pentru că** [beneficiu] **Acceptance Criteria:** - [ ] Criteriu 1 specific și testabil - [ ] Criteriu 2 specific și testabil - [ ] {TYPECHECK_COMMAND} passes - [ ] [Pentru UI] Verificare vizuală cu browser: [comportament specific] ### US-002: [Titlu] ... ## 5. Cerințe Funcționale 1. [REQ-001] Sistemul trebuie să... 2. [REQ-002] Utilizatorul poate să... 3. [REQ-003] Când X se întâmplă, Y trebuie să... ## 6. Non-Goals (Ce NU facem) - [Explicit ce nu e în scope pentru a evita scope creep] - [Funcționalități similare care NU sunt incluse] ## 7. Considerații Tehnice ### Stack/Tehnologii - [Din detecție sau răspunsuri] ### Patterns de Urmat - [Patterns existente în codebase - din analiză] ### Dependențe - [De ce depinde acest feature] ### Riscuri Tehnice - [Potențiale probleme] ### Best Practices [Dacă s-a făcut WebSearch, include findings aici] ## 8. Considerații UI/UX [Dacă UI changes != "Nu - doar backend"] - Layout și flow - Stări (loading, error, empty, success) - Accesibilitate ## 9. Considerații Security [Din răspunsul la întrebarea despre security] ## 10. Open Questions - [ ] [Întrebări nerezolvate care necesită clarificare] ``` --- ### FAZA 4: Validare și salvare 1. **Afișează preview** al PRD-ului generat 2. **Întreabă** utilizatorul: - "PRD-ul acoperă tot ce ai în minte?" - "Vrei să adaugi sau să modifici ceva?" - "Stories-urile sunt de mărime potrivită pentru implementare incrementală?" 3. **Salvează** în `/tasks/prd-[feature-name].md` 4. **Sugerează următorul pas**: ``` PRD salvat în tasks/prd-[feature-name].md **Următorii pași:** 1. Revizuiește PRD-ul și adaugă detalii dacă e nevoie 2. Când ești gata, folosește `/ralph:convert` pentru a converti în prd.json 3. Apoi rulează `./scripts/ralph/ralph.sh` pentru implementare autonomă ``` --- ## Reguli pentru User Stories bune ### Mărime potrivită (1 context window): - Adaugă un câmp în DB + migration - Creează un component React simplu - Implementează un endpoint API - Scrie unit tests pentru o funcție ### Prea mare (trebuie spart): - "Implementează autentificarea" → sparge în: login form, register form, JWT middleware, session management - "Creează dashboard" → sparge în: layout, charts component, data fetching, filtering ### Ordine dependențe: 1. Database/Schema (nu depind de nimic) 2. Backend logic (depind de schema) 3. API endpoints (depind de backend) 4. UI components (depind de API) 5. Integration (depind de toate) ### Acceptance Criteria: - Specifice: "Butonul Submit trimite form data la POST /api/users" - NU vagi: "Funcționează corect" - Verificabile: "După submit, redirect la /dashboard" - NU subiective: "UX plăcut" - Include ÎNTOTDEAUNA comanda de typecheck din proiect - Pentru UI: "Verificare vizuală cu browser că [behavior]" --- ## Output așteptat - Fișier `/tasks/prd-[feature-name].md` cu documentație completă - User stories clare, atomice, cu acceptance criteria verificabile - Non-goals explicit definite - Context tehnic detectat (pentru FEATURE_MODE) ## Important 1. **NU începe implementarea** - acest skill doar generează documentație 2. **Folosește AskUserQuestion** pentru întrebări interactive 3. **Detectează contextul** înainte de a pune întrebări 4. **Stories atomice** - fiecare trebuie să fie independent completabil 5. **Acceptance criteria verificabile** - nu vagi 6. **Kebab-case** pentru nume fișiere