claude-settings-cli 1.0.0 → 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 (77) 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 +2 -0
  16. package/dist/commands/interactive.d.ts.map +1 -0
  17. package/dist/commands/interactive.js +385 -0
  18. package/dist/commands/interactive.js.map +1 -0
  19. package/dist/commands/io.d.ts.map +1 -1
  20. package/dist/commands/io.js +11 -10
  21. package/dist/commands/io.js.map +1 -1
  22. package/dist/commands/plugin.d.ts.map +1 -1
  23. package/dist/commands/plugin.js +13 -12
  24. package/dist/commands/plugin.js.map +1 -1
  25. package/dist/commands/preset.d.ts.map +1 -1
  26. package/dist/commands/preset.js +25 -20
  27. package/dist/commands/preset.js.map +1 -1
  28. package/dist/commands/project.d.ts.map +1 -1
  29. package/dist/commands/project.js +7 -6
  30. package/dist/commands/project.js.map +1 -1
  31. package/dist/commands/repl.d.ts +2 -0
  32. package/dist/commands/repl.d.ts.map +1 -0
  33. package/dist/commands/repl.js +296 -0
  34. package/dist/commands/repl.js.map +1 -0
  35. package/dist/commands/template.d.ts +3 -0
  36. package/dist/commands/template.d.ts.map +1 -0
  37. package/dist/commands/template.js +228 -0
  38. package/dist/commands/template.js.map +1 -0
  39. package/dist/core/diff.d.ts.map +1 -1
  40. package/dist/core/diff.js +3 -2
  41. package/dist/core/diff.js.map +1 -1
  42. package/dist/core/paths.d.ts +5 -0
  43. package/dist/core/paths.d.ts.map +1 -1
  44. package/dist/core/paths.js +25 -6
  45. package/dist/core/paths.js.map +1 -1
  46. package/dist/core/switcher.d.ts.map +1 -1
  47. package/dist/core/switcher.js +2 -1
  48. package/dist/core/switcher.js.map +1 -1
  49. package/dist/core/templates.d.ts +14 -0
  50. package/dist/core/templates.d.ts.map +1 -0
  51. package/dist/core/templates.js +180 -0
  52. package/dist/core/templates.js.map +1 -0
  53. package/dist/core/writer.d.ts.map +1 -1
  54. package/dist/core/writer.js +7 -3
  55. package/dist/core/writer.js.map +1 -1
  56. package/dist/i18n.d.ts +5 -0
  57. package/dist/i18n.d.ts.map +1 -0
  58. package/dist/i18n.js +1104 -0
  59. package/dist/i18n.js.map +1 -0
  60. package/dist/index.js +24 -10
  61. package/dist/index.js.map +1 -1
  62. package/dist/types/index.d.ts +14 -0
  63. package/dist/types/index.d.ts.map +1 -1
  64. package/dist/utils/backup.d.ts.map +1 -1
  65. package/dist/utils/backup.js +2 -1
  66. package/dist/utils/backup.js.map +1 -1
  67. package/dist/utils/errors.d.ts.map +1 -1
  68. package/dist/utils/errors.js +8 -7
  69. package/dist/utils/errors.js.map +1 -1
  70. package/dist/utils/prompt.d.ts +11 -0
  71. package/dist/utils/prompt.d.ts.map +1 -0
  72. package/dist/utils/prompt.js +50 -0
  73. package/dist/utils/prompt.js.map +1 -0
  74. package/dist/utils/safe-json.d.ts.map +1 -1
  75. package/dist/utils/safe-json.js +3 -2
  76. package/dist/utils/safe-json.js.map +1 -1
  77. package/package.json +13 -2
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ export declare function interactivePresetMenu(): Promise<void>;
2
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"AAiBA,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoE3D"}
@@ -0,0 +1,385 @@
1
+ import chalk from 'chalk';
2
+ import inquirer from 'inquirer';
3
+ import { ConfigReader } from '../core/reader.js';
4
+ import { ConfigWriter } from '../core/writer.js';
5
+ import { PresetSwitcher } from '../core/switcher.js';
6
+ import { maskValue } from '../schema/settings.js';
7
+ import { success, spinner } from '../utils/logger.js';
8
+ import { t } from '../i18n.js';
9
+ export async function interactivePresetMenu() {
10
+ while (true) {
11
+ const presets = ConfigReader.listPresets();
12
+ const active = ConfigReader.detectActivePreset();
13
+ // Show preset list
14
+ console.log('');
15
+ console.log(chalk.cyan.bold(t('interactive_presets_header')));
16
+ if (presets.length === 0) {
17
+ console.log(chalk.dim(t('interactive_none')));
18
+ }
19
+ else {
20
+ for (const name of presets) {
21
+ const isActive = name === active;
22
+ if (isActive) {
23
+ console.log(chalk.green(` ● ${name} ← active`));
24
+ }
25
+ else {
26
+ console.log(chalk.white(` ○ ${name}`));
27
+ }
28
+ }
29
+ }
30
+ console.log('');
31
+ const { action } = await inquirer.prompt([
32
+ {
33
+ type: 'list',
34
+ name: 'action',
35
+ message: t('interactive_what_to_do'),
36
+ choices: [
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' },
42
+ new inquirer.Separator(),
43
+ { name: t('interactive_quit'), value: 'quit' },
44
+ ],
45
+ },
46
+ ]);
47
+ if (action === 'quit') {
48
+ console.log(chalk.dim(t('interactive_bye')));
49
+ return;
50
+ }
51
+ try {
52
+ switch (action) {
53
+ case 'use':
54
+ await handleUse(presets, active);
55
+ break;
56
+ case 'add':
57
+ await handleAdd(presets);
58
+ break;
59
+ case 'edit':
60
+ await handleEdit(presets);
61
+ break;
62
+ case 'delete':
63
+ await handleDelete(presets, active);
64
+ break;
65
+ case 'view':
66
+ await handleView(presets);
67
+ break;
68
+ }
69
+ }
70
+ catch (err) {
71
+ if (err instanceof Error) {
72
+ console.log(chalk.red(t('interactive_error', { msg: err.message })));
73
+ }
74
+ }
75
+ }
76
+ }
77
+ async function handleUse(presets, active) {
78
+ if (presets.length === 0) {
79
+ console.log(chalk.dim(t('interactive_no_presets_switch')));
80
+ return;
81
+ }
82
+ const { name } = await inquirer.prompt([
83
+ {
84
+ type: 'list',
85
+ name: 'name',
86
+ message: t('interactive_select_switch'),
87
+ choices: presets.map((p) => ({
88
+ name: p === active ? chalk.green(`${p} ← active`) : p,
89
+ value: p,
90
+ })),
91
+ },
92
+ ]);
93
+ if (name === active) {
94
+ console.log(chalk.dim(t('repl_already_active')));
95
+ return;
96
+ }
97
+ const s = spinner(t('repl_switching', { name }));
98
+ const { previous, current } = await PresetSwitcher.switchTo(name);
99
+ s.succeed(t('repl_switched', { name }));
100
+ PresetSwitcher.printSwitchSummary(previous, current);
101
+ }
102
+ async function handleAdd(presets) {
103
+ const { source } = await inquirer.prompt([
104
+ {
105
+ type: 'list',
106
+ name: 'source',
107
+ message: t('interactive_create_from'),
108
+ choices: [
109
+ { name: t('interactive_from_current'), value: 'current' },
110
+ { name: t('interactive_from_copy'), value: 'copy' },
111
+ { name: t('interactive_from_file'), value: 'file' },
112
+ ],
113
+ },
114
+ ]);
115
+ let name;
116
+ if (source === 'copy' && presets.length > 0) {
117
+ const answers = await inquirer.prompt([
118
+ {
119
+ type: 'list',
120
+ name: 'src',
121
+ message: t('interactive_copy_which'),
122
+ choices: presets,
123
+ },
124
+ {
125
+ type: 'input',
126
+ name: 'name',
127
+ message: t('interactive_new_preset_name'),
128
+ validate: (v) => {
129
+ if (!v.trim())
130
+ return t('template_name_required');
131
+ if (presets.includes(v.trim()))
132
+ return t('template_preset_exists');
133
+ return true;
134
+ },
135
+ },
136
+ ]);
137
+ const srcSettings = ConfigReader.readPreset(answers.src);
138
+ await ConfigWriter.savePreset(answers.name.trim(), srcSettings);
139
+ success(t('interactive_created_from', { name: answers.name.trim(), src: answers.src }));
140
+ return;
141
+ }
142
+ if (source === 'file') {
143
+ const answers = await inquirer.prompt([
144
+ {
145
+ type: 'input',
146
+ name: 'file',
147
+ message: t('interactive_file_path'),
148
+ validate: (v) => (v.trim() ? true : t('interactive_path_required')),
149
+ },
150
+ {
151
+ type: 'input',
152
+ name: 'name',
153
+ message: t('interactive_new_preset_name'),
154
+ validate: (v) => {
155
+ if (!v.trim())
156
+ return t('template_name_required');
157
+ if (presets.includes(v.trim()))
158
+ return t('template_preset_exists');
159
+ return true;
160
+ },
161
+ },
162
+ ]);
163
+ await PresetSwitcher.saveAs(answers.name.trim(), answers.file.trim());
164
+ success(t('interactive_created_from_file', { name: answers.name.trim() }));
165
+ return;
166
+ }
167
+ // Default: from current settings
168
+ const answers = await inquirer.prompt([
169
+ {
170
+ type: 'input',
171
+ name: 'name',
172
+ message: t('interactive_new_preset_name'),
173
+ validate: (v) => {
174
+ if (!v.trim())
175
+ return t('template_name_required');
176
+ if (presets.includes(v.trim()))
177
+ return t('template_preset_exists');
178
+ return true;
179
+ },
180
+ },
181
+ ]);
182
+ name = answers.name.trim();
183
+ await PresetSwitcher.saveAs(name);
184
+ success(t('interactive_saved_current', { name }));
185
+ }
186
+ async function handleEdit(presets) {
187
+ if (presets.length === 0) {
188
+ console.log(chalk.dim(t('interactive_no_presets_edit')));
189
+ return;
190
+ }
191
+ const { target } = await inquirer.prompt([
192
+ {
193
+ type: 'list',
194
+ name: 'target',
195
+ message: t('interactive_select_edit'),
196
+ choices: presets,
197
+ },
198
+ ]);
199
+ const settings = ConfigReader.readPreset(target);
200
+ const envKeys = Object.keys(settings.env);
201
+ // Flatten all editable fields
202
+ const allFields = [];
203
+ for (const [k, v] of Object.entries(settings.env)) {
204
+ allFields.push({ key: `env.${k}`, value: v });
205
+ }
206
+ if (settings.language !== undefined) {
207
+ allFields.push({ key: 'language', value: settings.language });
208
+ }
209
+ if (settings.alwaysThinkingEnabled !== undefined) {
210
+ allFields.push({
211
+ key: 'alwaysThinkingEnabled',
212
+ value: settings.alwaysThinkingEnabled,
213
+ });
214
+ }
215
+ if (settings.permissions?.defaultMode !== undefined) {
216
+ allFields.push({
217
+ key: 'permissions.defaultMode',
218
+ value: settings.permissions.defaultMode,
219
+ });
220
+ }
221
+ const { editAction } = await inquirer.prompt([
222
+ {
223
+ type: 'list',
224
+ name: 'editAction',
225
+ message: t('interactive_editing', { name: target }),
226
+ choices: [
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' },
230
+ ],
231
+ },
232
+ ]);
233
+ if (editAction === 'modify') {
234
+ const { field } = await inquirer.prompt([
235
+ {
236
+ type: 'list',
237
+ name: 'field',
238
+ message: t('interactive_select_modify'),
239
+ choices: allFields.map((f) => ({
240
+ name: `${f.key}: ${JSON.stringify(f.value)}`,
241
+ value: f.key,
242
+ })),
243
+ },
244
+ ]);
245
+ const currentVal = allFields.find((f) => f.key === field)?.value;
246
+ const { newVal } = await inquirer.prompt([
247
+ {
248
+ type: 'input',
249
+ name: 'newVal',
250
+ message: t('interactive_new_value', { field }),
251
+ default: String(currentVal),
252
+ },
253
+ ]);
254
+ // Parse the value
255
+ const parsed = parseValue(newVal);
256
+ // Set the value
257
+ if (field.startsWith('env.')) {
258
+ settings.env[field.slice(4)] = String(parsed);
259
+ }
260
+ else if (field === 'language') {
261
+ settings.language = String(parsed);
262
+ }
263
+ else if (field === 'alwaysThinkingEnabled') {
264
+ settings.alwaysThinkingEnabled = parsed === true || parsed === 'true';
265
+ }
266
+ else if (field === 'permissions.defaultMode') {
267
+ if (!settings.permissions)
268
+ settings.permissions = {};
269
+ settings.permissions.defaultMode = String(parsed);
270
+ }
271
+ await ConfigWriter.savePreset(target, settings);
272
+ success(t('interactive_updated', { field }));
273
+ }
274
+ else if (editAction === 'add-env') {
275
+ const answers = await inquirer.prompt([
276
+ {
277
+ type: 'input',
278
+ name: 'key',
279
+ message: t('interactive_env_name'),
280
+ validate: (v) => (v.trim() ? true : t('interactive_key_required')),
281
+ },
282
+ {
283
+ type: 'input',
284
+ name: 'value',
285
+ message: t('interactive_value_prompt'),
286
+ validate: (v) => (v.trim() ? true : t('interactive_value_required')),
287
+ },
288
+ ]);
289
+ settings.env[answers.key.trim()] = answers.value.trim();
290
+ await ConfigWriter.savePreset(target, settings);
291
+ success(t('interactive_added_env', { key: answers.key.trim() }));
292
+ }
293
+ else if (editAction === 'remove') {
294
+ const { field } = await inquirer.prompt([
295
+ {
296
+ type: 'list',
297
+ name: 'field',
298
+ message: t('interactive_select_remove'),
299
+ choices: allFields.map((f) => f.key),
300
+ },
301
+ ]);
302
+ if (field.startsWith('env.')) {
303
+ delete settings.env[field.slice(4)];
304
+ }
305
+ await ConfigWriter.savePreset(target, settings);
306
+ success(t('interactive_removed', { field }));
307
+ }
308
+ }
309
+ async function handleDelete(presets, active) {
310
+ if (presets.length === 0) {
311
+ console.log(chalk.dim(t('interactive_no_presets_delete')));
312
+ return;
313
+ }
314
+ const { name } = await inquirer.prompt([
315
+ {
316
+ type: 'list',
317
+ name: 'name',
318
+ message: t('interactive_select_delete'),
319
+ choices: presets.map((p) => ({
320
+ name: p === active ? `${p} ← active` : p,
321
+ value: p,
322
+ })),
323
+ },
324
+ ]);
325
+ const { confirm } = await inquirer.prompt([
326
+ {
327
+ type: 'confirm',
328
+ name: 'confirm',
329
+ message: t('interactive_delete_confirm', { name }),
330
+ default: false,
331
+ },
332
+ ]);
333
+ if (!confirm) {
334
+ console.log(chalk.dim(t('interactive_cancelled')));
335
+ return;
336
+ }
337
+ await ConfigWriter.deletePreset(name);
338
+ success(t('interactive_deleted', { name }));
339
+ }
340
+ async function handleView(presets) {
341
+ if (presets.length === 0) {
342
+ console.log(chalk.dim(t('interactive_no_presets_view')));
343
+ return;
344
+ }
345
+ const { name } = await inquirer.prompt([
346
+ {
347
+ type: 'list',
348
+ name: 'name',
349
+ message: t('interactive_select_view'),
350
+ choices: presets,
351
+ },
352
+ ]);
353
+ const settings = ConfigReader.readPreset(name);
354
+ console.log('');
355
+ console.log(chalk.cyan.bold(` ── ${name} ──`));
356
+ for (const [key, value] of Object.entries(settings.env)) {
357
+ const display = maskValue(key, String(value));
358
+ console.log(` ${chalk.dim(`env.${key}`)}: ${display}`);
359
+ }
360
+ const otherKeys = ['language', 'alwaysThinkingEnabled', 'permissions'];
361
+ for (const key of otherKeys) {
362
+ const val = settings[key];
363
+ if (val !== undefined) {
364
+ console.log(` ${chalk.dim(key)}: ${JSON.stringify(val)}`);
365
+ }
366
+ }
367
+ const pluginCount = settings.enabledPlugins
368
+ ? Object.values(settings.enabledPlugins).filter(Boolean).length
369
+ : 0;
370
+ console.log(t('interactive_plugins_count', { count: pluginCount }));
371
+ console.log('');
372
+ }
373
+ function parseValue(val) {
374
+ if (val === 'true')
375
+ return true;
376
+ if (val === 'false')
377
+ return false;
378
+ if (val === 'null')
379
+ return null;
380
+ const num = Number(val);
381
+ if (!isNaN(num) && val.trim() !== '')
382
+ return num;
383
+ return val;
384
+ }
385
+ //# sourceMappingURL=interactive.js.map