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.
- package/cli.mjs +105 -32
- 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
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
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
|
+
// default — name 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
|
-
|
|
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.
|
|
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",
|