Architettura¶
Come una richiesta viaggia da una riga della board fino all'agente e ritorno, e dove vive nel codice ogni pezzo di quel viaggio. Da leggere prima di estendere il package, di rivedere una modifica o di cercare un problema che succede «da qualche parte in mezzo».
In una riga¶
Griglia è un package Laravel: componenti Livewire per la board, modelli Eloquent per i dati, un solo
comando artisan (griglia:check) come intero contratto con l'agente e un solo evento broadcast
(TodoChanged) che tiene allineati tutti gli schermi aperti. Non ha un server suo, non ha un worker di coda
suo, non ha API HTTP: gira dentro la tua applicazione, sul tuo database.
Il ciclo¶
Un task è una piccola macchina a stati. La metà sinistra è tua, la metà destra è dell'agente, e nessuno dei due può muovere le frecce dell'altro.
stateDiagram-v2
direction LR
[*] --> in_attesa: scrivi la richiesta
in_attesa --> da_fare: tocchi il pallino
da_fare --> in_lavorazione: agente · --take
in_lavorazione --> domanda: agente · --ask
domanda --> da_fare: rispondi e fai ripartire
in_lavorazione --> in_pausa: agente · --pause
in_pausa --> in_lavorazione: il worker la riprende
in_lavorazione --> in_attesa: tocchi il badge (stop)
in_lavorazione --> fatto: agente · --done
in_lavorazione --> in_revisione: agente · --done, se il task ha un revisore
in_revisione --> fatto: revisore · --approve
in_revisione --> da_fare: revisore · --request-changes
fatto --> [*]
| Freccia | Chi la muove | Cosa cambia nella riga |
|---|---|---|
| in attesa → da fare | tu, sulla board | open_to_work = true; solo ora un agente può prenderlo |
| da fare → in lavorazione | l'agente, --take |
working = true, working_since avvia il cronometro |
| in lavorazione → domanda | l'agente, --ask |
una riga in questions, il task esce da working |
| domanda → da fare | tu, rispondendo nel modale | le risposte restano attaccate al task per sempre |
| in lavorazione → in pausa | l'agente, --pause |
paused = true; percentuale e fase restano |
| in lavorazione → in attesa | tu, toccando il badge «in lavorazione» | viene scritto stopped_at — l'agente deve mollare il task |
| in lavorazione → fatto | l'agente, --done |
completed_at, il commento di chiusura, le statistiche |
| in lavorazione → in revisione | l'agente, --done su un task con revisore |
nasce un tentativo di revisione per il revisore |
| in revisione → fatto / da fare | il revisore, --approve / --request-changes |
approvato chiude l'originale, le modifiche lo riaprono |
I pallini e le loro icone stanno in Usare la board; le parole nel glossario.
Due regole tengono insieme tutto il resto:
- L'agente non si apre il lavoro da solo. Niente porta un task da «in attesa» a «da fare» tranne te.
- La percentuale è un rapporto, non uno stato.
--progresse--phasescrivono due colonne e fanno broadcast; non spostano mai il task.
I pezzi¶
| Cartella | Cosa ci vive |
|---|---|
src/Models/ |
Checklist, Todo, Ingredient (sotto-task), Question, Attachment, ContextGroup, ContextBlock |
src/Livewire/ |
la board (TodoList, ThemedTodoList), il modale del task (IngredientModal) e le pagine: impostazioni, contesto, piani, statistiche, agenti |
src/Console/ |
il contratto con l'agente (griglia:check, griglia:watch) e i comandi di servizio (archivio, temi, skill, docs, immagini) |
src/Domain/ |
ReviewWorkflow e i suoi enum — l'unico posto dove una revisione cambia mano |
src/Support/ |
i servizi dietro i componenti: Plan, Stats, Skills, Context, Notify, ImageStore, Speech, AgentStatus, … |
src/Settings/ |
i tre gruppi spatie/laravel-settings: AgentSettings, OptimizationSettings, AppSettings |
src/Events/ |
TodoChanged, l'unico evento broadcast |
src/Http/ |
cinque controller (allegati, push, service worker, asset dei temi, trascrizione) e la catena di middleware |
src/Notifications/ |
campanella, Web Push e mail, inviate quando l'agente chiede o chiude |
src/Ai/ |
le chiamate AI opzionali: piani da un prompt, descrizione delle immagini, trascrizione |
radice di src/ |
Agent, Admin, Mode, Themes, ThemeStore, GrigliaServiceProvider |
GrigliaServiceProvider è la cucitura con l'applicazione che ospita il package: registra rotte, viste,
traduzioni, migrazioni, settings, comandi e i tag di publish. Tutto ciò che espone di proposito sta in
Estendere Griglia.
I dati¶
Queste sono le tabelle create dalle migrazioni del package — quelle delle notifiche solo se la tua
applicazione non le ha già. Ogni tabella di proprietà del package porta il prefisso griglia_, così non
occupa mai un nome generico nel tuo database. griglia_todos porta la macchina a stati in colonne normali:
non c'è nessuna stringa di stato da tenere allineata.
| Tabella | Contiene | Note |
|---|---|---|
griglia_checklists |
le liste | user_id proprietario, agent agente di default, plan_prompt + plan_paused per i piani |
griglia_todos |
i task | stato, percentuale, agente, statistiche, catene — vedi sotto |
griglia_ingredients |
i sotto-task | nome storico, tenuto di proposito (glossario) |
griglia_questions |
le domande dell'agente | question, answer, choices opzionali |
griglia_attachments |
le immagini di un task | file su un disco privato, description scritta dall'AI e cercata dalla ricerca |
griglia_context_groups, griglia_context_blocks |
il file di istruzioni dell'agente, a pezzi | ciò che griglia:context scrive su disco |
settings |
i tre gruppi di impostazioni | una riga per chiave, payload in JSON |
notifications, sottoscrizioni push |
notifiche Laravel ed endpoint Web Push | create solo se la tua app non le ha già |
Il prefisso è griglia.table_prefix (GRIGLIA_TABLE_PREFIX). Mettilo a '' per
tenere i vecchi nomi senza prefisso; su un database già in uso la migrazione rinomina le tabelle da sé, dati
e chiavi esterne compresi. Le ultime tre righe appartengono a spatie/laravel-settings, a Laravel e a webpush,
che cercano le loro tabelle con la propria configurazione: non hanno mai il prefisso.
Le colonne di griglia_todos che contano, raggruppate per chi le scrive:
| Scritte da | Colonne |
|---|---|
| te | title, notes, order, open_to_work, stopped_at, archived_at, skills |
| l'agente | working, paused, progress, phase, question, completed, claude_comment, result_summary, outcome, tokens_in, tokens_out |
| la board | working_since, completed_at, result_seen, review_status, review_outcome |
Tre chiavi esterne puntano ad altri task e danno alla board le sue tre catene:
| Colonna | Catena | Dove è spiegata |
|---|---|---|
depends_on_id |
un piano: chiudere un task apre il successivo | Piani |
parent_id |
un task ripreso resta legato a quello che continua | Usare la board |
review_of_id |
un tentativo di revisione e il task che rivede | --approve / --request-changes |
notes è tua e claude_comment è dell'agente: l'agente scrive il risultato nel proprio campo e non tocca
mai il tuo.
Il percorso di una richiesta¶
Ogni pagina della board passa dalla stessa catena di middleware, configurata in config/griglia.php:
web (o il tuo `middleware`) → GrigliaAccess → SetLocale → RememberStyle → OpenFromLink → componente Livewire
GrigliaAccesssostituisceauthnelle rotte del package: in modalitàserverrichiede un utente autenticato e l'hookcanAccessGriglia(); in modalitàlocalfa passare chiunque e le liste diventano globali.GrigliaAdminprotegge solo/settingse/context.SetLocaleapplica la lingua della board,RememberStylericorda lo stile della lista che stavi guardando,OpenFromLinkapre un task direttamente dal link di una notifica.
Modalità e cancelli sono descritti in Accessi, amministratori e modalità.
Aggiornamenti dal vivo¶
Ogni modifica a un task, sotto-task, domanda o allegato fa broadcast di un solo evento TodoChanged sul
canale privato del proprietario (modalità server) o su un unico canale pubblico (modalità local). Le
board aperte aggiornano la riga, il toast compare solo per le modifiche arrivate dalla console e senza un
broadcaster configurato non si rompe niente: l'evento viene semplicemente lasciato cadere. Payload e
listener stanno in Eventi e broadcasting.
Il lato agente dello stesso segnale è griglia:watch, che stampa quegli eventi sul terminale: così un
worker può reagire senza fare polling.
Dove si configura il comportamento¶
Due livelli, di proposito:
| Livello | Lo cambia | Contiene |
|---|---|---|
config/griglia.php (+ .env) |
chi installa il package | il cablaggio: rotte, modalità, agenti, dischi, asset, rate limit — vedi la reference della configurazione |
| Le impostazioni, nel database | tu, da /settings |
il comportamento: come lavora l'agente, notifiche, ottimizzazione, i default della board — vedi la reference delle impostazioni |
La regola pratica: se per cambiarlo serve un deploy è configurazione; se potresti volerlo cambiare dal
telefono è un'impostazione. griglia:check stampa in testa le impostazioni dell'agente e quelle di
ottimizzazione, così l'agente le legge all'inizio di ogni sessione.
Cosa non c'è, di proposito¶
Il contratto con l'agente è artisan più un worker, e nient'altro: niente API HTTP, niente token macchina, niente webhook, niente server MCP, nessuna chiamata in uscita a parte quelle AI opzionali che configuri tu. Chi esegue il comando ha già una shell sull'host e le credenziali del database: aggiungere una seconda porta, più debole, allargherebbe soltanto la superficie.
Le conseguenze di questa scelta, e le altre strade non prese, stanno nella roadmap.
Vedi anche¶
- Il lato agente — i comandi che muovono la macchina a stati.
- Estendere Griglia — le cuciture fatte apposta per essere usate da fuori.
- Sviluppo — come far girare il package e i suoi test in locale.
- Roadmap — cosa arriva e cosa resta fuori per scelta.