wormclaude 1.0.150 → 1.0.152

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/api.js CHANGED
@@ -151,6 +151,7 @@ export async function* streamChat(messages, tools, config, signal) {
151
151
  method: 'POST',
152
152
  headers: {
153
153
  'Content-Type': 'application/json',
154
+ 'X-WormClaude-Client': 'cli', // gateway: CLI kullanımı abonelik kovasından düşer (çıplak API = API cüzdanı)
154
155
  ...(config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : {}),
155
156
  ...(getTrace() ? { 'X-WC-Trace': getTrace(), 'X-WC-Session': getSession() } : {}),
156
157
  },
package/dist/auth.js CHANGED
@@ -4,6 +4,9 @@ import * as path from 'node:path';
4
4
  import * as os from 'node:os';
5
5
  import * as readline from 'node:readline';
6
6
  import { spawn } from 'node:child_process';
7
+ import { getLang } from './i18n.js';
8
+ // Kullanıcıya gösterilen metin: VARSAYILAN İngilizce; yalnız dil 'tr' ise Türkçe.
9
+ const tt = (en, tr) => (getLang() === 'tr' ? tr : en);
7
10
  export const CONFIG_DIR = path.join(os.homedir(), '.wormclaude');
8
11
  export const CONFIG_PATH = path.join(CONFIG_DIR, 'config.json');
9
12
  // Müşteriler bunu değiştirmesin diye varsayılan public API.
@@ -31,6 +34,32 @@ export function clearStored() {
31
34
  }
32
35
  catch { }
33
36
  }
37
+ // Anahtarı doğrudan yapıştırarak giriş: web Ayarlar → API'den kopyalanan anahtarı kaydet.
38
+ // Anahtar gateway'de doğrulanır (geçersizse kaydetmez). [[api-key-unification]] Faz 3.
39
+ export async function loginWithKey(rawKey) {
40
+ const key = (rawKey || '').trim();
41
+ if (!key) {
42
+ process.stdout.write('\n ' + tt('Empty key. Usage: wormclaude login --key <KEY>', 'Anahtar boş. Kullanım: wormclaude login --key <ANAHTAR>') + '\n\n');
43
+ process.exit(1);
44
+ }
45
+ const base = process.env.WORMCLAUDE_BASE_URL || DEFAULT_BASE_URL;
46
+ process.stdout.write(' ' + tt('Validating key...', 'Anahtar doğrulanıyor...'));
47
+ try {
48
+ const r = await fetch(`${base}/account`, { headers: { Authorization: `Bearer ${key}` } });
49
+ if (!r.ok) {
50
+ process.stdout.write('\n\n \x1b[31m' + tt('✗ Invalid key', '✗ Anahtar geçersiz') + '\x1b[0m (HTTP ' + r.status + '). ' +
51
+ tt('Copy the correct key from web Settings → API.', 'Web Ayarlar → API\'den doğru anahtarı kopyala.') + '\n\n');
52
+ process.exit(1);
53
+ }
54
+ }
55
+ catch (e) {
56
+ process.stdout.write('\n\n ' + tt('Could not reach the server: ', 'Sunucuya ulaşılamadı: ') + (e?.message || e) + '\n\n');
57
+ process.exit(1);
58
+ }
59
+ saveStored({ baseUrl: base, apiKey: key, model: 'wormclaude-v2' });
60
+ process.stdout.write('\n\n \x1b[32m' + tt('✓ Signed in!', '✓ Giriş başarılı!') + '\x1b[0m ' +
61
+ tt('You can now use `wormclaude`.', 'Artık `wormclaude` yazarak kullanabilirsiniz.') + '\n\n');
62
+ }
34
63
  // baseUrl ".../v1" → device endpoint'leri için kök (".../v1" olmadan)
35
64
  function apiOrigin(baseUrl) {
36
65
  return baseUrl.replace(/\/v1\/?$/, '');
@@ -111,8 +140,8 @@ export function runUpdate() {
111
140
  // ↑/↓ ok tuşlarıyla gezin, Enter ile seç. (1/2 tuşları da çalışır.)
112
141
  export function promptLoginMenu() {
113
142
  const items = [
114
- { label: 'Giriş yap', value: 'login' },
115
- { label: 'Çıkış', value: 'exit' },
143
+ { label: tt('Log in', 'Giriş yap'), value: 'login' },
144
+ { label: tt('Exit', 'Çıkış'), value: 'exit' },
116
145
  ];
117
146
  return new Promise((resolve) => {
118
147
  const stdin = process.stdin;
@@ -124,7 +153,7 @@ export function promptLoginMenu() {
124
153
  }
125
154
  let idx = 0;
126
155
  process.stdout.write('\n \x1b[1mWormClaude\x1b[0m\n');
127
- process.stdout.write(' \x1b[2m↑/↓ ile seç · Enter ile onayla\x1b[0m\n\n');
156
+ process.stdout.write(' \x1b[2m' + tt('↑/↓ to select · Enter to confirm', '↑/↓ ile seç · Enter ile onayla') + '\x1b[0m\n\n');
128
157
  const draw = (first) => {
129
158
  if (!first)
130
159
  process.stdout.write(`\x1b[${items.length}A`); // imleci listenin başına al
@@ -193,17 +222,17 @@ export async function deviceLogin() {
193
222
  start = await r.json();
194
223
  }
195
224
  catch (e) {
196
- process.stderr.write('Giriş başlatılamadı: ' + (e?.message || e) + '\n');
225
+ process.stderr.write(tt('Could not start login: ', 'Giriş başlatılamadı: ') + (e?.message || e) + '\n');
197
226
  process.exit(1);
198
227
  }
199
228
  const url = start.verification_uri_complete || start.verification_uri;
200
229
  const deviceCode = start.device_code;
201
230
  openBrowser(url);
202
- process.stdout.write('\n Tarayıcıda Google ile giriş yapın...\n');
203
- process.stdout.write(' \x1b[2m(tarayıcı açılmadıysa: ' + url + ')\x1b[0m\n\n');
231
+ process.stdout.write('\n ' + tt('Sign in with Google in your browser...', 'Tarayıcıda Google ile giriş yapın...') + '\n');
232
+ process.stdout.write(' \x1b[2m(' + tt('if the browser did not open: ', 'tarayıcı açılmadıysa: ') + url + ')\x1b[0m\n\n');
204
233
  const pollMs = Math.max(2, Number(start.interval) || 3) * 1000;
205
234
  const deadline = Date.now() + (Number(start.expires_in) || 600) * 1000;
206
- process.stdout.write(' Bekleniyor');
235
+ process.stdout.write(' ' + tt('Waiting', 'Bekleniyor'));
207
236
  while (Date.now() < deadline) {
208
237
  await sleep(pollMs);
209
238
  process.stdout.write('.');
@@ -216,19 +245,21 @@ export async function deviceLogin() {
216
245
  continue; // geçici ağ hatası — tekrar dene
217
246
  }
218
247
  if (d.status === 'approved') {
248
+ // Gateway onayda anahtarı CLI'ye bağlar (yoksa oluşturur, varsa yeniler) → api_key hep dolu.
219
249
  saveStored({
220
250
  baseUrl: d.base_url || base,
221
251
  apiKey: d.api_key,
222
252
  model: d.model || 'wormclaude-v2',
223
253
  });
224
- process.stdout.write('\n\n \x1b[32m✓ Giriş başarılı!\x1b[0m Artık `wormclaude` yazarak kullanabilirsiniz.\n\n');
254
+ process.stdout.write('\n\n \x1b[32m' + tt('Signed in!', '✓ Giriş başarılı!') + '\x1b[0m ' +
255
+ tt('You can now use `wormclaude`.', 'Artık `wormclaude` yazarak kullanabilirsiniz.') + '\n\n');
225
256
  return;
226
257
  }
227
258
  if (d.status === 'expired') {
228
- process.stdout.write('\n\n Kodun süresi doldu. Tekrar deneyin: wormclaude login\n\n');
259
+ process.stdout.write('\n\n ' + tt('Code expired. Try again: wormclaude login', 'Kodun süresi doldu. Tekrar deneyin: wormclaude login') + '\n\n');
229
260
  process.exit(1);
230
261
  }
231
262
  }
232
- process.stdout.write('\n\n Süre doldu. Tekrar deneyin: wormclaude login\n\n');
263
+ process.stdout.write('\n\n ' + tt('Timed out. Try again: wormclaude login', 'Süre doldu. Tekrar deneyin: wormclaude login') + '\n\n');
233
264
  process.exit(1);
234
265
  }
package/dist/cli.js CHANGED
@@ -61,11 +61,15 @@ import { shouldAutoCompact, runCompact, isContextError } from './compact.js';
61
61
  import { shouldExtract, triggerMemory, loadMemoryContext } from './memory.js';
62
62
  // --- WORMCLAUDE SUBCOMMANDS (TUI oncesi) ---
63
63
  const _arg = (process.argv[2] || '').toLowerCase();
64
+ // Dil: VARSAYILAN İngilizce; kayıtlı dil varsa onu uygula. TÜM yollardan (subcommand + TUI) ÖNCE
65
+ // ayarla ki login/whoami/hata mesajları da doğru dilde olsun (eskiden subcommand'lar default'a düşüyordu).
66
+ setLang(loadLang() ?? 'en');
67
+ const _tt = (en, tr) => (getLang() === 'tr' ? tr : en);
64
68
  // Headless mod: wormclaude -p "<görev>" → TUI'siz çalıştır, stdout'a yaz, çık (scriptlenebilir + test).
65
69
  if (_arg === '-p' || _arg === '--print') {
66
70
  const _prompt = process.argv.slice(3).join(' ').trim();
67
71
  if (!_prompt) {
68
- console.error('Kullanım: wormclaude -p "<görev>"');
72
+ console.error(_tt('Usage: wormclaude -p "<task>"', 'Kullanım: wormclaude -p "<görev>"'));
69
73
  process.exit(1);
70
74
  }
71
75
  const { runHeadless } = await import('./headless.js');
@@ -74,15 +78,21 @@ if (_arg === '-p' || _arg === '--print') {
74
78
  }
75
79
  if (_arg === 'login' || _arg === 'logout' || _arg === 'whoami' || _arg === '--version' || _arg === '-v' || _arg === 'update') {
76
80
  const auth = await import('./auth.js');
77
- if (_arg === 'login')
78
- await auth.deviceLogin();
81
+ if (_arg === 'login') {
82
+ // wormclaude login --key <ANAHTAR> → anahtarı doğrudan yapıştır (web Ayarlar'dan kopyalanan).
83
+ const _ki = process.argv.indexOf('--key');
84
+ if (_ki > 0 && process.argv[_ki + 1])
85
+ await auth.loginWithKey(process.argv[_ki + 1]);
86
+ else
87
+ await auth.deviceLogin();
88
+ }
79
89
  else if (_arg === 'logout') {
80
90
  auth.clearStored();
81
- console.log('Cikis yapildi.');
91
+ console.log(_tt('Logged out.', 'Çıkış yapıldı.'));
82
92
  }
83
93
  else if (_arg === 'whoami') {
84
94
  const c = auth.loadStored();
85
- console.log(c.apiKey ? ('Giris yapildi (' + (c.baseUrl || '') + ')') : 'Giris yapilmadi - wormclaude login');
95
+ console.log(c.apiKey ? (_tt('Logged in (', 'Giriş yapıldı (') + (c.baseUrl || '') + ')') : _tt('Not logged in - wormclaude login', 'Giriş yapılmadı - wormclaude login'));
86
96
  }
87
97
  else if (_arg === 'update') {
88
98
  await auth.runUpdate();
@@ -162,7 +172,7 @@ if (_needLogin) {
162
172
  setToolConfig(config); // Agent/alt-agent araçları aynı config'i kullanır
163
173
  setCheckpointStore(process.cwd()); // rewind deposu (/rewind, /checkpoints)
164
174
  const MAX_TURNS = Number(process.env.WORMCLAUDE_MAX_TURNS) || 90; // tur limiti
165
- setLang(loadLang() ?? 'tr'); // kayıtlı dili yükle (yoksa tr)
175
+ setLang(loadLang() ?? 'en'); // kayıtlı dili yükle (yoksa İngilizce)
166
176
  loadSkills(); // .wormclaude/skills/*.md yükle
167
177
  loadExtensions(); // extensions/<ad>/ (gömülü + kullanıcı + proje) yükle
168
178
  // Kalıcı hafıza: açılışta .wormclaude/memory.md + WORMCLAUDE.md'yi context'e yükle
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.150';
19
+ export const VERSION = '1.0.152';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wormclaude",
3
- "version": "1.0.150",
3
+ "version": "1.0.152",
4
4
  "description": "WormClaude CLI - uncensored security+code assistant (ink TUI, Claude-style)",
5
5
  "type": "module",
6
6
  "bin": {