@lamemind/loom-deck 0.21.2 → 0.22.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/dist/cli.js CHANGED
@@ -203,7 +203,7 @@ function runLaunch(entry, cwd) {
203
203
  // sé nella stessa finestra, invece di sparpagliare finestre.
204
204
  // Nessun `-- CMD`: l'azione È aprire la shell (differenza dalle launch custom,
205
205
  // che eseguono un comando dentro `bash -lic`).
206
- // `-T <title>` col core `<owner> <name>` tiene la finestra matchabile da compass
206
+ // `-T <title>` con la chiave `🖥️ <name>` tiene la finestra matchabile da compass
207
207
  // anche mentre la tab attiva è il terminale; senza identità nel file config si
208
208
  // spawna senza titolo (la surface resta funzionante, il progetto risulta assente
209
209
  // dal radar finché quella tab è in primo piano).
@@ -517,11 +517,15 @@ function Deck({ cwd, tasksPath, tasksDir }) {
517
517
  const launch = useMemo(() => loadLaunch(cwd), [cwd]);
518
518
  // Identità (T37): titolo delle tab terminale spawnate col tasto `t`.
519
519
  const identity = useMemo(() => loadIdentity(cwd), [cwd]);
520
- // T53 — `<owner> <name>`: il core che ogni titolo di tab porta, quindi la
521
- // colonna costante da togliere quando serve spazio. Hoistato qui perché ora
522
- // lo consumano DUE schermate (lista e ricerca): calcolarlo su ogni call site
523
- // è il modo in cui le due smettono di togliere la stessa cosa.
524
- const projectCore = identity ? `${identity.owner} ${identity.name}` : null;
520
+ // T53 — il core che ogni titolo di tab porta, quindi la colonna costante da
521
+ // togliere quando serve spazio. Hoistato qui perché ora lo consumano DUE
522
+ // schermate (lista e ricerca): calcolarlo su ogni call site è il modo in cui
523
+ // le due smettono di togliere la stessa cosa.
524
+ // T58 il core è il solo `name`, non `<emoji> <name>` come la chiave di match
525
+ // di compass: qui non serve entropia (è un taglio cosmetico, non un matcher) e
526
+ // il nome nudo ripulisce anche i titoli storici, scritti quando la formula
527
+ // includeva l'owner.
528
+ const projectCore = identity ? identity.name : null;
525
529
  // La vista è una trasformazione DERIVATA, applicata a valle del load: il
526
530
  // polling di tasks.md continua a funzionare senza saperne nulla.
527
531
  const { visible: viewTasks, hidden: hiddenTasks } = useMemo(() => applyView(tasks, view), [tasks, view]);
@@ -1310,7 +1314,7 @@ function Deck({ cwd, tasksPath, tasksDir }) {
1310
1314
  }
1311
1315
  }
1312
1316
  else if (input === 't') {
1313
- const title = identity ? `🖥️ ${identity.owner} ${identity.name} [term]` : null;
1317
+ const title = identity ? `🖥️ ${identity.name} [term]` : null;
1314
1318
  const child = spawnTerminal(cwd, title);
1315
1319
  child.on('error', () => setNote('⚠ t → ptyxis non lanciabile'));
1316
1320
  setNote(`t → terminale su ${projectName}`);
@@ -1556,11 +1560,12 @@ function searchTitleWidth(columns) {
1556
1560
  * Cosa scrivere sulla riga-gruppo per distinguere una conversazione dall'altra.
1557
1561
  *
1558
1562
  * Non basta `session.title`: quel titolo è la label della tab Ptyxis, cioè
1559
- * `<emoji> <owner> <name>` più un eventuale suffisso. Su una lista tutta dello
1563
+ * `<emoji> <name>` più un eventuale suffisso. Su una lista tutta dello
1560
1564
  * stesso progetto (D3) è una COLONNA COSTANTE — tre righe su quattro
1561
1565
  * identiche, che è esattamente il difetto che la riga-gruppo doveva evitare.
1562
1566
  *
1563
- * Si toglie quindi il core `<owner> <name>` (noto dal file config), e se ciò
1567
+ * Si toglie quindi il core `<name>` con tutto ciò che lo precede (noto dal file
1568
+ * config), e se ciò
1564
1569
  * che resta è vuoto o duplica la task già mostrata nella sua colonna, si
1565
1570
  * ripiega sul primo prompt — l'unica cosa che davvero identifica quella
1566
1571
  * conversazione e non un'altra.
package/dist/config.js CHANGED
@@ -102,10 +102,10 @@ export function launchLegend(entries, columns, reserved = 0) {
102
102
  export function parseIdentity(raw) {
103
103
  if (!raw || typeof raw !== 'object')
104
104
  return null;
105
- const { owner, name } = raw;
106
- if (typeof owner !== 'string' || !owner || typeof name !== 'string' || !name)
105
+ const { name } = raw;
106
+ if (typeof name !== 'string' || !name)
107
107
  return null;
108
- return { owner, name };
108
+ return { name };
109
109
  }
110
110
  /** File assente o malformato → nessuna identità. Mai un throw. */
111
111
  export function loadIdentity(projectRoot) {
@@ -17,13 +17,14 @@
17
17
  import { cut, termWidth } from './width.js';
18
18
  // ── T53 · etichetta di riga ────────────────────────────────────────────────
19
19
  /**
20
- * Toglie dal titolo il core `<owner> <name>` del progetto e la punteggiatura di
21
- * giunzione che resta appesa davanti.
20
+ * Toglie dal titolo il core del progetto (il suo `name`) e tutto ciò che lo
21
+ * precede — emoji inclusa — più la punteggiatura di giunzione che resta appesa
22
+ * davanti.
22
23
  *
23
- * Il titolo di una sessione È la label della tab Ptyxis (`🧵 LOCAL loom-works ·
24
- * T52`): dentro un deck che mostra un progetto solo, il core è una COLONNA
25
- * COSTANTE ripetuta su ogni riga. Toglierlo libera le colonne per ciò che
26
- * distingue davvero una conversazione dall'altra.
24
+ * Il titolo di una sessione È la label della tab Ptyxis (`🧵 loom-works · T52`):
25
+ * dentro un deck che mostra un progetto solo, il core è una COLONNA COSTANTE
26
+ * ripetuta su ogni riga. Toglierlo libera le colonne per ciò che distingue
27
+ * davvero una conversazione dall'altra.
27
28
  *
28
29
  * `core` null (file config assente o senza identità) → titolo intatto: senza
29
30
  * sapere cosa togliere non si indovina, si lascia stare.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lamemind/loom-deck",
3
- "version": "0.21.2",
3
+ "version": "0.22.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": {
package/scripts/deck-run CHANGED
@@ -159,11 +159,11 @@ PROFILE_UUID="${LOOM_DECK_PROFILE_UUID:-5a36ae48df1c4d4882f43060e3e59656}"
159
159
  WORKDIR="${LOOM_DECK_WORKDIR:-$PWD}"
160
160
 
161
161
  # ── Titolo tab = label standard loom (matchabile da compass) ──────────────────
162
- # compass matcha le finestre con `window.title.includes(project.label)`, dove la
163
- # label è DERIVATA dal contratto committato .claude/loom-works.json:
164
- # `{emoji} {owner} {name}` → es. "🧵 LOCAL loom-works". Un titolo "cc <task>"
165
- # non contiene la label → finestra ORFANA (progetto appare spento anche mentre ci
166
- # lavori dentro). Deriviamo la label dal file e la usiamo come titolo, con
162
+ # compass matcha le finestre cercando nel titolo un prefisso `{emoji} {name}`,
163
+ # dove i due token sono DERIVATI dal contratto committato .claude/loom-works.json
164
+ # → es. "🧵 loom-works". Un titolo "cc <task>" non contiene la label → finestra
165
+ # ORFANA (progetto appare spento anche mentre ci lavori dentro). Deriviamo la
166
+ # label dal file e la usiamo come titolo, con
167
167
  # suffisso "· <task>" per restare distinguibili fra più tab claude (il suffisso
168
168
  # non rompe il match: è .includes, non equals — stesso pattern del "· deck").
169
169
  # Fallback su "cc <task>" se manca il file o jq (progetto non loom-registered).
@@ -191,8 +191,8 @@ _cfg=""
191
191
  # la sessione è bound, nessun suffisso quando è nuda.
192
192
  if [[ $NO_TASK -eq 1 ]]; then TITLE="cc"; else TITLE="cc ${TASK}"; fi
193
193
  if [[ -n "$_cfg" ]]; then
194
- _label="$(jq -r 'if (.emoji and .owner and .name)
195
- then "\(.emoji) \(.owner) \(.name)" else empty end' \
194
+ _label="$(jq -r 'if (.emoji and .name)
195
+ then "\(.emoji) \(.name)" else empty end' \
196
196
  "$_cfg" 2>/dev/null || true)"
197
197
  if [[ -n "${_label:-}" ]]; then
198
198
  if [[ $NO_TASK -eq 1 ]]; then TITLE="${_label}"; else TITLE="${_label} · ${TASK}"; fi