lazyclaw 3.99.25 → 3.99.26

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.
Files changed (2) hide show
  1. package/cli.mjs +105 -32
  2. package/package.json +1 -1
package/cli.mjs CHANGED
@@ -1468,40 +1468,111 @@ function _attachGhostAutocomplete(rl) {
1468
1468
  // border off the box (which is exactly the bug v3.99.5 shipped:
1469
1469
  // two of the inner lines were 33 cols vs the others' 32, so the
1470
1470
  // ╮ rendered into the next line).
1471
- function _renderBanner(version) {
1472
- // Rebuilt from the Claude Design handoff bundle (v0.1 mascot sheet):
1473
- // Claude's asterisk star wearing a crab/crustacean helmet with two
1474
- // antenna-claws. 10-line "big ASCII" form fits a terminal banner
1475
- // without zoom and reads at any monospace font that has the
1476
- // box-drawing + geometric-shape glyphs.
1477
- //
1478
- // Palette (CLAUDE ORIGINAL): helmet body #c33d2a, helmet shadow
1479
- // #7a1f15, star body #d97757, star shadow #a04f32, eyes ink
1480
- // #c7bca6 / muted slits. Truecolor ANSI; degrades gracefully on
1481
- // terminals that ignore it.
1482
- const helmet = (s) => `\x1b[38;2;195;61;42m${s}\x1b[0m`; // #c33d2a
1483
- const star = (s) => `\x1b[38;2;217;119;87m${s}\x1b[0m`; // #d97757 — Claude orange
1484
- const ink = (s) => `\x1b[38;2;241;234;217m${s}\x1b[0m`; // #f1ead9 paper-ink
1485
- const dim = (s) => `\x1b[2m${s}\x1b[0m`;
1486
- const muted = (s) => `\x1b[38;2;122;110;95m${s}\x1b[0m`; // #7a6e5f
1471
+ // v3.99.26 — canonical Big ASCII mascot from the v0.1 Claude Design
1472
+ // handoff bundle. 12 rows. Claude's square body + lobster pincers (◂▸)
1473
+ // + helmet (╔═╗) + asterisk-star tail. Sleepy slit eyes (│ │) by
1474
+ // defaultname says lazyclaw.
1475
+ //
1476
+ // State variants live in _renderMascot(state). Big variant = banner.
1477
+ // Inline 3-row Tiny variant lives in _renderMascotTiny(state).
1478
+ const _MASCOT_BIG = {
1479
+ idle: [
1480
+ ' ◂▸ ◂▸ ',
1481
+ ' │ │ ',
1482
+ ' │ │ ',
1483
+ '╔═════════════╗',
1484
+ '║ ║',
1485
+ '╚═════════════╝',
1486
+ '┌─────────────┐',
1487
+ '│ │ │ │',
1488
+ '┤ │ │ ├',
1489
+ '└─────────────┘',
1490
+ ' ┃ ┃ ',
1491
+ ' ┃ ┃ ',
1492
+ ],
1493
+ working: [
1494
+ ' ◂▸ ◂▸ ',
1495
+ ' │ ··· │ ',
1496
+ ' │ │ ',
1497
+ '╔═════════════╗',
1498
+ '║ * ║',
1499
+ '╚═════════════╝',
1500
+ '┌─────────────┐',
1501
+ '│ · · │',
1502
+ '┤ ├',
1503
+ '└─────────────┘',
1504
+ ' ┃ ┃ ',
1505
+ ' ┃ ┃ ',
1506
+ ],
1507
+ done: [
1508
+ '✦ ◂▸ ◂▸ ✦',
1509
+ ' │ │ ',
1510
+ ' │ │ ',
1511
+ '╔═════════════╗',
1512
+ '║ ║',
1513
+ '╚═════════════╝',
1514
+ '┌─────────────┐',
1515
+ '│ ^ ^ │',
1516
+ '┤ ‿‿‿ ├',
1517
+ '└─────────────┘',
1518
+ ' ┃ ┃ ',
1519
+ ' ┃ ┃ ',
1520
+ ],
1521
+ error: [
1522
+ ' ▾ ▾ ',
1523
+ ' │ │ ',
1524
+ ' │ │ ',
1525
+ '╔═════════════╗',
1526
+ '║ ~ ║',
1527
+ '╚═════════════╝',
1528
+ '┌─────────────┐',
1529
+ '│ × × │',
1530
+ '┤ ⏜ ├',
1531
+ '└─────────────┘',
1532
+ ' ┃ ┃ ',
1533
+ ' ┃ ┃ ',
1534
+ ],
1535
+ };
1536
+ const _MASCOT_TINY = {
1537
+ idle: '◂▸ ◂▸\n[│ │]\n ┃ ┃ ',
1538
+ working: '◂▸ ◂▸\n[· ·] ···\n ┃ ┃ ',
1539
+ done: '◂▸ ◂▸\n[^ ^] ✓\n ┃ ┃ ',
1540
+ error: '▾ ▾ \n[× ×] !\n ┃ ┃ ',
1541
+ };
1542
+
1543
+ // Ink helpers. State picks a primary colour; the banner caller layers
1544
+ // a secondary "wordmark" right column.
1545
+ function _mascotInkers(state) {
1546
+ const helmet = (s) => `\x1b[38;2;195;61;42m${s}\x1b[0m`;
1547
+ const helmetDim = (s) => `\x1b[38;2;122;31;21m${s}\x1b[0m`;
1548
+ const star = (s) => `\x1b[38;2;217;119;87m${s}\x1b[0m`;
1549
+ const ok = (s) => `\x1b[38;2;111;185;143m${s}\x1b[0m`;
1550
+ const err = (s) => `\x1b[38;2;230;57;70m${s}\x1b[0m`;
1551
+ if (state === 'done') return (s) => ok(s);
1552
+ if (state === 'error') return (s) => err(s);
1553
+ if (state === 'working') return (s) => helmet(s);
1554
+ return (s) => helmet(s);
1555
+ }
1487
1556
 
1557
+ function _renderMascot(state) {
1558
+ const rows = _MASCOT_BIG[state] || _MASCOT_BIG.idle;
1559
+ const ink = _mascotInkers(state);
1560
+ return rows.map((r) => ink(r));
1561
+ }
1562
+
1563
+ // Tiny inline mascot — picked up by chat/agent helpers when they want
1564
+ // to flash a one-line status without re-rendering the whole banner.
1565
+ // Returns a string; callers add their own newline.
1566
+ function _renderMascotTiny(state) {
1567
+ const ink = _mascotInkers(state);
1568
+ return ink((_MASCOT_TINY[state] || _MASCOT_TINY.idle));
1569
+ }
1570
+
1571
+ function _renderBanner(version) {
1572
+ const ink = (s) => `\x1b[38;2;241;234;217m${s}\x1b[0m`;
1573
+ const dim = (s) => `\x1b[2m${s}\x1b[0m`;
1488
1574
  const v = String(version || '?.?.?');
1489
- // Left column — sprite. Right column — wordmark + tagline, aligned
1490
- // to the helmet's eye-row / brim. The trailing spaces preserve the
1491
- // grid so any caller padding the lines (or copying them) doesn't
1492
- // get ragged edges.
1493
- const left = [
1494
- ` ${helmet('▲')} ${helmet('▲')} `,
1495
- ` ${helmet('│')} ${helmet('│')} `,
1496
- ` ${helmet('╔══════════╗')} `,
1497
- ` ${helmet('║')} ${helmet('║')} `,
1498
- ` ${helmet('║')} ${muted('──')} ${muted('──')} ${helmet('║')} `,
1499
- ` ${helmet('║')} ${helmet('║')} `,
1500
- ` ${helmet('╚══════════╝')} `,
1501
- ` ${star('✦')} `,
1502
- ` ${star('╱|╲')} `,
1503
- ` ${star('╱ | ╲')} `,
1504
- ];
1575
+ const left = _renderMascot('idle');
1505
1576
  const right = [
1506
1577
  '',
1507
1578
  '',
@@ -1513,6 +1584,8 @@ function _renderBanner(version) {
1513
1584
  '',
1514
1585
  '',
1515
1586
  '',
1587
+ '',
1588
+ '',
1516
1589
  ];
1517
1590
  return left.map((l, i) => ' ' + l + (right[i] || ''));
1518
1591
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lazyclaw",
3
- "version": "3.99.25",
3
+ "version": "3.99.26",
4
4
  "description": "Lazy, elegant terminal CLI for chatting with Claude / OpenAI / Gemini / Ollama and orchestrating multi-step LLM workflows. Banner-on-launch, slash-command ghost autocomplete, persistent sessions, local HTTP gateway.",
5
5
  "keywords": [
6
6
  "claude",