@eruoxi/csm-test 0.0.1
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/LICENSE +21 -0
- package/README.md +217 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +43 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/backup.d.ts +3 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +99 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/backups.d.ts +3 -0
- package/dist/commands/backups.d.ts.map +1 -0
- package/dist/commands/backups.js +109 -0
- package/dist/commands/backups.js.map +1 -0
- package/dist/commands/copy.d.ts +3 -0
- package/dist/commands/copy.d.ts.map +1 -0
- package/dist/commands/copy.js +36 -0
- package/dist/commands/copy.js.map +1 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +102 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/current.d.ts +3 -0
- package/dist/commands/current.d.ts.map +1 -0
- package/dist/commands/current.js +45 -0
- package/dist/commands/current.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +111 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/edit.d.ts +3 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +86 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +43 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +3 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +74 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +13 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +66 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/rename.d.ts +3 -0
- package/dist/commands/rename.d.ts.map +1 -0
- package/dist/commands/rename.js +30 -0
- package/dist/commands/rename.js.map +1 -0
- package/dist/commands/restore.d.ts +3 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +184 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/show.d.ts +3 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +24 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/use.d.ts +3 -0
- package/dist/commands/use.d.ts.map +1 -0
- package/dist/commands/use.js +234 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/merge.d.ts +20 -0
- package/dist/lib/merge.d.ts.map +1 -0
- package/dist/lib/merge.js +146 -0
- package/dist/lib/merge.js.map +1 -0
- package/dist/lib/profile.d.ts +65 -0
- package/dist/lib/profile.d.ts.map +1 -0
- package/dist/lib/profile.js +158 -0
- package/dist/lib/profile.js.map +1 -0
- package/dist/lib/settings.d.ts +72 -0
- package/dist/lib/settings.d.ts.map +1 -0
- package/dist/lib/settings.js +270 -0
- package/dist/lib/settings.js.map +1 -0
- package/dist/lib/state.d.ts +55 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +145 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/types/index.d.ts +37 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/atomicWrite.d.ts +24 -0
- package/dist/utils/atomicWrite.d.ts.map +1 -0
- package/dist/utils/atomicWrite.js +67 -0
- package/dist/utils/atomicWrite.js.map +1 -0
- package/dist/utils/backupValidator.d.ts +32 -0
- package/dist/utils/backupValidator.d.ts.map +1 -0
- package/dist/utils/backupValidator.js +144 -0
- package/dist/utils/backupValidator.js.map +1 -0
- package/dist/utils/errors.d.ts +63 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +117 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/file.d.ts +8 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +54 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +37 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/normalize.d.ts +13 -0
- package/dist/utils/normalize.d.ts.map +1 -0
- package/dist/utils/normalize.js +31 -0
- package/dist/utils/normalize.js.map +1 -0
- package/dist/utils/validator.d.ts +24 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +178 -0
- package/dist/utils/validator.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initCreateCommand = initCreateCommand;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const profile_1 = require("../lib/profile");
|
|
9
|
+
const settings_1 = require("../lib/settings");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
const validator_1 = require("../utils/validator");
|
|
12
|
+
const errors_1 = require("../utils/errors");
|
|
13
|
+
function initCreateCommand(program) {
|
|
14
|
+
program
|
|
15
|
+
.command('create <name>')
|
|
16
|
+
.description('创建新的配置档案')
|
|
17
|
+
.option('-c, --copy-current', '从当前 settings.json 复制配置')
|
|
18
|
+
.option('-e, --empty', '创建空配置,跳过交互式设置')
|
|
19
|
+
.action(async (name, options) => {
|
|
20
|
+
try {
|
|
21
|
+
// 1. 验证名称格式
|
|
22
|
+
if (!(0, validator_1.validateProfileName)(name)) {
|
|
23
|
+
(0, logger_1.error)('名称格式无效。只允许使用字母、数字、连字符和下划线。');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const profileManager = new profile_1.ProfileManager();
|
|
27
|
+
const settingsManager = new settings_1.SettingsManager();
|
|
28
|
+
// 2. 检查是否已存在
|
|
29
|
+
if (await profileManager.exists(name)) {
|
|
30
|
+
(0, logger_1.error)(`配置档案 "${name}" 已存在。`);
|
|
31
|
+
(0, logger_1.info)(`提示: 使用 "csm show ${name}" 查看该配置`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
let settings = {};
|
|
35
|
+
// 3. 如果 --copy-current,读取当前 settings
|
|
36
|
+
if (options.copyCurrent) {
|
|
37
|
+
try {
|
|
38
|
+
settings = await settingsManager.read();
|
|
39
|
+
(0, logger_1.success)('已从当前 settings.json 复制配置。');
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
(0, logger_1.error)('无法读取当前 settings.json,将创建空配置。');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (!options.empty && process.stdin.isTTY) {
|
|
46
|
+
// 4. 在交互环境下使用 inquirer 创建基础配置
|
|
47
|
+
const answers = await inquirer_1.default.prompt([
|
|
48
|
+
{
|
|
49
|
+
type: 'confirm',
|
|
50
|
+
name: 'configureBasic',
|
|
51
|
+
message: '是否配置基础设置?',
|
|
52
|
+
default: false
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
type: 'input',
|
|
56
|
+
name: 'language',
|
|
57
|
+
message: '设置语言 (留空跳过):',
|
|
58
|
+
when: (ans) => ans.configureBasic
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
type: 'list',
|
|
62
|
+
name: 'effortLevel',
|
|
63
|
+
message: '选择努力级别:',
|
|
64
|
+
choices: [
|
|
65
|
+
{ name: 'low - 快速响应,适合简单任务', value: 'low' },
|
|
66
|
+
{ name: 'medium - 平衡模式 (默认)', value: 'medium' },
|
|
67
|
+
{ name: 'high - 深度思考,适合复杂任务', value: 'high' },
|
|
68
|
+
{ name: '跳过此设置', value: '' }
|
|
69
|
+
],
|
|
70
|
+
when: (ans) => ans.configureBasic
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
type: 'confirm',
|
|
74
|
+
name: 'autoMemoryEnabled',
|
|
75
|
+
message: '启用自动记忆?',
|
|
76
|
+
default: false,
|
|
77
|
+
when: (ans) => ans.configureBasic
|
|
78
|
+
}
|
|
79
|
+
]);
|
|
80
|
+
if (answers.configureBasic) {
|
|
81
|
+
if (answers.language) {
|
|
82
|
+
settings.language = answers.language;
|
|
83
|
+
}
|
|
84
|
+
if (answers.effortLevel) {
|
|
85
|
+
settings.effortLevel = answers.effortLevel;
|
|
86
|
+
}
|
|
87
|
+
if (answers.autoMemoryEnabled !== undefined) {
|
|
88
|
+
settings.autoMemoryEnabled = answers.autoMemoryEnabled;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// 5. --empty 或非交互环境时创建空配置
|
|
93
|
+
// 6. 创建 profile 文件
|
|
94
|
+
await profileManager.create(name, settings);
|
|
95
|
+
(0, logger_1.success)(`配置档案 "${name}" 创建成功。`);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
(0, errors_1.handleCommandError)(err, '创建配置档案');
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current.d.ts","sourceRoot":"","sources":["../../src/commands/current.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,QA0ClD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initCurrentCommand = initCurrentCommand;
|
|
4
|
+
const state_1 = require("../lib/state");
|
|
5
|
+
const profile_1 = require("../lib/profile");
|
|
6
|
+
const logger_1 = require("../utils/logger");
|
|
7
|
+
const logger_2 = require("../utils/logger");
|
|
8
|
+
function initCurrentCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('current')
|
|
11
|
+
.description('显示当前激活的配置名称')
|
|
12
|
+
.option('-s, --show-settings', '同时显示当前 settings 内容')
|
|
13
|
+
.action(async (options) => {
|
|
14
|
+
try {
|
|
15
|
+
const stateManager = new state_1.StateManager();
|
|
16
|
+
const profileManager = new profile_1.ProfileManager();
|
|
17
|
+
// 1. 获取 activeProfile 名称
|
|
18
|
+
const activeProfile = await stateManager.getActiveProfile();
|
|
19
|
+
// 2. 如果 null,显示无激活配置
|
|
20
|
+
if (!activeProfile) {
|
|
21
|
+
(0, logger_1.warn)('当前没有激活的配置');
|
|
22
|
+
(0, logger_1.info)('使用 "csm use <name>" 或 "csm switch" 切换到一个配置');
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// 3. 显示当前激活的配置名称
|
|
26
|
+
(0, logger_1.info)(`当前配置: ${activeProfile}`);
|
|
27
|
+
// 4. 如果 --show-settings,获取 profile 详情显示
|
|
28
|
+
if (options.showSettings) {
|
|
29
|
+
const settings = await profileManager.getIfExists(activeProfile);
|
|
30
|
+
if (!settings) {
|
|
31
|
+
(0, logger_1.error)(`配置 "${activeProfile}" 的文件不存在或已损坏`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// 显示 settings 内容
|
|
35
|
+
console.log('\n配置内容:');
|
|
36
|
+
console.log((0, logger_2.highlightJson)(settings));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
(0, logger_1.error)(`获取当前配置失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=current.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current.js","sourceRoot":"","sources":["../../src/commands/current.ts"],"names":[],"mappings":";;AAMA,gDA0CC;AA/CD,wCAA4C;AAC5C,4CAAgD;AAChD,4CAAoD;AACpD,4CAAgD;AAEhD,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,oBAAY,EAAE,CAAC;YACxC,MAAM,cAAc,GAAG,IAAI,wBAAc,EAAE,CAAC;YAE5C,yBAAyB;YACzB,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,gBAAgB,EAAE,CAAC;YAE5D,qBAAqB;YACrB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,IAAA,aAAI,EAAC,WAAW,CAAC,CAAC;gBAClB,IAAA,aAAI,EAAC,4CAA4C,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,iBAAiB;YACjB,IAAA,aAAI,EAAC,SAAS,aAAa,EAAE,CAAC,CAAC;YAE/B,wCAAwC;YACxC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;gBAEjE,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,IAAA,cAAK,EAAC,OAAO,aAAa,cAAc,CAAC,CAAC;oBAC1C,OAAO;gBACT,CAAC;gBAED,iBAAiB;gBACjB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,IAAA,sBAAa,EAAC,QAAQ,CAAC,CAAC,CAAC;YACvC,CAAC;QAEH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,cAAK,EAAC,aAAa,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QAoGjD"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initDeleteCommand = initDeleteCommand;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const profile_1 = require("../lib/profile");
|
|
10
|
+
const state_1 = require("../lib/state");
|
|
11
|
+
const logger_1 = require("../utils/logger");
|
|
12
|
+
const file_1 = require("../utils/file");
|
|
13
|
+
const errors_1 = require("../utils/errors");
|
|
14
|
+
function initDeleteCommand(program) {
|
|
15
|
+
program
|
|
16
|
+
.command('delete <name>')
|
|
17
|
+
.description('删除指定配置档案')
|
|
18
|
+
.option('-f, --force', '强制删除,不询问确认')
|
|
19
|
+
.action(async (name, options) => {
|
|
20
|
+
try {
|
|
21
|
+
const profileManager = new profile_1.ProfileManager();
|
|
22
|
+
const stateManager = new state_1.StateManager();
|
|
23
|
+
// 并行检查 profile 存在性和当前激活配置
|
|
24
|
+
const [profile, activeProfile] = await Promise.all([
|
|
25
|
+
profileManager.getIfExists(name),
|
|
26
|
+
stateManager.getActiveProfile()
|
|
27
|
+
]);
|
|
28
|
+
if (!profile) {
|
|
29
|
+
(0, logger_1.error)(`配置档案 "${name}" 不存在。`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
// 如果是当前激活的 profile,警告
|
|
33
|
+
const isActiveProfile = activeProfile === name;
|
|
34
|
+
if (isActiveProfile) {
|
|
35
|
+
(0, logger_1.warn)(`配置档案 "${name}" 当前正在使用中。删除后当前设置将保持不变。`);
|
|
36
|
+
}
|
|
37
|
+
// 3. 如果无 --force,使用 inquirer 确认
|
|
38
|
+
if (!options.force) {
|
|
39
|
+
const answer = await inquirer_1.default.prompt([
|
|
40
|
+
{
|
|
41
|
+
type: 'confirm',
|
|
42
|
+
name: 'confirm',
|
|
43
|
+
message: `确定要删除配置档案 "${name}" 吗?`,
|
|
44
|
+
default: false
|
|
45
|
+
}
|
|
46
|
+
]);
|
|
47
|
+
if (!answer.confirm) {
|
|
48
|
+
(0, logger_1.info)('已取消删除操作。');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// 4. 原子性删除:先更新状态,再删除文件
|
|
53
|
+
// 如果状态更新失败,文件仍存在,用户可以重试
|
|
54
|
+
// 如果文件删除失败,状态已清除,影响较小
|
|
55
|
+
let stateBackup = null;
|
|
56
|
+
const statePath = (0, file_1.getStatePath)();
|
|
57
|
+
if (isActiveProfile) {
|
|
58
|
+
// 备份状态文件以便回滚(直接尝试,失败说明文件不存在)
|
|
59
|
+
try {
|
|
60
|
+
stateBackup = `${statePath}.backup-${Date.now()}`;
|
|
61
|
+
await fs_extra_1.default.copy(statePath, stateBackup);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// 文件不存在或复制失败,继续执行
|
|
65
|
+
}
|
|
66
|
+
// 先清除状态
|
|
67
|
+
try {
|
|
68
|
+
await stateManager.setActiveProfile(null);
|
|
69
|
+
}
|
|
70
|
+
catch (stateError) {
|
|
71
|
+
// 状态更新失败,中止删除
|
|
72
|
+
(0, logger_1.error)(`更新状态失败,删除操作已中止: ${stateError instanceof Error ? stateError.message : String(stateError)}`);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 5. 删除 profile 文件
|
|
77
|
+
const deleted = await profileManager.delete(name);
|
|
78
|
+
if (deleted) {
|
|
79
|
+
// 删除成功,清理状态备份
|
|
80
|
+
if (stateBackup) {
|
|
81
|
+
try {
|
|
82
|
+
await fs_extra_1.default.remove(stateBackup);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// 忽略清理错误
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
(0, logger_1.success)(`配置档案 "${name}" 已删除。`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// 删除失败,尝试恢复状态
|
|
92
|
+
if (stateBackup && await fs_extra_1.default.pathExists(stateBackup)) {
|
|
93
|
+
try {
|
|
94
|
+
await fs_extra_1.default.copy(stateBackup, statePath);
|
|
95
|
+
await fs_extra_1.default.remove(stateBackup);
|
|
96
|
+
(0, logger_1.warn)('删除失败,已恢复状态');
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
(0, logger_1.error)('删除失败且无法恢复状态,请手动检查');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
(0, logger_1.error)(`删除配置档案 "${name}" 失败。`);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
(0, errors_1.handleCommandError)(err, '删除配置档案');
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoDpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,QAoC/C"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initEditCommand = initEditCommand;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const profile_1 = require("../lib/profile");
|
|
9
|
+
const file_1 = require("../utils/file");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
const errors_1 = require("../utils/errors");
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
/**
|
|
14
|
+
* 获取可用的编辑器命令
|
|
15
|
+
*/
|
|
16
|
+
function getEditorCommand() {
|
|
17
|
+
// 优先使用环境变量
|
|
18
|
+
if (process.env.EDITOR)
|
|
19
|
+
return process.env.EDITOR;
|
|
20
|
+
if (process.env.VISUAL)
|
|
21
|
+
return process.env.VISUAL;
|
|
22
|
+
// 根据平台选择默认编辑器
|
|
23
|
+
if (process.platform === 'win32') {
|
|
24
|
+
return 'notepad';
|
|
25
|
+
}
|
|
26
|
+
// macOS/Linux 返回最常见编辑器
|
|
27
|
+
return 'nano';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 尝试打开编辑器
|
|
31
|
+
* @returns 是否成功打开编辑器
|
|
32
|
+
*/
|
|
33
|
+
function openEditor(filePath) {
|
|
34
|
+
const editor = getEditorCommand();
|
|
35
|
+
if (!editor) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
// 在后台打开编辑器
|
|
40
|
+
const child = (0, child_process_1.spawn)(editor, [filePath], {
|
|
41
|
+
stdio: 'ignore',
|
|
42
|
+
detached: true,
|
|
43
|
+
shell: process.platform === 'win32'
|
|
44
|
+
});
|
|
45
|
+
// 让子进程独立运行
|
|
46
|
+
child.unref();
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function initEditCommand(program) {
|
|
54
|
+
program
|
|
55
|
+
.command('edit <name>')
|
|
56
|
+
.description('编辑配置档案')
|
|
57
|
+
.option('--no-open', '仅显示文件路径,不打开编辑器')
|
|
58
|
+
.action(async (name, options) => {
|
|
59
|
+
try {
|
|
60
|
+
const profileManager = new profile_1.ProfileManager();
|
|
61
|
+
// 1. 检查 profile 存在
|
|
62
|
+
const exists = await profileManager.exists(name);
|
|
63
|
+
if (!exists) {
|
|
64
|
+
(0, logger_1.error)(`配置档案 "${name}" 不存在。`);
|
|
65
|
+
(0, logger_1.info)(`提示: 使用 "csm list" 查看所有可用配置`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
const filePath = path_1.default.join((0, file_1.getProfilesDir)(), `${name}.json`);
|
|
69
|
+
// 2. 尝试打开编辑器
|
|
70
|
+
if (options.open !== false) {
|
|
71
|
+
const opened = openEditor(filePath);
|
|
72
|
+
if (opened) {
|
|
73
|
+
(0, logger_1.success)(`已打开编辑器: ${filePath}`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// 3. 无法打开编辑器或用户指定不打开
|
|
78
|
+
(0, logger_1.info)(`请使用外部编辑器编辑配置文件。`);
|
|
79
|
+
(0, logger_1.info)(`配置文件路径: ${filePath}`);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
(0, errors_1.handleCommandError)(err, '编辑配置档案');
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":";;;;;AAoDA,0CAoCC;AAvFD,iDAAsC;AACtC,4CAAgD;AAChD,wCAA+C;AAC/C,4CAAuD;AACvD,4CAAqD;AACrD,gDAAwB;AAExB;;GAEG;AACH,SAAS,gBAAgB;IACvB,WAAW;IACX,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;IAClD,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;IAElD,cAAc;IACd,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,uBAAuB;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,QAAgB;IAClC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAElC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,WAAW;QACX,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;YACtC,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAC;QAEH,WAAW;QACX,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,QAAQ,CAAC;SACrB,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC;SACrC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,wBAAc,EAAE,CAAC;YAE5C,mBAAmB;YACnB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAA,cAAK,EAAC,SAAS,IAAI,QAAQ,CAAC,CAAC;gBAC7B,IAAA,aAAI,EAAC,4BAA4B,CAAC,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAA,qBAAc,GAAE,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;YAE7D,aAAa;YACb,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACpC,IAAI,MAAM,EAAE,CAAC;oBACX,IAAA,gBAAO,EAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;oBAC/B,OAAO;gBACT,CAAC;YACH,CAAC;YAED,qBAAqB;YACrB,IAAA,aAAI,EAAC,iBAAiB,CAAC,CAAC;YACxB,IAAA,aAAI,EAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,2BAAkB,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QAkCjD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initExportCommand = initExportCommand;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const profile_1 = require("../lib/profile");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
const errors_1 = require("../utils/errors");
|
|
12
|
+
function initExportCommand(program) {
|
|
13
|
+
program
|
|
14
|
+
.command('export <name>')
|
|
15
|
+
.description('导出指定配置为 JSON 文件')
|
|
16
|
+
.option('-o, --output <dir>', '输出目录,默认当前目录')
|
|
17
|
+
.option('-f, --filename <filename>', '输出文件名,默认使用配置名')
|
|
18
|
+
.action(async (name, options) => {
|
|
19
|
+
try {
|
|
20
|
+
// 1. 获取 profile settings
|
|
21
|
+
const manager = new profile_1.ProfileManager();
|
|
22
|
+
const settings = await manager.get(name);
|
|
23
|
+
// 2. 确定输出路径
|
|
24
|
+
const outputDir = options.output
|
|
25
|
+
? (path_1.default.isAbsolute(options.output)
|
|
26
|
+
? options.output
|
|
27
|
+
: path_1.default.resolve(process.cwd(), options.output))
|
|
28
|
+
: process.cwd();
|
|
29
|
+
// 确保输出目录存在
|
|
30
|
+
await fs_extra_1.default.ensureDir(outputDir);
|
|
31
|
+
// 确定输出文件名
|
|
32
|
+
const filename = options.filename || `${name}.json`;
|
|
33
|
+
const outputPath = path_1.default.join(outputDir, filename);
|
|
34
|
+
// 3. 写入 JSON 文件(格式化输出)
|
|
35
|
+
await fs_extra_1.default.writeJson(outputPath, settings, { spaces: 2 });
|
|
36
|
+
(0, logger_1.success)(`成功导出配置到: ${outputPath}`);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
(0, errors_1.handleCommandError)(err, '导出');
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":";;;;;AAOA,8CAkCC;AAxCD,wDAA0B;AAC1B,gDAAwB;AACxB,4CAAgD;AAChD,4CAAuD;AACvD,4CAAqD;AAErD,SAAgB,iBAAiB,CAAC,OAAgB;IAChD,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,oBAAoB,EAAE,aAAa,CAAC;SAC3C,MAAM,CAAC,2BAA2B,EAAE,eAAe,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,OAAO,GAAG,IAAI,wBAAc,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEzC,YAAY;YACZ,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM;gBAC9B,CAAC,CAAC,CAAC,cAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;oBAC9B,CAAC,CAAC,OAAO,CAAC,MAAM;oBAChB,CAAC,CAAC,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClD,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAElB,WAAW;YACX,MAAM,kBAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAE9B,UAAU;YACV,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,GAAG,IAAI,OAAO,CAAC;YACpD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAElD,uBAAuB;YACvB,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YACxD,IAAA,gBAAO,EAAC,YAAY,UAAU,EAAE,CAAC,CAAC;QAEpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,2BAAkB,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QAkEjD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initImportCommand = initImportCommand;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const profile_1 = require("../lib/profile");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
const validator_1 = require("../utils/validator");
|
|
12
|
+
const errors_1 = require("../utils/errors");
|
|
13
|
+
function initImportCommand(program) {
|
|
14
|
+
program
|
|
15
|
+
.command('import <file>')
|
|
16
|
+
.description('从外部 JSON 文件导入配置')
|
|
17
|
+
.option('-n, --name <name>', '指定导入后的配置名称')
|
|
18
|
+
.option('-f, --force', '覆盖已存在的同名配置')
|
|
19
|
+
.action(async (file, options) => {
|
|
20
|
+
try {
|
|
21
|
+
// 1. 解析文件路径(支持相对路径和绝对路径)
|
|
22
|
+
const filePath = path_1.default.isAbsolute(file)
|
|
23
|
+
? file
|
|
24
|
+
: path_1.default.resolve(process.cwd(), file);
|
|
25
|
+
// 2. 检查文件存在
|
|
26
|
+
if (!(await fs_extra_1.default.pathExists(filePath))) {
|
|
27
|
+
(0, logger_1.error)(`文件不存在: ${filePath}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
// 3. 读取并解析 JSON
|
|
31
|
+
let content;
|
|
32
|
+
try {
|
|
33
|
+
content = await fs_extra_1.default.readJson(filePath);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
(0, logger_1.error)('无法解析 JSON 文件,请检查文件格式');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
// 4. 验证格式 - 只支持 Settings 格式
|
|
40
|
+
if (!(0, validator_1.validateSettings)(content)) {
|
|
41
|
+
(0, logger_1.error)('文件格式无效,必须是有效的 Settings JSON 格式');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const settings = content;
|
|
45
|
+
// 5. 确定名称(优先使用 --name,其次使用文件名)
|
|
46
|
+
const finalName = options.name || path_1.default.basename(filePath, '.json');
|
|
47
|
+
// 6. 验证名称格式
|
|
48
|
+
if (!(0, validator_1.validateProfileName)(finalName)) {
|
|
49
|
+
(0, logger_1.error)(`配置名称无效: "${finalName}"。名称只能包含字母、数字、连字符和下划线`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
// 7. 检查是否已存在
|
|
53
|
+
const manager = new profile_1.ProfileManager();
|
|
54
|
+
if (await manager.exists(finalName)) {
|
|
55
|
+
if (options.force) {
|
|
56
|
+
// 删除已存在的配置
|
|
57
|
+
await manager.delete(finalName);
|
|
58
|
+
(0, logger_1.warn)(`已删除现有配置: ${finalName}`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
(0, logger_1.error)(`配置 "${finalName}" 已存在。使用 -f 或 --force 选项覆盖`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// 8. 创建 profile
|
|
66
|
+
await manager.create(finalName, settings);
|
|
67
|
+
(0, logger_1.success)(`成功导入配置: ${finalName}`);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
(0, errors_1.handleCommandError)(err, '导入');
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":";;;;;AASA,8CAkEC;AA1ED,wDAA0B;AAC1B,gDAAwB;AACxB,4CAAgD;AAChD,4CAAuD;AACvD,kDAA2E;AAC3E,4CAAqD;AAGrD,SAAgB,iBAAiB,CAAC,OAAgB;IAChD,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,mBAAmB,EAAE,YAAY,CAAC;SACzC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,QAAQ,GAAG,cAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBACpC,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;YAEtC,YAAY;YACZ,IAAI,CAAC,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACrC,IAAA,cAAK,EAAC,UAAU,QAAQ,EAAE,CAAC,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,gBAAgB;YAChB,IAAI,OAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAA,cAAK,EAAC,sBAAsB,CAAC,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,4BAA4B;YAC5B,IAAI,CAAC,IAAA,4BAAgB,EAAC,OAAyB,CAAC,EAAE,CAAC;gBACjD,IAAA,cAAK,EAAC,gCAAgC,CAAC,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,QAAQ,GAAG,OAAyB,CAAC;YAE3C,+BAA+B;YAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,cAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEnE,YAAY;YACZ,IAAI,CAAC,IAAA,+BAAmB,EAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,IAAA,cAAK,EAAC,YAAY,SAAS,uBAAuB,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,aAAa;YACb,MAAM,OAAO,GAAG,IAAI,wBAAc,EAAE,CAAC;YACrC,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,WAAW;oBACX,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAChC,IAAA,aAAI,EAAC,YAAY,SAAS,EAAE,CAAC,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,IAAA,cAAK,EAAC,OAAO,SAAS,4BAA4B,CAAC,CAAC;oBACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,gBAAgB;YAChB,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC1C,IAAA,gBAAO,EAAC,WAAW,SAAS,EAAE,CAAC,CAAC;QAElC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,2BAAkB,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initBackupsCommand = exports.initRestoreCommand = exports.initBackupCommand = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 命令模块导出
|
|
6
|
+
*/
|
|
7
|
+
var backup_1 = require("./backup");
|
|
8
|
+
Object.defineProperty(exports, "initBackupCommand", { enumerable: true, get: function () { return backup_1.initBackupCommand; } });
|
|
9
|
+
var restore_1 = require("./restore");
|
|
10
|
+
Object.defineProperty(exports, "initRestoreCommand", { enumerable: true, get: function () { return restore_1.initRestoreCommand; } });
|
|
11
|
+
var backups_1 = require("./backups");
|
|
12
|
+
Object.defineProperty(exports, "initBackupsCommand", { enumerable: true, get: function () { return backups_1.initBackupsCommand; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,mCAA6C;AAApC,2GAAA,iBAAiB,OAAA;AAC1B,qCAA+C;AAAtC,6GAAA,kBAAkB,OAAA;AAC3B,qCAA+C;AAAtC,6GAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,QA2D/C"}
|