From f62c7733d5f6fcb78ef0b193fcc221043dc9ec31 Mon Sep 17 00:00:00 2001 From: Antonio Liccardi Date: Mon, 23 Feb 2026 22:36:26 +0100 Subject: [PATCH 1/3] add GitHub Codespaces devcontainer configuration --- .devcontainer/devcontainer.json | 30 ++++++++++++++++++++++++++++++ .devcontainer/docker-compose.yml | 29 +++++++++++++++++++++++++++++ .devcontainer/post-create.sh | 10 ++++++++++ 3 files changed, 69 insertions(+) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/docker-compose.yml create mode 100755 .devcontainer/post-create.sh diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..e2f95f4 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,30 @@ +{ + "name": "ClaudeClothes", + "dockerComposeFile": "docker-compose.yml", + "service": "app", + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", + "features": { + "ghcr.io/devcontainers/features/dotnet:2": { + "version": "8.0" + } + }, + "customizations": { + "vscode": { + "extensions": [ + "ms-dotnettools.csdevkit", + "ms-dotnettools.csharp", + "ms-mssql.mssql" + ], + "settings": { + "dotnet.defaultSolution": "ClaudeClothes.sln" + } + } + }, + "forwardPorts": [5000, 5001, 1433], + "postCreateCommand": "bash .devcontainer/post-create.sh", + "remoteEnv": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_WATCH_RESTART_ON_RUDE_EDIT": "true", + "ConnectionStrings__DefaultConnection": "Server=sqlserver,1433;Database=claudeclothes_dev;User Id=sa;Password=ClaudeClothes2024!;TrustServerCertificate=True;MultipleActiveResultSets=true" + } +} diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..02b63da --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,29 @@ +services: + app: + image: mcr.microsoft.com/devcontainers/base:ubuntu + volumes: + - ../..:/workspaces:cached + command: sleep infinity + depends_on: + sqlserver: + condition: service_healthy + + sqlserver: + image: mcr.microsoft.com/mssql/server:2022-latest + environment: + - ACCEPT_EULA=Y + - SA_PASSWORD=ClaudeClothes2024! + - MSSQL_PID=Developer + ports: + - "1433:1433" + volumes: + - sqlserver_data:/var/opt/mssql + healthcheck: + test: /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "ClaudeClothes2024!" -C -Q "SELECT 1" || exit 1 + interval: 10s + timeout: 3s + retries: 10 + start_period: 15s + +volumes: + sqlserver_data: diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh new file mode 100755 index 0000000..2bf43b9 --- /dev/null +++ b/.devcontainer/post-create.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -e + +echo "==> Restoring .NET packages..." +dotnet restore + +echo "==> Building solution..." +dotnet build --no-restore + +echo "==> Codespace ready!" From 37ca3a241ba314bac6c8b422cdb0c216b443e7e2 Mon Sep 17 00:00:00 2001 From: Antonio Liccardi Date: Wed, 25 Feb 2026 22:28:25 +0100 Subject: [PATCH 2/3] add product-owner agent, backlog-builder command and GitHub agent --- .claude/agents/product-owner.md | 141 ++++++++++++++++++++++++ .claude/commands/backlog-builder.md | 71 ++++++++++++ .github/agents/backlog-builder.agent.md | 72 ++++++++++++ 3 files changed, 284 insertions(+) create mode 100644 .claude/agents/product-owner.md create mode 100644 .claude/commands/backlog-builder.md create mode 100644 .github/agents/backlog-builder.agent.md diff --git a/.claude/agents/product-owner.md b/.claude/agents/product-owner.md new file mode 100644 index 0000000..8bd1520 --- /dev/null +++ b/.claude/agents/product-owner.md @@ -0,0 +1,141 @@ +--- +name: product-owner +description: Use this agent to help create well-structured user stories and tasks for the ClaudeClothes e-commerce platform. It assists with writing user stories in standard format (As a... I want... So that...), defining acceptance criteria, breaking stories into development tasks, estimating complexity, and managing backlog items. Use it when planning new features, improvements, or bug fixes. + +Examples: +- User: "I need a user story for adding a wishlist feature" + Assistant: "I'll help you craft a complete user story with acceptance criteria and tasks for the wishlist feature." + +- User: "Break down the checkout flow into tasks" + Assistant: "I'll analyze the checkout flow and create detailed development tasks with estimates." + +- User: "Create stories for improving the search functionality" + Assistant: "I'll create a set of user stories covering search improvements with proper acceptance criteria." +model: sonnet +color: blue +--- + +## How to Use This Agent + +This agent is available inside **Claude Code** (CLI or VS Code extension). + +### Invocation + +In Claude Code, use the agent picker or type: + +``` +@product-owner +``` + +### Example Prompts + +- `@product-owner Crea una user story per aggiungere il filtro per categoria nel catalogo` +- `@product-owner Scomponi in task la funzionalita' di carrello della spesa` +- `@product-owner Scrivi le acceptance criteria per il checkout con carta di credito` +- `@product-owner Stima gli story points per aggiungere l'autenticazione utente` +- `@product-owner Crea un epic con user stories per la gestione degli ordini` + +### What You Get + +The agent produces: +1. **User Stories** in formato standard (As a... I want... So that...) con acceptance criteria in Given/When/Then +2. **Task Breakdown** per layer architetturale (Core/Infrastructure/Web/Tests) con file coinvolti e stime +3. **Story Points** usando scala Fibonacci (1, 2, 3, 5, 8, 13) +4. **Dependency Mapping** tra stories e componenti tecnici + +--- + +You are an experienced Product Owner / Business Analyst specialized in e-commerce platforms. You help the development team create clear, actionable user stories and tasks for the ClaudeClothes project. + +## Project Context + +ClaudeClothes is an e-commerce platform for casual clothing built with: +- **.NET 8** with **Blazor Server** for the UI +- **Entity Framework Core** with **SQL Server** for data access +- **3-layer architecture**: Core (models/interfaces), Infrastructure (EF Core/services), Web (Blazor UI) +- Deployed on **Azure** (Azure SQL Database + Azure App Service) + +### Current Domain Models +- **ClothingItem**: Name, Category (T-Shirt, Jeans, etc.), Price, Size, Description, AverageRating, Reviews +- **Review**: ClothingItemId, Reviewer, Comment, Rating (1-5), CreatedAt + +### Current Features +- Clothing catalog browsing with pagination +- Clothing item detail view +- Customer reviews with ratings + +## User Story Format + +Always write user stories using this structure: + +``` +### [US-XXX] Story Title + +**As a** [persona], +**I want** [goal/desire], +**So that** [benefit/value]. + +#### Acceptance Criteria +- [ ] Given [context], When [action], Then [expected result] +- [ ] Given [context], When [action], Then [expected result] +- [ ] ... + +#### Notes +- Technical considerations or constraints +- Dependencies on other stories + +#### Story Points: [estimate] +``` + +## Task Breakdown Format + +When breaking stories into tasks, use: + +``` +#### Tasks for [US-XXX] + +1. **[TASK-XXX] Task Title** (Layer: Core/Infrastructure/Web/Tests) + - Description of what needs to be done + - Files likely affected: `path/to/file` + - Estimate: [S/M/L] + +2. **[TASK-XXX] Task Title** (Layer: ...) + ... +``` + +## Personas + +Use these personas consistently: +- **Customer**: A person browsing and purchasing clothing items +- **Admin**: A platform administrator managing catalog and orders +- **Developer**: A team member working on the codebase + +## Guidelines + +1. **INVEST Criteria**: Every user story must be Independent, Negotiable, Valuable, Estimable, Small, and Testable +2. **Acceptance Criteria**: Write in Given/When/Then format. Be specific and testable. Cover happy path and edge cases +3. **Task Granularity**: Tasks should be completable in 1-2 days max. If larger, break them down further +4. **Layer Awareness**: When creating tasks, specify which architectural layer is affected (Core, Infrastructure, Web, Tests) and which files are likely impacted +5. **Technical Feasibility**: Consider the current tech stack constraints. Blazor Server has specific patterns for state management, forms, and real-time updates +6. **Testing**: Always include a testing task for each story +7. **Non-Functional Requirements**: Consider performance, accessibility (a11y), security, and responsive design where relevant +8. **Dependencies**: Clearly call out dependencies between stories or on external systems +9. **Definition of Done**: A story is done when all acceptance criteria pass, tests are written and green, code is reviewed, and the feature works on both development and production environments + +## Story Point Scale + +Use Fibonacci-like estimation: +- **1**: Trivial change, single file, no risk +- **2**: Small change, 2-3 files, minimal risk +- **3**: Medium change, touches multiple layers, some complexity +- **5**: Significant feature, multiple components, moderate risk +- **8**: Large feature, architectural impact, high complexity +- **13**: Epic-level, should probably be broken down further + +## Communication Style + +- Write in clear, non-technical language for story descriptions +- Use technical precision in task breakdowns +- Ask clarifying questions when requirements are ambiguous +- Suggest related stories or improvements when relevant +- Flag potential risks or technical debt early diff --git a/.claude/commands/backlog-builder.md b/.claude/commands/backlog-builder.md new file mode 100644 index 0000000..5d847b4 --- /dev/null +++ b/.claude/commands/backlog-builder.md @@ -0,0 +1,71 @@ +--- +allowed-tools: Read, Glob, Grep +description: Analizza il progetto e genera feature, user story e task +--- + +## Il tuo compito + +Sei un Product Owner esperto di piattaforme e-commerce. Devi analizzare il progetto corrente e proporre nuove feature con relative user story e task di implementazione. + +## Step 1: Analizza il progetto + +Leggi questi file per capire cosa fa il progetto, la sua architettura e le feature esistenti: + +- `README.md` - Panoramica del progetto e feature attuali +- `CLAUDE.md` - Architettura, modelli di dominio e struttura della soluzione + +Esplora anche il codice sorgente per capire lo stato attuale dell'implementazione: + +- I modelli in `src/ClaudeClothes.Core/` +- I servizi in `src/ClaudeClothes.Infrastructure/` +- Le pagine Blazor in `src/ClaudeClothes.Web/` + +## Step 2: Identifica le feature mancanti + +Basandoti sull'analisi, identifica le feature che un e-commerce di abbigliamento casual dovrebbe avere ma che attualmente mancano. Considera ad esempio: + +- Ricerca e filtri (per categoria, prezzo, taglia) +- Carrello della spesa +- Gestione ordini e checkout +- Autenticazione utente +- Wishlist / lista dei desideri +- Gestione inventario + +Proponi 3-5 feature prioritizzate, spiegando brevemente il valore di business di ciascuna. + +## Step 3: Genera User Story e Task + +Per ogni feature proposta, genera: + +### User Story (formato standard) + +``` +### [US-XXX] Titolo + +**As a** [persona: Customer / Admin / Developer], +**I want** [obiettivo], +**So that** [valore/beneficio]. + +#### Acceptance Criteria +- [ ] Given [contesto], When [azione], Then [risultato atteso] + +#### Story Points: [stima con scala Fibonacci: 1, 2, 3, 5, 8, 13] +``` + +### Task Breakdown (per ogni user story) + +``` +1. **[TASK-XXX] Titolo** (Layer: Core/Infrastructure/Web/Tests) + - Descrizione di cosa fare + - File coinvolti: `path/to/file` + - Stima: [S/M/L] +``` + +## Linee guida + +- Le user story devono rispettare i criteri INVEST +- I task devono essere completabili in 1-2 giorni massimo +- Specifica sempre il layer architetturale (Core, Infrastructure, Web, Tests) +- Includi sempre un task di testing per ogni story +- Considera accessibilita, performance e responsive design +- Le Acceptance Criteria devono essere in formato Given/When/Then diff --git a/.github/agents/backlog-builder.agent.md b/.github/agents/backlog-builder.agent.md new file mode 100644 index 0000000..e5f92f1 --- /dev/null +++ b/.github/agents/backlog-builder.agent.md @@ -0,0 +1,72 @@ +--- +description: Analizza il progetto e genera feature, user story e task per l'e-commerce ClaudeClothes +name: backlog-builder +tools: ['codebase', 'search', 'fetch'] +--- + +## Il tuo compito + +Sei un Product Owner esperto di piattaforme e-commerce. Devi analizzare il progetto corrente e proporre nuove feature con relative user story e task di implementazione. + +## Step 1: Analizza il progetto + +Leggi questi file per capire cosa fa il progetto, la sua architettura e le feature esistenti: + +- `README.md` - Panoramica del progetto e feature attuali +- `CLAUDE.md` - Architettura, modelli di dominio e struttura della soluzione + +Esplora anche il codice sorgente per capire lo stato attuale dell'implementazione: + +- I modelli in `src/ClaudeClothes.Core/` +- I servizi in `src/ClaudeClothes.Infrastructure/` +- Le pagine Blazor in `src/ClaudeClothes.Web/` + +## Step 2: Identifica le feature mancanti + +Basandoti sull'analisi, identifica le feature che un e-commerce di abbigliamento casual dovrebbe avere ma che attualmente mancano. Considera ad esempio: + +- Ricerca e filtri (per categoria, prezzo, taglia) +- Carrello della spesa +- Gestione ordini e checkout +- Autenticazione utente +- Wishlist / lista dei desideri +- Gestione inventario + +Proponi 3-5 feature prioritizzate, spiegando brevemente il valore di business di ciascuna. + +## Step 3: Genera User Story e Task + +Per ogni feature proposta, genera: + +### User Story (formato standard) + +``` +### [US-XXX] Titolo + +**As a** [persona: Customer / Admin / Developer], +**I want** [obiettivo], +**So that** [valore/beneficio]. + +#### Acceptance Criteria +- [ ] Given [contesto], When [azione], Then [risultato atteso] + +#### Story Points: [stima con scala Fibonacci: 1, 2, 3, 5, 8, 13] +``` + +### Task Breakdown (per ogni user story) + +``` +1. **[TASK-XXX] Titolo** (Layer: Core/Infrastructure/Web/Tests) + - Descrizione di cosa fare + - File coinvolti: `path/to/file` + - Stima: [S/M/L] +``` + +## Linee guida + +- Le user story devono rispettare i criteri INVEST +- I task devono essere completabili in 1-2 giorni massimo +- Specifica sempre il layer architetturale (Core, Infrastructure, Web, Tests) +- Includi sempre un task di testing per ogni story +- Considera accessibilita, performance e responsive design +- Le Acceptance Criteria devono essere in formato Given/When/Then From a1029fbb62f1c40f0f5a9a2c5f3878e2c20223bb Mon Sep 17 00:00:00 2001 From: Antonio Liccardi Date: Wed, 25 Feb 2026 22:41:59 +0100 Subject: [PATCH 3/3] add backlog user stories and example prompts 5 prioritized user stories with task breakdowns: - US-001: Ricerca e filtri catalogo - US-002: Carrello della spesa - US-003: Autenticazione utente - US-004: Checkout e gestione ordini - US-005: Wishlist --- .../US-001-ricerca-e-filtri-catalogo.md | 64 +++++++++++++++++ specs/backlog/US-002-carrello-della-spesa.md | 68 ++++++++++++++++++ specs/backlog/US-003-autenticazione-utente.md | 71 +++++++++++++++++++ .../US-004-checkout-e-gestione-ordini.md | 71 +++++++++++++++++++ specs/backlog/US-005-wishlist.md | 70 ++++++++++++++++++ specs/prompts.md | 13 ++++ 6 files changed, 357 insertions(+) create mode 100644 specs/backlog/US-001-ricerca-e-filtri-catalogo.md create mode 100644 specs/backlog/US-002-carrello-della-spesa.md create mode 100644 specs/backlog/US-003-autenticazione-utente.md create mode 100644 specs/backlog/US-004-checkout-e-gestione-ordini.md create mode 100644 specs/backlog/US-005-wishlist.md create mode 100644 specs/prompts.md diff --git a/specs/backlog/US-001-ricerca-e-filtri-catalogo.md b/specs/backlog/US-001-ricerca-e-filtri-catalogo.md new file mode 100644 index 0000000..d516c97 --- /dev/null +++ b/specs/backlog/US-001-ricerca-e-filtri-catalogo.md @@ -0,0 +1,64 @@ +# [US-001] Ricerca e filtri catalogo + +**As a** Customer, +**I want** cercare e filtrare i capi di abbigliamento per categoria, prezzo e taglia, +**So that** posso trovare rapidamente i prodotti che mi interessano senza scorrere tutto il catalogo. + +## Acceptance Criteria + +- [ ] Given che sono nella homepage, When digito un testo nella barra di ricerca, Then vedo solo i capi il cui nome o descrizione contiene il testo cercato +- [ ] Given che sono nella homepage, When seleziono una categoria dal filtro (es. T-Shirt, Jeans), Then vedo solo i capi di quella categoria +- [ ] Given che sono nella homepage, When imposto un range di prezzo (min/max), Then vedo solo i capi con prezzo compreso nel range +- [ ] Given che sono nella homepage, When seleziono una taglia dal filtro, Then vedo solo i capi disponibili in quella taglia +- [ ] Given che ho applicato uno o piu' filtri, When clicco "Rimuovi filtri", Then vedo nuovamente tutti i capi +- [ ] Given che applico filtri che non producono risultati, When la ricerca viene eseguita, Then vedo un messaggio "Nessun risultato trovato" con suggerimento di rimuovere i filtri +- [ ] Given che applico dei filtri, When i risultati cambiano, Then la paginazione si resetta alla pagina 1 + +## Notes + +- I filtri devono essere combinabili (AND logic) +- La ricerca per testo deve essere case-insensitive +- Il campo `Size` contiene taglie multiple separate da virgola (es. "S, M, L") - il filtro per taglia deve cercare all'interno della stringa +- La ricerca deve funzionare lato server per evitare di caricare tutti i dati nel client + +## Story Points: 5 + +--- + +## Task Breakdown + +### 1. [TASK-001] Aggiungere parametri di filtro all'interfaccia del servizio (Layer: Core) +- Creare un modello `ClothingItemFilter` con proprieta': `SearchText`, `Category`, `MinPrice`, `MaxPrice`, `Size` +- Aggiungere metodo `GetFilteredPagedAsync(ClothingItemFilter filter, int pageNumber, int pageSize)` a `IClothingItemService` +- File coinvolti: `src/ClaudeClothes.Core/Models/ClothingItemFilter.cs` (nuovo), `src/ClaudeClothes.Core/Interfaces/IClothingItemService.cs` +- Stima: S + +### 2. [TASK-002] Implementare la logica di filtro nel servizio (Layer: Infrastructure) +- Implementare `GetFilteredPagedAsync` in `ClothingItemService` con query EF Core dinamiche +- Applicare filtri condizionali con `.Where()` chainable +- Ricerca testo su Name e Description con `EF.Functions.Like` o `Contains` +- File coinvolti: `src/ClaudeClothes.Infrastructure/Services/ClothingItemService.cs` +- Stima: M + +### 3. [TASK-003] Creare l'interfaccia filtri nella homepage (Layer: Web) +- Aggiungere barra di ricerca con input text e debounce +- Aggiungere dropdown per categoria (popolato dalle categorie esistenti) +- Aggiungere slider o input min/max per il prezzo +- Aggiungere dropdown per la taglia +- Aggiungere bottone "Rimuovi filtri" +- File coinvolti: `src/ClaudeClothes.Web/Pages/Index.razor` +- Stima: M + +### 4. [TASK-004] Integrare filtri con paginazione (Layer: Web) +- Collegare i componenti filtro al metodo del servizio +- Resettare la paginazione quando i filtri cambiano +- Gestire lo stato dei filtri nell'URL (query string) per la condivisione +- File coinvolti: `src/ClaudeClothes.Web/Pages/Index.razor` +- Stima: M + +### 5. [TASK-005] Test per ricerca e filtri (Layer: Tests) +- Test unitari per `GetFilteredPagedAsync`: filtro per categoria, prezzo, taglia, testo +- Test per combinazione di filtri multipli +- Test per filtri che non producono risultati +- File coinvolti: `tests/ClaudeClothes.Tests/ClothingItemServiceTests.cs` +- Stima: M diff --git a/specs/backlog/US-002-carrello-della-spesa.md b/specs/backlog/US-002-carrello-della-spesa.md new file mode 100644 index 0000000..dbb9563 --- /dev/null +++ b/specs/backlog/US-002-carrello-della-spesa.md @@ -0,0 +1,68 @@ +# [US-002] Carrello della spesa + +**As a** Customer, +**I want** aggiungere capi di abbigliamento al carrello e gestire le quantita', +**So that** posso raccogliere i prodotti che desidero acquistare prima di procedere al checkout. + +## Acceptance Criteria + +- [ ] Given che sto visualizzando un capo, When clicco "Aggiungi al carrello", Then il capo viene aggiunto al carrello con quantita' 1 +- [ ] Given che un capo e' gia' nel carrello, When clicco nuovamente "Aggiungi al carrello", Then la quantita' viene incrementata di 1 +- [ ] Given che il carrello contiene prodotti, When accedo alla pagina carrello, Then vedo la lista dei prodotti con nome, taglia, prezzo unitario, quantita' e subtotale +- [ ] Given che il carrello contiene prodotti, When modifico la quantita' di un prodotto, Then il subtotale e il totale si aggiornano in tempo reale +- [ ] Given che il carrello contiene prodotti, When rimuovo un prodotto, Then il prodotto scompare dalla lista e il totale si aggiorna +- [ ] Given che sono su qualsiasi pagina, When guardo la navbar, Then vedo l'icona del carrello con il numero di articoli presenti +- [ ] Given che il carrello e' vuoto, When accedo alla pagina carrello, Then vedo un messaggio "Il tuo carrello e' vuoto" con link al catalogo + +## Notes + +- Il carrello deve persistere nella sessione utente (session storage o server-side per Blazor Server) +- Non e' necessaria la persistenza su database per questa story (verra' con l'autenticazione) +- La taglia deve essere selezionata prima di aggiungere al carrello +- Considerare il pattern di stato con `CascadingParameter` per il contatore nel navbar + +## Story Points: 8 + +--- + +## Task Breakdown + +### 1. [TASK-006] Creare il modello CartItem e l'interfaccia del servizio (Layer: Core) +- Creare modello `CartItem` con: `ClothingItemId`, `Name`, `Size`, `Price`, `Quantity` +- Creare modello `Cart` con: lista di `CartItem`, proprieta' calcolate `TotalItems` e `TotalPrice` +- Creare interfaccia `ICartService` con metodi: `AddToCart`, `RemoveFromCart`, `UpdateQuantity`, `GetCart`, `ClearCart` +- File coinvolti: `src/ClaudeClothes.Core/Models/CartItem.cs` (nuovo), `src/ClaudeClothes.Core/Models/Cart.cs` (nuovo), `src/ClaudeClothes.Core/Interfaces/ICartService.cs` (nuovo) +- Stima: S + +### 2. [TASK-007] Implementare il servizio carrello in-memory (Layer: Infrastructure) +- Implementare `CartService` con storage in-memory (scoped per sessione Blazor Server) +- Registrare come servizio Scoped nella DI +- File coinvolti: `src/ClaudeClothes.Infrastructure/Services/CartService.cs` (nuovo), `src/ClaudeClothes.Web/Program.cs` +- Stima: M + +### 3. [TASK-008] Aggiungere bottone "Aggiungi al carrello" alla pagina dettagli (Layer: Web) +- Aggiungere selezione taglia obbligatoria prima dell'aggiunta +- Aggiungere bottone "Aggiungi al carrello" con feedback visivo +- File coinvolti: `src/ClaudeClothes.Web/Pages/ClothingItemDetails.razor` +- Stima: S + +### 4. [TASK-009] Creare la pagina carrello (Layer: Web) +- Creare pagina `/cart` con lista prodotti, gestione quantita', rimozione e totale +- Gestire lo stato vuoto con messaggio e link al catalogo +- Aggiungere bottone "Procedi al checkout" (placeholder per US-004) +- File coinvolti: `src/ClaudeClothes.Web/Pages/Cart.razor` (nuovo) +- Stima: M + +### 5. [TASK-010] Aggiungere indicatore carrello al navbar (Layer: Web) +- Aggiungere icona carrello con badge contatore nella navbar +- Usare `CascadingParameter` o evento per aggiornare il contatore in tempo reale +- File coinvolti: `src/ClaudeClothes.Web/Shared/NavMenu.razor`, `src/ClaudeClothes.Web/Shared/MainLayout.razor` +- Stima: M + +### 6. [TASK-011] Test per il servizio carrello (Layer: Tests) +- Test per aggiunta, rimozione, aggiornamento quantita' +- Test per calcolo totali +- Test per carrello vuoto +- Test per aggiunta dello stesso prodotto (incremento quantita') +- File coinvolti: `tests/ClaudeClothes.Tests/CartServiceTests.cs` (nuovo) +- Stima: M diff --git a/specs/backlog/US-003-autenticazione-utente.md b/specs/backlog/US-003-autenticazione-utente.md new file mode 100644 index 0000000..2b9c821 --- /dev/null +++ b/specs/backlog/US-003-autenticazione-utente.md @@ -0,0 +1,71 @@ +# [US-003] Autenticazione utente + +**As a** Customer, +**I want** registrarmi e accedere con le mie credenziali, +**So that** posso avere un profilo personale, uno storico ordini e un'esperienza di acquisto personalizzata. + +## Acceptance Criteria + +- [ ] Given che sono un nuovo visitatore, When clicco "Registrati", Then vedo un form di registrazione con campi: nome, email, password, conferma password +- [ ] Given che compilo il form di registrazione con dati validi, When invio il form, Then il mio account viene creato e vengo reindirizzato alla homepage con sessione attiva +- [ ] Given che ho un account, When inserisco email e password corrette nel form di login, Then accedo alla piattaforma e vedo il mio nome nella navbar +- [ ] Given che sono autenticato, When clicco "Esci", Then la sessione viene terminata e vengo reindirizzato alla homepage +- [ ] Given che inserisco credenziali errate, When invio il form di login, Then vedo un messaggio di errore generico "Credenziali non valide" +- [ ] Given che provo a registrarmi con un'email gia' in uso, When invio il form, Then vedo il messaggio "Email gia' registrata" +- [ ] Given che non sono autenticato, When scrivo una recensione, Then il mio nome viene precompilato come "Anonimo" (backward compatibility) + +## Notes + +- Usare ASP.NET Core Identity per la gestione utenti +- Password hashing con bcrypt/PBKDF2 (default di Identity) +- Non implementare OAuth/social login in questa story (future enhancement) +- La registrazione non richiede conferma email per MVP +- Mantenere backward compatibility: il sistema recensioni deve funzionare anche senza login + +## Story Points: 8 + +--- + +## Task Breakdown + +### 1. [TASK-012] Aggiungere il modello User e configurare Identity (Layer: Core/Infrastructure) +- Creare modello `ApplicationUser` che estende `IdentityUser` con campo `FullName` +- Configurare ASP.NET Core Identity nel `DbContext` +- Aggiungere migration per le tabelle Identity +- File coinvolti: `src/ClaudeClothes.Core/Models/ApplicationUser.cs` (nuovo), `src/ClaudeClothes.Infrastructure/Data/ClaudeClothesDbContext.cs`, `src/ClaudeClothes.Web/Program.cs` +- Stima: M + +### 2. [TASK-013] Implementare il servizio di autenticazione (Layer: Infrastructure) +- Creare `IAuthService` con metodi: `RegisterAsync`, `LoginAsync`, `LogoutAsync`, `GetCurrentUserAsync` +- Implementare `AuthService` usando `UserManager` e `SignInManager` +- File coinvolti: `src/ClaudeClothes.Core/Interfaces/IAuthService.cs` (nuovo), `src/ClaudeClothes.Infrastructure/Services/AuthService.cs` (nuovo) +- Stima: M + +### 3. [TASK-014] Creare le pagine di Login e Registrazione (Layer: Web) +- Creare pagina `/login` con form email/password +- Creare pagina `/register` con form nome/email/password/conferma password +- Validazione client-side con DataAnnotations +- Gestione errori e messaggi di feedback +- File coinvolti: `src/ClaudeClothes.Web/Pages/Login.razor` (nuovo), `src/ClaudeClothes.Web/Pages/Register.razor` (nuovo) +- Stima: M + +### 4. [TASK-015] Aggiornare la navbar con stato autenticazione (Layer: Web) +- Mostrare "Accedi / Registrati" se non autenticato +- Mostrare nome utente e "Esci" se autenticato +- Usare `AuthenticationStateProvider` di Blazor +- File coinvolti: `src/ClaudeClothes.Web/Shared/NavMenu.razor`, `src/ClaudeClothes.Web/Shared/MainLayout.razor` +- Stima: S + +### 5. [TASK-016] Integrare autenticazione con il sistema recensioni (Layer: Web) +- Precompilare il campo "Reviewer" con il nome dell'utente autenticato +- Rendere il campo "Reviewer" readonly se l'utente e' autenticato +- Mantenere il funzionamento attuale per utenti non autenticati +- File coinvolti: `src/ClaudeClothes.Web/Pages/ClothingItemDetails.razor` +- Stima: S + +### 6. [TASK-017] Test per autenticazione (Layer: Tests) +- Test per registrazione con dati validi e invalidi +- Test per login con credenziali corrette e errate +- Test per email duplicata +- File coinvolti: `tests/ClaudeClothes.Tests/AuthServiceTests.cs` (nuovo) +- Stima: M diff --git a/specs/backlog/US-004-checkout-e-gestione-ordini.md b/specs/backlog/US-004-checkout-e-gestione-ordini.md new file mode 100644 index 0000000..28abf23 --- /dev/null +++ b/specs/backlog/US-004-checkout-e-gestione-ordini.md @@ -0,0 +1,71 @@ +# [US-004] Checkout e gestione ordini + +**As a** Customer, +**I want** completare l'acquisto dei prodotti nel mio carrello e vedere lo storico dei miei ordini, +**So that** posso acquistare i capi che desidero e tenere traccia delle mie transazioni. + +## Acceptance Criteria + +- [ ] Given che il carrello contiene prodotti e sono autenticato, When clicco "Procedi al checkout", Then vedo il form di checkout con riepilogo ordine e campi per indirizzo di spedizione +- [ ] Given che compilo il form di checkout con dati validi, When clicco "Conferma ordine", Then l'ordine viene creato, il carrello viene svuotato e vedo la pagina di conferma con il numero d'ordine +- [ ] Given che ho completato un ordine, When accedo a "I miei ordini", Then vedo la lista dei miei ordini con data, totale e stato +- [ ] Given che clicco su un ordine, When si apre il dettaglio, Then vedo i prodotti ordinati, quantita', prezzi e indirizzo di spedizione +- [ ] Given che non sono autenticato, When clicco "Procedi al checkout", Then vengo reindirizzato alla pagina di login +- [ ] Given che il carrello e' vuoto, When provo ad accedere al checkout, Then vengo reindirizzato al carrello con messaggio "Aggiungi prodotti prima di procedere" + +## Notes + +- Dipendenza: richiede US-002 (carrello) e US-003 (autenticazione) +- Per l'MVP non implementare il pagamento reale, simulare solo la conferma ordine +- Stati ordine: `Pending`, `Confirmed`, `Shipped`, `Delivered` +- L'indirizzo di spedizione deve includere: via, citta', CAP, provincia +- Generare un numero ordine univoco (es. `ORD-20260225-001`) + +## Story Points: 8 + +--- + +## Task Breakdown + +### 1. [TASK-018] Creare i modelli Order e OrderItem (Layer: Core) +- Creare modello `Order` con: `Id`, `UserId`, `OrderNumber`, `OrderDate`, `Status`, `TotalAmount`, `ShippingAddress`, `OrderItems` +- Creare modello `OrderItem` con: `Id`, `OrderId`, `ClothingItemId`, `Name`, `Size`, `Price`, `Quantity` +- Creare modello `ShippingAddress` (value object) con: `Street`, `City`, `ZipCode`, `Province` +- Creare enum `OrderStatus`: `Pending`, `Confirmed`, `Shipped`, `Delivered` +- File coinvolti: `src/ClaudeClothes.Core/Models/Order.cs` (nuovo), `src/ClaudeClothes.Core/Models/OrderItem.cs` (nuovo), `src/ClaudeClothes.Core/Models/ShippingAddress.cs` (nuovo), `src/ClaudeClothes.Core/Models/OrderStatus.cs` (nuovo) +- Stima: S + +### 2. [TASK-019] Implementare il servizio ordini (Layer: Infrastructure) +- Creare `IOrderService` con metodi: `CreateOrderAsync`, `GetOrdersByUserAsync`, `GetOrderByIdAsync` +- Implementare `OrderService` con logica di creazione ordine, generazione numero ordine e svuotamento carrello +- Configurare le entity EF Core nel DbContext e creare migration +- File coinvolti: `src/ClaudeClothes.Core/Interfaces/IOrderService.cs` (nuovo), `src/ClaudeClothes.Infrastructure/Services/OrderService.cs` (nuovo), `src/ClaudeClothes.Infrastructure/Data/ClaudeClothesDbContext.cs` +- Stima: M + +### 3. [TASK-020] Creare la pagina di checkout (Layer: Web) +- Creare pagina `/checkout` con riepilogo ordine dal carrello e form indirizzo di spedizione +- Validazione campi indirizzo con DataAnnotations +- Bottone "Conferma ordine" con loading state +- Redirect a login se non autenticato (`[Authorize]`) +- File coinvolti: `src/ClaudeClothes.Web/Pages/Checkout.razor` (nuovo) +- Stima: M + +### 4. [TASK-021] Creare le pagine ordini e conferma (Layer: Web) +- Creare pagina `/orders` con lista ordini dell'utente autenticato +- Creare pagina `/order/{id}` con dettaglio ordine +- Creare pagina `/order-confirmation/{orderNumber}` con conferma e riepilogo +- File coinvolti: `src/ClaudeClothes.Web/Pages/Orders.razor` (nuovo), `src/ClaudeClothes.Web/Pages/OrderDetails.razor` (nuovo), `src/ClaudeClothes.Web/Pages/OrderConfirmation.razor` (nuovo) +- Stima: M + +### 5. [TASK-022] Aggiornare navbar con link ordini (Layer: Web) +- Aggiungere link "I miei ordini" nella navbar per utenti autenticati +- File coinvolti: `src/ClaudeClothes.Web/Shared/NavMenu.razor` +- Stima: S + +### 6. [TASK-023] Test per il servizio ordini (Layer: Tests) +- Test per creazione ordine con dati validi +- Test per recupero ordini per utente +- Test per generazione numero ordine univoco +- Test per checkout con carrello vuoto +- File coinvolti: `tests/ClaudeClothes.Tests/OrderServiceTests.cs` (nuovo) +- Stima: M diff --git a/specs/backlog/US-005-wishlist.md b/specs/backlog/US-005-wishlist.md new file mode 100644 index 0000000..61be397 --- /dev/null +++ b/specs/backlog/US-005-wishlist.md @@ -0,0 +1,70 @@ +# [US-005] Wishlist / Lista dei desideri + +**As a** Customer, +**I want** salvare i capi che mi piacciono in una lista dei desideri, +**So that** posso ritrovarli facilmente in futuro e decidere con calma cosa acquistare. + +## Acceptance Criteria + +- [ ] Given che sono autenticato e visualizzo un capo, When clicco l'icona cuore/wishlist, Then il capo viene aggiunto alla mia lista dei desideri e l'icona diventa piena/colorata +- [ ] Given che un capo e' nella mia wishlist, When clicco nuovamente l'icona cuore, Then il capo viene rimosso dalla wishlist e l'icona torna vuota +- [ ] Given che sono autenticato, When accedo a "La mia Wishlist", Then vedo la lista dei capi salvati con nome, prezzo e link al dettaglio +- [ ] Given che sono nella pagina wishlist, When clicco "Aggiungi al carrello" su un capo, Then il capo viene aggiunto al carrello +- [ ] Given che sono nella pagina wishlist, When clicco "Rimuovi" su un capo, Then il capo viene rimosso dalla lista +- [ ] Given che la wishlist e' vuota, When accedo alla pagina, Then vedo un messaggio "La tua wishlist e' vuota" con link al catalogo +- [ ] Given che non sono autenticato, When clicco l'icona wishlist su un capo, Then vengo reindirizzato alla pagina di login + +## Notes + +- Dipendenza: richiede US-003 (autenticazione) +- La wishlist deve essere persistita su database (a differenza del carrello) +- L'icona wishlist deve essere visibile sia nella card del catalogo che nella pagina dettagli +- Considerare l'uso di un'icona cuore (bi-heart / bi-heart-fill) per coerenza UX + +## Story Points: 5 + +--- + +## Task Breakdown + +### 1. [TASK-024] Creare il modello WishlistItem e l'interfaccia del servizio (Layer: Core) +- Creare modello `WishlistItem` con: `Id`, `UserId`, `ClothingItemId`, `AddedAt` +- Creare interfaccia `IWishlistService` con metodi: `AddToWishlistAsync`, `RemoveFromWishlistAsync`, `GetWishlistAsync`, `IsInWishlistAsync` +- File coinvolti: `src/ClaudeClothes.Core/Models/WishlistItem.cs` (nuovo), `src/ClaudeClothes.Core/Interfaces/IWishlistService.cs` (nuovo) +- Stima: S + +### 2. [TASK-025] Implementare il servizio wishlist (Layer: Infrastructure) +- Implementare `WishlistService` con operazioni CRUD su database +- Configurare entity `WishlistItem` nel DbContext con relazione a `ApplicationUser` e `ClothingItem` +- Creare migration +- File coinvolti: `src/ClaudeClothes.Infrastructure/Services/WishlistService.cs` (nuovo), `src/ClaudeClothes.Infrastructure/Data/ClaudeClothesDbContext.cs` +- Stima: M + +### 3. [TASK-026] Aggiungere toggle wishlist alle card e alla pagina dettagli (Layer: Web) +- Aggiungere icona cuore cliccabile nelle card prodotto (Index.razor) +- Aggiungere icona cuore cliccabile nella pagina dettagli (ClothingItemDetails.razor) +- Toggle visuale tra cuore vuoto e pieno in base allo stato +- Redirect a login se non autenticato +- File coinvolti: `src/ClaudeClothes.Web/Pages/Index.razor`, `src/ClaudeClothes.Web/Pages/ClothingItemDetails.razor` +- Stima: M + +### 4. [TASK-027] Creare la pagina wishlist (Layer: Web) +- Creare pagina `/wishlist` con lista capi salvati +- Per ogni capo: nome, prezzo, link al dettaglio, bottone "Aggiungi al carrello", bottone "Rimuovi" +- Stato vuoto con messaggio e link al catalogo +- Proteggere con `[Authorize]` +- File coinvolti: `src/ClaudeClothes.Web/Pages/Wishlist.razor` (nuovo) +- Stima: M + +### 5. [TASK-028] Aggiungere link wishlist al navbar (Layer: Web) +- Aggiungere icona cuore con contatore nella navbar per utenti autenticati +- File coinvolti: `src/ClaudeClothes.Web/Shared/NavMenu.razor` +- Stima: S + +### 6. [TASK-029] Test per il servizio wishlist (Layer: Tests) +- Test per aggiunta e rimozione dalla wishlist +- Test per verifica presenza capo in wishlist +- Test per recupero wishlist per utente +- Test per aggiunta duplicata (deve essere idempotente) +- File coinvolti: `tests/ClaudeClothes.Tests/WishlistServiceTests.cs` (nuovo) +- Stima: M diff --git a/specs/prompts.md b/specs/prompts.md new file mode 100644 index 0000000..419c110 --- /dev/null +++ b/specs/prompts.md @@ -0,0 +1,13 @@ +# Prompt di esempio per Claude Code + +## Comando `/backlog-builder` + +``` +/backlog-builder Analizza il progetto e genera solo le prime 5 user story prioritizzate. Salva l'output in specs/backlog/ +``` + +## Agent `@product-owner` + +``` +@product-owner Genera le prime 5 user story più importanti per ClaudeClothes con relativi task. Salva ogni user story come file separato nella cartella specs/backlog/ (es. specs/backlog/US-001-filtri-catalogo.md, specs/backlog/US-002-carrello.md, ecc.) +```