@lamemind/loom-deck 0.39.0 → 0.40.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.
Files changed (3) hide show
  1. package/README.md +8 -6
  2. package/dist/cli.js +24 -9
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -66,7 +66,7 @@ Assegnazioni correnti:
66
66
  | modale | `F` | filtri |
67
67
  | modale | `^F` | **ricerca full-text** nelle conversazioni del progetto |
68
68
  | modale | `⏎` | **detail** della task selezionata: task file scrollabile + barra azioni |
69
- | modale | `CANC` | **elimina** — la task selezionata, oppure l'intera vista `archiviabili` se è quella attiva |
69
+ | modale | `CANC` | **elimina** — la task selezionata; su una riga meta della vista `archiviabili`, l'intero insieme |
70
70
  | immediata | `^K` | spawna la task selezionata col prompt di **recap** |
71
71
  | immediata | `^P` | spawna la task selezionata sul **preflight** |
72
72
  | immediata | `^R` | spawna la task selezionata in **esecuzione** |
@@ -98,12 +98,14 @@ Le emoji sono quelle del menu compass. Per il terminale compass usa 🖥️, che
98
98
 
99
99
  Il deck **ordina** la potatura, non la esegue: la fa `loom-works:clean-tasks`, invocato da un processo Claude headless. Nessun `git rm` e nessuna riscrittura di `tasks.md` vivono qui — quella sequenza (task file + folder dot-prefixed + riga in `tasks.md`, un commit atomico per task, symlink `current-task.md` rimosso, righe orfane riconciliate) è implementata una volta sola, e averne una seconda darebbe due rimozioni capaci di divergere.
100
100
 
101
- Lo **stesso tasto ha due bersagli di taglia diversa**, e ciò che li discrimina è la vista attiva un'informazione che sta in header, non sotto le dita:
101
+ Lo **stesso tasto ha due bersagli di taglia diversa**, e a discriminarli è la **selezione prima della vista**:
102
102
 
103
- | Vista attiva | Bersaglio |
104
- |---|---|
105
- | `archiviabili` | **tutte** le task che la vista mostra |
106
- | qualunque altra | la **task selezionata** |
103
+ | | riga meta (`≡ tutte` / `○ spot`) | riga task |
104
+ |---|---|---|
105
+ | vista `archiviabili` | **tutte** le task che la vista mostra | quella task |
106
+ | qualunque altra vista | rifiuto, con la nota che dice quale riga meta è | quella task |
107
+
108
+ Con una riga task sotto il caret il tasto tocca **sempre e solo quella task**. Il bulk richiede quindi di essere usciti da ogni riga task, cioè un movimento in più: l'azione di massa non è mai a un tasto di distanza da quella singola, e non la si preme guardando una task evidenziata credendo che il bersaglio sia lei. Il costo è che la regola non si legge dallo schermo — la legenda la dice (`CANC elimina` contro `CANC elimina tutte`), ed è il solo canale che la rende visibile prima della conferma.
107
109
 
108
110
  Da qui la forma della conferma: nomina il bersaglio (quante e quali ID, troncando con `+N`) invece dell'azione, e dice l'**effetto sul disco** — mai «archiviare», che prometterebbe uno spostamento in un archivio che non esiste. I commit restano **locali**: `clean-tasks` non pusha, quindi finché nessuno lo fa un altro worktree continua a vedere le task potate.
109
111
 
package/dist/cli.js CHANGED
@@ -123,6 +123,19 @@ function Deck({ cwd, tasksPath, tasksDir }) {
123
123
  : selectTasks(tasks, taskViewId, { view, archivable }), [taskViewId, viewTasks, tasks, view, archivable]);
124
124
  const isSpot = sel === SPOT;
125
125
  const isAll = sel === ALL;
126
+ // T112 — quando `CANC` pota in BLOCCO invece della sola task selezionata.
127
+ //
128
+ // La SELEZIONE batte la vista, non il contrario: con una riga task sotto il
129
+ // caret il tasto tocca quella task e basta, in ogni vista. Il bulk vive solo
130
+ // sulle righe meta della vista `archiviabili`, cioè richiede di essere usciti
131
+ // da ogni riga task — così l'azione di massa non è mai a un tasto di distanza
132
+ // da quella singola, e non si preme guardando una task evidenziata credendo
133
+ // che il bersaglio sia lei.
134
+ //
135
+ // Derivato una volta e letto sia dal ramo di apertura sia dalla legenda: due
136
+ // condizioni scritte due volte direbbero due cose diverse sullo stesso tasto
137
+ // alla prima modifica.
138
+ const purgeBulk = taskViewId === 'archivable' && (isAll || isSpot);
126
139
  const projectName = cwd.split('/').pop() || cwd;
127
140
  // Unica fonte della selezione: si legge SEMPRE dalla vista, mai dall'array
128
141
  // grezzo — è l'invariante che tiene allineati dettaglio mostrato e spawn.
@@ -425,10 +438,11 @@ function Deck({ cwd, tasksPath, tasksDir }) {
425
438
  setNote(ok ? `✔ ${task.id} → ${summary} · committato` : `⚠ ${task.id} salvato, commit fallito: ${err}`);
426
439
  });
427
440
  }
428
- // T112 — apertura della conferma di eliminazione. Il tasto è uno, il bersaglio
429
- // dipende dalla VISTA attiva: `archiviabili` l'insieme intero, ogni altra →
430
- // la task selezionata. Ciò che discrimina sta in header e non sotto le dita,
431
- // quindi il modale deve nominare il bersaglio (quante e quali), non l'azione.
441
+ // T112 — apertura della conferma di eliminazione. Il tasto è uno e il
442
+ // bersaglio ha due taglie: la task selezionata, o l'insieme intero della vista
443
+ // `archiviabili`. A discriminare è `purgeBulk` la selezione prima della
444
+ // vista. Il modale nomina comunque il bersaglio (quante e quali) e non
445
+ // l'azione: è l'unico punto in cui la differenza fra i due gesti è leggibile.
432
446
  //
433
447
  // Il bersaglio del bulk si legge da `paneTasks`, cioè dalla stessa fonte che
434
448
  // disegna le righe e alimenta il contatore in header (D6): mai il `Set` grezzo
@@ -444,7 +458,7 @@ function Deck({ cwd, tasksPath, tasksDir }) {
444
458
  setNote('CANC → eliminare: seleziona una task (← per il pane)');
445
459
  return;
446
460
  }
447
- const bulk = taskViewId === 'archivable';
461
+ const bulk = purgeBulk;
448
462
  const ids = bulk ? paneTasks.map((t) => t.id) : [];
449
463
  if (!bulk) {
450
464
  const task = selectedTaskOr('CANC', 'eliminare');
@@ -1147,11 +1161,12 @@ function Deck({ cwd, tasksPath, tasksDir }) {
1147
1161
  // Nessuna voce di uscita: non esiste più un tasto che chiuda il deck.
1148
1162
  const keyLegend = sanitize([
1149
1163
  ...(canSpawn ? ['⏎ detail', '^K/^P/^R spawn'] : canResume ? ['⏎ resume'] : []),
1150
- // T112 — la voce nomina il BERSAGLIO, che cambia con la vista attiva
1151
- // senza che cambi il tasto: dire solo «CANC elimina» lascerebbe credere
1152
- // che sulla vista `archiviabili` agisca sulla riga selezionata.
1164
+ // T112 — la voce nomina il BERSAGLIO, che cambia di taglia senza che
1165
+ // cambi il tasto. Legge `purgeBulk`, la stessa condizione del ramo di
1166
+ // apertura: una legenda che annunciasse «tutte» dove il tasto ne pota una
1167
+ // sola sarebbe peggio di nessuna legenda.
1153
1168
  ...(focus === 'tasks'
1154
- ? [taskViewId === 'archivable' ? 'CANC elimina tutte' : 'CANC elimina']
1169
+ ? [purgeBulk ? 'CANC elimina tutte' : 'CANC elimina']
1155
1170
  : []),
1156
1171
  ...(canResume ? ['f fork'] : []),
1157
1172
  ...(canPin ? ['p pin', 'N nota', 'A assegna'] : []),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lamemind/loom-deck",
3
- "version": "0.39.0",
3
+ "version": "0.40.0",
4
4
  "description": "Deck TUI Ink per-progetto della famiglia loom: legge tasks.md e spawna sessioni Claude Code bound via LOOM_TASK",
5
5
  "type": "module",
6
6
  "bin": {