@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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 eruoxi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# CSM - Claude Code Settings Manager
|
|
2
|
+
|
|
3
|
+
管理多个 Claude Code 配置档案的 CLI 工具,支持在不同模型厂商配置之间一键切换。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
### npm 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g @eruoxi/csm
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### 直接下载
|
|
14
|
+
|
|
15
|
+
从 [GitHub Releases](https://github.com/eruoxi/csm/releases) 下载适合你系统的可执行文件。
|
|
16
|
+
|
|
17
|
+
## 快速开始
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# 创建配置档案 (从当前配置复制)
|
|
21
|
+
csm create baidu-qianfan --copy-current
|
|
22
|
+
|
|
23
|
+
# 创建空配置
|
|
24
|
+
csm create anthropic-official --empty
|
|
25
|
+
|
|
26
|
+
# 列出所有配置
|
|
27
|
+
csm list
|
|
28
|
+
|
|
29
|
+
# 切换配置
|
|
30
|
+
csm use baidu-qianfan
|
|
31
|
+
|
|
32
|
+
# 查看当前配置
|
|
33
|
+
csm current
|
|
34
|
+
|
|
35
|
+
# 交互式切换 (use 无参数时的别名)
|
|
36
|
+
csm switch
|
|
37
|
+
|
|
38
|
+
# 或直接使用 use 无参数
|
|
39
|
+
csm use
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 命令列表
|
|
43
|
+
|
|
44
|
+
### 配置管理
|
|
45
|
+
|
|
46
|
+
| 命令 | 说明 |
|
|
47
|
+
|-----------------------|-------------|
|
|
48
|
+
| `csm create <name>` | 创建新配置档案 |
|
|
49
|
+
| `csm show <name>` | 显示配置详情 |
|
|
50
|
+
| `csm edit <name>` | 用编辑器打开配置文件 |
|
|
51
|
+
| `csm rename <old> <new>` | 重命名配置档案 |
|
|
52
|
+
| `csm delete <name>` | 删除配置 |
|
|
53
|
+
| `csm list` / `csm ls` | 列出所有配置 |
|
|
54
|
+
|
|
55
|
+
### 配置切换
|
|
56
|
+
|
|
57
|
+
| 命令 | 说明 |
|
|
58
|
+
|------------------|----------|
|
|
59
|
+
| `csm use <name>` | 切换到指定配置 (无参数时交互式选择) |
|
|
60
|
+
| `csm switch` | 交互式选择切换 (use 的别名) |
|
|
61
|
+
| `csm current` | 显示当前激活配置 |
|
|
62
|
+
|
|
63
|
+
### 导入导出
|
|
64
|
+
|
|
65
|
+
| 命令 | 说明 |
|
|
66
|
+
|-------------------------|---------------|
|
|
67
|
+
| `csm import <file>` | 从 JSON 文件导入配置 |
|
|
68
|
+
| `csm export <name>` | 导出配置为 JSON 文件 |
|
|
69
|
+
| `csm copy <src> <dest>` | 复制配置 |
|
|
70
|
+
|
|
71
|
+
### 备份恢复
|
|
72
|
+
|
|
73
|
+
| 命令 | 说明 |
|
|
74
|
+
|------------------------|----------------|
|
|
75
|
+
| `csm backup` | 备份所有配置到 zip 文件 |
|
|
76
|
+
| `csm restore <backup>` | 从备份恢复配置 |
|
|
77
|
+
| `csm backups` | 列出所有备份文件 |
|
|
78
|
+
|
|
79
|
+
## 配置合并策略
|
|
80
|
+
|
|
81
|
+
切换配置时支持部分字段继承:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# 完全替换 (默认)
|
|
85
|
+
csm use anthropic-official
|
|
86
|
+
|
|
87
|
+
# 保留当前权限配置
|
|
88
|
+
csm use openai-proxy --keep-permissions
|
|
89
|
+
|
|
90
|
+
# 保留当前插件配置
|
|
91
|
+
csm use baidu-qianfan --keep-plugins
|
|
92
|
+
|
|
93
|
+
# 保留多个字段
|
|
94
|
+
csm use custom --keep-permissions --keep-plugins
|
|
95
|
+
|
|
96
|
+
# 指定合并字段
|
|
97
|
+
csm use custom --merge permissions,enabledPlugins,env
|
|
98
|
+
|
|
99
|
+
# 完全替换,不合并任何字段
|
|
100
|
+
csm use custom --no-merge
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 选项说明
|
|
104
|
+
|
|
105
|
+
### create 命令选项
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
-c, --copy-current 从当前 settings.json 复制配置
|
|
109
|
+
-e, --empty 创建空配置,跳过交互式设置
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### use 命令选项
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
--merge <fields> 指定要合并的字段 (逗号分隔)
|
|
116
|
+
--no-merge 完全替换,不合并任何字段
|
|
117
|
+
--keep-permissions 保留当前权限配置
|
|
118
|
+
--keep-plugins 保留当前插件配置
|
|
119
|
+
--dry-run 预览切换结果,不实际执行
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### list 命令选项
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
-j, --json 以 JSON 格式输出
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### current 命令选项
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
-s, --show-settings 同时显示当前 settings 内容
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### edit 命令选项
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
--no-open 仅显示文件路径,不打开编辑器
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### delete 命令选项
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
-f, --force 强制删除,不询问确认
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### import 命令选项
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
-n, --name <name> 指定导入后的配置名称
|
|
150
|
+
-f, --force 覆盖已存在的同名配置
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### export 命令选项
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
-o, --output <dir> 输出目录 (默认当前目录)
|
|
157
|
+
-f, --filename <name> 输出文件名 (默认使用配置名)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### restore 命令选项
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
-f, --force 覆盖现有配置,不询问
|
|
164
|
+
--skip-validation 跳过备份验证
|
|
165
|
+
--no-auto-backup 恢复前不自动备份当前配置
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### backup 命令选项
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
-n, --name <name> 指定备份文件名(默认自动生成)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### backups 命令选项
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
-j, --json 以 JSON 格式输出
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## 数据存储
|
|
181
|
+
|
|
182
|
+
所有数据存储在 `~/.claude/` 目录下:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
~/.claude/
|
|
186
|
+
├── settings.json # 当前生效配置
|
|
187
|
+
├── csm/ # CSM 数据目录
|
|
188
|
+
│ ├── profiles/ # 配置档案存储目录
|
|
189
|
+
│ │ ├── baidu-qianfan.json
|
|
190
|
+
│ │ └── anthropic-official.json
|
|
191
|
+
│ ├── backups/ # 备份存储目录
|
|
192
|
+
│ │ └── csm-backup-*.zip
|
|
193
|
+
│ └── csm-state.json # 工具状态 (当前激活配置)
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## 开发
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# 安装依赖
|
|
200
|
+
npm install
|
|
201
|
+
|
|
202
|
+
# 开发模式运行
|
|
203
|
+
npm run dev
|
|
204
|
+
|
|
205
|
+
# 构建
|
|
206
|
+
npm run build
|
|
207
|
+
|
|
208
|
+
# 测试
|
|
209
|
+
npm test
|
|
210
|
+
|
|
211
|
+
# 打包可执行文件 (Windows/macOS/Linux)
|
|
212
|
+
npm run pkg
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## License
|
|
216
|
+
|
|
217
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const commander_1 = require("commander");
|
|
7
|
+
const packageJson = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '..', 'package.json'), 'utf-8'));
|
|
8
|
+
const create_1 = require("./commands/create");
|
|
9
|
+
const show_1 = require("./commands/show");
|
|
10
|
+
const edit_1 = require("./commands/edit");
|
|
11
|
+
const delete_1 = require("./commands/delete");
|
|
12
|
+
const list_1 = require("./commands/list");
|
|
13
|
+
const use_1 = require("./commands/use");
|
|
14
|
+
const current_1 = require("./commands/current");
|
|
15
|
+
const import_1 = require("./commands/import");
|
|
16
|
+
const export_1 = require("./commands/export");
|
|
17
|
+
const copy_1 = require("./commands/copy");
|
|
18
|
+
const rename_1 = require("./commands/rename");
|
|
19
|
+
const backup_1 = require("./commands/backup");
|
|
20
|
+
const restore_1 = require("./commands/restore");
|
|
21
|
+
const backups_1 = require("./commands/backups");
|
|
22
|
+
const program = new commander_1.Command();
|
|
23
|
+
program
|
|
24
|
+
.name('csm')
|
|
25
|
+
.description(packageJson.description)
|
|
26
|
+
.version(packageJson.version);
|
|
27
|
+
// 注册所有命令
|
|
28
|
+
(0, create_1.initCreateCommand)(program);
|
|
29
|
+
(0, show_1.initShowCommand)(program);
|
|
30
|
+
(0, edit_1.initEditCommand)(program);
|
|
31
|
+
(0, delete_1.initDeleteCommand)(program);
|
|
32
|
+
(0, list_1.initListCommand)(program);
|
|
33
|
+
(0, use_1.initUseCommand)(program); // 包含 switch 别名
|
|
34
|
+
(0, current_1.initCurrentCommand)(program);
|
|
35
|
+
(0, import_1.initImportCommand)(program);
|
|
36
|
+
(0, export_1.initExportCommand)(program);
|
|
37
|
+
(0, copy_1.initCopyCommand)(program);
|
|
38
|
+
(0, rename_1.initRenameCommand)(program);
|
|
39
|
+
(0, backup_1.initBackupCommand)(program);
|
|
40
|
+
(0, restore_1.initRestoreCommand)(program);
|
|
41
|
+
(0, backups_1.initBackupsCommand)(program);
|
|
42
|
+
program.parse();
|
|
43
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,2BAAkC;AAClC,+BAA4B;AAC5B,yCAAoC;AAEpC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAC7D,CAAC;AAEF,8CAAsD;AACtD,0CAAkD;AAClD,0CAAkD;AAClD,8CAAsD;AACtD,0CAAkD;AAClD,wCAAgD;AAChD,gDAAwD;AACxD,8CAAsD;AACtD,8CAAsD;AACtD,0CAAkD;AAClD,8CAAsD;AACtD,8CAAsD;AACtD,gDAAwD;AACxD,gDAAwD;AAExD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;KACpC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,SAAS;AACT,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC;AAC3B,IAAA,sBAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,sBAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC;AAC3B,IAAA,sBAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,oBAAc,EAAC,OAAO,CAAC,CAAC,CAAE,eAAe;AACzC,IAAA,4BAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC;AAC3B,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC;AAC3B,IAAA,sBAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC;AAC3B,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC;AAC3B,IAAA,4BAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,4BAAkB,EAAC,OAAO,CAAC,CAAC;AAE5B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoEpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QA2CjD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
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.initBackupCommand = initBackupCommand;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const archiver_1 = __importDefault(require("archiver"));
|
|
10
|
+
const file_1 = require("../utils/file");
|
|
11
|
+
const logger_1 = require("../utils/logger");
|
|
12
|
+
const errors_1 = require("../utils/errors");
|
|
13
|
+
/**
|
|
14
|
+
* 生成备份文件名
|
|
15
|
+
* 格式: csm-backup-YYYYMMDD-HHmmss.zip
|
|
16
|
+
*/
|
|
17
|
+
function generateBackupName() {
|
|
18
|
+
const now = new Date();
|
|
19
|
+
const year = now.getFullYear();
|
|
20
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
21
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
22
|
+
const hours = String(now.getHours()).padStart(2, '0');
|
|
23
|
+
const minutes = String(now.getMinutes()).padStart(2, '0');
|
|
24
|
+
const seconds = String(now.getSeconds()).padStart(2, '0');
|
|
25
|
+
return `csm-backup-${year}${month}${day}-${hours}${minutes}${seconds}.zip`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 创建 zip 压缩包
|
|
29
|
+
*/
|
|
30
|
+
async function createZipArchive(outputPath, profilesDir, settingsPath, statePath) {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
const output = fs_extra_1.default.createWriteStream(outputPath);
|
|
33
|
+
const archive = (0, archiver_1.default)('zip', { zlib: { level: 9 } });
|
|
34
|
+
output.on('close', () => resolve());
|
|
35
|
+
archive.on('error', (err) => reject(err));
|
|
36
|
+
archive.pipe(output);
|
|
37
|
+
// 添加 profiles 目录
|
|
38
|
+
(async () => {
|
|
39
|
+
if (await fs_extra_1.default.pathExists(profilesDir)) {
|
|
40
|
+
const files = await fs_extra_1.default.readdir(profilesDir);
|
|
41
|
+
for (const file of files) {
|
|
42
|
+
if (file.endsWith('.json')) {
|
|
43
|
+
const filePath = path_1.default.join(profilesDir, file);
|
|
44
|
+
archive.file(filePath, { name: `profiles/${file}` });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// 添加 settings.json
|
|
49
|
+
if (await fs_extra_1.default.pathExists(settingsPath)) {
|
|
50
|
+
archive.file(settingsPath, { name: 'settings.json' });
|
|
51
|
+
}
|
|
52
|
+
// 添加 csm-state.json
|
|
53
|
+
if (await fs_extra_1.default.pathExists(statePath)) {
|
|
54
|
+
archive.file(statePath, { name: 'csm-state.json' });
|
|
55
|
+
}
|
|
56
|
+
archive.finalize();
|
|
57
|
+
})().catch(reject);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function initBackupCommand(program) {
|
|
61
|
+
program
|
|
62
|
+
.command('backup')
|
|
63
|
+
.description('备份所有配置到压缩包')
|
|
64
|
+
.option('-n, --name <name>', '备份文件名,默认自动生成')
|
|
65
|
+
.action(async (options) => {
|
|
66
|
+
try {
|
|
67
|
+
// 1. 确保备份目录存在
|
|
68
|
+
const backupsDir = (0, file_1.getBackupsDir)();
|
|
69
|
+
await fs_extra_1.default.ensureDir(backupsDir);
|
|
70
|
+
// 2. 确定备份文件名和路径
|
|
71
|
+
const backupName = options.name || generateBackupName();
|
|
72
|
+
const backupPath = path_1.default.join(backupsDir, backupName.endsWith('.zip') ? backupName : `${backupName}.zip`);
|
|
73
|
+
// 3. 获取需要备份的路径
|
|
74
|
+
const profilesDir = (0, file_1.getProfilesDir)();
|
|
75
|
+
const settingsPath = (0, file_1.getSettingsPath)();
|
|
76
|
+
const statePath = (0, file_1.getStatePath)();
|
|
77
|
+
// 4. 检查是否有内容需要备份
|
|
78
|
+
const profilesExist = await fs_extra_1.default.pathExists(profilesDir);
|
|
79
|
+
const settingsExist = await fs_extra_1.default.pathExists(settingsPath);
|
|
80
|
+
const stateExist = await fs_extra_1.default.pathExists(statePath);
|
|
81
|
+
if (!profilesExist && !settingsExist && !stateExist) {
|
|
82
|
+
(0, logger_1.error)('没有找到任何配置文件,无法创建备份');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// 5. 创建压缩包
|
|
86
|
+
(0, logger_1.info)('正在创建备份...');
|
|
87
|
+
await createZipArchive(backupPath, profilesDir, settingsPath, statePath);
|
|
88
|
+
// 6. 输出结果
|
|
89
|
+
const stats = await fs_extra_1.default.stat(backupPath);
|
|
90
|
+
const sizeKB = (stats.size / 1024).toFixed(2);
|
|
91
|
+
(0, logger_1.success)(`备份已创建: ${backupPath}`);
|
|
92
|
+
(0, logger_1.info)(`文件大小: ${sizeKB} KB`);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
(0, errors_1.handleCommandError)(err, '备份');
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backups.d.ts","sourceRoot":"","sources":["../../src/commands/backups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkEpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,QAoDlD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
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.initBackupsCommand = initBackupsCommand;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const file_1 = require("../utils/file");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
/**
|
|
12
|
+
* 获取备份文件列表
|
|
13
|
+
*/
|
|
14
|
+
async function getBackupList() {
|
|
15
|
+
const backupsDir = (0, file_1.getBackupsDir)();
|
|
16
|
+
if (!(await fs_extra_1.default.pathExists(backupsDir))) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
const files = await fs_extra_1.default.readdir(backupsDir);
|
|
20
|
+
const backupFiles = files.filter(f => f.endsWith('.zip'));
|
|
21
|
+
const backups = [];
|
|
22
|
+
for (const file of backupFiles) {
|
|
23
|
+
const filePath = path_1.default.join(backupsDir, file);
|
|
24
|
+
const stats = await fs_extra_1.default.stat(filePath);
|
|
25
|
+
backups.push({
|
|
26
|
+
name: file,
|
|
27
|
+
path: filePath,
|
|
28
|
+
createdAt: stats.birthtime.toISOString(),
|
|
29
|
+
size: stats.size
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
// 按创建时间降序排序
|
|
33
|
+
return backups.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 格式化文件大小
|
|
37
|
+
*/
|
|
38
|
+
function formatSize(bytes) {
|
|
39
|
+
if (bytes < 1024) {
|
|
40
|
+
return `${bytes} B`;
|
|
41
|
+
}
|
|
42
|
+
else if (bytes < 1024 * 1024) {
|
|
43
|
+
return `${(bytes / 1024).toFixed(2)} KB`;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 格式化日期时间
|
|
51
|
+
*/
|
|
52
|
+
function formatDateTime(isoString) {
|
|
53
|
+
const date = new Date(isoString);
|
|
54
|
+
const year = date.getFullYear();
|
|
55
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
56
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
57
|
+
const hours = String(date.getHours()).padStart(2, '0');
|
|
58
|
+
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
59
|
+
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
60
|
+
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
61
|
+
}
|
|
62
|
+
function initBackupsCommand(program) {
|
|
63
|
+
program
|
|
64
|
+
.command('backups')
|
|
65
|
+
.description('列出所有备份文件')
|
|
66
|
+
.option('-j, --json', '以 JSON 格式输出')
|
|
67
|
+
.action(async (options) => {
|
|
68
|
+
try {
|
|
69
|
+
const backups = await getBackupList();
|
|
70
|
+
if (backups.length === 0) {
|
|
71
|
+
(0, logger_1.warn)('没有找到任何备份文件');
|
|
72
|
+
(0, logger_1.info)(`备份目录: ${(0, file_1.getBackupsDir)()}`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (options.json) {
|
|
76
|
+
// JSON 格式输出
|
|
77
|
+
console.log(JSON.stringify(backups, null, 2));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// 表格格式输出
|
|
81
|
+
(0, logger_1.success)(`找到 ${backups.length} 个备份文件:\n`);
|
|
82
|
+
// 计算列宽
|
|
83
|
+
const nameWidth = Math.max(35, ...backups.map(b => b.name.length));
|
|
84
|
+
const dateWidth = 20;
|
|
85
|
+
const sizeWidth = 12;
|
|
86
|
+
// 表头
|
|
87
|
+
const header = '名称'.padEnd(nameWidth) +
|
|
88
|
+
'创建时间'.padEnd(dateWidth) +
|
|
89
|
+
'大小'.padEnd(sizeWidth);
|
|
90
|
+
console.log(header);
|
|
91
|
+
console.log('-'.repeat(nameWidth + dateWidth + sizeWidth));
|
|
92
|
+
// 数据行
|
|
93
|
+
for (const backup of backups) {
|
|
94
|
+
const line = backup.name.padEnd(nameWidth) +
|
|
95
|
+
formatDateTime(backup.createdAt).padEnd(dateWidth) +
|
|
96
|
+
formatSize(backup.size).padEnd(sizeWidth);
|
|
97
|
+
console.log(line);
|
|
98
|
+
}
|
|
99
|
+
console.log('');
|
|
100
|
+
(0, logger_1.info)(`备份目录: ${(0, file_1.getBackupsDir)()}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
console.error(`列出备份失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=backups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backups.js","sourceRoot":"","sources":["../../src/commands/backups.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/commands/copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,QAgC/C"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initCopyCommand = initCopyCommand;
|
|
4
|
+
const profile_1 = require("../lib/profile");
|
|
5
|
+
const logger_1 = require("../utils/logger");
|
|
6
|
+
const validator_1 = require("../utils/validator");
|
|
7
|
+
const errors_1 = require("../utils/errors");
|
|
8
|
+
function initCopyCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('copy <src> <dest>')
|
|
11
|
+
.description('复制现有配置创建新配置')
|
|
12
|
+
.action(async (src, dest) => {
|
|
13
|
+
try {
|
|
14
|
+
// 验证目标名称格式
|
|
15
|
+
if (!(0, validator_1.validateProfileName)(dest)) {
|
|
16
|
+
(0, logger_1.error)(`配置名称无效: "${dest}"。名称只能包含字母、数字、连字符和下划线`);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const manager = new profile_1.ProfileManager();
|
|
20
|
+
// 1. 检查源 profile 存在
|
|
21
|
+
const sourceSettings = await manager.get(src);
|
|
22
|
+
// 2. 检查目标名称不存在
|
|
23
|
+
if (await manager.exists(dest)) {
|
|
24
|
+
(0, logger_1.error)(`目标配置 "${dest}" 已存在`);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
// 3. 复制 settings
|
|
28
|
+
await manager.create(dest, sourceSettings);
|
|
29
|
+
(0, logger_1.success)(`成功复制配置: ${src} -> ${dest}`);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
(0, errors_1.handleCommandError)(err, '复制');
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/commands/copy.ts"],"names":[],"mappings":";;AAMA,0CAgCC;AArCD,4CAAgD;AAChD,4CAAiD;AACjD,kDAAyD;AACzD,4CAAqD;AAErD,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,WAAW;YACX,IAAI,CAAC,IAAA,+BAAmB,EAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,IAAA,cAAK,EAAC,YAAY,IAAI,uBAAuB,CAAC,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,wBAAc,EAAE,CAAC;YAErC,oBAAoB;YACpB,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE9C,eAAe;YACf,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,IAAA,cAAK,EAAC,SAAS,IAAI,OAAO,CAAC,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,iBAAiB;YACjB,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAE3C,IAAA,gBAAO,EAAC,WAAW,GAAG,OAAO,IAAI,EAAE,CAAC,CAAC;QAEvC,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":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QA2FjD"}
|