@lamemind/loom-deck 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -51,9 +51,17 @@ senza collisioni:
51
51
  | `⏎` | azione primaria del pane | Tasks → spawna la task selezionata · Sessions → riprende (`claude --resume`) la sessione selezionata |
52
52
  | **MAIUSCOLA** | **apre un modale** | cattura tutti i tasti; `esc` annulla, non esce |
53
53
  | minuscola | azione immediata, one-shot | |
54
+ | `CTRL`+lettera | idiomi universali e toggle dentro i modali di testo | `^F` = find, come ovunque |
54
55
  | `1`…`9` | voce `launch` n-esima del progetto | da `.claude/loom-works.json` |
55
56
  | `q` `esc` | esce dal deck | in un modale `esc` annulla soltanto |
56
57
 
58
+ `CTRL` è il terzo livello, aggiunto quando è arrivata la ricerca. Serve perché
59
+ un modale con **campi di testo** mangia ogni lettera nuda: là dentro nessun
60
+ comando può essere una lettera semplice. `CTRL+X` e `x` nudo condividono lo
61
+ stesso `input` e si distinguono solo per `key.ctrl`, quindi in modalità normale
62
+ il ramo `CTRL` è valutato **per primo** e chiude l'intera classe — senza,
63
+ `CTRL+F` cadrebbe nel ramo `f` e forkerebbe una sessione invece di cercare.
64
+
57
65
  Assegnazioni correnti:
58
66
 
59
67
  | | Tasto | Cosa fa |
@@ -62,6 +70,7 @@ Assegnazioni correnti:
62
70
  | modale | `E` | edit priorità/stato della task selezionata (salva + commit) |
63
71
  | modale | `S` | sort chain |
64
72
  | modale | `F` | filtri |
73
+ | modale | `^F` | **ricerca full-text** nelle conversazioni del progetto |
65
74
  | immediata | `f` | **forka** la sessione selezionata (solo col focus sul pane Sessions) |
66
75
  | immediata | `t` | terminale @project-root (surface standard launch) |
67
76
  | immediata | `c` | sessione Claude **nuda**: nessuna task, nessun prompt iniziale |
@@ -107,6 +116,57 @@ pannello di dettaglio; la sua tab Ptyxis titola `<label> · <task> · fork`.
107
116
  > `codium`/`idea` non hanno più una lettera dedicata (erano `C`/`I` hardcoded):
108
117
  > ora sono voci `launch` del file config, raggiunte per indice `1`…`9`.
109
118
 
119
+ ### `^F` — cercare dentro le conversazioni
120
+
121
+ Il navigator trova una conversazione per **metadati** (titolo, data, turni). `^F`
122
+ la trova per **contenuto**: «l'IA me l'ha detto 150k di testo fa, ricordo mezza
123
+ parola». Claude Code non ha un find-in-conversation, ma i transcript sono tutti
124
+ su disco e il deck li legge già.
125
+
126
+ Due campi, `tab` per passare dall'uno all'altro:
127
+
128
+ - **hash** — prefisso del `sessionId` (gli 8 char della statusline bastano),
129
+ restringe a una conversazione. Vuoto = **tutte** quelle del progetto.
130
+ - **chiave** — il termine cercato. La ricerca è **eager**: si aggiorna a ogni
131
+ carattere, da 3 in su.
132
+
133
+ Sei toggle, tutti su `CTRL` perché i campi di testo occupano le lettere nude.
134
+ Lo stato si legge da `[x]`/`[ ]`, non dal solo colore:
135
+
136
+ | Tasto | Toggle | Default |
137
+ |---|---|---|
138
+ | `^R` | la chiave è una **regex** invece che testo letterale | off |
139
+ | `^A` | **case-sensitive** | off |
140
+ | `^W` | solo **parole intere** | off |
141
+ | `^B` | cerca nel testo **dell'IA** | **on** |
142
+ | `^T` | cerca nei **tool** (`tool_use` / `tool_result`) | off |
143
+ | `^U` | cerca nei prompt **umani** | off |
144
+
145
+ Non esiste un toggle *thinking*: quei blocchi sono persistiti **senza testo**
146
+ (il transcript porta la sola firma crittografica), quindi sarebbe una casella
147
+ che non può mai produrre un risultato.
148
+
149
+ Con l'hash vuoto la lista è **raggruppata per conversazione**; `⏎` è contestuale
150
+ alla riga selezionata — su una riga-conversazione **riprende** la sessione
151
+ (come dal pane Sessions), su una riga-occorrenza apre il **reader**.
152
+
153
+ Il reader mostra il messaggio intero, aperto già **posizionato sull'occorrenza**
154
+ col match evidenziato: `↑↓` riga, `PgUp`/`PgDn` pagina, `g`/`G` estremi, `esc`
155
+ torna alla lista senza perdere query, toggle e selezione. (Gli estremi stanno su
156
+ lettera e non su `Home`/`End` perché Ink non espone quei due tasti: arrivano
157
+ indistinguibili da qualunque tasto ignoto.)
158
+
159
+ I toggle e la query sono **volatili**: sopravvivono alla chiusura del modale,
160
+ non al riavvio del deck — comporre una ricerca non tocca il disco.
161
+
162
+ **Come fa a essere istantanea.** I corpi dei messaggi restano in RAM dentro la
163
+ cache mtime-keyed che il deck usa già per la lista sessioni: quei file venivano
164
+ comunque deserializzati per turni e titoli, e i corpi buttati. Trattenerli non
165
+ aggiunge I/O, aggiunge memoria — e ne aggiunge poca, perché un JSONL è per l'85%
166
+ overhead (misurato su un progetto reale: 57 MB su disco = 9,8 MB di testo
167
+ cercabile). Cercarci dentro costa 1-9 ms; un prefiltro `grep` sugli stessi file
168
+ ne costerebbe 26, perché rileggerebbe il volume pieno a ogni battuta.
169
+
110
170
  ## Vista: filtri e ordinamenti
111
171
 
112
172
  La lista è una **vista** sulla `tasks.md`: si filtra e si ordina senza toccare il file.