wormclaude 1.0.96 → 1.0.97

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.
@@ -1,29 +1,38 @@
1
- import React, { useState, useEffect } from 'react';
1
+ import React, { useState, useEffect, useRef } from 'react';
2
2
  import { Text, useInput } from 'ink';
3
3
  // Tam imleç-kontrollü satır editörü (ink-text-input yerine).
4
- // Destekler: yazma (imleç konumuna ekleme), Backspace/Delete, →, Home/End (Ctrl+A/Ctrl+E).
4
+ // ÖNEMLİ: Ink'in useInput'u handler'ı bayat closure ile çağırabilir → value/cursor'u REF'ten okuruz
5
+ // (her render güncellenir) ki sağ-ok/yazma doğru konumu kullansın.
6
+ // Destekler: yazma (imleç konumuna), Backspace/Delete, ← →, Home/End (Ctrl+A/Ctrl+E).
5
7
  // ↑↓/PageUp/PageDown/Esc/Tab'a DOKUNMAZ → menü/scroll/dialog handler'larına geçer.
6
8
  export default function LineEditor({ value, onChange, onSubmit, placeholder, isActive = true, color }) {
7
9
  const [cursor, setCursor] = useState(value.length);
8
- // value dışarıdan değişirse imleci sınırda tut (örn. submit'te temizlenince).
9
- useEffect(() => { setCursor((c) => Math.min(c, value.length)); }, [value]);
10
+ const valueRef = useRef(value);
11
+ const cursorRef = useRef(cursor);
12
+ valueRef.current = value; // her render'da güncel değer
13
+ cursorRef.current = cursor;
14
+ // value dışarıdan kısalırsa imleci sınırla (örn. submit'te temizlenince).
15
+ useEffect(() => { if (cursor > value.length)
16
+ setCursor(value.length); }, [value]); // eslint-disable-line
10
17
  useInput((input, key) => {
18
+ const val = valueRef.current;
19
+ const cur = cursorRef.current;
11
20
  if (key.leftArrow) {
12
- setCursor((c) => Math.max(0, c - 1));
21
+ setCursor(Math.max(0, cur - 1));
13
22
  return;
14
23
  }
15
24
  if (key.rightArrow) {
16
- setCursor((c) => Math.min(value.length, c + 1));
25
+ setCursor(Math.min(val.length, cur + 1));
17
26
  return;
18
27
  }
19
28
  if (key.return) {
20
- onSubmit?.(value);
29
+ onSubmit?.(val);
21
30
  return;
22
31
  }
23
32
  if (key.backspace || key.delete) {
24
- if (cursor > 0) {
25
- onChange(value.slice(0, cursor - 1) + value.slice(cursor));
26
- setCursor(cursor - 1);
33
+ if (cur > 0) {
34
+ onChange(val.slice(0, cur - 1) + val.slice(cur));
35
+ setCursor(cur - 1);
27
36
  }
28
37
  return;
29
38
  }
@@ -32,15 +41,15 @@ export default function LineEditor({ value, onChange, onSubmit, placeholder, isA
32
41
  return;
33
42
  }
34
43
  if (key.ctrl && input === 'e') {
35
- setCursor(value.length);
44
+ setCursor(val.length);
36
45
  return;
37
46
  }
38
47
  // Gezinme/özel tuşlar bize ait değil → metne yazma, başka handler'lara bırak.
39
48
  if (key.ctrl || key.meta || key.tab || key.escape || key.upArrow || key.downArrow || key.pageUp || key.pageDown)
40
49
  return;
41
50
  if (input) {
42
- onChange(value.slice(0, cursor) + input + value.slice(cursor));
43
- setCursor(cursor + input.length);
51
+ onChange(val.slice(0, cur) + input + val.slice(cur));
52
+ setCursor(cur + input.length);
44
53
  }
45
54
  }, { isActive });
46
55
  // Placeholder (boş input)
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.96';
19
+ export const VERSION = '1.0.97';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wormclaude",
3
- "version": "1.0.96",
3
+ "version": "1.0.97",
4
4
  "description": "WormClaude CLI - uncensored security+code assistant (ink TUI, Claude-style)",
5
5
  "type": "module",
6
6
  "bin": {