wormclaude 1.0.28 → 1.0.30
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/ansi.js +7 -4
- package/dist/theme.js +1 -1
- package/dist/tui.js +34 -12
- package/package.json +1 -1
package/dist/ansi.js
CHANGED
|
@@ -72,10 +72,13 @@ const CLAUDE_ROWS = [
|
|
|
72
72
|
];
|
|
73
73
|
/** Banner'ı ANSI olarak üretir (dar ekranda tek kelime, geniş ekranda yan yana). */
|
|
74
74
|
export function bannerAnsi(cols) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
// HER ZAMAN büyük ASCII (tek-kelime fallback YOK). Geniş (≥90) → WORM+CLAUDE yan yana;
|
|
76
|
+
// dar → WORM üstte CLAUDE altta (2 blok). Daha da darsa satırlar genişliğe KIRPILIR (sarmaz,
|
|
77
|
+
// bozulmaz — TUI resize'da yeniden bastığı için temiz). Kutu çizim karakterleri 1 sütun.
|
|
78
|
+
const w = Math.max(10, cols);
|
|
79
|
+
const rows = cols >= 90 ? WORM_ROWS.map((r, i) => r + CLAUDE_ROWS[i]) : [...WORM_ROWS, ...CLAUDE_ROWS];
|
|
80
|
+
const body = rows.map((r) => paint(r.length > w ? r.slice(0, w) : r, theme.red, true)).join('\n');
|
|
81
|
+
return body + '\n' + paint(' ' + t('banner.subtitle'), theme.greyDim);
|
|
79
82
|
}
|
|
80
83
|
// ── Markdown bloğu → ANSI (kod blokları sözdizimi-vurgulu) ──
|
|
81
84
|
function markdownAnsi(text, cols) {
|
package/dist/theme.js
CHANGED
package/dist/tui.js
CHANGED
|
@@ -46,8 +46,20 @@ export async function runTui() {
|
|
|
46
46
|
let streamPreview = ''; // akış sırasında footer'da gösterilen ham metin
|
|
47
47
|
let spin = 0;
|
|
48
48
|
const SPIN = ['·', '✢', '✳', '✶', '✻', '✽', '✶', '✳', '✢'];
|
|
49
|
-
//
|
|
50
|
-
const
|
|
49
|
+
// Tüm görsel öğeler bellekte (resize'da yeni genişlikte yeniden basmak için).
|
|
50
|
+
const displayItems = [
|
|
51
|
+
{ kind: 'banner' },
|
|
52
|
+
{ kind: 'note', text: `v${VERSION} · özel renderer (deneysel) · /help komutlar · /kopyala panoya` },
|
|
53
|
+
];
|
|
54
|
+
// ── Geçmişe kalıcı yaz (scrollback) + belleğe ekle ──
|
|
55
|
+
const printItem = (it) => { displayItems.push(it); logUpdate.clear(); process.stdout.write(itemAnsi(it, cols()) + '\n'); renderFooter(); };
|
|
56
|
+
// ── Resize: ekranı temizle, HER ŞEYİ o anki genişlikte yeniden bas (banner + kod responsive) ──
|
|
57
|
+
function redrawAll() {
|
|
58
|
+
process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
|
|
59
|
+
for (const it of displayItems)
|
|
60
|
+
process.stdout.write(itemAnsi(it, cols()) + '\n');
|
|
61
|
+
renderFooter();
|
|
62
|
+
}
|
|
51
63
|
// ── Canlı footer (log-update yönetir) ──
|
|
52
64
|
function renderFooter() {
|
|
53
65
|
const W = Math.max(8, cols());
|
|
@@ -70,8 +82,20 @@ export async function runTui() {
|
|
|
70
82
|
shown = '…' + shown.slice(-(avail - 1));
|
|
71
83
|
lines.push(prompt + shown + (busy ? '' : paint('▌', theme.greyDim)));
|
|
72
84
|
lines.push(paint('/kopyala panoya · Ctrl+C çıkış', theme.greyDim));
|
|
73
|
-
|
|
74
|
-
|
|
85
|
+
const footerLines = lines.map((l) => fit(l, W)); // genişliğe kırp (sarma olmaz)
|
|
86
|
+
// Giriş kutusunu ekranın EN ALTINA sabitle: içerik kısaysa üstüne boş satır doldur.
|
|
87
|
+
// (İçerik ekranı doldurunca pad ≤ 0 → footer doğal olarak içeriğin hemen altında / en altta.)
|
|
88
|
+
const rows = process.stdout.rows || 24;
|
|
89
|
+
let contentH = 0;
|
|
90
|
+
for (const it of displayItems) {
|
|
91
|
+
for (const ln of itemAnsi(it, W).split('\n'))
|
|
92
|
+
contentH += Math.max(1, Math.ceil((vis(ln) || 1) / W));
|
|
93
|
+
if (contentH >= rows)
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
const pad = rows - contentH - footerLines.length - 1;
|
|
97
|
+
const out = pad > 0 ? [...Array(pad).fill(''), ...footerLines] : footerLines;
|
|
98
|
+
logUpdate(out.join('\n'));
|
|
75
99
|
}
|
|
76
100
|
// ── Bir sohbet turu (Milestone 1: araç yok, saf metin) ──
|
|
77
101
|
async function runTurn(userText) {
|
|
@@ -116,12 +140,8 @@ export async function runTui() {
|
|
|
116
140
|
process.stdout.write('\x1b[?1000l\x1b[?1002l\x1b[?1003l\x1b[?1006l\x1b[?1015l\x1b[?1007l');
|
|
117
141
|
}
|
|
118
142
|
catch { }
|
|
119
|
-
// Temiz
|
|
120
|
-
|
|
121
|
-
// KOMPAKT banner (tek satır) — büyük ASCII scrollback'te küçültünce bozuluyordu; bu bozulmaz.
|
|
122
|
-
process.stdout.write(paint(' ● WORMCLAUDE', theme.red, true) + paint(' · uncensored security + code', theme.greyDim) + '\n');
|
|
123
|
-
process.stdout.write(paint(` v${VERSION} · özel renderer (deneysel) · /help komutlar · /kopyala panoya`, theme.greyDim) + '\n\n');
|
|
124
|
-
renderFooter();
|
|
143
|
+
// Temiz başlangıç + banner'ı o anki genişlikte bas (responsive: geniş→büyük ASCII, dar→tek kelime).
|
|
144
|
+
redrawAll();
|
|
125
145
|
const quit = () => { logUpdate.clear(); process.stdout.write('\x1b[2J\x1b[3J\x1b[H'); process.exit(0); };
|
|
126
146
|
let ctrlcAt = 0;
|
|
127
147
|
process.stdin.on('keypress', (str, key) => {
|
|
@@ -189,6 +209,8 @@ export async function runTui() {
|
|
|
189
209
|
renderFooter();
|
|
190
210
|
}
|
|
191
211
|
});
|
|
192
|
-
// resize →
|
|
193
|
-
|
|
212
|
+
// resize → debounce sonra HER ŞEYİ yeni genişlikte yeniden bas (banner/kod responsive, bozulmaz).
|
|
213
|
+
let rzTimer = null;
|
|
214
|
+
process.stdout.on('resize', () => { if (rzTimer)
|
|
215
|
+
clearTimeout(rzTimer); rzTimer = setTimeout(redrawAll, 120); });
|
|
194
216
|
}
|