Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ coverage/
.worktrees/
test-results/
playwright-report/
.playwright-mcp/
tsconfig.tsbuildinfo
.vercel/
186 changes: 126 additions & 60 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,80 +1,146 @@
# AGENTS.md - EasyPIVA Coding Guidelines
# AGENTS.md - EasyPIVA

## Build, Lint, Test
Guida operativa per agenti AI e maintainer che lavorano su questo repository. Le regole qui descritte prevalgono sulle abitudini generiche: EasyPIVA è uno strumento fiscale usato da persone reali e un errore su una soglia o su un'aliquota ha conseguenze concrete.

```bash
npm run dev # Start Vite dev server on port 3000
npm run build # Production build to dist/
npm run preview # Preview production build
npm run typecheck # TypeScript check
npm run lint # ESLint check
npm run test # Vitest unit/integration tests
npm run test:e2e # Playwright end-to-end tests on port 4173
npm run format # Prettier write
npm run format:check # Prettier check
npm run ci # Full local/CI verification pipeline
```
## Panoramica e finalità

EasyPIVA è una single-page application client-side che fornisce **simulazioni fiscali indicative** per la Partita IVA italiana (regime forfettario, contributi INPS, confronto con il regime ordinario, calcolo inverso del fatturato, pianificazione ricavi) e un generatore di preventivi con export PDF.

Install dependencies with `npm ci`. npm is the canonical package manager for this repository.
- Repository **pubblico**, licenza MIT, workflow `maintainers-only` (vedi `CONTRIBUTING.md`).
- Nessun backend applicativo, nessun account utente, nessuna telemetria: tutto viene eseguito nel browser.
- Distribuzione: build statica Vite pubblicata su Vercel (<https://easypiva.vercel.app>).
- Non è un pacchetto npm (`"private": true`) e non è una VS Code extension: nessun `npm publish`, nessun `.vsix`.

## Tech Stack
## Stack e runtime

- React 19, React Router 8, TypeScript 6, Vite 6.
- Tailwind CSS v4 with `@tailwindcss/vite`.
- Base UI / shadcn-style primitives in `components/ui/`.
- Zustand for local client state.
- React Hook Form and Zod for validated forms.
- Recharts, motion, jsPDF, and html2canvas for charts, animation, and PDF export.
- Vitest for unit/UI tests and Playwright for E2E.
- Tailwind CSS v4 tramite `@tailwindcss/vite` (nessuna pipeline PostCSS: non aggiungere `postcss.config.*` né `autoprefixer`).
- Primitivi UI Base UI / shadcn in `components/ui/`; `src/index.css` importa `shadcn/tailwind.css`, quindi `shadcn` è una dipendenza di build reale e non solo una CLI.
- Zustand per lo stato client, React Hook Form + Zod per i form.
- Recharts, motion, jsPDF e html2canvas per grafici, animazioni ed export PDF.
- Vitest (jsdom) per unit/UI, Playwright (chromium) per gli E2E.
- **Runtime richiesto:** Node.js 24 LTS (`.nvmrc`, `engines.node >= 24`) e npm 11 (`packageManager`).
- **Package manager obbligatorio:** npm. Non introdurre pnpm, yarn o bun e non aggiungere un secondo lockfile.

## Project Structure
## Struttura del repository

```text
src/
pages/ # Route pages, lazy loaded in App.tsx
components/ # App components
App.tsx # Router e lazy loading delle pagine
pages/ # Route pubbliche
components/ # Layout, disclaimer, componenti del preventivo
lib/
calculations/ # Pure fiscal domain logic
quote/ # Quote builder model, pagination, export
fiscal-data.ts # Fiscal constants and ATECO categories
number-input.ts # Numeric input normalization helpers
public-copy.ts # Public warning/disclaimer copy
store/ # Zustand stores
test/ # Vitest setup and storage mocks
components/ui/ # Shared UI primitives
tests/e2e/ # Playwright tests
docs/ # Architecture, privacy, fiscal assumptions
calculations/ # Logica fiscale pura (forfettario, inps, comparison, targetNet, planning)
quote/ # Modello preventivo, paginazione, export PDF
fiscal-data.ts # Soglie, aliquote, coefficienti ATECO 2026
number-input.ts # Normalizzazione input numerici non negativi
public-copy.ts # Copy centralizzata dei warning fiscali
browser-storage.ts # Unico accesso consentito a localStorage
theme.ts # Inizializzazione e persistenza del tema
store/ # Store Zustand (disclaimer, tema)
test/ # Setup Vitest e mock di storage
components/ui/ # Primitivi UI condivisi (alias @/components/)
tests/e2e/ # Playwright
docs/ # architecture.md, privacy-and-storage.md, ADRs/, repository-governance.md
.github/ # CI, dependency review, Dependabot, CODEOWNERS, template
```

## Comandi (verificati)

```bash
npm ci # Install riproducibile (usa sempre questo, non npm install ad hoc)
npm run dev # Dev server su http://127.0.0.1:3000
npm run dev:e2e # Dev server dedicato agli E2E su http://127.0.0.1:4173
npm run build # Build di produzione in dist/
npm run preview # Anteprima della build
npm run clean # Rimuove dist/
npm run typecheck # tsc --noEmit
npm run lint # eslint .
npm run format # prettier . --write
npm run format:check # prettier . --check
npm run test # vitest run
npm run test:watch # vitest in watch
npm run test:e2e # playwright test (richiede chromium installato)
npm run ci # format:check + typecheck + lint + test + build + test:e2e
```

## Coding Rules
Se Playwright segnala browser mancanti: `npx playwright install chromium`.
Non esiste uno script di deploy nel repository: il deployment è gestito da Vercel a partire da `main`.

## Regole fiscali (area critica)

- **Non modificare aliquote, coefficienti, soglie o formule senza una fonte primaria verificabile** (Agenzia delle Entrate, Circolari INPS, legge di bilancio). Cita la fonte nel commit e nell'ADR.
- Tutte le costanti fiscali vivono in `src/lib/fiscal-data.ts`. Non duplicarle nelle pagine né nei componenti.
- Ogni cambiamento fiscale richiede un aggiornamento **coordinato** di: costante in `fiscal-data.ts`, logica in `src/lib/calculations/`, test corrispondenti, `docs/ADRs/0001-fiscal-assumptions.md`, copy pubblica (`src/lib/public-copy.ts`, `src/pages/Sources.tsx`) e `CHANGELOG.md`.
- La logica in `src/lib/calculations/` deve restare **pura**: nessun accesso a `window`, storage, rete o data corrente.
- I warning verso l'utente passano dal pattern `DomainWarning` + `warningCopy`; non scrivere messaggi fiscali inline nelle pagine.
- Il disclaimer ("stime indicative, non consulenza fiscale") è parte del prodotto: è presente nel modale iniziale, in `/informativa` e nel README. **Non rimuoverlo né attenuarlo.**
- Se emergono incoerenze tra codice, test e documentazione fiscale, **segnalale** invece di correggerle a intuito.

## Convenzioni di codice

- La copy UI è in italiano; il codice, i nomi e i commenti tecnici in inglese o italiano tecnico, coerentemente con il file.
- Import: `@/` per `src/`, `@/components/` per i primitivi UI. Usa `import type` per i tipi.
- Usa `cn()` per il merge delle classi Tailwind.
- Normalizza gli input numerici con `parseNonNegativeNumber` invece di `Number(...)` ad hoc.
- Ogni accesso a `localStorage` passa da `src/lib/browser-storage.ts` (gestisce SSR, quota esaurita e storage disabilitato).
- Prettier è la fonte di verità sulla formattazione: non riformattare a mano, esegui `npm run format`.
- Commenti sparsi e utili; niente commenti che ripetono il codice.

## Testing

- Aggiungi o aggiorna test Vitest per **ogni** cambiamento di comportamento fiscale.
- Aggiungi test UI quando cambiano validazione dei form o copy visibile all'utente.
- Mantieni Playwright sulla porta dedicata 4173 (`npm run dev:e2e`); non riusare la 3000.
- `npm run ci` deve essere verde prima di considerare il lavoro concluso.

## File generati e da non modificare a mano

- `package-lock.json`: aggiornalo solo tramite npm.
- `dist/`, `test-results/`, `playwright-report/`, `tsconfig.tsbuildinfo`, `node_modules/`: generati, ignorati da Git.
- `docs/assets/easypiva-dashboard.png`: asset di prodotto. Non sostituirlo, ridimensionarlo o ricomprimerlo (provenienza in `docs/asset-provenance.md`).
- `components/ui/`: primitivi generati da shadcn. Preferisci l'estensione a monte invece della modifica invasiva.
- Il commento su `DISABLE_HMR` in `vite.config.ts` è intenzionale: non rimuoverlo.

## Sicurezza e variabili d'ambiente

- Il progetto **non usa variabili d'ambiente applicative** e non ha `.env.example`: non introdurne senza una necessità reale. Qualsiasi valore inserito in un bundle Vite (`VITE_*`) è pubblico.
- `.env*` è già in `.gitignore`. Non committare mai token, chiavi o dati di clienti.
- Le GitHub Actions sono fissate a commit SHA completi con il tag in commento: mantieni questa convenzione.
- Gli header HTTP in `vercel.json` sono parte della superficie di sicurezza pubblica e sono coperti da `src/test/deployment-security.test.ts`: non indebolirli senza una motivazione verificata.
- Le animazioni devono rispettare `prefers-reduced-motion`; conserva sia `MotionConfig reducedMotion="user"` sia il fallback CSS globale.
- `allowScripts` in `package.json` è l'allowlist npm 11 degli install script: aggiungi voci solo dopo aver revisionato lo script (`npm approve-scripts --allow-scripts-pending` elenca i pendenti).
- Dependabot apre solo aggiornamenti di sicurezza (`open-pull-requests-limit: 0` sui version update): non riattivare i version update senza una decisione esplicita del maintainer.
- Le vulnerabilità si segnalano privatamente secondo `SECURITY.md`, mai via issue pubbliche.

## Anti-breaking-change e compatibilità

- Non cambiare le chiavi di `localStorage` (`easypiva-disclaimer-storage`, `easypiva-theme-mode`, `easypiva.quote-draft`) senza una migrazione: gli utenti perderebbero bozze di preventivo reali.
- Non cambiare i path delle route (`/calcolatore`, `/confronto`, `/contributi`, `/quanto-fatturare`, `/pianificazione`, `/preventivo`, `/informativa`): sono link pubblici.
- Preserva l'architettura local-first: niente backend, niente analytics, niente richieste di rete a runtime.
- Non modificare la firma dei risultati esportati da `src/lib/calculations/` senza aggiornare tutti i consumatori e i test.

- Keep fiscal calculations pure and covered by tests.
- Centralize tax thresholds and rates in `src/lib/fiscal-data.ts`.
- When changing fiscal assumptions, update code, `docs/ADRs/0001-fiscal-assumptions.md`, and public copy together.
- Normalize numeric form inputs through shared helpers instead of ad hoc `Number(...)` parsing.
- Use the `DomainWarning` pattern plus `warningCopy` for user-facing fiscal warnings.
- Keep browser storage access behind `src/lib/browser-storage.ts`.
- Preserve the local-first/no-backend architecture unless explicitly changing product scope.
## Versioning, release e pubblicazione

## Testing Rules
- SemVer. La versione è replicata in `package.json`, `package-lock.json`, `README.md` e `CITATION.cff`: **vanno aggiornati insieme**.
- Il branch `main` è protetto: pull request obbligatoria, 1 approvazione, conversazioni risolte, branch aggiornato, storia lineare, check `build` e `dependency-review` obbligatori. Niente push diretti, niente force push, niente riscrittura della storia.
- Flusso di release: branch dedicato → `npm run ci` verde → PR con template compilato → merge squash → tag `vX.Y.Z` → GitHub Release. Il dettaglio è in `docs/repository-governance.md`.
- Non esiste pubblicazione su registry: il pacchetto è `private` e la distribuzione avviene solo tramite il deploy Vercel di `main`.

- Add or update Vitest tests for every fiscal behavior change.
- Add UI tests when form validation or user-visible copy changes.
- Keep Playwright on its dedicated port via `npm run dev:e2e`; do not reuse port 3000 for E2E.
- Run `npm run ci` before considering work complete.
## Criteri di validazione obbligatori

## GitHub Repository Hygiene
Prima di dichiarare completato un lavoro:

- Keep `.github/workflows/ci.yml`, `.github/dependabot.yml`, and `.github/workflows/dependency-review.yml` aligned with `package.json` scripts.
- Keep Dependabot version updates disabled with `open-pull-requests-limit: 0`; security updates remain enabled and require maintainer review.
- Update `docs/repository-governance.md` when repository settings, branch protection recommendations, or supply-chain policy change.
- Use the PR template checklist for maintainer reviews.
- Do not route security reports through public issues; follow `SECURITY.md`.
1. `npm ci` (o `npm install` se hai cambiato dipendenze, così il lockfile resta coerente);
2. `npm run ci` completamente verde;
3. `npm audit` senza vulnerabilità nuove;
4. documentazione, changelog e versione allineati alle modifiche reali;
5. nessun segreto, artefatto o file locale nel diff.

## Style
## Istruzioni per agenti AI

- UI copy is Italian.
- Prefer `@/` imports for `src/` and `@/components/` for UI primitives.
- Use `type` imports for type-only imports.
- Use `cn()` for class merging.
- Keep comments sparse and useful; avoid restating obvious code.
- Trattandosi di repository pubblico, presumi che ogni riga di codice, commit e documento sia leggibile da chiunque.
- Non inventare fonti normative, badge, statistiche o risultati di comandi: riporta l'output reale.
- Non disabilitare test, lint o controlli per farli passare.
- Preferisci diff piccoli e motivati; evita refactoring estetici che non portano beneficio.
- Se un'informazione fiscale non è verificabile con una fonte primaria, segnalala nel riepilogo invece di modificarla.
16 changes: 15 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,17 @@ Tutte le modifiche rilevanti a EasyPIVA vengono tracciate in questo file.

## [Unreleased]

Nessuna modifica in attesa di rilascio.

## [1.1.0] - 2026-08-02

- rimosse le devDependencies inutilizzate `@types/express` (nessun uso di Express nel progetto) e `autoprefixer` (il progetto non ha una pipeline PostCSS: Tailwind CSS v4 passa da `@tailwindcss/vite`), per un totale di 14 pacchetti in meno nell'albero di installazione;
- aggiunti i metadata `bugs` e `keywords` in `package.json`, allineati ai topic GitHub del repository;
- aggiunti `repository-code` e `date-released` a `CITATION.cff` e allineata la versione citabile;
- ignorati `.playwright-mcp/` e `.vercel/` per evitare che artefatti locali di tooling finiscano nel branch principale;
- README esteso con link alla web app pubblicata, sezione di deployment su Vercel e struttura del repository;
- `AGENTS.md` riscritto come guida operativa completa per agenti e maintainer (architettura, comandi verificati, file generati, aree fiscali delicate, versioning, release e deployment);
- aggiunto `CITATION.cff` alla checklist di release in `docs/repository-governance.md`;
- aggiornato il runtime di sviluppo e CI da Node.js 20 EOL a Node.js 24 LTS, con `.nvmrc`, vincoli `engines`, npm dichiarato e tipi Node allineati;
- migrato il routing dichiarativo da `react-router-dom` 7 a `react-router` 8, eliminando l'alert di sicurezza relativo ai percorsi RSC non usati dall'app;
- corretto il calcolo inverso del fatturato affinché rispetti il massimale INPS anche per obiettivi elevati;
Expand All @@ -20,7 +31,10 @@ Tutte le modifiche rilevanti a EasyPIVA vengono tracciate in questo file.
- reso deterministico lo smoke test E2E restringendo i link alla navigazione, rimuovendo l'ambiguità con le card della home;
- allineate documentazione (ADR assunzioni fiscali) e pagina informativa ai dati 2026;
- uniformata la formattazione del codice sorgente con Prettier;
- risolte 12 vulnerabilità `npm audit` locali aggiornando le dipendenze nei range consentiti.
- risolte 12 vulnerabilità `npm audit` locali aggiornando le dipendenze nei range consentiti;
- aggiunti header HTTP di sicurezza al deployment Vercel (CSP, anti-framing, anti-MIME-sniffing, referrer e permissions policy), con test di regressione sulla configurazione;
- migliorata l'accessibilità della navigazione e dell'anteprima preventivo con nome accessibile del toggle tema mobile, `aria-current` sulle route attive e scope espliciti sulle intestazioni della tabella;
- rispettata la preferenza `prefers-reduced-motion` nelle animazioni Motion, nella transizione del tema e nel fallback CSS.

## [1.0.0] - 2026-05-03

Expand Down
4 changes: 3 additions & 1 deletion CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,7 @@ authors:
- family-names: Gasperini
given-names: Michael
url: 'https://github.com/TheStreamCode/easypiva'
version: '1.0.0'
repository-code: 'https://github.com/TheStreamCode/easypiva'
version: '1.1.0'
date-released: '2026-08-02'
license: MIT
Loading