natureco-cli 5.54.0 → 5.56.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "natureco-cli",
3
- "version": "5.54.0",
3
+ "version": "5.56.0",
4
4
  "description": "OpenClaw'dan daha güvenli, daha hızlı, daha ucuz AI agent CLI. Multi-agent, self-evolving skills, audit log, maliyet optimizasyonu ve NatureCo platform-native.",
5
5
  "bin": {
6
6
  "natureco": "bin/natureco.js"
@@ -1,4 +1,6 @@
1
- const chalk = require('chalk');
1
+ const chalk = require('chalk');
2
+ const { getLang: _gl } = require('../utils/i18n');
3
+ const L = (tr, en) => (_gl() === 'en' ? en : tr);
2
4
  const fs = require('fs');
3
5
  const path = require('path');
4
6
  const os = require('os');
@@ -29,7 +31,7 @@ async function agent(args) {
29
31
  if (opts.action === 'unbind') return unbindAgent(opts);
30
32
  if (opts.action === 'set-identity') return setIdentity(opts);
31
33
 
32
- console.log(chalk.red(`\n ❌ Bilinmeyen komut: ${opts.action}\n`));
34
+ console.log(chalk.red(`\n ❌ ${L('Bilinmeyen komut', 'Unknown command')}: ${opts.action}\n`));
33
35
  process.exit(1);
34
36
  }
35
37
 
@@ -46,7 +48,7 @@ async function runAgent(opts) {
46
48
  const apiKey = pc?.apiKey || config[`${provider}ApiKey`] || process.env[`${provider.toUpperCase()}_API_KEY`];
47
49
 
48
50
  if (!apiKey) {
49
- console.log(chalk.red(`\n ❌ ${provider} API key gerekli\n`));
51
+ console.log(chalk.red(`\n ❌ ${provider} API key ${L('gerekli', 'required')}\n`));
50
52
  process.exit(1);
51
53
  }
52
54
 
@@ -104,18 +106,18 @@ function abortAgent(taskId) {
104
106
  const { cancelTask, listTasks } = require('../utils/background');
105
107
  if (taskId) {
106
108
  const t = cancelTask(taskId);
107
- if (!t) { console.log(chalk.red(`\n ❌ Task bulunamadı: ${taskId}\n`)); process.exit(1); }
108
- console.log(chalk.yellow(`\n 🛑 Task iptal edildi: ${taskId}\n`));
109
+ if (!t) { console.log(chalk.red(`\n ❌ ${L('Task bulunamadı', 'Task not found')}: ${taskId}\n`)); process.exit(1); }
110
+ console.log(chalk.yellow(`\n 🛑 ${L('Task iptal edildi', 'Task cancelled')}: ${taskId}\n`));
109
111
  return;
110
112
  }
111
113
  const running = listTasks({ status: 'running' });
112
114
  if (running.length === 0) {
113
- console.log(chalk.gray('\n Çalışan task yok\n'));
115
+ console.log(chalk.gray(L('\n Çalışan task yok\n', '\n No running tasks\n')));
114
116
  return;
115
117
  }
116
118
  for (const t of running) {
117
119
  cancelTask(t.id);
118
- console.log(chalk.yellow(` 🛑 Task iptal edildi: ${t.id} — ${t.message}`));
120
+ console.log(chalk.yellow(` 🛑 ${L('Task iptal edildi', 'Task cancelled')}: ${t.id} — ${t.message}`));
119
121
  }
120
122
  console.log();
121
123
  }
@@ -123,11 +125,11 @@ function abortAgent(taskId) {
123
125
  function tailAgent(taskId) {
124
126
  const { getTask } = require('../utils/background');
125
127
  if (!taskId) {
126
- console.log(chalk.red('\n ❌ Task ID gerekli. Kullanım: natureco agent tail <id>\n'));
128
+ console.log(chalk.red(L('\n ❌ Task ID gerekli. Kullanım: natureco agent tail <id>\n', '\n ❌ Task ID required. Usage: natureco agent tail <id>\n')));
127
129
  process.exit(1);
128
130
  }
129
131
  const task = getTask(taskId);
130
- if (!task) { console.log(chalk.red(`\n ❌ Task bulunamadı: ${taskId}\n`)); process.exit(1); }
132
+ if (!task) { console.log(chalk.red(`\n ❌ ${L('Task bulunamadı', 'Task not found')}: ${taskId}\n`)); process.exit(1); }
131
133
  console.log(chalk.cyan(`\n 📋 Task: ${task.id}\n`));
132
134
  console.log(chalk.gray(' ' + '─'.repeat(48)));
133
135
  console.log(` ${chalk.white('Message:')} ${task.message}`);
@@ -145,11 +147,11 @@ function logsAgent(statusFilter) {
145
147
  console.log(chalk.cyan(`\n 📜 Agent Logs${statusFilter ? ` (${statusFilter})` : ''}\n`));
146
148
  console.log(chalk.gray(' ' + '─'.repeat(48)));
147
149
  if (tasks.length === 0) {
148
- console.log(chalk.gray(' Task bulunamadı.\n'));
150
+ console.log(chalk.gray(L(' Task bulunamadı.\n', ' Task not found.\n')));
149
151
  return;
150
152
  }
151
153
  for (const t of tasks.slice(0, 20)) {
152
- console.log(` ${statusColor(t.status)} ${chalk.white(t.message || '(boş)')}`);
154
+ console.log(` ${statusColor(t.status)} ${chalk.white(t.message || L('(boş)', '(empty)'))}`);
153
155
  console.log(chalk.gray(` [${t.id}] ${t.createdAt?.slice(0, 16) || ''} — ${t.runtime}`));
154
156
  }
155
157
  console.log();
@@ -271,7 +273,7 @@ function showHelp() {
271
273
  console.log(chalk.cyan(' --model <model>') + chalk.gray(' Model override'));
272
274
  console.log(chalk.cyan(' --provider <name>') + chalk.gray(' Provider override'));
273
275
  console.log(chalk.gray('\n Examples:'));
274
- console.log(chalk.gray(' natureco agent run --message "Merhaba"'));
276
+ console.log(chalk.gray(L(' natureco agent run --message "Merhaba"', ' natureco agent run --message "Hello"')));
275
277
  console.log(chalk.gray(' natureco agent abort'));
276
278
  console.log(chalk.gray(' natureco agent tail <id>'));
277
279
  console.log(chalk.gray(' natureco agent logs running\n'));
@@ -1,4 +1,6 @@
1
1
  const chalk = require('chalk');
2
+ const { getLang: _gl } = require('../utils/i18n');
3
+ const L = (tr, en) => (_gl() === 'en' ? en : tr);
2
4
  const tui = require('../utils/tui');
3
5
  const F = require('../utils/format');
4
6
  const fs = require('fs');
@@ -47,8 +49,8 @@ async function agents(args) {
47
49
  if (action === 'unbind') return unbindAgent(params[0], params[1]);
48
50
  if (action === 'set-identity') return setIdentity(params[0], params.slice(1).join(' '));
49
51
 
50
- console.log(chalk.red(`\n ❌ Bilinmeyen komut: ${action}\n`));
51
- console.log(chalk.gray(' Kullanım: natureco agents [list|set|info|add|bindings|bind|unbind|set-identity]\n'));
52
+ console.log(chalk.red(`\n ❌ ${L('Bilinmeyen komut', 'Unknown command')}: ${action}\n`));
53
+ console.log(chalk.gray(L(' Kullanım: natureco agents [list|set|info|add|bindings|bind|unbind|set-identity]\n', ' Usage: natureco agents [list|set|info|add|bindings|bind|unbind|set-identity]\n')));
52
54
  process.exit(1);
53
55
  }
54
56
 
@@ -56,7 +58,7 @@ async function listAgents() {
56
58
  const config = getConfig();
57
59
  const apiKey = config.providerApiKey || config.apiKey || '';
58
60
 
59
- F.info('Agentlar yükleniyor...');
61
+ F.info(L('Agentlar yükleniyor...', 'Loading agents...'));
60
62
 
61
63
  let botList = { bots: [] };
62
64
  try {
@@ -67,8 +69,8 @@ async function listAgents() {
67
69
  console.log(tui.styled(' ' + '─'.repeat(56), { color: tui.PALETTE.border }));
68
70
 
69
71
  if (!botList.bots?.length) {
70
- console.log('\n ' + tui.C.muted('Agent bulunamadı.'));
71
- console.log(' ' + tui.C.muted('Oluşturmak için: ') + tui.C.brand('developers.natureco.me'));
72
+ console.log('\n ' + tui.C.muted(L('Agent bulunamadı.', 'No agents found.')));
73
+ console.log(' ' + tui.C.muted(L('Oluşturmak için: ', 'To create: ')) + tui.C.brand('developers.natureco.me'));
72
74
  console.log('');
73
75
  return;
74
76
  }
@@ -83,7 +85,7 @@ async function listAgents() {
83
85
 
84
86
  console.log('\n' + tui.table(rows, [
85
87
  {
86
- key: 'name', label: 'İsim', minWidth: 18,
88
+ key: 'name', label: L('İsim', 'Name'), minWidth: 18,
87
89
  render: r => r.active
88
90
  ? tui.styled(r.name, { color: tui.PALETTE.success, bold: true })
89
91
  : tui.C.text(r.name)
@@ -93,7 +95,7 @@ async function listAgents() {
93
95
  { key: 'model', label: 'Model', minWidth: 18, render: r => tui.C.muted(r.model) },
94
96
  ], { borderStyle: 'round', zebra: true }));
95
97
 
96
- console.log('\n ' + tui.C.muted('Değiştirmek için: ') + tui.C.brand('natureco agents set <bot-adı>'));
98
+ console.log('\n ' + tui.C.muted(L('Değiştirmek için: ', 'To switch: ')) + tui.C.brand(L('natureco agents set <bot-adı>', 'natureco agents set <bot-name>')));
97
99
  console.log('');
98
100
  }
99
101
 
@@ -108,13 +110,13 @@ async function setActiveAgent(botName) {
108
110
 
109
111
  if (!botName) {
110
112
  if (!botList.bots?.length) {
111
- console.log(chalk.gray('\n Agent bulunamadı.\n'));
113
+ console.log(chalk.gray(L('\n Agent bulunamadı.\n', '\n No agents found.\n')));
112
114
  return;
113
115
  }
114
116
  const { selected } = await inquirer.prompt([{
115
117
  type: 'list',
116
118
  name: 'selected',
117
- message: ' Aktif agent seç:',
119
+ message: L(' Aktif agent seç:', ' Select active agent:'),
118
120
  choices: botList.bots.map(b => ({ name: b.name, value: b.name })),
119
121
  }]);
120
122
  botName = selected;
@@ -122,7 +124,7 @@ async function setActiveAgent(botName) {
122
124
 
123
125
  const bot = botList.bots?.find(b => b.name === botName || b.id === botName);
124
126
  if (!bot && botList.bots?.length) {
125
- console.log(chalk.red(`\n ❌ Agent bulunamadı: ${botName}\n`));
127
+ console.log(chalk.red(`\n ❌ ${L('Agent bulunamadı', 'No agent found')}: ${botName}\n`));
126
128
  process.exit(1);
127
129
  }
128
130
 
@@ -130,7 +132,7 @@ async function setActiveAgent(botName) {
130
132
  if (bot?.id) config.defaultBotId = bot.id;
131
133
  saveConfig(config);
132
134
 
133
- console.log(chalk.green(`\n ✓ Aktif agent: ${botName}\n`));
135
+ console.log(chalk.green(`\n ✓ ${L('Aktif agent', 'Active agent')}: ${botName}\n`));
134
136
  }
135
137
 
136
138
  async function agentInfo(botName) {
@@ -139,7 +141,7 @@ async function agentInfo(botName) {
139
141
  const name = botName || config.botName;
140
142
 
141
143
  if (!name) {
142
- F.error('Agent adı belirtin: natureco agents info <bot-adı>');
144
+ F.error(L('Agent adı belirtin: natureco agents info <bot-adı>', 'Specify agent name: natureco agents info <bot-name>'));
143
145
  return;
144
146
  }
145
147
 
@@ -160,24 +162,24 @@ async function agentInfo(botName) {
160
162
  F.kv('Prompt', bot.system_prompt.slice(0, 80) + (bot.system_prompt.length > 80 ? '...' : ''));
161
163
  }
162
164
  } else {
163
- F.meta('(Detay alınamadı)');
165
+ F.meta(L('(Detay alınamadı)', '(Details unavailable)'));
164
166
  }
165
167
 
166
168
  try {
167
169
  const { loadMemory } = require('../utils/memory');
168
170
  const mem = loadMemory(bot?.id || 'universal-provider');
169
171
  if (mem.name || mem.facts?.length) {
170
- if (mem.name) F.kv('Kullanıcı', mem.name);
171
- F.kv('Hafıza', (mem.facts || []).length + ' bilgi');
172
+ if (mem.name) F.kv(L('Kullanıcı', 'User'), mem.name);
173
+ F.kv(L('Hafıza', 'Memory'), (mem.facts || []).length + L(' bilgi', ' facts'));
172
174
  }
173
175
  } catch {}
174
176
  }
175
177
 
176
178
  async function addAgent() {
177
179
  console.log('');
178
- console.log(chalk.gray(' Yeni agent oluşturmak için Developers Portal\'ı kullanın:'));
180
+ console.log(chalk.gray(L(' Yeni agent oluşturmak için Developers Portal\'ı kullanın:', ' Use the Developers Portal to create a new agent:')));
179
181
  console.log(chalk.cyan(' developers.natureco.me\n'));
180
- console.log(chalk.gray(' Oluşturduktan sonra: ') + chalk.cyan('natureco agents list\n'));
182
+ console.log(chalk.gray(L(' Oluşturduktan sonra: ', ' After creating: ')) + chalk.cyan('natureco agents list\n'));
181
183
  }
182
184
 
183
185
  // ── Bindings ──────────────────────────────────────────────────────────────────
@@ -189,7 +191,7 @@ function listBindings() {
189
191
  F.section('Bindings (' + keys.length + ')');
190
192
 
191
193
  if (keys.length === 0) {
192
- F.meta('Henüz binding yok.');
194
+ F.meta(L('Henüz binding yok.', 'No bindings yet.'));
193
195
  return;
194
196
  }
195
197
 
@@ -202,35 +204,35 @@ function listBindings() {
202
204
 
203
205
  function bindAgent(agentId, channel) {
204
206
  if (!agentId || !channel) {
205
- F.error('Kullanım: natureco agents bind <agentId> <channel>');
207
+ F.error(L('Kullanım: natureco agents bind <agentId> <channel>', 'Usage: natureco agents bind <agentId> <channel>'));
206
208
  return;
207
209
  }
208
210
  const bindings = loadBindings();
209
211
  if (!bindings[agentId]) bindings[agentId] = [];
210
212
  if (!bindings[agentId].includes(channel)) bindings[agentId].push(channel);
211
213
  saveBindings(bindings);
212
- F.success('Agent ' + agentId + ' → ' + channel + ' bağlandı');
214
+ F.success('Agent ' + agentId + ' → ' + channel + L(' bağlandı', ' bound'));
213
215
  }
214
216
 
215
217
  function unbindAgent(agentId, channel) {
216
218
  if (!agentId || !channel) {
217
- F.error('Kullanım: natureco agents unbind <agentId> <channel>');
219
+ F.error(L('Kullanım: natureco agents unbind <agentId> <channel>', 'Usage: natureco agents unbind <agentId> <channel>'));
218
220
  return;
219
221
  }
220
222
  const bindings = loadBindings();
221
223
  if (!bindings[agentId]) {
222
- F.warning('Agent ' + agentId + ' için binding bulunamadı');
224
+ F.warning('Agent ' + agentId + L(' için binding bulunamadı', ' has no bindings'));
223
225
  return;
224
226
  }
225
227
  bindings[agentId] = bindings[agentId].filter(ch => ch !== channel);
226
228
  if (bindings[agentId].length === 0) delete bindings[agentId];
227
229
  saveBindings(bindings);
228
- F.success('Agent ' + agentId + ' → ' + channel + ' bağlantısı kaldırıldı');
230
+ F.success('Agent ' + agentId + ' → ' + channel + L(' bağlantısı kaldırıldı', ' unbound'));
229
231
  }
230
232
 
231
233
  function setIdentity(agentId, identity) {
232
234
  if (!agentId) {
233
- F.error('Kullanım: natureco agents set-identity <agentId> <identity>');
235
+ F.error(L('Kullanım: natureco agents set-identity <agentId> <identity>', 'Usage: natureco agents set-identity <agentId> <identity>'));
234
236
  return;
235
237
  }
236
238
  const identities = loadIdentities();
@@ -1,4 +1,6 @@
1
1
  const chalk = require('chalk');
2
+ const { getLang: _gl } = require('../utils/i18n');
3
+ const L = (tr, en) => (_gl() === 'en' ? en : tr);
2
4
  const tui = require('../utils/tui');
3
5
  const { getApiKey, getConfig } = require('../utils/config');
4
6
  const { getBots } = require('../utils/api');
@@ -7,7 +9,7 @@ async function bots() {
7
9
  const config = getConfig();
8
10
  const apiKey = getApiKey() || config.providerApiKey || '';
9
11
 
10
- console.log('\n' + tui.styled(' ⏳ Botlar yükleniyor...', { color: tui.PALETTE.muted }));
12
+ console.log('\n' + tui.styled(L(' ⏳ Botlar yükleniyor...', ' ⏳ Loading bots...'), { color: tui.PALETTE.muted }));
11
13
 
12
14
  try {
13
15
  // v4.6+: Eğer local provider varsa (api.minimax.io, api.groq.com),
@@ -37,27 +39,27 @@ async function bots() {
37
39
  }
38
40
 
39
41
  if (!botList || !botList.bots || botList.bots.length === 0) {
40
- console.log('\n' + tui.C.muted(' Bot bulunamadı.'));
41
- console.log(' ' + tui.C.muted('Oluşturmak için: ') + tui.C.brand('natureco setup') + ' ' + tui.C.muted('veya config\'e bot ekleyin.'));
42
+ console.log('\n' + tui.C.muted(L(' Bot bulunamadı.', ' No bots found.')));
43
+ console.log(' ' + tui.C.muted(L('Oluşturmak için: ', 'To create: ')) + tui.C.brand('natureco setup') + ' ' + tui.C.muted(L('veya config\'e bot ekleyin.', 'or add a bot to config.')));
42
44
  console.log('');
43
45
  return;
44
46
  }
45
47
 
46
48
  const rows = botList.bots.map((bot, i) => ({
47
49
  idx: String(i + 1),
48
- name: bot.name || '(isimsiz)',
50
+ name: bot.name || L('(isimsiz)', '(unnamed)'),
49
51
  id: bot.id,
50
52
  provider: bot.ai_provider || bot.provider || '—',
51
53
  model: bot.model || '—',
52
54
  active: config.botName === bot.name,
53
55
  }));
54
56
 
55
- console.log('\n' + tui.styled(' 🤖 Bot Listesi (' + rows.length + ')', { color: tui.PALETTE.primary, bold: true }));
57
+ console.log('\n' + tui.styled(L(' 🤖 Bot Listesi (', ' 🤖 Bot List (') + rows.length + ')', { color: tui.PALETTE.primary, bold: true }));
56
58
  console.log(tui.styled(' ' + '─'.repeat(56), { color: tui.PALETTE.border }));
57
59
  console.log('\n' + tui.table(rows, [
58
60
  { key: 'idx', label: '#', minWidth: 4 },
59
61
  {
60
- key: 'name', label: 'İsim', minWidth: 18,
62
+ key: 'name', label: L('İsim', 'Name'), minWidth: 18,
61
63
  render: r => r.active
62
64
  ? tui.styled(r.name + ' ●', { color: tui.PALETTE.success, bold: true })
63
65
  : tui.C.text(r.name)
@@ -67,10 +69,10 @@ async function bots() {
67
69
  { key: 'model', label: 'Model', minWidth: 20, render: r => tui.C.muted(r.model) },
68
70
  ], { borderStyle: 'round', zebra: true }));
69
71
 
70
- console.log('\n ' + tui.C.muted('Chat başlatmak için: ') + tui.C.brand('natureco chat') + ' ' + tui.C.muted('veya ') + tui.C.brand('natureco repl'));
72
+ console.log('\n ' + tui.C.muted(L('Chat başlatmak için: ', 'To start chat: ')) + tui.C.brand('natureco chat') + ' ' + tui.C.muted(L('veya ', 'or ')) + tui.C.brand('natureco repl'));
71
73
  console.log('');
72
74
  } catch (err) {
73
- console.log('\n' + tui.C.red(' ❌ Hata: ' + err.message) + '\n');
75
+ console.log('\n' + tui.C.red(L(' ❌ Hata: ', ' ❌ Error: ') + err.message) + '\n');
74
76
  process.exit(1);
75
77
  }
76
78
  }
@@ -1,4 +1,6 @@
1
1
  const chalk = require('chalk');
2
+ const { getLang: _gl } = require('../utils/i18n');
3
+ const L = (tr, en) => (_gl() === 'en' ? en : tr);
2
4
  const F = require('../utils/format');
3
5
  const path = require('path');
4
6
  const fs = require('fs');
@@ -13,7 +15,7 @@ function config(args) {
13
15
  const [action, key, ...valueParts] = args;
14
16
 
15
17
  if (!action) {
16
- F.error('Kullanım: natureco config <get|set|unset|list|file|schema|validate|backups|restore> [key] [value]');
18
+ F.error(L('Kullanım: natureco config <get|set|unset|list|file|schema|validate|backups|restore> [key] [value]', 'Usage: natureco config <get|set|unset|list|file|schema|validate|backups|restore> [key] [value]'));
17
19
  process.exit(1);
18
20
  }
19
21
 
@@ -34,12 +36,12 @@ function config(args) {
34
36
  sensitive: SENSITIVE_KEYS.some(sk => k.toLowerCase().includes(sk.toLowerCase())),
35
37
  }));
36
38
 
37
- console.log('\n' + tui.styled(' ⚙️ Configuration (' + rows.length + ' ayar)', { color: tui.PALETTE.primary, bold: true }));
39
+ console.log('\n' + tui.styled(' ⚙️ Configuration (' + rows.length + L(' ayar)', ' settings)'), { color: tui.PALETTE.primary, bold: true }));
38
40
  console.log(tui.styled(' ' + '─'.repeat(56), { color: tui.PALETTE.border }));
39
41
  console.log('\n' + tui.table(rows, [
40
- { key: 'key', label: 'Anahtar', minWidth: 24, render: r => tui.styled(r.key, { color: tui.PALETTE.primary, bold: true }) },
42
+ { key: 'key', label: L('Anahtar', 'Key'), minWidth: 24, render: r => tui.styled(r.key, { color: tui.PALETTE.primary, bold: true }) },
41
43
  {
42
- key: 'value', label: 'Değer', minWidth: 40,
44
+ key: 'value', label: L('Değer', 'Value'), minWidth: 40,
43
45
  render: r => r.sensitive
44
46
  ? tui.styled(r.value, { color: tui.PALETTE.warning })
45
47
  : tui.C.text(r.value)
@@ -51,7 +53,7 @@ function config(args) {
51
53
 
52
54
  if (action === 'get') {
53
55
  if (!key) {
54
- console.log('\n' + tui.C.red(' ❌ Key belirtilmedi.') + '\n');
56
+ console.log('\n' + tui.C.red(L(' ❌ Key belirtilmedi.', ' ❌ Key not specified.')) + '\n');
55
57
  process.exit(1);
56
58
  }
57
59
  const cfg = getConfig();
@@ -61,7 +63,7 @@ function config(args) {
61
63
  value = value?.[k];
62
64
  }
63
65
  if (value === undefined) {
64
- console.log('\n' + tui.styled(' ℹ ' + key + ': (tanımlı değil)', { color: tui.PALETTE.muted }) + '\n');
66
+ console.log('\n' + tui.styled(' ℹ ' + key + L(': (tanımlı değil)', ': (not set)'), { color: tui.PALETTE.muted }) + '\n');
65
67
  } else {
66
68
  const cardW = 60;
67
69
  console.log('\n' + tui.styled(' 🔍 ' + key, { color: tui.PALETTE.primary, bold: true }));
@@ -79,11 +81,11 @@ function config(args) {
79
81
 
80
82
  if (action === 'set') {
81
83
  if (!key) {
82
- F.error('Key belirtilmedi.');
84
+ F.error(L('Key belirtilmedi.', 'Key not specified.'));
83
85
  process.exit(1);
84
86
  }
85
87
  if (valueParts.length === 0) {
86
- F.error('Value belirtilmedi.');
88
+ F.error(L('Value belirtilmedi.', 'Value not specified.'));
87
89
  process.exit(1);
88
90
  }
89
91
  const value = valueParts.join(' ');
@@ -100,7 +102,7 @@ function config(args) {
100
102
 
101
103
  if (action === 'unset') {
102
104
  if (!key) {
103
- F.error('Key belirtilmedi.');
105
+ F.error(L('Key belirtilmedi.', 'Key not specified.'));
104
106
  process.exit(1);
105
107
  }
106
108
  const cfg = getConfig();
@@ -197,18 +199,18 @@ function config(args) {
197
199
 
198
200
  if (action === 'backups' || action === 'backup') {
199
201
  const backups = listBackups();
200
- F.section('Config Yedekleri');
202
+ F.section(L('Config Yedekleri', 'Config Backups'));
201
203
  if (backups.length === 0) {
202
- F.info('Hen\u00fcz yedek al\u0131nmam\u0131\u015f.');
204
+ F.info(L('Hen\u00fcz yedek al\u0131nmam\u0131\u015f.', 'No backups yet.'));
203
205
  return;
204
206
  }
205
207
  const rows = backups.map((f, i) => {
206
208
  const ts = f.replace(/^config-|\.json$/g, '').replace(/T/, ' ').replace(/-/g, ':').replace(/:[^:]*$/, '');
207
209
  return [String(i + 1), ts, path.join(CONFIG_BACKUP_DIR, f)];
208
210
  });
209
- F.table(['#', 'Tarih', 'Dosya'], rows);
210
- F.meta('Geri y\u00fcklemek i\u00e7in: natureco config restore <dosya-ad\u0131>');
211
- F.meta(`\u00d6rnek: natureco config restore ${backups[0] || 'config-....json'}`);
211
+ F.table(['#', L('Tarih', 'Date'), L('Dosya', 'File')], rows);
212
+ F.meta(L('Geri y\u00fcklemek i\u00e7in: natureco config restore <dosya-ad\u0131>', 'To restore: natureco config restore <file-name>'));
213
+ F.meta(`${L('Örnek', 'Example')}: natureco config restore ${backups[0] || 'config-....json'}`);
212
214
  return;
213
215
  }
214
216
 
@@ -217,22 +219,22 @@ function config(args) {
217
219
  if (!backupId) {
218
220
  const backups = listBackups();
219
221
  if (backups.length === 0) {
220
- F.error('Geri y\u00fcklenecek yedek bulunamad\u0131.');
222
+ F.error(L('Geri y\u00fcklenecek yedek bulunamad\u0131.', 'No backup found to restore.'));
221
223
  process.exit(1);
222
224
  }
223
- F.section('Geri Y\u00fckleme');
224
- F.kv('En son yedek', backups[0]);
225
- F.meta(`Kullan\u0131m: natureco config restore ${backups[0]}`);
226
- F.meta('Yedekleri listelemek i\u00e7in: natureco config backups');
225
+ F.section(L('Geri Y\u00fckleme', 'Restore'));
226
+ F.kv(L('En son yedek', 'Latest backup'), backups[0]);
227
+ F.meta(`${L('Kullanım', 'Usage')}: natureco config restore ${backups[0]}`);
228
+ F.meta(L('Yedekleri listelemek i\u00e7in: natureco config backups', 'To list backups: natureco config backups'));
227
229
  return;
228
230
  }
229
231
 
230
232
  try {
231
233
  const result = restoreConfig(backupId);
232
- F.success(`Config geri y\u00fcklendi: ${result.timestamp}`);
233
- F.meta(`Kaynak: ${result.path}`);
234
+ F.success(`${L('Config geri yüklendi', 'Config restored')}: ${result.timestamp}`);
235
+ F.meta(`${L('Kaynak', 'Source')}: ${result.path}`);
234
236
  } catch (err) {
235
- F.error(`Geri y\u00fckleme ba\u015far\u0131s\u0131z: ${err.message}`);
237
+ F.error(`${L('Geri yükleme başarısız', 'Restore failed')}: ${err.message}`);
236
238
  process.exit(1);
237
239
  }
238
240
  return;
@@ -242,8 +244,8 @@ function config(args) {
242
244
  return configBudget(key, valueParts);
243
245
  }
244
246
 
245
- F.error(`Ge\u00e7ersiz action: ${action}`);
246
- F.meta('Kullan\u0131m: natureco config <get|set|unset|list|file|schema|validate|backups|restore|budget> [key] [value]');
247
+ F.error(`${L('Geçersiz action', 'Invalid action')}: ${action}`);
248
+ F.meta(L('Kullan\u0131m: natureco config <get|set|unset|list|file|schema|validate|backups|restore|budget> [key] [value]', 'Usage: natureco config <get|set|unset|list|file|schema|validate|backups|restore|budget> [key] [value]'));
247
249
  process.exit(1);
248
250
  }
249
251
 
@@ -294,12 +296,12 @@ function configBudget(sub, args) {
294
296
  const key = args[0];
295
297
  const val = args[1];
296
298
  if (!key || val === undefined) {
297
- F.error('Kullan\u0131m: natureco config budget set <key> <value>');
299
+ F.error(L('Kullan\u0131m: natureco config budget set <key> <value>', 'Usage: natureco config budget set <key> <value>'));
298
300
  return;
299
301
  }
300
302
  const budget = TB.load();
301
303
  if (!(key in budget)) {
302
- F.error('Bilinmeyen budget key: ' + key);
304
+ F.error(L('Bilinmeyen budget key: ', 'Unknown budget key: ') + key);
303
305
  return;
304
306
  }
305
307
  const num = Number(val);
@@ -312,7 +314,7 @@ function configBudget(sub, args) {
312
314
  if (sub === 'usage') {
313
315
  const usage = TB.getAllUsage();
314
316
  if (!usage || Object.keys(usage).length === 0) {
315
- F.info('Hen\u00fcz token kullan\u0131m\u0131 kaydedilmedi.');
317
+ F.info(L('Hen\u00fcz token kullan\u0131m\u0131 kaydedilmedi.', 'No token usage recorded yet.'));
316
318
  return;
317
319
  }
318
320
  F.header('Token Usage');
@@ -327,8 +329,8 @@ function configBudget(sub, args) {
327
329
  return;
328
330
  }
329
331
 
330
- F.error('Budget alt komutu: ' + sub);
331
- F.meta('Kullan\u0131m: natureco config budget <show|preset|set|usage>');
332
+ F.error(L('Budget alt komutu: ', 'Budget sub-command: ') + sub);
333
+ F.meta(L('Kullan\u0131m: natureco config budget <show|preset|set|usage>', 'Usage: natureco config budget <show|preset|set|usage>'));
332
334
  }
333
335
 
334
336
  module.exports = config;