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.
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +8 -7
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +10 -9
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/create.d.ts +4 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +229 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/edit.d.ts +4 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +248 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/interactive.d.ts.map +1 -1
- package/dist/commands/interactive.js +60 -59
- package/dist/commands/interactive.js.map +1 -1
- package/dist/commands/io.d.ts.map +1 -1
- package/dist/commands/io.js +11 -10
- package/dist/commands/io.js.map +1 -1
- package/dist/commands/plugin.d.ts.map +1 -1
- package/dist/commands/plugin.js +13 -12
- package/dist/commands/plugin.js.map +1 -1
- package/dist/commands/preset.d.ts.map +1 -1
- package/dist/commands/preset.js +21 -20
- package/dist/commands/preset.js.map +1 -1
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +7 -6
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/repl.d.ts +2 -0
- package/dist/commands/repl.d.ts.map +1 -0
- package/dist/commands/repl.js +296 -0
- package/dist/commands/repl.js.map +1 -0
- package/dist/commands/template.d.ts +3 -0
- package/dist/commands/template.d.ts.map +1 -0
- package/dist/commands/template.js +228 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/core/diff.d.ts.map +1 -1
- package/dist/core/diff.js +3 -2
- package/dist/core/diff.js.map +1 -1
- package/dist/core/paths.d.ts +5 -0
- package/dist/core/paths.d.ts.map +1 -1
- package/dist/core/paths.js +25 -6
- package/dist/core/paths.js.map +1 -1
- package/dist/core/switcher.d.ts.map +1 -1
- package/dist/core/switcher.js +2 -1
- package/dist/core/switcher.js.map +1 -1
- package/dist/core/templates.d.ts +14 -0
- package/dist/core/templates.d.ts.map +1 -0
- package/dist/core/templates.js +180 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/core/writer.d.ts.map +1 -1
- package/dist/core/writer.js +7 -3
- package/dist/core/writer.js.map +1 -1
- package/dist/i18n.d.ts +5 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +1104 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.js +19 -12
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/backup.d.ts.map +1 -1
- package/dist/utils/backup.js +2 -1
- package/dist/utils/backup.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +8 -7
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/prompt.d.ts +11 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +50 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/safe-json.d.ts.map +1 -1
- package/dist/utils/safe-json.js +3 -2
- package/dist/utils/safe-json.js.map +1 -1
- 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":"
|
|
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('
|
|
15
|
+
console.log(chalk.cyan.bold(t('interactive_presets_header')));
|
|
15
16
|
if (presets.length === 0) {
|
|
16
|
-
console.log(chalk.dim(
|
|
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: '
|
|
35
|
+
message: t('interactive_what_to_do'),
|
|
35
36
|
choices: [
|
|
36
|
-
{ name: '
|
|
37
|
-
{ name: '
|
|
38
|
-
{ name: '
|
|
39
|
-
{ name: '
|
|
40
|
-
{ name: '
|
|
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: '
|
|
43
|
+
{ name: t('interactive_quit'), value: 'quit' },
|
|
43
44
|
],
|
|
44
45
|
},
|
|
45
46
|
]);
|
|
46
47
|
if (action === 'quit') {
|
|
47
|
-
console.log(chalk.dim('
|
|
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(
|
|
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('
|
|
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: '
|
|
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('
|
|
94
|
+
console.log(chalk.dim(t('repl_already_active')));
|
|
94
95
|
return;
|
|
95
96
|
}
|
|
96
|
-
const s = spinner(
|
|
97
|
+
const s = spinner(t('repl_switching', { name }));
|
|
97
98
|
const { previous, current } = await PresetSwitcher.switchTo(name);
|
|
98
|
-
s.succeed(
|
|
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: '
|
|
107
|
+
message: t('interactive_create_from'),
|
|
107
108
|
choices: [
|
|
108
|
-
{ name: '
|
|
109
|
-
{ name: '
|
|
110
|
-
{ name: '
|
|
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: '
|
|
121
|
+
message: t('interactive_copy_which'),
|
|
121
122
|
choices: presets,
|
|
122
123
|
},
|
|
123
124
|
{
|
|
124
125
|
type: 'input',
|
|
125
126
|
name: 'name',
|
|
126
|
-
message: '
|
|
127
|
+
message: t('interactive_new_preset_name'),
|
|
127
128
|
validate: (v) => {
|
|
128
129
|
if (!v.trim())
|
|
129
|
-
return '
|
|
130
|
+
return t('template_name_required');
|
|
130
131
|
if (presets.includes(v.trim()))
|
|
131
|
-
return '
|
|
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(
|
|
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: '
|
|
147
|
-
validate: (v) => (v.trim() ? true : '
|
|
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: '
|
|
153
|
+
message: t('interactive_new_preset_name'),
|
|
153
154
|
validate: (v) => {
|
|
154
155
|
if (!v.trim())
|
|
155
|
-
return '
|
|
156
|
+
return t('template_name_required');
|
|
156
157
|
if (presets.includes(v.trim()))
|
|
157
|
-
return '
|
|
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(
|
|
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: '
|
|
172
|
+
message: t('interactive_new_preset_name'),
|
|
172
173
|
validate: (v) => {
|
|
173
174
|
if (!v.trim())
|
|
174
|
-
return '
|
|
175
|
+
return t('template_name_required');
|
|
175
176
|
if (presets.includes(v.trim()))
|
|
176
|
-
return '
|
|
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(
|
|
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('
|
|
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: '
|
|
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:
|
|
225
|
+
message: t('interactive_editing', { name: target }),
|
|
225
226
|
choices: [
|
|
226
|
-
{ name: '
|
|
227
|
-
{ name: '
|
|
228
|
-
{ name: '
|
|
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: '
|
|
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:
|
|
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(
|
|
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: '
|
|
279
|
-
validate: (v) => (v.trim() ? true : '
|
|
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: '
|
|
285
|
-
validate: (v) => (v.trim() ? true : '
|
|
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(
|
|
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: '
|
|
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(
|
|
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('
|
|
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: '
|
|
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:
|
|
329
|
+
message: t('interactive_delete_confirm', { name }),
|
|
329
330
|
default: false,
|
|
330
331
|
},
|
|
331
332
|
]);
|
|
332
333
|
if (!confirm) {
|
|
333
|
-
console.log(chalk.dim('
|
|
334
|
+
console.log(chalk.dim(t('interactive_cancelled')));
|
|
334
335
|
return;
|
|
335
336
|
}
|
|
336
337
|
await ConfigWriter.deletePreset(name);
|
|
337
|
-
success(
|
|
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('
|
|
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: '
|
|
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(
|
|
370
|
+
console.log(t('interactive_plugins_count', { count: pluginCount }));
|
|
370
371
|
console.log('');
|
|
371
372
|
}
|
|
372
373
|
function parseValue(val) {
|