termdeck-cli 2.0.5 → 2.0.7

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 CHANGED
@@ -1,6 +1,11 @@
1
1
  <div align="center">
2
2
 
3
- # 🖥️ termdeck — Terminal Project Control Dashboard
3
+ ```text
4
+ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄
5
+ █▄▄ ▄▄█ █ ▄▄▄▄█ █ ▄▄▄▄█ █ ▄ ▄ █ █ ▄▄ ▀█ █ ▄▄▄▄█ █ ▄▄▄▄█ █ █▀ ▄█
6
+ █ █ █ ▄▄▄█▄ █ ▄ ▄▄█ █ █ █ █ █ █▄▀ █ █ ▄▄▄█▄ █ █▄▄▄▄ █ ▄ ▀█▄
7
+ █▄█ █▄▄▄▄▄█ █▄█▄▄▄█ █▄█▀█▄█ █▄▄▄▄█▀ █▄▄▄▄▄█ █▄▄▄▄▄█ █▄██▄▄█
8
+ ```
4
9
 
5
10
  **A beautiful, multi-pane TUI dashboard for managing your local development projects.**
6
11
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdeck-cli",
3
- "version": "2.0.5",
3
+ "version": "2.0.7",
4
4
  "description": "Terminal project control: a multi-pane TUI to manage your local dev projects — dev servers, git state, process stats, and AI coding agents.",
5
5
  "keywords": [
6
6
  "cli",
package/src/dashboard.js CHANGED
@@ -7,9 +7,10 @@
7
7
  * exactly the rows it needs, with zero gaps between panes:
8
8
  *
9
9
  * +-------------------------------------------------------------------+
10
- * | 15:14:19 +------------+ ● DAEMON ON |
11
- * | | TERMDECK | |
12
- * | +------------+ |
10
+ * | 15:14:19 ● DAEMON ON |
11
+ * | (4-line ASCII TERMDECK banner, centered |
12
+ * | columns 0-62, rows 1-4 of the 5-row masthead) |
13
+ * | |
13
14
  * | [ALL 14] [LIVE 6] [EXP 4] … /search (regex) [box] |
14
15
  * +---------------------------------+---------------------------------+
15
16
  * | PROJECTS (14) | DETAILS: hyperion-core |
@@ -42,7 +43,7 @@ const { getGitInfo, detectStack, generateCommitMessage, commitAndPush } = requir
42
43
  const { launchAgent, tailAgentLog, stopAllAgents, activeTails } = require('./agentManager');
43
44
  const { startMonitoring, stopMonitoring, stopAllMonitoring } = require('./processMonitor');
44
45
 
45
- const LAYOUT = { rows: 12, cols: 12, headerHeight: 6, footerHeight: 2 };
46
+ const LAYOUT = { rows: 12, cols: 12, headerHeight: 8, footerHeight: 2 };
46
47
 
47
48
  /* ------------------------------------------------------------------ *
48
49
  * Theme — dark, modern palette, pastel status tags, thin borders.
@@ -227,13 +228,18 @@ function launchDashboard(config, options = {}) {
227
228
  return widget;
228
229
  }
229
230
 
230
- // Two-strip header: a 3-row masthead (clock | TERMDECK box | daemon) above a
231
- // 3-row chips strip (status chips | search box). updateHeader() is the only
232
- // renderer that mutates these.
233
- const TITLE_TEXT = 'T E R M D E C K';
234
- const LOGO_GREEN = '#00ff00';
235
- const HEADER_ROWS = 6;
236
- const CHIP_STRIP_TOP = 3;
231
+ // Two-strip header: a 5-row masthead (row 0 clock + daemon, rows 1-4 the
232
+ // centered ASCII banner) above a 3-row chips strip. updateHeader() is the
233
+ // only renderer that mutates the dynamic parts.
234
+ const BANNER = [
235
+ '\u2584\u2584\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2584\u2584',
236
+ '\u2588\u2584\u2584 \u2584\u2584\u2588 \u2588 \u2584\u2584\u2584\u2584\u2588 \u2588 \u2584\u2584\u2584\u2584\u2588 \u2588 \u2584 \u2584 \u2588 \u2588 \u2584\u2584 \u2580\u2588 \u2588 \u2584\u2584\u2584\u2584\u2588 \u2588 \u2584\u2584\u2584\u2584\u2588 \u2588 \u2588\u2580 \u2584\u2588',
237
+ ' \u2588 \u2588 \u2588 \u2584\u2584\u2584\u2588\u2584 \u2588 \u2584 \u2584\u2584\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584\u2580 \u2588 \u2588 \u2584\u2584\u2584\u2588\u2584 \u2588 \u2588\u2584\u2584\u2584\u2584 \u2588 \u2584 \u2580\u2588\u2584',
238
+ ' \u2588\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2588\u2584\u2584\u2584\u2588 \u2588\u2584\u2588\u2580\u2588\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2588\u2580 \u2588\u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2588\u2588\u2584\u2584\u2588',
239
+ ].join('\n');
240
+ const BANNER_FG = '#AAAAAA';
241
+ const HEADER_ROWS = 8;
242
+ const CHIP_STRIP_TOP = 5;
237
243
  const CHIP_ORDER = ['all', 'live', 'exp', 'pend', 'unknown', 'scrap'];
238
244
  const CHIP_LABELS = { all: 'ALL', live: 'LIVE', exp: 'EXP', pend: 'PEND', unknown: 'UNKNOWN', scrap: 'SCRAP' };
239
245
  const CHIP_WIDTHS = { all: 8, live: 8, exp: 8, pend: 8, unknown: 12, scrap: 11 };
@@ -250,14 +256,14 @@ function launchDashboard(config, options = {}) {
250
256
  top: 0,
251
257
  left: 0,
252
258
  width: '100%',
253
- height: 3,
259
+ height: 5,
254
260
  tags: true,
255
261
  style: { bg: THEME.bg, fg: THEME.text },
256
262
  });
257
263
 
258
264
  const clockLabel = blessed.text({
259
265
  parent: masthead,
260
- top: 1,
266
+ top: 0,
261
267
  left: 1,
262
268
  height: 1,
263
269
  tags: true,
@@ -267,21 +273,20 @@ function launchDashboard(config, options = {}) {
267
273
 
268
274
  const titleBox = blessed.box({
269
275
  parent: masthead,
270
- top: 0,
271
- left: 'center',
272
- width: TITLE_TEXT.length + 2,
273
- height: 3,
276
+ top: 1,
277
+ left: 0,
278
+ width: '100%',
279
+ height: 4,
274
280
  tags: true,
275
281
  align: 'center',
276
- valign: 'middle',
277
- border: { type: 'line', fg: LOGO_GREEN },
278
- style: { fg: LOGO_GREEN, bold: true, bg: THEME.bg },
279
- content: TITLE_TEXT,
282
+ valign: 'top',
283
+ content: BANNER,
284
+ style: { fg: BANNER_FG, bg: THEME.bg },
280
285
  });
281
286
 
282
287
  const daemonLabel = blessed.text({
283
288
  parent: masthead,
284
- top: 1,
289
+ top: 0,
285
290
  right: 1,
286
291
  height: 1,
287
292
  tags: true,
@@ -336,7 +341,7 @@ function launchDashboard(config, options = {}) {
336
341
  const footerHeight = 2; // bordered footer box
337
342
  const bodyHeight = Math.max(6, screen.rows - bodyTop - footerHeight);
338
343
  // Bordered buttons need 5 rows x 3 cells (15) + border(2) + label-row(0). When the
339
- // window is too short (80x24 → body 16), the grid collapses to 1-line chips.
344
+ // window is too short (80x24 → body 14), the grid collapses to 1-line chips.
340
345
  const large = bodyHeight >= 29;
341
346
  const actionsHeight = large ? 18 : 8; // border(2) + grid(5x3 or 5x1)
342
347
  const outputHeight = Math.max(3, Math.min(large ? 6 : 4, bodyHeight - actionsHeight - (large ? 8 : 5)));