@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 +14 -9
- package/dist/config.js +3 -3
- package/dist/session-list.js +7 -6
- package/package.json +1 -1
- package/scripts/deck-run +7 -7
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>`
|
|
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 —
|
|
521
|
-
//
|
|
522
|
-
//
|
|
523
|
-
//
|
|
524
|
-
|
|
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.
|
|
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> <
|
|
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 `<
|
|
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 {
|
|
106
|
-
if (typeof
|
|
105
|
+
const { name } = raw;
|
|
106
|
+
if (typeof name !== 'string' || !name)
|
|
107
107
|
return null;
|
|
108
|
-
return {
|
|
108
|
+
return { name };
|
|
109
109
|
}
|
|
110
110
|
/** File assente o malformato → nessuna identità. Mai un throw. */
|
|
111
111
|
export function loadIdentity(projectRoot) {
|
package/dist/session-list.js
CHANGED
|
@@ -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
|
|
21
|
-
* giunzione che resta appesa
|
|
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 (`🧵
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
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
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
|
|
163
|
-
#
|
|
164
|
-
#
|
|
165
|
-
#
|
|
166
|
-
#
|
|
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 .
|
|
195
|
-
then "\(.emoji) \(.
|
|
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
|