Cartelle
Disponibile da
v0.3.0.
Le cartelle sono l'ubicazione canonica di un prompt: ogni prompt sta in una sola cartella (oppure a root del workspace, quando FolderId è NULL).
I tag restano trasversali (un prompt → molti tag) e sono il modo giusto per categorizzare per dimensioni ortogonali (tono, scopo, destinatario). Cartelle e tag risolvono problemi diversi.
Modello dati
erDiagram
Workspaces ||--o{ Folders : contiene
Folders ||--o{ Folders : "ParentFolderId"
Folders ||--o{ Prompts : "FolderId NULL=root"
Folders {
TEXT Id PK
TEXT WorkspaceId FK
TEXT ParentFolderId "NULL=root"
TEXT Name
TEXT Path "denormalizzato, es /marketing/email"
TEXT CreatedAt
TEXT UpdatedAt
TEXT DeletedAt
}Path è denormalizzato: contiene la stringa /parent/child/... ricalcolata su sposta/rinomina di sotto-tree. Vincolo invariante: Path = parent.Path + "/" + Name. Sentinella in test (docs/operativo/coverage.md § cartelle).
Vincoli
UNIQUE(WorkspaceId, ParentFolderId, Name)— nomi duplicati OK fra sotto-tree diversi, vietati come fratelliName: max 100 caratteri, no/, non vuoto- Profondità: nessun hard limit (lo schema permette N livelli, ma in pratica abbiamo testato fino a 5 livelli con 100 cartelle e tutto regge senza inconsistenze)
- Soft delete:
DeletedAtcascata sui discendenti; i prompt nella cartella eliminata tornano a root (FolderId = NULL)
UX nel client
La sidebar della Libreria mostra l'albero delle cartelle. Click destro su una cartella per:
- Nuova cartella figlia (rispetta UNIQUE su (parent, name))
- Rinomina (propaga
Patha tutti i discendenti, in transazione) - Sposta in... (drag&drop o menu)
- Elimina (soft delete cascata; conferma esplicita perché i prompt dentro tornano a root)
I prompt si spostano trascinandoli sulla cartella desiderata, oppure dal menu contestuale del prompt > "Sposta in...".
Filtri di lista
Nella Libreria, click su una cartella filtra la lista a:
- prompt direttamente in quella cartella, oppure
- prompt anche nei sotto-tree (toggle "include sottocartelle")
Anti-pattern
- Cartelle troppo profonde (> 5 livelli): scoraggiate. Già a 5 livelli stai duplicando informazione che andrebbe in tag. Il linter avvisa con
IMP003quando un import attraversa una catena profonda — segnale che la struttura è da appiattire. - Stessa cartella per ruoli ortogonali: se hai cartella "marketing" che mescola "email cold", "presentazioni keynote", "social copy" — meglio cartella per dominio (cliente/progetto) e tag per tipologia.
Permessi (anteprima Fase 4)
Oggi le cartelle sono visibili a tutti gli utenti del workspace. La Fase 4 introdurrà ACL per cartella (Reader/Editor/Owner) come unità minima di permesso, in modo che un team può avere cartelle private al singolo utente senza dover splittare il workspace.
Lo schema Folders è già pensato per questo: ParentFolderId permette sia inheritance dei permessi che override puntuale. Non c'è ancora il campo Permissions ma sarà additivo.
Comandi Tauri esposti
| Comando | Cosa fa |
|---|---|
folder_lista | Albero piatto con conteggio prompt per cartella |
folder_crea | Crea sotto un parent (o a root) |
folder_rinomina | Cambia Name + propaga Path ai discendenti |
folder_sposta | Cambia ParentFolderId + ricalcola tutti i Path |
folder_elimina | Soft delete cascata + sposta prompt a root |
prompt_sposta | Cambia FolderId di un prompt |
Riferimenti
- Implementazione:
apps/client/src-tauri/src/cartelle.rs - Test stress: 14 unit test (incluso 100 cartelle depth 5)
- Schema:
schema-dati.md