wormclaude 1.0.95 → 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.
package/dist/cli.js CHANGED
@@ -22,7 +22,7 @@ import { recordLearned } from './learn.js';
22
22
  import { loadSkills, getSkills, getSkill, buildSkillPrompt } from './skills.js';
23
23
  import { loadExtensions, getExtCommands, getExtCommand, buildExtCommandPrompt } from './extensions.js';
24
24
  import { platformNote } from './subagents.js';
25
- import { COMMANDS, runSlashCommand } from './commands.js';
25
+ import { COMMANDS, runSlashCommand, getPendingPentestCommand } from './commands.js';
26
26
  import { tasks } from './tasks.js';
27
27
  import { connectMcpServers } from './mcp.js';
28
28
  import * as usage from './usage.js';
@@ -841,6 +841,10 @@ function App() {
841
841
  setCmdSel(0);
842
842
  if (!v)
843
843
  return;
844
+ // Bekleyen güvenlik taraması onayı: sadece "run"/"onayla" yazıldıysa tam komuta çevir.
845
+ const _pending = getPendingPentestCommand(v);
846
+ if (_pending)
847
+ v = _pending;
844
848
  // ! shell modu — LLM'siz doğrudan shell komutu (cmdsec ile gate'li). Sonucu modele bağlam olarak ekle.
845
849
  if (v.startsWith('!') && v.length > 1) {
846
850
  const cmd = v.slice(1).trim();
package/dist/commands.js CHANGED
@@ -122,6 +122,16 @@ const PT_REASON = {
122
122
  timeout: 'Sunucu zaman aşımı.',
123
123
  upstream_error: 'Sunucuya ulaşılamadı.',
124
124
  };
125
+ // Bekleyen tarama onayı — kullanıcı uyarıdan sonra sadece "run"/"onayla" yazınca çalıştırmak için.
126
+ const PT_BUILTIN = new Set(['recon', 'scan', 'xss', 'sqli']);
127
+ let pendingPentest = null;
128
+ export function getPendingPentestCommand(input) {
129
+ if (!pendingPentest)
130
+ return null;
131
+ const cmd = pendingPentest;
132
+ pendingPentest = null; // her girişte tüket — onaylanmazsa bekleyen iptal olur
133
+ return /^(run|onayla|çalıştır|calistir|evet|yes|-y|--yes)$/i.test((input || '').trim()) ? cmd : null;
134
+ }
125
135
  function formatFinding(x) {
126
136
  const sev = x.severity ? `[${String(x.severity).toUpperCase()}] ` : '';
127
137
  if (x.type === 'xss')
@@ -161,13 +171,16 @@ async function pentestCmd(tool, arg, ctx) {
161
171
  return;
162
172
  }
163
173
  if (!scopeAck) {
174
+ const reRun = PT_BUILTIN.has(tool) ? `/${tool} ${target} run` : `/skill ${tool} ${target} run`;
175
+ pendingPentest = reRun;
164
176
  ctx.note(`⚠️ YETKİ ONAYI GEREKLİ — ${label}\n` +
165
177
  `Hedef: ${target}\n\n` +
166
178
  `Bu tarama hedefe GERÇEK istekler gönderir ve trafik SENİN IP'nden çıkar. Yalnız sahibi olduğun ya da\n` +
167
179
  `yazılı izin/angajman bulunan sistemlerde çalıştır. Yetkisiz tarama yasa dışıdır ve kayıt altına alınır.\n\n` +
168
- `Çalıştırmak için sonuna "run" ekle: /${tool} ${target} run`);
180
+ `Onaylamak için sadece "run" yaz (Enter) · ya da tam komut: ${reRun}`);
169
181
  return;
170
182
  }
183
+ pendingPentest = null; // tarama başladı → bekleyen onayı temizle
171
184
  ctx.note(`${label} başlatılıyor — ${target}`);
172
185
  const out = await runPentest(ctx.config, tool, target, true, (s) => ctx.note(s));
173
186
  if (!out.ok) {
@@ -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.95';
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.95",
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": {