@lamemind/loom-deck 0.75.0 → 0.76.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/tasks.js CHANGED
@@ -8,29 +8,16 @@ import { sanitize } from './width.js';
8
8
  * divergano (uno accetterebbe righe che l'altro rifiuta).
9
9
  */
10
10
  export const TASK_ID_RE = /^T\d+$/;
11
- /**
12
- * Nome della cartella doc del progetto (`docs`, `runtime`, …).
13
- *
14
- * D1 (preflight T20): override via env `LOOM_DECK_DOCS_ROOT`, nessun
15
- * auto-detect e nessuna lettura del file config. Il deck non si lancia mai a
16
- * mano — nasce da compass, che legge `docsRoot` dal registry dconf e lo
17
- * antepone al comando, o dal custom-command del profilo Ptyxis, che ce l'ha
18
- * cablato — quindi l'env c'è sempre nei percorsi di avvio reali.
19
- *
20
- * T134 — funzione e non più letterale ripetuto: la legge anche lo scan della
21
- * coda inbox, e due copie della stessa cascata divergerebbero appena una delle
22
- * due imparasse a leggere il file config.
23
- */
24
- export function docsRootName() {
25
- return process.env.LOOM_DECK_DOCS_ROOT || 'docs';
26
- }
27
- export function resolveTasksPath(cwd = process.cwd()) {
28
- return join(cwd, docsRootName(), 'tasks.md');
11
+ // La docs-root arriva dal chiamante, già risolta: la cascata che la sceglie
12
+ // (`docsRootName` in `config.ts`) gira una volta per vita del deck, e i due path
13
+ // qui sotto devono nascere dallo stesso valore che leggono gli scan del modo doc.
14
+ export function resolveTasksPath(cwd, docsRoot) {
15
+ return join(cwd, docsRoot, 'tasks.md');
29
16
  }
30
17
  // I task file vivono in `<docsRoot>/tasks/` — sibling di tasks.md. Derivo la
31
- // dir dallo stesso path per rispettare l'override LOOM_DECK_DOCS_ROOT.
32
- export function resolveTasksDir(cwd = process.cwd()) {
33
- return join(dirname(resolveTasksPath(cwd)), 'tasks');
18
+ // dir dallo stesso path, così le due non possono puntare a docs-root diverse.
19
+ export function resolveTasksDir(cwd, docsRoot) {
20
+ return join(dirname(resolveTasksPath(cwd, docsRoot)), 'tasks');
34
21
  }
35
22
  /**
36
23
  * Indici di colonna della Tasks Overview letti dall'HEADER, non cablati.
@@ -20,6 +20,7 @@ import { DOC_FLAG_W, flagCell } from '../doc-tree.js';
20
20
  import { docView } from '../doc-views.js';
21
21
  import { docHeaderParts } from '../pane-header.js';
22
22
  import { HeaderLine } from './header-line.js';
23
+ import { offText } from '../platform.js';
23
24
  /**
24
25
  * Rientro di un livello dell'albero: UNA colonna, non due.
25
26
  *
@@ -53,14 +54,17 @@ export function DocHeader({ counts, active, above, below, focused, columns, hasD
53
54
  const { parts, shown } = docHeaderParts(counts, active, above, below, columns, hasDirs);
54
55
  return _jsx(HeaderLine, { parts: parts, shown: shown, focused: focused });
55
56
  }
56
- export function DocPane({ rows, counts, activeView, paneCount, selectedPath, focused, above, below, columns, ok, scanned, scanning, hasDirs, }) {
57
+ export function DocPane({ rows, counts, activeView, paneCount, selectedPath, focused, above, below, columns, ok, scanned, scanning, hasDirs, available = true, }) {
57
58
  const width = paneTextWidth(columns);
58
59
  // Cella elastica per sottrazione dalle colonne fisse, come nel pane inbox e
59
60
  // nella lista sessioni. Pavimento 0 e non un minimo di cortesia: è un tetto,
60
61
  // non una preferenza, e alzarlo sopra lo spazio reale fa uscire la riga dal
61
62
  // pane mangiandone il bordo (invariante ③ di width.ts).
62
63
  const nameW = Math.max(0, width - (2 /* caret */ + DOC_FLAG_W + 1 /* gutter */));
63
- return (_jsxs(Box, { flexDirection: "column", width: "50%", marginRight: 1, borderStyle: "single", borderColor: focused ? 'cyan' : 'gray', paddingX: 1, children: [_jsx(DocHeader, { counts: counts, active: activeView, above: above, below: below, focused: focused, columns: columns, hasDirs: hasDirs }), paneCount === 0 ? (
64
+ return (_jsxs(Box, { flexDirection: "column", width: "50%", marginRight: 1, borderStyle: "single", borderColor: focused ? 'cyan' : 'gray', paddingX: 1, children: [_jsx(DocHeader, { counts: counts, active: activeView, above: above, below: below, focused: focused, columns: columns, hasDirs: hasDirs }), !available ? (
65
+ // T175 — gemello del pane inbox: la misura qui non esiste, e va detto
66
+ // per nome invece di restare su «albero non ancora misurato».
67
+ _jsx(Text, { color: "yellow", wrap: "truncate-end", children: cut(offText('pluginScripts', 'albero doc'), width) })) : paneCount === 0 ? (
64
68
  // Quattro vuoti diversi, e dirlo è il punto. Ai tre del pane inbox se ne
65
69
  // aggiunge uno che solo questo scan ha: «sto misurando». Quattro secondi
66
70
  // di wall clock sono abbastanza da vedersi, e un pane vuoto per quattro
@@ -19,6 +19,7 @@ import { NATURA_SHORT, NATURA_W, inboxMark } from '../inbox.js';
19
19
  import { inboxView } from '../inbox-views.js';
20
20
  import { inboxHeaderParts } from '../pane-header.js';
21
21
  import { HeaderLine } from './header-line.js';
22
+ import { offText } from '../platform.js';
22
23
  /**
23
24
  * Header del pane inbox: le parti e il loro taglio vengono da `pane-header.ts`,
24
25
  * lo stesso modulo da cui `frame.ts` ricava le colonne cliccabili — una fonte
@@ -43,7 +44,7 @@ export function InboxHeader({ counts, active, above, below, focused, columns, })
43
44
  * colonna fissa la paga la cella elastica del nome — che è l'unica cosa con cui
44
45
  * si riconosce un file.
45
46
  */
46
- export function InboxPane({ files, counts, activeView, paneCount, selectedPath, focused, above, below, columns, ok, scanned, }) {
47
+ export function InboxPane({ files, counts, activeView, paneCount, selectedPath, focused, above, below, columns, ok, scanned, available = true, }) {
47
48
  const width = paneTextWidth(columns);
48
49
  // La cella elastica si calcola per SOTTRAZIONE dalle colonne fisse, come il
49
50
  // titolo della lista sessioni: pavimento 0 e non un minimo di cortesia — è un
@@ -58,7 +59,11 @@ export function InboxPane({ files, counts, activeView, paneCount, selectedPath,
58
59
  1 /* gutter */ +
59
60
  1 /* gutter prima della data */ +
60
61
  ageW));
61
- return (_jsxs(Box, { flexDirection: "column", width: "50%", borderStyle: "single", borderColor: focused ? 'cyan' : 'gray', paddingX: 1, children: [_jsx(InboxHeader, { counts: counts, active: activeView, above: above, below: below, focused: focused, columns: columns }), paneCount === 0 ? (
62
+ return (_jsxs(Box, { flexDirection: "column", width: "50%", borderStyle: "single", borderColor: focused ? 'cyan' : 'gray', paddingX: 1, children: [_jsx(InboxHeader, { counts: counts, active: activeView, above: above, below: below, focused: focused, columns: columns }), !available ? (
63
+ // T175 — un quarto vuoto, il solo che non è uno stato della coda: la
64
+ // misura qui non esiste. Va detto per nome, o si leggerebbe come «coda
65
+ // non ancora misurata» per sempre.
66
+ _jsx(Text, { color: "yellow", wrap: "truncate-end", children: cut(offText('pluginScripts', 'coda inbox'), width) })) : paneCount === 0 ? (
62
67
  // Tre vuoti diversi, e dirlo è il punto: «non ho ancora misurato» non è
63
68
  // «ho misurato e non c'è niente», e «la misura si è rotta» non è nessuno
64
69
  // dei due (D2 preflight). Una lista vuota che non dice quale dei tre è
package/dist/wrap-scan.js CHANGED
@@ -145,7 +145,7 @@ export async function runWrapScan(projectRoot) {
145
145
  if (!script)
146
146
  return false;
147
147
  try {
148
- const { stdout } = await execFileAsync('python3', [script, '--root', projectRoot, '--scan'], { cwd: projectRoot, maxBuffer: 16 * 1024 * 1024 });
148
+ const { stdout } = await execFileAsync('python3', [script, '--root', projectRoot, '--scan'], { cwd: projectRoot, maxBuffer: 16 * 1024 * 1024, windowsHide: true });
149
149
  const path = wrapCacheFile(projectRoot);
150
150
  mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
151
151
  writeFileSync(path, stdout, { mode: 0o600 });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lamemind/loom-deck",
3
- "version": "0.75.0",
3
+ "version": "0.76.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": {
@@ -13,7 +13,7 @@
13
13
  "scripts": {
14
14
  "dev": "tsx src/cli.tsx",
15
15
  "build": "tsc",
16
- "test": "tsx --test test/*.test.ts",
16
+ "test": "node test/run.mjs",
17
17
  "start": "node dist/cli.js",
18
18
  "prepare": "tsc"
19
19
  },