wormclaude 1.0.29 → 1.0.31

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 CHANGED
@@ -72,12 +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
- // Responsive: çok dar tek kelime; orta → WORM üstte CLAUDE altta; geniş → yan yana.
76
- // (TUI resize'da yeniden bastığı için bozulmaz.)
77
- if (cols < 50)
78
- return paint('WORMCLAUDE', theme.red, true) + '\n' + paint(' ' + t('banner.subtitle'), theme.greyDim);
79
- const rows = cols >= 90 ? WORM_ROWS.map((w, i) => w + CLAUDE_ROWS[i]) : [...WORM_ROWS, ...CLAUDE_ROWS];
80
- return rows.map((r) => paint(r, theme.red, true)).join('\n') + '\n' + paint(' ' + t('banner.subtitle'), theme.greyDim);
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);
81
82
  }
82
83
  // ── Markdown bloğu → ANSI (kod blokları sözdizimi-vurgulu) ──
83
84
  function markdownAnsi(text, cols) {
package/dist/theme.js CHANGED
@@ -16,4 +16,4 @@ export const theme = {
16
16
  synType: '#a78bfa', // tip/sınıf adları, sabitler
17
17
  synProp: '#e0e0e0', // özellik/anahtar adları
18
18
  };
19
- export const VERSION = '1.0.29';
19
+ export const VERSION = '1.0.31';
package/dist/tui.js CHANGED
@@ -55,7 +55,8 @@ export async function runTui() {
55
55
  const printItem = (it) => { displayItems.push(it); logUpdate.clear(); process.stdout.write(itemAnsi(it, cols()) + '\n'); renderFooter(); };
56
56
  // ── Resize: ekranı temizle, HER ŞEYİ o anki genişlikte yeniden bas (banner + kod responsive) ──
57
57
  function redrawAll() {
58
- process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
58
+ logUpdate.clear(); // ÖNCE log-update sayacını sıfırla (yoksa
59
+ process.stdout.write('\x1b[2J\x1b[3J\x1b[H'); // sonraki render eraseLines ile banner'ı siler → garble)
59
60
  for (const it of displayItems)
60
61
  process.stdout.write(itemAnsi(it, cols()) + '\n');
61
62
  renderFooter();
@@ -82,8 +83,20 @@ export async function runTui() {
82
83
  shown = '…' + shown.slice(-(avail - 1));
83
84
  lines.push(prompt + shown + (busy ? '' : paint('▌', theme.greyDim)));
84
85
  lines.push(paint('/kopyala panoya · Ctrl+C çıkış', theme.greyDim));
85
- // HER satırı genişliğe kırp küçük terminalde sarma/bozulma olmaz
86
- logUpdate(lines.map((l) => fit(l, W)).join('\n'));
86
+ const footerLines = lines.map((l) => fit(l, W)); // genişliğe kırp (sarma olmaz)
87
+ // Giriş kutusunu ekranın EN ALTINA sabitle: içerik kısaysa üstüne boş satır doldur.
88
+ // (İçerik ekranı doldurunca pad ≤ 0 → footer doğal olarak içeriğin hemen altında / en altta.)
89
+ const rows = process.stdout.rows || 24;
90
+ let contentH = 0;
91
+ for (const it of displayItems) {
92
+ for (const ln of itemAnsi(it, W).split('\n'))
93
+ contentH += Math.max(1, Math.ceil((vis(ln) || 1) / W));
94
+ if (contentH >= rows)
95
+ break;
96
+ }
97
+ const pad = rows - contentH - footerLines.length - 1;
98
+ const out = pad > 0 ? [...Array(pad).fill(''), ...footerLines] : footerLines;
99
+ logUpdate(out.join('\n'));
87
100
  }
88
101
  // ── Bir sohbet turu (Milestone 1: araç yok, saf metin) ──
89
102
  async function runTurn(userText) {
@@ -197,8 +210,14 @@ export async function runTui() {
197
210
  renderFooter();
198
211
  }
199
212
  });
200
- // resize → debounce sonra HER ŞEYİ yeni genişlikte yeniden bas (banner/kod responsive, bozulmaz).
213
+ // resize → her event'te ANINDA temizle (sürüklerken garbled reflow gösterme), settle sonrası
214
+ // (100ms) HER ŞEYİ yeni genişlikte yeniden bas (banner/kod responsive, bozulmaz).
201
215
  let rzTimer = null;
202
- process.stdout.on('resize', () => { if (rzTimer)
203
- clearTimeout(rzTimer); rzTimer = setTimeout(redrawAll, 120); });
216
+ process.stdout.on('resize', () => {
217
+ logUpdate.clear();
218
+ process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
219
+ if (rzTimer)
220
+ clearTimeout(rzTimer);
221
+ rzTimer = setTimeout(redrawAll, 100);
222
+ });
204
223
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wormclaude",
3
- "version": "1.0.29",
3
+ "version": "1.0.31",
4
4
  "description": "WormClaude CLI - uncensored security+code assistant (ink TUI, Claude-style)",
5
5
  "type": "module",
6
6
  "bin": {