@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/README.md +1 -1
- package/dist/actions.js +35 -0
- package/dist/archivable.js +1 -1
- package/dist/claude-cmd.js +101 -0
- package/dist/cli.js +18 -7
- package/dist/commit-times.js +5 -2
- package/dist/config.js +51 -6
- package/dist/deck-model.js +14 -9
- package/dist/doc-tree.js +1 -1
- package/dist/frame.js +7 -0
- package/dist/git-bash.js +78 -0
- package/dist/gitlink.js +1 -0
- package/dist/hooks.js +21 -7
- package/dist/inbox.js +1 -1
- package/dist/input.js +7 -0
- package/dist/live-sessions.js +4 -1
- package/dist/overlays/gitlink.js +12 -2
- package/dist/overlays/wrap.js +10 -1
- package/dist/pane-views.js +12 -2
- package/dist/platform.js +94 -0
- package/dist/project-path.js +71 -0
- package/dist/purge.js +1 -0
- package/dist/sessions.js +63 -29
- package/dist/spawn.js +27 -5
- package/dist/tasks.js +8 -21
- package/dist/ui/doc-pane.js +6 -2
- package/dist/ui/inbox-pane.js +7 -2
- package/dist/wrap-scan.js +1 -1
- package/package.json +2 -2
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
32
|
-
export function resolveTasksDir(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.
|
package/dist/ui/doc-pane.js
CHANGED
|
@@ -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 }),
|
|
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
|
package/dist/ui/inbox-pane.js
CHANGED
|
@@ -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 }),
|
|
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.
|
|
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": "
|
|
16
|
+
"test": "node test/run.mjs",
|
|
17
17
|
"start": "node dist/cli.js",
|
|
18
18
|
"prepare": "tsc"
|
|
19
19
|
},
|