xray-manager 1.0.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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +798 -0
  3. package/dist/cli.d.ts +11 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +113 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/config.d.ts +49 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +295 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/interactive.d.ts +83 -0
  12. package/dist/commands/interactive.d.ts.map +1 -0
  13. package/dist/commands/interactive.js +362 -0
  14. package/dist/commands/interactive.js.map +1 -0
  15. package/dist/commands/logs.d.ts +43 -0
  16. package/dist/commands/logs.d.ts.map +1 -0
  17. package/dist/commands/logs.js +257 -0
  18. package/dist/commands/logs.js.map +1 -0
  19. package/dist/commands/service.d.ts +43 -0
  20. package/dist/commands/service.d.ts.map +1 -0
  21. package/dist/commands/service.js +177 -0
  22. package/dist/commands/service.js.map +1 -0
  23. package/dist/commands/user.d.ts +43 -0
  24. package/dist/commands/user.d.ts.map +1 -0
  25. package/dist/commands/user.js +212 -0
  26. package/dist/commands/user.js.map +1 -0
  27. package/dist/constants/exit-codes.d.ts +49 -0
  28. package/dist/constants/exit-codes.d.ts.map +1 -0
  29. package/dist/constants/exit-codes.js +100 -0
  30. package/dist/constants/exit-codes.js.map +1 -0
  31. package/dist/constants/paths.d.ts +57 -0
  32. package/dist/constants/paths.d.ts.map +1 -0
  33. package/dist/constants/paths.js +72 -0
  34. package/dist/constants/paths.js.map +1 -0
  35. package/dist/constants/timeouts.d.ts +84 -0
  36. package/dist/constants/timeouts.d.ts.map +1 -0
  37. package/dist/constants/timeouts.js +111 -0
  38. package/dist/constants/timeouts.js.map +1 -0
  39. package/dist/services/config-manager.d.ts +66 -0
  40. package/dist/services/config-manager.d.ts.map +1 -0
  41. package/dist/services/config-manager.js +206 -0
  42. package/dist/services/config-manager.js.map +1 -0
  43. package/dist/services/log-manager.d.ts +113 -0
  44. package/dist/services/log-manager.d.ts.map +1 -0
  45. package/dist/services/log-manager.js +288 -0
  46. package/dist/services/log-manager.js.map +1 -0
  47. package/dist/services/systemd-manager.d.ts +197 -0
  48. package/dist/services/systemd-manager.d.ts.map +1 -0
  49. package/dist/services/systemd-manager.js +458 -0
  50. package/dist/services/systemd-manager.js.map +1 -0
  51. package/dist/services/user-manager.d.ts +63 -0
  52. package/dist/services/user-manager.d.ts.map +1 -0
  53. package/dist/services/user-manager.js +219 -0
  54. package/dist/services/user-manager.js.map +1 -0
  55. package/dist/types/config.d.ts +256 -0
  56. package/dist/types/config.d.ts.map +1 -0
  57. package/dist/types/config.js +7 -0
  58. package/dist/types/config.js.map +1 -0
  59. package/dist/types/service.d.ts +96 -0
  60. package/dist/types/service.d.ts.map +1 -0
  61. package/dist/types/service.js +7 -0
  62. package/dist/types/service.js.map +1 -0
  63. package/dist/types/user.d.ts +114 -0
  64. package/dist/types/user.d.ts.map +1 -0
  65. package/dist/types/user.js +7 -0
  66. package/dist/types/user.js.map +1 -0
  67. package/dist/utils/clipboard.d.ts +21 -0
  68. package/dist/utils/clipboard.d.ts.map +1 -0
  69. package/dist/utils/clipboard.js +45 -0
  70. package/dist/utils/clipboard.js.map +1 -0
  71. package/dist/utils/format.d.ts +93 -0
  72. package/dist/utils/format.d.ts.map +1 -0
  73. package/dist/utils/format.js +242 -0
  74. package/dist/utils/format.js.map +1 -0
  75. package/dist/utils/logger.d.ts +113 -0
  76. package/dist/utils/logger.d.ts.map +1 -0
  77. package/dist/utils/logger.js +260 -0
  78. package/dist/utils/logger.js.map +1 -0
  79. package/dist/utils/preflight.d.ts +57 -0
  80. package/dist/utils/preflight.d.ts.map +1 -0
  81. package/dist/utils/preflight.js +215 -0
  82. package/dist/utils/preflight.js.map +1 -0
  83. package/dist/utils/validator.d.ts +102 -0
  84. package/dist/utils/validator.d.ts.map +1 -0
  85. package/dist/utils/validator.js +238 -0
  86. package/dist/utils/validator.js.map +1 -0
  87. package/dist/utils/which.d.ts +13 -0
  88. package/dist/utils/which.d.ts.map +1 -0
  89. package/dist/utils/which.js +28 -0
  90. package/dist/utils/which.js.map +1 -0
  91. package/package.json +69 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Xray Manager CLI Entry Point
4
+ *
5
+ * This is the main entry point for the CLI tool.
6
+ * It performs preflight checks and launches the interactive menu.
7
+ *
8
+ * @module cli
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
package/dist/cli.js ADDED
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Xray Manager CLI Entry Point
5
+ *
6
+ * This is the main entry point for the CLI tool.
7
+ * It performs preflight checks and launches the interactive menu.
8
+ *
9
+ * @module cli
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const commander_1 = require("commander");
16
+ const logger_1 = __importDefault(require("./utils/logger"));
17
+ const exit_codes_1 = require("./constants/exit-codes");
18
+ const preflight_1 = require("./utils/preflight");
19
+ const interactive_1 = require("./commands/interactive");
20
+ // Read package.json for version
21
+ const packageJson = require('../package.json');
22
+ /**
23
+ * Main CLI function
24
+ */
25
+ async function main() {
26
+ // Create Commander program
27
+ const program = new commander_1.Command();
28
+ program
29
+ .name('xray-manager')
30
+ .description('Xray VPN 服务管理 CLI 工具')
31
+ .version(packageJson.version, '-v, --version', '显示版本号')
32
+ .helpOption('-h, --help', '显示帮助信息');
33
+ // Global options
34
+ program
35
+ .option('--config <path>', '指定配置文件路径')
36
+ .option('--service <name>', '指定服务名称', 'xray')
37
+ .option('--json', '以 JSON 格式输出')
38
+ .option('--no-color', '禁用彩色输出')
39
+ .option('--verbose', '详细输出模式');
40
+ // Parse arguments
41
+ program.parse(process.argv);
42
+ const options = program.opts();
43
+ // Configure logger based on options
44
+ if (options.noColor) {
45
+ logger_1.default.configure({ color: false });
46
+ }
47
+ // If no command provided, start interactive menu
48
+ if (process.argv.length === 2 || program.args.length === 0) {
49
+ try {
50
+ // Perform preflight checks
51
+ const preflightResult = await (0, preflight_1.preflightChecks)({
52
+ checkSystemd: true,
53
+ checkXray: false, // Optional for menu startup
54
+ checkConfig: false, // Optional for menu startup
55
+ });
56
+ if (!preflightResult.passed && preflightResult.critical) {
57
+ logger_1.default.error('预检查失败 - 无法启动菜单');
58
+ preflightResult.errors.forEach((error) => logger_1.default.error(` • ${error}`));
59
+ if (preflightResult.suggestions.length > 0) {
60
+ logger_1.default.hint('建议解决方案:');
61
+ preflightResult.suggestions.forEach((suggestion) => logger_1.default.info(` • ${suggestion}`));
62
+ }
63
+ await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.SERVICE_ERROR);
64
+ }
65
+ // Show warnings but continue
66
+ if (preflightResult.warnings.length > 0) {
67
+ preflightResult.warnings.forEach((warning) => logger_1.default.warn(warning));
68
+ logger_1.default.newline();
69
+ }
70
+ // Start interactive menu
71
+ await (0, interactive_1.startInteractiveMenu)({
72
+ configPath: options.config,
73
+ serviceName: options.service,
74
+ jsonOutput: options.json,
75
+ verbose: options.verbose,
76
+ });
77
+ await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.SUCCESS);
78
+ }
79
+ catch (error) {
80
+ logger_1.default.error('启动菜单时出错:');
81
+ logger_1.default.error(error.message);
82
+ if (options.verbose && error instanceof Error) {
83
+ logger_1.default.error('Stack trace:');
84
+ logger_1.default.error(error.stack || 'No stack trace available');
85
+ }
86
+ await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.GENERAL_ERROR);
87
+ }
88
+ }
89
+ }
90
+ // Handle SIGINT (Ctrl+C)
91
+ process.on('SIGINT', async () => {
92
+ logger_1.default.newline();
93
+ logger_1.default.info('👋 程序已中断');
94
+ await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.SIGINT);
95
+ });
96
+ // Handle uncaught errors
97
+ process.on('uncaughtException', async (error) => {
98
+ logger_1.default.error('未捕获的异常:');
99
+ logger_1.default.error(error.message);
100
+ await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.GENERAL_ERROR);
101
+ });
102
+ process.on('unhandledRejection', async (reason) => {
103
+ logger_1.default.error('未处理的 Promise 拒绝:');
104
+ logger_1.default.error(String(reason));
105
+ await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.GENERAL_ERROR);
106
+ });
107
+ // Run main function
108
+ main().catch(async (error) => {
109
+ logger_1.default.error('Fatal error:');
110
+ logger_1.default.error(error.message);
111
+ await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.GENERAL_ERROR);
112
+ });
113
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Config Command Handler
3
+ *
4
+ * Handles configuration-related commands (view, backup, restore, modify)
5
+ *
6
+ * @module commands/config
7
+ */
8
+ /**
9
+ * Config command options
10
+ */
11
+ export interface ConfigCommandOptions {
12
+ /** Config file path */
13
+ configPath?: string;
14
+ /** Service name */
15
+ serviceName?: string;
16
+ /** JSON output mode */
17
+ json?: boolean;
18
+ }
19
+ /**
20
+ * Display current configuration
21
+ *
22
+ * @param options - Command options
23
+ */
24
+ export declare function viewConfig(options?: ConfigCommandOptions): Promise<void>;
25
+ /**
26
+ * Create a configuration backup
27
+ *
28
+ * @param options - Command options
29
+ */
30
+ export declare function backupConfig(options?: ConfigCommandOptions): Promise<void>;
31
+ /**
32
+ * List all configuration backups
33
+ *
34
+ * @param options - Command options
35
+ */
36
+ export declare function listBackups(options?: ConfigCommandOptions): Promise<void>;
37
+ /**
38
+ * Restore configuration from backup
39
+ *
40
+ * @param options - Command options
41
+ */
42
+ export declare function restoreConfig(options?: ConfigCommandOptions): Promise<void>;
43
+ /**
44
+ * Modify configuration item
45
+ *
46
+ * @param options - Command options
47
+ */
48
+ export declare function modifyConfig(options?: ConfigCommandOptions): Promise<void>;
49
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,uBAAuB;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ClF;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBpF;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CnF;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqErF;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGpF"}
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+ /**
3
+ * Config Command Handler
4
+ *
5
+ * Handles configuration-related commands (view, backup, restore, modify)
6
+ *
7
+ * @module commands/config
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.viewConfig = viewConfig;
14
+ exports.backupConfig = backupConfig;
15
+ exports.listBackups = listBackups;
16
+ exports.restoreConfig = restoreConfig;
17
+ exports.modifyConfig = modifyConfig;
18
+ const config_manager_1 = require("../services/config-manager");
19
+ const systemd_manager_1 = require("../services/systemd-manager");
20
+ const logger_1 = __importDefault(require("../utils/logger"));
21
+ const chalk_1 = __importDefault(require("chalk"));
22
+ const ora_1 = __importDefault(require("ora"));
23
+ const prompts_1 = require("@inquirer/prompts");
24
+ const path_1 = require("path");
25
+ /**
26
+ * Display current configuration
27
+ *
28
+ * @param options - Command options
29
+ */
30
+ async function viewConfig(options = {}) {
31
+ try {
32
+ const manager = new config_manager_1.ConfigManager(options.configPath);
33
+ const config = await manager.readConfig();
34
+ if (options.json) {
35
+ console.log(JSON.stringify(config, null, 2));
36
+ return;
37
+ }
38
+ logger_1.default.newline();
39
+ logger_1.default.separator();
40
+ console.log(chalk_1.default.bold.cyan('⚙️ 当前配置'));
41
+ logger_1.default.separator();
42
+ logger_1.default.newline();
43
+ // Display main config sections
44
+ console.log(chalk_1.default.cyan(' 日志配置:'));
45
+ if (config.log) {
46
+ console.log(chalk_1.default.gray(` 级别: ${config.log.loglevel || 'warning'}`));
47
+ console.log(chalk_1.default.gray(` 路径: ${config.log.access || 'none'}`));
48
+ }
49
+ else {
50
+ console.log(chalk_1.default.gray(' 未配置'));
51
+ }
52
+ logger_1.default.newline();
53
+ console.log(chalk_1.default.cyan(' 入站配置:'));
54
+ for (const inbound of config.inbounds || []) {
55
+ console.log(chalk_1.default.gray(` 协议: ${inbound.protocol}`));
56
+ console.log(chalk_1.default.gray(` 端口: ${inbound.port}`));
57
+ console.log(chalk_1.default.gray(` 标签: ${inbound.tag || 'default'}`));
58
+ if (inbound.settings?.clients) {
59
+ console.log(chalk_1.default.gray(` 用户数: ${inbound.settings.clients.length}`));
60
+ }
61
+ logger_1.default.newline();
62
+ }
63
+ console.log(chalk_1.default.cyan(' 出站配置:'));
64
+ for (const outbound of config.outbounds || []) {
65
+ console.log(chalk_1.default.gray(` 协议: ${outbound.protocol}`));
66
+ console.log(chalk_1.default.gray(` 标签: ${outbound.tag || 'default'}`));
67
+ logger_1.default.newline();
68
+ }
69
+ }
70
+ catch (error) {
71
+ logger_1.default.error(error.message);
72
+ process.exit(1);
73
+ }
74
+ }
75
+ /**
76
+ * Create a configuration backup
77
+ *
78
+ * @param options - Command options
79
+ */
80
+ async function backupConfig(options = {}) {
81
+ try {
82
+ const manager = new config_manager_1.ConfigManager(options.configPath);
83
+ const spinner = (0, ora_1.default)('正在备份配置...').start();
84
+ const backupPath = await manager.backupConfig();
85
+ spinner.succeed(chalk_1.default.green('✅ 配置备份成功!'));
86
+ logger_1.default.newline();
87
+ console.log(chalk_1.default.cyan(' 备份文件: ') + chalk_1.default.white(backupPath));
88
+ logger_1.default.newline();
89
+ }
90
+ catch (error) {
91
+ logger_1.default.error(error.message);
92
+ process.exit(1);
93
+ }
94
+ }
95
+ /**
96
+ * List all configuration backups
97
+ *
98
+ * @param options - Command options
99
+ */
100
+ async function listBackups(options = {}) {
101
+ try {
102
+ const manager = new config_manager_1.ConfigManager(options.configPath);
103
+ const backups = await manager.listBackups();
104
+ if (options.json) {
105
+ console.log(JSON.stringify(backups, null, 2));
106
+ return;
107
+ }
108
+ logger_1.default.newline();
109
+ logger_1.default.separator();
110
+ console.log(chalk_1.default.bold.cyan(`💾 配置备份列表 (共 ${backups.length} 个备份)`));
111
+ logger_1.default.separator();
112
+ logger_1.default.newline();
113
+ if (backups.length === 0) {
114
+ console.log(chalk_1.default.gray(' 暂无备份'));
115
+ logger_1.default.newline();
116
+ return;
117
+ }
118
+ // Display backups
119
+ for (let i = 0; i < backups.length; i++) {
120
+ const backup = backups[i];
121
+ const filename = (0, path_1.basename)(backup);
122
+ // Extract timestamp from filename (config.YYYY-MM-DDTHH-MM-SS-sssZ.json)
123
+ const timestampMatch = filename.match(/config\.(.+)\.json/);
124
+ const timestamp = timestampMatch
125
+ ? timestampMatch[1].replace(/-/g, ':').replace(/T(\d{2}):(\d{2}):(\d{2})/, 'T$1-$2-$3')
126
+ : 'unknown';
127
+ console.log(chalk_1.default.cyan(` ${i + 1}. ${filename}`));
128
+ console.log(chalk_1.default.gray(` 时间: ${timestamp}`));
129
+ console.log(chalk_1.default.gray(` 路径: ${backup}`));
130
+ logger_1.default.newline();
131
+ }
132
+ }
133
+ catch (error) {
134
+ logger_1.default.error(error.message);
135
+ process.exit(1);
136
+ }
137
+ }
138
+ /**
139
+ * Restore configuration from backup
140
+ *
141
+ * @param options - Command options
142
+ */
143
+ async function restoreConfig(options = {}) {
144
+ try {
145
+ const manager = new config_manager_1.ConfigManager(options.configPath);
146
+ const systemdManager = new systemd_manager_1.SystemdManager(options.serviceName || 'xray');
147
+ // List backups first
148
+ const backups = await manager.listBackups();
149
+ if (backups.length === 0) {
150
+ logger_1.default.warn('暂无备份可恢复');
151
+ return;
152
+ }
153
+ logger_1.default.newline();
154
+ console.log(chalk_1.default.bold('📋 可用备份:'));
155
+ backups.forEach((backup, i) => {
156
+ const filename = (0, path_1.basename)(backup);
157
+ console.log(` ${i + 1}. ${filename}`);
158
+ });
159
+ logger_1.default.newline();
160
+ // Prompt for backup selection
161
+ const backupInput = await (0, prompts_1.input)({
162
+ message: '请输入要恢复的备份序号或完整路径:',
163
+ });
164
+ // Check if input is a number (index)
165
+ let targetBackup = backupInput;
166
+ const index = parseInt(backupInput, 10) - 1;
167
+ if (!isNaN(index) && index >= 0 && index < backups.length) {
168
+ targetBackup = backups[index];
169
+ }
170
+ // Confirm restoration
171
+ const confirmed = await (0, prompts_1.confirm)({
172
+ message: chalk_1.default.yellow(`⚠️ 确定要从备份恢复配置吗?当前配置将被覆盖(会先自动备份)。`),
173
+ default: false,
174
+ });
175
+ if (!confirmed) {
176
+ logger_1.default.info('已取消恢复操作');
177
+ return;
178
+ }
179
+ const spinner = (0, ora_1.default)('正在恢复配置...').start();
180
+ await manager.restoreConfig(targetBackup);
181
+ spinner.succeed(chalk_1.default.green('✅ 配置恢复成功!'));
182
+ logger_1.default.newline();
183
+ // Ask if user wants to restart service
184
+ const shouldRestart = await (0, prompts_1.confirm)({
185
+ message: chalk_1.default.yellow('是否立即重启服务以应用新配置?'),
186
+ default: true,
187
+ });
188
+ if (shouldRestart) {
189
+ const restartSpinner = (0, ora_1.default)('正在重启服务...').start();
190
+ await systemdManager.restart();
191
+ restartSpinner.succeed(chalk_1.default.green('✅ 服务重启成功!'));
192
+ }
193
+ else {
194
+ logger_1.default.info('💡 请记得手动重启服务以应用新配置');
195
+ }
196
+ }
197
+ catch (error) {
198
+ logger_1.default.error(error.message);
199
+ process.exit(1);
200
+ }
201
+ }
202
+ /**
203
+ * Modify configuration item
204
+ *
205
+ * @param options - Command options
206
+ */
207
+ async function modifyConfig(options = {}) {
208
+ try {
209
+ const manager = new config_manager_1.ConfigManager(options.configPath);
210
+ const systemdManager = new systemd_manager_1.SystemdManager(options.serviceName || 'xray');
211
+ logger_1.default.newline();
212
+ console.log(chalk_1.default.bold('⚙️ 配置修改'));
213
+ logger_1.default.newline();
214
+ // Common config items
215
+ const configItems = [
216
+ { name: '日志级别 (log.loglevel)', value: 'log.loglevel' },
217
+ { name: '访问日志路径 (log.access)', value: 'log.access' },
218
+ { name: '错误日志路径 (log.error)', value: 'log.error' },
219
+ { name: '自定义路径', value: 'custom' },
220
+ ];
221
+ const itemChoice = await (0, prompts_1.select)({
222
+ message: '请选择要修改的配置项:',
223
+ choices: configItems,
224
+ });
225
+ let path = itemChoice;
226
+ if (itemChoice === 'custom') {
227
+ path = await (0, prompts_1.input)({
228
+ message: '请输入配置项路径 (例如: log.loglevel):',
229
+ validate: (value) => {
230
+ if (!value || value.trim().length === 0) {
231
+ return '配置项路径不能为空';
232
+ }
233
+ return true;
234
+ },
235
+ });
236
+ }
237
+ // Get current value
238
+ const currentConfig = await manager.readConfig();
239
+ const parts = path.split('.');
240
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
241
+ let currentValue = currentConfig;
242
+ for (const part of parts) {
243
+ currentValue = currentValue?.[part];
244
+ }
245
+ console.log(chalk_1.default.gray(` 当前值: ${currentValue !== undefined ? currentValue : '(未设置)'}`));
246
+ logger_1.default.newline();
247
+ // Prompt for new value
248
+ const newValueStr = await (0, prompts_1.input)({
249
+ message: '请输入新值:',
250
+ });
251
+ // Try to parse as JSON for non-string values
252
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
253
+ let newValue = newValueStr;
254
+ try {
255
+ newValue = JSON.parse(newValueStr);
256
+ }
257
+ catch {
258
+ // Keep as string
259
+ }
260
+ // Confirm modification
261
+ const confirmed = await (0, prompts_1.confirm)({
262
+ message: chalk_1.default.yellow(`⚠️ 确定要修改配置项 "${path}" 吗?`),
263
+ default: false,
264
+ });
265
+ if (!confirmed) {
266
+ logger_1.default.info('已取消修改操作');
267
+ return;
268
+ }
269
+ const spinner = (0, ora_1.default)('正在修改配置...').start();
270
+ // Backup first
271
+ await manager.backupConfig();
272
+ // Modify
273
+ await manager.modifyConfigItem(path, newValue);
274
+ spinner.succeed(chalk_1.default.green('✅ 配置修改成功!'));
275
+ logger_1.default.newline();
276
+ // Ask if user wants to restart service
277
+ const shouldRestart = await (0, prompts_1.confirm)({
278
+ message: chalk_1.default.yellow('是否立即重启服务以应用新配置?'),
279
+ default: true,
280
+ });
281
+ if (shouldRestart) {
282
+ const restartSpinner = (0, ora_1.default)('正在重启服务...').start();
283
+ await systemdManager.restart();
284
+ restartSpinner.succeed(chalk_1.default.green('✅ 服务重启成功!'));
285
+ }
286
+ else {
287
+ logger_1.default.info('💡 请记得手动重启服务以应用新配置');
288
+ }
289
+ }
290
+ catch (error) {
291
+ logger_1.default.error(error.message);
292
+ process.exit(1);
293
+ }
294
+ }
295
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Interactive Menu Implementation
3
+ *
4
+ * Provides the main interactive menu system for the CLI tool
5
+ *
6
+ * @module commands/interactive
7
+ */
8
+ /**
9
+ * Menu options configuration
10
+ */
11
+ export interface MenuOptions {
12
+ /** Config file path */
13
+ configPath?: string;
14
+ /** Service name */
15
+ serviceName?: string;
16
+ /** JSON output mode */
17
+ jsonOutput?: boolean;
18
+ /** Verbose mode */
19
+ verbose?: boolean;
20
+ }
21
+ /**
22
+ * Menu context information
23
+ */
24
+ export interface MenuContext {
25
+ /** Service status */
26
+ serviceStatus?: string;
27
+ /** Number of users */
28
+ userCount?: number;
29
+ /** Last updated timestamp */
30
+ lastUpdated?: Date;
31
+ }
32
+ /**
33
+ * Menu stack for navigation
34
+ */
35
+ export declare class MenuStack {
36
+ private stack;
37
+ push(menu: string): void;
38
+ pop(): string;
39
+ current(): string | undefined;
40
+ depth(): number;
41
+ canGoBack(): boolean;
42
+ clear(): void;
43
+ }
44
+ /**
45
+ * Get menu context (service status, user count)
46
+ */
47
+ export declare function getMenuContext(options?: MenuOptions): Promise<MenuContext>;
48
+ /**
49
+ * Format menu header with context
50
+ */
51
+ export declare function formatMenuHeader(context: MenuContext): string;
52
+ /**
53
+ * Get main menu options
54
+ */
55
+ export declare function getMainMenuOptions(): any[];
56
+ /**
57
+ * Get menu depth (for Constitution compliance - max 3 levels)
58
+ */
59
+ export declare function getMenuDepth(): number;
60
+ /**
61
+ * Format a menu option
62
+ */
63
+ export declare function formatMenuOption(name: string, value: string): {
64
+ name: string;
65
+ value: string;
66
+ };
67
+ /**
68
+ * Show a menu and get user selection
69
+ */
70
+ export declare function showMenu(options: any[], message?: string): Promise<string>;
71
+ /**
72
+ * Handle menu selection
73
+ */
74
+ export declare function handleMenuSelection(selection: string, options: MenuOptions): Promise<boolean>;
75
+ /**
76
+ * Handle SIGINT (Ctrl+C)
77
+ */
78
+ export declare function handleSigInt(): Promise<boolean>;
79
+ /**
80
+ * Main interactive menu loop
81
+ */
82
+ export declare function startInteractiveMenu(options: MenuOptions): Promise<void>;
83
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,uBAAuB;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,mBAAmB;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAgB;IAE7B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxB,GAAG,IAAI,MAAM;IAOb,OAAO,IAAI,MAAM,GAAG,SAAS;IAI7B,KAAK,IAAI,MAAM;IAIf,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,IAAI;CAGd;AAKD;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAyBpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAO7D;AAED;;GAEG;AAEH,wBAAgB,kBAAkB,IAAI,GAAG,EAAE,CAqC1C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAa7F;AAED;;GAEG;AAEH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,GAAE,MAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAiEnG;AAqED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAQrD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+D9E"}