claude-settings-cli 1.0.1 → 1.1.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.
Files changed (76) hide show
  1. package/dist/commands/backup.d.ts.map +1 -1
  2. package/dist/commands/backup.js +8 -7
  3. package/dist/commands/backup.js.map +1 -1
  4. package/dist/commands/config.d.ts.map +1 -1
  5. package/dist/commands/config.js +10 -9
  6. package/dist/commands/config.js.map +1 -1
  7. package/dist/commands/create.d.ts +4 -0
  8. package/dist/commands/create.d.ts.map +1 -0
  9. package/dist/commands/create.js +229 -0
  10. package/dist/commands/create.js.map +1 -0
  11. package/dist/commands/edit.d.ts +4 -0
  12. package/dist/commands/edit.d.ts.map +1 -0
  13. package/dist/commands/edit.js +248 -0
  14. package/dist/commands/edit.js.map +1 -0
  15. package/dist/commands/interactive.d.ts.map +1 -1
  16. package/dist/commands/interactive.js +60 -59
  17. package/dist/commands/interactive.js.map +1 -1
  18. package/dist/commands/io.d.ts.map +1 -1
  19. package/dist/commands/io.js +11 -10
  20. package/dist/commands/io.js.map +1 -1
  21. package/dist/commands/plugin.d.ts.map +1 -1
  22. package/dist/commands/plugin.js +13 -12
  23. package/dist/commands/plugin.js.map +1 -1
  24. package/dist/commands/preset.d.ts.map +1 -1
  25. package/dist/commands/preset.js +21 -20
  26. package/dist/commands/preset.js.map +1 -1
  27. package/dist/commands/project.d.ts.map +1 -1
  28. package/dist/commands/project.js +7 -6
  29. package/dist/commands/project.js.map +1 -1
  30. package/dist/commands/repl.d.ts +2 -0
  31. package/dist/commands/repl.d.ts.map +1 -0
  32. package/dist/commands/repl.js +296 -0
  33. package/dist/commands/repl.js.map +1 -0
  34. package/dist/commands/template.d.ts +3 -0
  35. package/dist/commands/template.d.ts.map +1 -0
  36. package/dist/commands/template.js +228 -0
  37. package/dist/commands/template.js.map +1 -0
  38. package/dist/core/diff.d.ts.map +1 -1
  39. package/dist/core/diff.js +3 -2
  40. package/dist/core/diff.js.map +1 -1
  41. package/dist/core/paths.d.ts +5 -0
  42. package/dist/core/paths.d.ts.map +1 -1
  43. package/dist/core/paths.js +25 -6
  44. package/dist/core/paths.js.map +1 -1
  45. package/dist/core/switcher.d.ts.map +1 -1
  46. package/dist/core/switcher.js +2 -1
  47. package/dist/core/switcher.js.map +1 -1
  48. package/dist/core/templates.d.ts +14 -0
  49. package/dist/core/templates.d.ts.map +1 -0
  50. package/dist/core/templates.js +180 -0
  51. package/dist/core/templates.js.map +1 -0
  52. package/dist/core/writer.d.ts.map +1 -1
  53. package/dist/core/writer.js +7 -3
  54. package/dist/core/writer.js.map +1 -1
  55. package/dist/i18n.d.ts +5 -0
  56. package/dist/i18n.d.ts.map +1 -0
  57. package/dist/i18n.js +1104 -0
  58. package/dist/i18n.js.map +1 -0
  59. package/dist/index.js +19 -12
  60. package/dist/index.js.map +1 -1
  61. package/dist/types/index.d.ts +14 -0
  62. package/dist/types/index.d.ts.map +1 -1
  63. package/dist/utils/backup.d.ts.map +1 -1
  64. package/dist/utils/backup.js +2 -1
  65. package/dist/utils/backup.js.map +1 -1
  66. package/dist/utils/errors.d.ts.map +1 -1
  67. package/dist/utils/errors.js +8 -7
  68. package/dist/utils/errors.js.map +1 -1
  69. package/dist/utils/prompt.d.ts +11 -0
  70. package/dist/utils/prompt.d.ts.map +1 -0
  71. package/dist/utils/prompt.js +50 -0
  72. package/dist/utils/prompt.js.map +1 -0
  73. package/dist/utils/safe-json.d.ts.map +1 -1
  74. package/dist/utils/safe-json.js +3 -2
  75. package/dist/utils/safe-json.js.map +1 -1
  76. package/package.json +3 -1
@@ -0,0 +1,248 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import inquirer from 'inquirer';
4
+ import { ConfigReader } from '../core/reader.js';
5
+ import { ConfigWriter } from '../core/writer.js';
6
+ import { maskValue } from '../schema/settings.js';
7
+ import { success } from '../utils/logger.js';
8
+ import { handleError } from '../utils/errors.js';
9
+ import { promptWithAbort, AbortError } from '../utils/prompt.js';
10
+ import { t } from '../i18n.js';
11
+ export async function runEdit(presetName) {
12
+ const presets = ConfigReader.listPresets();
13
+ if (presets.length === 0) {
14
+ console.log(chalk.dim(t('edit_no_presets')));
15
+ return;
16
+ }
17
+ // Step 1: Select preset
18
+ let name = presetName;
19
+ if (!name) {
20
+ const answer = await promptWithAbort([
21
+ {
22
+ type: 'list',
23
+ name: 'name',
24
+ message: t('edit_select'),
25
+ choices: presets,
26
+ },
27
+ ]);
28
+ name = answer.name;
29
+ }
30
+ else if (!presets.includes(name)) {
31
+ console.log(chalk.red(t('edit_preset_not_found', { name })));
32
+ return;
33
+ }
34
+ const settings = structuredClone(ConfigReader.readPreset(name));
35
+ // Step 2: Show current fields
36
+ printFields(name, settings);
37
+ // Step 3: Loop editing
38
+ while (true) {
39
+ const { action } = await promptWithAbort([
40
+ {
41
+ type: 'list',
42
+ name: 'action',
43
+ message: t('edit_what_to_do'),
44
+ choices: [
45
+ { name: t('edit_modify'), value: 'modify' },
46
+ { name: t('edit_add_env'), value: 'add-env' },
47
+ { name: t('edit_remove'), value: 'remove' },
48
+ { name: t('edit_view'), value: 'view' },
49
+ new inquirer.Separator(),
50
+ { name: t('edit_save'), value: 'save' },
51
+ { name: t('edit_discard'), value: 'discard' },
52
+ ],
53
+ },
54
+ ]);
55
+ if (action === 'save') {
56
+ await ConfigWriter.savePreset(name, settings);
57
+ success(t('edit_saved', { name }));
58
+ return;
59
+ }
60
+ if (action === 'discard') {
61
+ console.log(chalk.dim(t('edit_discarded')));
62
+ return;
63
+ }
64
+ if (action === 'view') {
65
+ console.log('');
66
+ printFields(name, settings);
67
+ continue;
68
+ }
69
+ if (action === 'modify') {
70
+ const allFields = flattenFields(settings);
71
+ if (allFields.length === 0) {
72
+ console.log(chalk.dim(t('edit_no_fields')));
73
+ continue;
74
+ }
75
+ const { field } = await promptWithAbort([
76
+ {
77
+ type: 'list',
78
+ name: 'field',
79
+ message: t('edit_select_modify'),
80
+ choices: allFields.map((f) => ({
81
+ name: `${f.key}: ${JSON.stringify(f.value)}`,
82
+ value: f.key,
83
+ })),
84
+ },
85
+ ]);
86
+ const currentVal = allFields.find((f) => f.key === field)?.value;
87
+ const { newVal } = await promptWithAbort([
88
+ {
89
+ type: 'input',
90
+ name: 'newVal',
91
+ message: t('edit_new_value', { field }),
92
+ default: String(currentVal),
93
+ },
94
+ ]);
95
+ const parsed = parseValue(newVal);
96
+ applyField(settings, field, parsed);
97
+ success(t('edit_updated', { field }));
98
+ }
99
+ else if (action === 'add-env') {
100
+ const answers = await promptWithAbort([
101
+ {
102
+ type: 'input',
103
+ name: 'key',
104
+ message: t('edit_env_key'),
105
+ validate: (v) => (v.trim() ? true : t('edit_env_key_required')),
106
+ },
107
+ {
108
+ type: 'input',
109
+ name: 'value',
110
+ message: t('edit_env_value'),
111
+ validate: (v) => (v.trim() ? true : t('edit_env_value_required')),
112
+ },
113
+ ]);
114
+ settings.env[answers.key.trim()] = answers.value.trim();
115
+ success(t('edit_env_added', { key: answers.key.trim() }));
116
+ }
117
+ else if (action === 'remove') {
118
+ const allFields = flattenFields(settings);
119
+ if (allFields.length === 0) {
120
+ console.log(chalk.dim(t('edit_no_fields')));
121
+ continue;
122
+ }
123
+ const { field } = await promptWithAbort([
124
+ {
125
+ type: 'list',
126
+ name: 'field',
127
+ message: t('edit_select_remove'),
128
+ choices: allFields.map((f) => f.key),
129
+ },
130
+ ]);
131
+ removeField(settings, field);
132
+ success(t('edit_removed', { field }));
133
+ }
134
+ }
135
+ }
136
+ export const editCommand = new Command('edit')
137
+ .description(t('edit_desc'))
138
+ .argument('[name]', 'Preset name to edit')
139
+ .action(async (name) => {
140
+ try {
141
+ await runEdit(name);
142
+ }
143
+ catch (err) {
144
+ if (err instanceof AbortError)
145
+ return;
146
+ handleError(err);
147
+ }
148
+ });
149
+ function printFields(name, settings) {
150
+ console.log('');
151
+ console.log(chalk.cyan.bold(t('edit_header', { name })));
152
+ for (const [key, value] of Object.entries(settings.env)) {
153
+ const display = maskValue(key, String(value));
154
+ console.log(` ${chalk.dim(`env.${key}`)}: ${display}`);
155
+ }
156
+ if (settings.language !== undefined) {
157
+ console.log(` ${chalk.dim('language')}: ${settings.language}`);
158
+ }
159
+ if (settings.alwaysThinkingEnabled !== undefined) {
160
+ console.log(` ${chalk.dim('alwaysThinkingEnabled')}: ${settings.alwaysThinkingEnabled}`);
161
+ }
162
+ if (settings.skipDangerousModePermissionPrompt !== undefined) {
163
+ console.log(` ${chalk.dim('skipDangerousModePermissionPrompt')}: ${settings.skipDangerousModePermissionPrompt}`);
164
+ }
165
+ if (settings.permissions?.defaultMode !== undefined) {
166
+ console.log(` ${chalk.dim('permissions.defaultMode')}: ${settings.permissions.defaultMode}`);
167
+ }
168
+ const pluginCount = settings.enabledPlugins
169
+ ? Object.values(settings.enabledPlugins).filter(Boolean).length
170
+ : 0;
171
+ if (pluginCount > 0) {
172
+ console.log(t('edit_plugins_count', { count: pluginCount }));
173
+ }
174
+ console.log('');
175
+ }
176
+ function flattenFields(settings) {
177
+ const fields = [];
178
+ for (const [k, v] of Object.entries(settings.env)) {
179
+ fields.push({ key: `env.${k}`, value: v });
180
+ }
181
+ if (settings.language !== undefined) {
182
+ fields.push({ key: 'language', value: settings.language });
183
+ }
184
+ if (settings.alwaysThinkingEnabled !== undefined) {
185
+ fields.push({ key: 'alwaysThinkingEnabled', value: settings.alwaysThinkingEnabled });
186
+ }
187
+ if (settings.skipDangerousModePermissionPrompt !== undefined) {
188
+ fields.push({ key: 'skipDangerousModePermissionPrompt', value: settings.skipDangerousModePermissionPrompt });
189
+ }
190
+ if (settings.permissions?.defaultMode !== undefined) {
191
+ fields.push({ key: 'permissions.defaultMode', value: settings.permissions.defaultMode });
192
+ }
193
+ return fields;
194
+ }
195
+ function applyField(settings, field, parsed) {
196
+ if (field.startsWith('env.')) {
197
+ settings.env[field.slice(4)] = String(parsed);
198
+ }
199
+ else if (field === 'language') {
200
+ settings.language = String(parsed);
201
+ }
202
+ else if (field === 'alwaysThinkingEnabled') {
203
+ settings.alwaysThinkingEnabled = parsed === true || parsed === 'true';
204
+ }
205
+ else if (field === 'skipDangerousModePermissionPrompt') {
206
+ settings.skipDangerousModePermissionPrompt = parsed === true || parsed === 'true';
207
+ }
208
+ else if (field === 'permissions.defaultMode') {
209
+ if (!settings.permissions)
210
+ settings.permissions = {};
211
+ settings.permissions.defaultMode = String(parsed);
212
+ }
213
+ }
214
+ function removeField(settings, field) {
215
+ if (field.startsWith('env.')) {
216
+ delete settings.env[field.slice(4)];
217
+ }
218
+ else if (field === 'language') {
219
+ delete settings.language;
220
+ }
221
+ else if (field === 'alwaysThinkingEnabled') {
222
+ delete settings.alwaysThinkingEnabled;
223
+ }
224
+ else if (field === 'skipDangerousModePermissionPrompt') {
225
+ delete settings.skipDangerousModePermissionPrompt;
226
+ }
227
+ else if (field === 'permissions.defaultMode') {
228
+ if (settings.permissions) {
229
+ delete settings.permissions.defaultMode;
230
+ if (Object.keys(settings.permissions).length === 0) {
231
+ delete settings.permissions;
232
+ }
233
+ }
234
+ }
235
+ }
236
+ function parseValue(val) {
237
+ if (val === 'true')
238
+ return true;
239
+ if (val === 'false')
240
+ return false;
241
+ if (val === 'null')
242
+ return null;
243
+ const num = Number(val);
244
+ if (!isNaN(num) && val.trim() !== '')
245
+ return num;
246
+ return val;
247
+ }
248
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"AAgBA,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoE3D"}
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"AAiBA,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoE3D"}
@@ -5,15 +5,16 @@ import { ConfigWriter } from '../core/writer.js';
5
5
  import { PresetSwitcher } from '../core/switcher.js';
6
6
  import { maskValue } from '../schema/settings.js';
7
7
  import { success, spinner } from '../utils/logger.js';
8
+ import { t } from '../i18n.js';
8
9
  export async function interactivePresetMenu() {
9
10
  while (true) {
10
11
  const presets = ConfigReader.listPresets();
11
12
  const active = ConfigReader.detectActivePreset();
12
13
  // Show preset list
13
14
  console.log('');
14
- console.log(chalk.cyan.bold(' ── Presets ──'));
15
+ console.log(chalk.cyan.bold(t('interactive_presets_header')));
15
16
  if (presets.length === 0) {
16
- console.log(chalk.dim(' (none)'));
17
+ console.log(chalk.dim(t('interactive_none')));
17
18
  }
18
19
  else {
19
20
  for (const name of presets) {
@@ -31,20 +32,20 @@ export async function interactivePresetMenu() {
31
32
  {
32
33
  type: 'list',
33
34
  name: 'action',
34
- message: 'What do you want to do?',
35
+ message: t('interactive_what_to_do'),
35
36
  choices: [
36
- { name: '▶ Switch preset', value: 'use' },
37
- { name: '+ Add new preset', value: 'add' },
38
- { name: '✎ Edit preset', value: 'edit' },
39
- { name: '✕ Delete preset', value: 'delete' },
40
- { name: '◉ View preset details', value: 'view' },
37
+ { name: t('interactive_switch'), value: 'use' },
38
+ { name: t('interactive_add'), value: 'add' },
39
+ { name: t('interactive_edit'), value: 'edit' },
40
+ { name: t('interactive_delete'), value: 'delete' },
41
+ { name: t('interactive_view'), value: 'view' },
41
42
  new inquirer.Separator(),
42
- { name: '← Quit', value: 'quit' },
43
+ { name: t('interactive_quit'), value: 'quit' },
43
44
  ],
44
45
  },
45
46
  ]);
46
47
  if (action === 'quit') {
47
- console.log(chalk.dim('Bye!'));
48
+ console.log(chalk.dim(t('interactive_bye')));
48
49
  return;
49
50
  }
50
51
  try {
@@ -68,21 +69,21 @@ export async function interactivePresetMenu() {
68
69
  }
69
70
  catch (err) {
70
71
  if (err instanceof Error) {
71
- console.log(chalk.red(` Error: ${err.message}`));
72
+ console.log(chalk.red(t('interactive_error', { msg: err.message })));
72
73
  }
73
74
  }
74
75
  }
75
76
  }
76
77
  async function handleUse(presets, active) {
77
78
  if (presets.length === 0) {
78
- console.log(chalk.dim(' No presets to switch. Add one first.'));
79
+ console.log(chalk.dim(t('interactive_no_presets_switch')));
79
80
  return;
80
81
  }
81
82
  const { name } = await inquirer.prompt([
82
83
  {
83
84
  type: 'list',
84
85
  name: 'name',
85
- message: 'Select a preset to switch to:',
86
+ message: t('interactive_select_switch'),
86
87
  choices: presets.map((p) => ({
87
88
  name: p === active ? chalk.green(`${p} ← active`) : p,
88
89
  value: p,
@@ -90,12 +91,12 @@ async function handleUse(presets, active) {
90
91
  },
91
92
  ]);
92
93
  if (name === active) {
93
- console.log(chalk.dim(' Already active.'));
94
+ console.log(chalk.dim(t('repl_already_active')));
94
95
  return;
95
96
  }
96
- const s = spinner(`Switching to "${name}"...`);
97
+ const s = spinner(t('repl_switching', { name }));
97
98
  const { previous, current } = await PresetSwitcher.switchTo(name);
98
- s.succeed(`Switched to preset "${name}"`);
99
+ s.succeed(t('repl_switched', { name }));
99
100
  PresetSwitcher.printSwitchSummary(previous, current);
100
101
  }
101
102
  async function handleAdd(presets) {
@@ -103,11 +104,11 @@ async function handleAdd(presets) {
103
104
  {
104
105
  type: 'list',
105
106
  name: 'source',
106
- message: 'Create preset from:',
107
+ message: t('interactive_create_from'),
107
108
  choices: [
108
- { name: 'Current settings.json', value: 'current' },
109
- { name: 'Copy from existing preset', value: 'copy' },
110
- { name: 'From a file', value: 'file' },
109
+ { name: t('interactive_from_current'), value: 'current' },
110
+ { name: t('interactive_from_copy'), value: 'copy' },
111
+ { name: t('interactive_from_file'), value: 'file' },
111
112
  ],
112
113
  },
113
114
  ]);
@@ -117,25 +118,25 @@ async function handleAdd(presets) {
117
118
  {
118
119
  type: 'list',
119
120
  name: 'src',
120
- message: 'Copy from which preset?',
121
+ message: t('interactive_copy_which'),
121
122
  choices: presets,
122
123
  },
123
124
  {
124
125
  type: 'input',
125
126
  name: 'name',
126
- message: 'New preset name:',
127
+ message: t('interactive_new_preset_name'),
127
128
  validate: (v) => {
128
129
  if (!v.trim())
129
- return 'Name is required';
130
+ return t('template_name_required');
130
131
  if (presets.includes(v.trim()))
131
- return 'Preset already exists';
132
+ return t('template_preset_exists');
132
133
  return true;
133
134
  },
134
135
  },
135
136
  ]);
136
137
  const srcSettings = ConfigReader.readPreset(answers.src);
137
138
  await ConfigWriter.savePreset(answers.name.trim(), srcSettings);
138
- success(`Created preset "${answers.name.trim()}" from "${answers.src}"`);
139
+ success(t('interactive_created_from', { name: answers.name.trim(), src: answers.src }));
139
140
  return;
140
141
  }
141
142
  if (source === 'file') {
@@ -143,24 +144,24 @@ async function handleAdd(presets) {
143
144
  {
144
145
  type: 'input',
145
146
  name: 'file',
146
- message: 'File path:',
147
- validate: (v) => (v.trim() ? true : 'Path is required'),
147
+ message: t('interactive_file_path'),
148
+ validate: (v) => (v.trim() ? true : t('interactive_path_required')),
148
149
  },
149
150
  {
150
151
  type: 'input',
151
152
  name: 'name',
152
- message: 'New preset name:',
153
+ message: t('interactive_new_preset_name'),
153
154
  validate: (v) => {
154
155
  if (!v.trim())
155
- return 'Name is required';
156
+ return t('template_name_required');
156
157
  if (presets.includes(v.trim()))
157
- return 'Preset already exists';
158
+ return t('template_preset_exists');
158
159
  return true;
159
160
  },
160
161
  },
161
162
  ]);
162
163
  await PresetSwitcher.saveAs(answers.name.trim(), answers.file.trim());
163
- success(`Created preset "${answers.name.trim()}" from file`);
164
+ success(t('interactive_created_from_file', { name: answers.name.trim() }));
164
165
  return;
165
166
  }
166
167
  // Default: from current settings
@@ -168,30 +169,30 @@ async function handleAdd(presets) {
168
169
  {
169
170
  type: 'input',
170
171
  name: 'name',
171
- message: 'New preset name:',
172
+ message: t('interactive_new_preset_name'),
172
173
  validate: (v) => {
173
174
  if (!v.trim())
174
- return 'Name is required';
175
+ return t('template_name_required');
175
176
  if (presets.includes(v.trim()))
176
- return 'Preset already exists';
177
+ return t('template_preset_exists');
177
178
  return true;
178
179
  },
179
180
  },
180
181
  ]);
181
182
  name = answers.name.trim();
182
183
  await PresetSwitcher.saveAs(name);
183
- success(`Saved current settings as preset "${name}"`);
184
+ success(t('interactive_saved_current', { name }));
184
185
  }
185
186
  async function handleEdit(presets) {
186
187
  if (presets.length === 0) {
187
- console.log(chalk.dim(' No presets to edit.'));
188
+ console.log(chalk.dim(t('interactive_no_presets_edit')));
188
189
  return;
189
190
  }
190
191
  const { target } = await inquirer.prompt([
191
192
  {
192
193
  type: 'list',
193
194
  name: 'target',
194
- message: 'Select a preset to edit:',
195
+ message: t('interactive_select_edit'),
195
196
  choices: presets,
196
197
  },
197
198
  ]);
@@ -221,11 +222,11 @@ async function handleEdit(presets) {
221
222
  {
222
223
  type: 'list',
223
224
  name: 'editAction',
224
- message: `Editing preset "${target}":`,
225
+ message: t('interactive_editing', { name: target }),
225
226
  choices: [
226
- { name: 'Modify a field', value: 'modify' },
227
- { name: 'Add new env variable', value: 'add-env' },
228
- { name: 'Remove a field', value: 'remove' },
227
+ { name: t('interactive_modify_field'), value: 'modify' },
228
+ { name: t('interactive_add_env'), value: 'add-env' },
229
+ { name: t('interactive_remove_field'), value: 'remove' },
229
230
  ],
230
231
  },
231
232
  ]);
@@ -234,7 +235,7 @@ async function handleEdit(presets) {
234
235
  {
235
236
  type: 'list',
236
237
  name: 'field',
237
- message: 'Select field to modify:',
238
+ message: t('interactive_select_modify'),
238
239
  choices: allFields.map((f) => ({
239
240
  name: `${f.key}: ${JSON.stringify(f.value)}`,
240
241
  value: f.key,
@@ -246,7 +247,7 @@ async function handleEdit(presets) {
246
247
  {
247
248
  type: 'input',
248
249
  name: 'newVal',
249
- message: `New value for ${field}:`,
250
+ message: t('interactive_new_value', { field }),
250
251
  default: String(currentVal),
251
252
  },
252
253
  ]);
@@ -268,33 +269,33 @@ async function handleEdit(presets) {
268
269
  settings.permissions.defaultMode = String(parsed);
269
270
  }
270
271
  await ConfigWriter.savePreset(target, settings);
271
- success(`Updated ${field}`);
272
+ success(t('interactive_updated', { field }));
272
273
  }
273
274
  else if (editAction === 'add-env') {
274
275
  const answers = await inquirer.prompt([
275
276
  {
276
277
  type: 'input',
277
278
  name: 'key',
278
- message: 'ENV variable name:',
279
- validate: (v) => (v.trim() ? true : 'Key is required'),
279
+ message: t('interactive_env_name'),
280
+ validate: (v) => (v.trim() ? true : t('interactive_key_required')),
280
281
  },
281
282
  {
282
283
  type: 'input',
283
284
  name: 'value',
284
- message: 'Value:',
285
- validate: (v) => (v.trim() ? true : 'Value is required'),
285
+ message: t('interactive_value_prompt'),
286
+ validate: (v) => (v.trim() ? true : t('interactive_value_required')),
286
287
  },
287
288
  ]);
288
289
  settings.env[answers.key.trim()] = answers.value.trim();
289
290
  await ConfigWriter.savePreset(target, settings);
290
- success(`Added env.${answers.key.trim()}`);
291
+ success(t('interactive_added_env', { key: answers.key.trim() }));
291
292
  }
292
293
  else if (editAction === 'remove') {
293
294
  const { field } = await inquirer.prompt([
294
295
  {
295
296
  type: 'list',
296
297
  name: 'field',
297
- message: 'Select field to remove:',
298
+ message: t('interactive_select_remove'),
298
299
  choices: allFields.map((f) => f.key),
299
300
  },
300
301
  ]);
@@ -302,19 +303,19 @@ async function handleEdit(presets) {
302
303
  delete settings.env[field.slice(4)];
303
304
  }
304
305
  await ConfigWriter.savePreset(target, settings);
305
- success(`Removed ${field}`);
306
+ success(t('interactive_removed', { field }));
306
307
  }
307
308
  }
308
309
  async function handleDelete(presets, active) {
309
310
  if (presets.length === 0) {
310
- console.log(chalk.dim(' No presets to delete.'));
311
+ console.log(chalk.dim(t('interactive_no_presets_delete')));
311
312
  return;
312
313
  }
313
314
  const { name } = await inquirer.prompt([
314
315
  {
315
316
  type: 'list',
316
317
  name: 'name',
317
- message: 'Select a preset to delete:',
318
+ message: t('interactive_select_delete'),
318
319
  choices: presets.map((p) => ({
319
320
  name: p === active ? `${p} ← active` : p,
320
321
  value: p,
@@ -325,27 +326,27 @@ async function handleDelete(presets, active) {
325
326
  {
326
327
  type: 'confirm',
327
328
  name: 'confirm',
328
- message: `Delete preset "${name}"? This cannot be undone.`,
329
+ message: t('interactive_delete_confirm', { name }),
329
330
  default: false,
330
331
  },
331
332
  ]);
332
333
  if (!confirm) {
333
- console.log(chalk.dim(' Cancelled.'));
334
+ console.log(chalk.dim(t('interactive_cancelled')));
334
335
  return;
335
336
  }
336
337
  await ConfigWriter.deletePreset(name);
337
- success(`Deleted preset "${name}"`);
338
+ success(t('interactive_deleted', { name }));
338
339
  }
339
340
  async function handleView(presets) {
340
341
  if (presets.length === 0) {
341
- console.log(chalk.dim(' No presets to view.'));
342
+ console.log(chalk.dim(t('interactive_no_presets_view')));
342
343
  return;
343
344
  }
344
345
  const { name } = await inquirer.prompt([
345
346
  {
346
347
  type: 'list',
347
348
  name: 'name',
348
- message: 'Select a preset to view:',
349
+ message: t('interactive_select_view'),
349
350
  choices: presets,
350
351
  },
351
352
  ]);
@@ -366,7 +367,7 @@ async function handleView(presets) {
366
367
  const pluginCount = settings.enabledPlugins
367
368
  ? Object.values(settings.enabledPlugins).filter(Boolean).length
368
369
  : 0;
369
- console.log(` ${chalk.dim('plugins')}: ${pluginCount} enabled`);
370
+ console.log(t('interactive_plugins_count', { count: pluginCount }));
370
371
  console.log('');
371
372
  }
372
373
  function parseValue(val) {