@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.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +43 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/backup.d.ts +3 -0
  8. package/dist/commands/backup.d.ts.map +1 -0
  9. package/dist/commands/backup.js +99 -0
  10. package/dist/commands/backup.js.map +1 -0
  11. package/dist/commands/backups.d.ts +3 -0
  12. package/dist/commands/backups.d.ts.map +1 -0
  13. package/dist/commands/backups.js +109 -0
  14. package/dist/commands/backups.js.map +1 -0
  15. package/dist/commands/copy.d.ts +3 -0
  16. package/dist/commands/copy.d.ts.map +1 -0
  17. package/dist/commands/copy.js +36 -0
  18. package/dist/commands/copy.js.map +1 -0
  19. package/dist/commands/create.d.ts +3 -0
  20. package/dist/commands/create.d.ts.map +1 -0
  21. package/dist/commands/create.js +102 -0
  22. package/dist/commands/create.js.map +1 -0
  23. package/dist/commands/current.d.ts +3 -0
  24. package/dist/commands/current.d.ts.map +1 -0
  25. package/dist/commands/current.js +45 -0
  26. package/dist/commands/current.js.map +1 -0
  27. package/dist/commands/delete.d.ts +3 -0
  28. package/dist/commands/delete.d.ts.map +1 -0
  29. package/dist/commands/delete.js +111 -0
  30. package/dist/commands/delete.js.map +1 -0
  31. package/dist/commands/edit.d.ts +3 -0
  32. package/dist/commands/edit.d.ts.map +1 -0
  33. package/dist/commands/edit.js +86 -0
  34. package/dist/commands/edit.js.map +1 -0
  35. package/dist/commands/export.d.ts +3 -0
  36. package/dist/commands/export.d.ts.map +1 -0
  37. package/dist/commands/export.js +43 -0
  38. package/dist/commands/export.js.map +1 -0
  39. package/dist/commands/import.d.ts +3 -0
  40. package/dist/commands/import.d.ts.map +1 -0
  41. package/dist/commands/import.js +74 -0
  42. package/dist/commands/import.js.map +1 -0
  43. package/dist/commands/index.d.ts +7 -0
  44. package/dist/commands/index.d.ts.map +1 -0
  45. package/dist/commands/index.js +13 -0
  46. package/dist/commands/index.js.map +1 -0
  47. package/dist/commands/list.d.ts +3 -0
  48. package/dist/commands/list.d.ts.map +1 -0
  49. package/dist/commands/list.js +66 -0
  50. package/dist/commands/list.js.map +1 -0
  51. package/dist/commands/rename.d.ts +3 -0
  52. package/dist/commands/rename.d.ts.map +1 -0
  53. package/dist/commands/rename.js +30 -0
  54. package/dist/commands/rename.js.map +1 -0
  55. package/dist/commands/restore.d.ts +3 -0
  56. package/dist/commands/restore.d.ts.map +1 -0
  57. package/dist/commands/restore.js +184 -0
  58. package/dist/commands/restore.js.map +1 -0
  59. package/dist/commands/show.d.ts +3 -0
  60. package/dist/commands/show.d.ts.map +1 -0
  61. package/dist/commands/show.js +24 -0
  62. package/dist/commands/show.js.map +1 -0
  63. package/dist/commands/use.d.ts +3 -0
  64. package/dist/commands/use.d.ts.map +1 -0
  65. package/dist/commands/use.js +234 -0
  66. package/dist/commands/use.js.map +1 -0
  67. package/dist/index.d.ts +13 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +37 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/lib/merge.d.ts +20 -0
  72. package/dist/lib/merge.d.ts.map +1 -0
  73. package/dist/lib/merge.js +146 -0
  74. package/dist/lib/merge.js.map +1 -0
  75. package/dist/lib/profile.d.ts +65 -0
  76. package/dist/lib/profile.d.ts.map +1 -0
  77. package/dist/lib/profile.js +158 -0
  78. package/dist/lib/profile.js.map +1 -0
  79. package/dist/lib/settings.d.ts +72 -0
  80. package/dist/lib/settings.d.ts.map +1 -0
  81. package/dist/lib/settings.js +270 -0
  82. package/dist/lib/settings.js.map +1 -0
  83. package/dist/lib/state.d.ts +55 -0
  84. package/dist/lib/state.d.ts.map +1 -0
  85. package/dist/lib/state.js +145 -0
  86. package/dist/lib/state.js.map +1 -0
  87. package/dist/types/index.d.ts +37 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/index.js +6 -0
  90. package/dist/types/index.js.map +1 -0
  91. package/dist/utils/atomicWrite.d.ts +24 -0
  92. package/dist/utils/atomicWrite.d.ts.map +1 -0
  93. package/dist/utils/atomicWrite.js +67 -0
  94. package/dist/utils/atomicWrite.js.map +1 -0
  95. package/dist/utils/backupValidator.d.ts +32 -0
  96. package/dist/utils/backupValidator.d.ts.map +1 -0
  97. package/dist/utils/backupValidator.js +144 -0
  98. package/dist/utils/backupValidator.js.map +1 -0
  99. package/dist/utils/errors.d.ts +63 -0
  100. package/dist/utils/errors.d.ts.map +1 -0
  101. package/dist/utils/errors.js +117 -0
  102. package/dist/utils/errors.js.map +1 -0
  103. package/dist/utils/file.d.ts +8 -0
  104. package/dist/utils/file.d.ts.map +1 -0
  105. package/dist/utils/file.js +54 -0
  106. package/dist/utils/file.js.map +1 -0
  107. package/dist/utils/logger.d.ts +6 -0
  108. package/dist/utils/logger.d.ts.map +1 -0
  109. package/dist/utils/logger.js +37 -0
  110. package/dist/utils/logger.js.map +1 -0
  111. package/dist/utils/normalize.d.ts +13 -0
  112. package/dist/utils/normalize.d.ts.map +1 -0
  113. package/dist/utils/normalize.js +31 -0
  114. package/dist/utils/normalize.js.map +1 -0
  115. package/dist/utils/validator.d.ts +24 -0
  116. package/dist/utils/validator.d.ts.map +1 -0
  117. package/dist/utils/validator.js +178 -0
  118. package/dist/utils/validator.js.map +1 -0
  119. package/package.json +69 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * 备份验证工具
3
+ *
4
+ * 验证备份文件的完整性和有效性
5
+ */
6
+ export interface BackupValidationResult {
7
+ valid: boolean;
8
+ errors: string[];
9
+ warnings: string[];
10
+ contents: {
11
+ hasSettings: boolean;
12
+ hasState: boolean;
13
+ profileCount: number;
14
+ profiles: string[];
15
+ };
16
+ /** 是否存在路径遍历风险 */
17
+ hasPathTraversalRisk?: boolean;
18
+ }
19
+ /**
20
+ * 检查 ZIP 条目路径是否存在路径遍历攻击风险
21
+ * @param entryPath - ZIP 条目路径
22
+ * @returns 是否安全
23
+ */
24
+ export declare function isEntryPathSafe(entryPath: string): boolean;
25
+ /**
26
+ * 验证备份文件完整性
27
+ *
28
+ * @param backupPath - 备份文件路径
29
+ * @returns 验证结果
30
+ */
31
+ export declare function validateBackup(backupPath: string): Promise<BackupValidationResult>;
32
+ //# sourceMappingURL=backupValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backupValidator.d.ts","sourceRoot":"","sources":["../../src/utils/backupValidator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE;QACR,WAAW,EAAE,OAAO,CAAC;QACrB,QAAQ,EAAE,OAAO,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,iBAAiB;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAwB1D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA6FxF"}
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ /**
3
+ * 备份验证工具
4
+ *
5
+ * 验证备份文件的完整性和有效性
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.isEntryPathSafe = isEntryPathSafe;
12
+ exports.validateBackup = validateBackup;
13
+ const fs_extra_1 = __importDefault(require("fs-extra"));
14
+ const path_1 = __importDefault(require("path"));
15
+ const unzipper_1 = __importDefault(require("unzipper"));
16
+ /**
17
+ * 检查 ZIP 条目路径是否存在路径遍历攻击风险
18
+ * @param entryPath - ZIP 条目路径
19
+ * @returns 是否安全
20
+ */
21
+ function isEntryPathSafe(entryPath) {
22
+ // 规范化路径,处理正斜杠和反斜杠
23
+ const normalized = entryPath.replace(/\\/g, '/');
24
+ // 检查是否以 / 开头(绝对路径)
25
+ if (normalized.startsWith('/')) {
26
+ return false;
27
+ }
28
+ // 检查是否包含 .. 路径遍历
29
+ const parts = normalized.split('/');
30
+ let depth = 0;
31
+ for (const part of parts) {
32
+ if (part === '..') {
33
+ depth--;
34
+ if (depth < 0) {
35
+ return false; // 尝试跳出根目录
36
+ }
37
+ }
38
+ else if (part !== '.' && part !== '') {
39
+ depth++;
40
+ }
41
+ }
42
+ return true;
43
+ }
44
+ /**
45
+ * 验证备份文件完整性
46
+ *
47
+ * @param backupPath - 备份文件路径
48
+ * @returns 验证结果
49
+ */
50
+ async function validateBackup(backupPath) {
51
+ const result = {
52
+ valid: true,
53
+ errors: [],
54
+ warnings: [],
55
+ contents: {
56
+ hasSettings: false,
57
+ hasState: false,
58
+ profileCount: 0,
59
+ profiles: []
60
+ }
61
+ };
62
+ // 1. 检查文件存在
63
+ if (!(await fs_extra_1.default.pathExists(backupPath))) {
64
+ result.valid = false;
65
+ result.errors.push('备份文件不存在');
66
+ return result;
67
+ }
68
+ // 2. 检查文件扩展名
69
+ if (!backupPath.endsWith('.zip')) {
70
+ result.valid = false;
71
+ result.errors.push('备份文件必须是 .zip 格式');
72
+ return result;
73
+ }
74
+ // 3. 检查文件大小
75
+ try {
76
+ const stats = await fs_extra_1.default.stat(backupPath);
77
+ if (stats.size === 0) {
78
+ result.valid = false;
79
+ result.errors.push('备份文件为空');
80
+ return result;
81
+ }
82
+ if (stats.size > 100 * 1024 * 1024) { // 100MB
83
+ result.warnings.push('备份文件较大 (>100MB),恢复可能需要一些时间');
84
+ }
85
+ }
86
+ catch (error) {
87
+ result.valid = false;
88
+ result.errors.push(`无法读取备份文件: ${error instanceof Error ? error.message : String(error)}`);
89
+ return result;
90
+ }
91
+ // 4. 读取 ZIP 文件内容
92
+ try {
93
+ const entries = await readZipEntries(backupPath);
94
+ // 检查路径遍历风险
95
+ for (const entry of entries) {
96
+ if (!isEntryPathSafe(entry)) {
97
+ result.valid = false;
98
+ result.errors.push(`检测到不安全的路径: ${entry}`);
99
+ result.hasPathTraversalRisk = true;
100
+ return result;
101
+ }
102
+ }
103
+ // 检查必需文件
104
+ const hasProfiles = entries.some(e => e.startsWith('profiles/') && e.endsWith('.json'));
105
+ if (!hasProfiles) {
106
+ result.warnings.push('备份中没有包含任何配置文件');
107
+ }
108
+ // 统计内容
109
+ result.contents.hasSettings = entries.includes('settings.json');
110
+ result.contents.hasState = entries.includes('csm-state.json');
111
+ const profileEntries = entries.filter(e => e.startsWith('profiles/') && e.endsWith('.json'));
112
+ result.contents.profileCount = profileEntries.length;
113
+ result.contents.profiles = profileEntries.map(e => path_1.default.basename(e, '.json'));
114
+ // 检查是否有实际内容
115
+ if (!result.contents.hasSettings &&
116
+ !result.contents.hasState &&
117
+ result.contents.profileCount === 0) {
118
+ result.valid = false;
119
+ result.errors.push('备份文件不包含任何有效内容');
120
+ }
121
+ }
122
+ catch (error) {
123
+ result.valid = false;
124
+ result.errors.push(`备份文件格式无效: ${error instanceof Error ? error.message : String(error)}`);
125
+ }
126
+ return result;
127
+ }
128
+ /**
129
+ * 读取 ZIP 文件条目列表
130
+ */
131
+ async function readZipEntries(backupPath) {
132
+ return new Promise((resolve, reject) => {
133
+ const entries = [];
134
+ fs_extra_1.default.createReadStream(backupPath)
135
+ .pipe(unzipper_1.default.Parse())
136
+ .on('entry', (entry) => {
137
+ entries.push(entry.path);
138
+ entry.autodrain();
139
+ })
140
+ .on('close', () => resolve(entries))
141
+ .on('error', reject);
142
+ });
143
+ }
144
+ //# sourceMappingURL=backupValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backupValidator.js","sourceRoot":"","sources":["../../src/utils/backupValidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * CSM 错误处理模块
3
+ *
4
+ * 提供统一的错误类型和处理方式
5
+ */
6
+ /**
7
+ * CSM 错误代码
8
+ */
9
+ export declare enum CsmErrorCode {
10
+ PROFILE_NOT_FOUND = "PROFILE_NOT_FOUND",
11
+ PROFILE_ALREADY_EXISTS = "PROFILE_ALREADY_EXISTS",
12
+ PROFILE_NAME_INVALID = "PROFILE_NAME_INVALID",
13
+ PROFILE_CORRUPTED = "PROFILE_CORRUPTED",
14
+ FILE_READ_ERROR = "FILE_READ_ERROR",
15
+ FILE_WRITE_ERROR = "FILE_WRITE_ERROR",
16
+ FILE_NOT_FOUND = "FILE_NOT_FOUND",
17
+ VALIDATION_ERROR = "VALIDATION_ERROR",
18
+ BACKUP_NOT_FOUND = "BACKUP_NOT_FOUND",
19
+ BACKUP_CORRUPTED = "BACKUP_CORRUPTED",
20
+ UNKNOWN_ERROR = "UNKNOWN_ERROR"
21
+ }
22
+ /**
23
+ * CSM 自定义错误类
24
+ */
25
+ export declare class CsmError extends Error {
26
+ readonly code: CsmErrorCode;
27
+ readonly details?: string;
28
+ constructor(code: CsmErrorCode, message: string, details?: string);
29
+ /**
30
+ * 创建配置不存在错误
31
+ */
32
+ static profileNotFound(name: string): CsmError;
33
+ /**
34
+ * 创建配置已存在错误
35
+ */
36
+ static profileAlreadyExists(name: string): CsmError;
37
+ /**
38
+ * 创建配置名称无效错误
39
+ */
40
+ static profileNameInvalid(name: string, reason: string): CsmError;
41
+ /**
42
+ * 创建配置文件损坏错误
43
+ */
44
+ static profileCorrupted(name: string, details?: string): CsmError;
45
+ /**
46
+ * 创建验证错误
47
+ */
48
+ static validationError(errors: string[]): CsmError;
49
+ }
50
+ /**
51
+ * 格式化错误信息用于显示
52
+ */
53
+ export declare function formatError(error: unknown): string;
54
+ /**
55
+ * 获取错误代码
56
+ */
57
+ export declare function getErrorCode(error: unknown): CsmErrorCode;
58
+ /**
59
+ * 处理命令错误(统一错误处理模式)
60
+ * 打印错误信息并退出进程
61
+ */
62
+ export declare function handleCommandError(err: unknown, commandName: string): never;
63
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,oBAAY,YAAY;IAEtB,iBAAiB,sBAAsB;IACvC,sBAAsB,2BAA2B;IACjD,oBAAoB,yBAAyB;IAC7C,iBAAiB,sBAAsB;IAGvC,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IACrC,cAAc,mBAAmB;IAGjC,gBAAgB,qBAAqB;IAGrC,gBAAgB,qBAAqB;IACrC,gBAAgB,qBAAqB;IAGrC,aAAa,kBAAkB;CAChC;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,EAAE,YAAY,CAAC;IACnC,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC;gBAErB,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAOjE;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAQ9C;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAQnD;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ;IAQjE;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAQjE;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ;CAOnD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAclD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAKzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,CAU3E"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * CSM 错误处理模块
4
+ *
5
+ * 提供统一的错误类型和处理方式
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.CsmError = exports.CsmErrorCode = void 0;
9
+ exports.formatError = formatError;
10
+ exports.getErrorCode = getErrorCode;
11
+ exports.handleCommandError = handleCommandError;
12
+ /**
13
+ * CSM 错误代码
14
+ */
15
+ var CsmErrorCode;
16
+ (function (CsmErrorCode) {
17
+ // 配置相关错误
18
+ CsmErrorCode["PROFILE_NOT_FOUND"] = "PROFILE_NOT_FOUND";
19
+ CsmErrorCode["PROFILE_ALREADY_EXISTS"] = "PROFILE_ALREADY_EXISTS";
20
+ CsmErrorCode["PROFILE_NAME_INVALID"] = "PROFILE_NAME_INVALID";
21
+ CsmErrorCode["PROFILE_CORRUPTED"] = "PROFILE_CORRUPTED";
22
+ // 文件操作错误
23
+ CsmErrorCode["FILE_READ_ERROR"] = "FILE_READ_ERROR";
24
+ CsmErrorCode["FILE_WRITE_ERROR"] = "FILE_WRITE_ERROR";
25
+ CsmErrorCode["FILE_NOT_FOUND"] = "FILE_NOT_FOUND";
26
+ // 验证错误
27
+ CsmErrorCode["VALIDATION_ERROR"] = "VALIDATION_ERROR";
28
+ // 备份相关错误
29
+ CsmErrorCode["BACKUP_NOT_FOUND"] = "BACKUP_NOT_FOUND";
30
+ CsmErrorCode["BACKUP_CORRUPTED"] = "BACKUP_CORRUPTED";
31
+ // 通用错误
32
+ CsmErrorCode["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
33
+ })(CsmErrorCode || (exports.CsmErrorCode = CsmErrorCode = {}));
34
+ /**
35
+ * CSM 自定义错误类
36
+ */
37
+ class CsmError extends Error {
38
+ constructor(code, message, details) {
39
+ super(message);
40
+ this.name = 'CsmError';
41
+ this.code = code;
42
+ this.details = details;
43
+ }
44
+ /**
45
+ * 创建配置不存在错误
46
+ */
47
+ static profileNotFound(name) {
48
+ return new CsmError(CsmErrorCode.PROFILE_NOT_FOUND, `配置 "${name}" 不存在`, `使用 "csm list" 查看所有可用配置`);
49
+ }
50
+ /**
51
+ * 创建配置已存在错误
52
+ */
53
+ static profileAlreadyExists(name) {
54
+ return new CsmError(CsmErrorCode.PROFILE_ALREADY_EXISTS, `配置 "${name}" 已存在`, `使用 "csm show ${name}" 查看该配置`);
55
+ }
56
+ /**
57
+ * 创建配置名称无效错误
58
+ */
59
+ static profileNameInvalid(name, reason) {
60
+ return new CsmError(CsmErrorCode.PROFILE_NAME_INVALID, `配置名称 "${name}" 无效`, reason);
61
+ }
62
+ /**
63
+ * 创建配置文件损坏错误
64
+ */
65
+ static profileCorrupted(name, details) {
66
+ return new CsmError(CsmErrorCode.PROFILE_CORRUPTED, `配置 "${name}" 文件已损坏`, details);
67
+ }
68
+ /**
69
+ * 创建验证错误
70
+ */
71
+ static validationError(errors) {
72
+ return new CsmError(CsmErrorCode.VALIDATION_ERROR, '配置验证失败', errors.join('\n - '));
73
+ }
74
+ }
75
+ exports.CsmError = CsmError;
76
+ /**
77
+ * 格式化错误信息用于显示
78
+ */
79
+ function formatError(error) {
80
+ if (error instanceof CsmError) {
81
+ let message = error.message;
82
+ if (error.details) {
83
+ message += `\n 提示: ${error.details}`;
84
+ }
85
+ return message;
86
+ }
87
+ if (error instanceof Error) {
88
+ return error.message;
89
+ }
90
+ return String(error);
91
+ }
92
+ /**
93
+ * 获取错误代码
94
+ */
95
+ function getErrorCode(error) {
96
+ if (error instanceof CsmError) {
97
+ return error.code;
98
+ }
99
+ return CsmErrorCode.UNKNOWN_ERROR;
100
+ }
101
+ /**
102
+ * 处理命令错误(统一错误处理模式)
103
+ * 打印错误信息并退出进程
104
+ */
105
+ function handleCommandError(err, commandName) {
106
+ if (err instanceof CsmError && err.details) {
107
+ const { error, info } = require('./logger');
108
+ error(err.message);
109
+ info(`提示: ${err.details}`);
110
+ }
111
+ else {
112
+ const { error } = require('./logger');
113
+ error(`${commandName}失败: ${formatError(err)}`);
114
+ }
115
+ process.exit(1);
116
+ }
117
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function getClaudeDir(): string;
2
+ export declare function getCsmDir(): string;
3
+ export declare function getProfilesDir(): string;
4
+ export declare function getSettingsPath(): string;
5
+ export declare function getBackupsDir(): string;
6
+ export declare function getStatePath(): string;
7
+ export declare function ensureClaudeDirs(): Promise<void>;
8
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAaA,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAGD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAGD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAGD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAGD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAGD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAGD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKtD"}
@@ -0,0 +1,54 @@
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.getClaudeDir = getClaudeDir;
7
+ exports.getCsmDir = getCsmDir;
8
+ exports.getProfilesDir = getProfilesDir;
9
+ exports.getSettingsPath = getSettingsPath;
10
+ exports.getBackupsDir = getBackupsDir;
11
+ exports.getStatePath = getStatePath;
12
+ exports.ensureClaudeDirs = ensureClaudeDirs;
13
+ /**
14
+ * 文件操作辅助函数
15
+ */
16
+ const fs_extra_1 = __importDefault(require("fs-extra"));
17
+ const path_1 = __importDefault(require("path"));
18
+ const os_1 = __importDefault(require("os"));
19
+ // Claude Code 配置目录名
20
+ const CLAUDE_DIR_NAME = '.claude';
21
+ // CSM 数据子目录名
22
+ const CSM_DIR_NAME = 'csm';
23
+ // 获取 Claude 配置目录
24
+ function getClaudeDir() {
25
+ return path_1.default.join(os_1.default.homedir(), CLAUDE_DIR_NAME);
26
+ }
27
+ // 获取 CSM 数据目录 (~/.claude/csm)
28
+ function getCsmDir() {
29
+ return path_1.default.join(getClaudeDir(), CSM_DIR_NAME);
30
+ }
31
+ // 获取 Profiles 目录 (~/.claude/csm/profiles)
32
+ function getProfilesDir() {
33
+ return path_1.default.join(getCsmDir(), 'profiles');
34
+ }
35
+ // 获取 Settings 文件路径 (保持在 ~/.claude/settings.json)
36
+ function getSettingsPath() {
37
+ return path_1.default.join(getClaudeDir(), 'settings.json');
38
+ }
39
+ // 获取 Backups 目录 (~/.claude/csm/backups)
40
+ function getBackupsDir() {
41
+ return path_1.default.join(getCsmDir(), 'backups');
42
+ }
43
+ // 获取 State 文件路径 (~/.claude/csm/csm-state.json)
44
+ function getStatePath() {
45
+ return path_1.default.join(getCsmDir(), 'csm-state.json');
46
+ }
47
+ // 确保 Claude 相关目录存在
48
+ async function ensureClaudeDirs() {
49
+ await fs_extra_1.default.ensureDir(getClaudeDir());
50
+ await fs_extra_1.default.ensureDir(getCsmDir());
51
+ await fs_extra_1.default.ensureDir(getProfilesDir());
52
+ await fs_extra_1.default.ensureDir(getBackupsDir());
53
+ }
54
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":";;;;;AAaA,oCAEC;AAGD,8BAEC;AAGD,wCAEC;AAGD,0CAEC;AAGD,sCAEC;AAGD,oCAEC;AAGD,4CAKC;AAhDD;;GAEG;AACH,wDAA0B;AAC1B,gDAAwB;AACxB,4CAAoB;AAEpB,oBAAoB;AACpB,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,aAAa;AACb,MAAM,YAAY,GAAG,KAAK,CAAC;AAE3B,iBAAiB;AACjB,SAAgB,YAAY;IAC1B,OAAO,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAClD,CAAC;AAED,8BAA8B;AAC9B,SAAgB,SAAS;IACvB,OAAO,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC;AAED,0CAA0C;AAC1C,SAAgB,cAAc;IAC5B,OAAO,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED,iDAAiD;AACjD,SAAgB,eAAe;IAC7B,OAAO,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,eAAe,CAAC,CAAC;AACpD,CAAC;AAED,wCAAwC;AACxC,SAAgB,aAAa;IAC3B,OAAO,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,+CAA+C;AAC/C,SAAgB,YAAY;IAC1B,OAAO,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAClD,CAAC;AAED,mBAAmB;AACZ,KAAK,UAAU,gBAAgB;IACpC,MAAM,kBAAE,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,MAAM,kBAAE,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;IAChC,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC;IACrC,MAAM,kBAAE,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function success(message: string): void;
2
+ export declare function error(message: string): void;
3
+ export declare function warn(message: string): void;
4
+ export declare function info(message: string): void;
5
+ export declare function highlightJson(json: object): string;
6
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAOA,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAGD,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAGD,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAGD,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAGD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD"}
@@ -0,0 +1,37 @@
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.success = success;
7
+ exports.error = error;
8
+ exports.warn = warn;
9
+ exports.info = info;
10
+ exports.highlightJson = highlightJson;
11
+ /**
12
+ * 日志输出工具
13
+ */
14
+ const chalk_1 = __importDefault(require("chalk"));
15
+ const cli_highlight_1 = require("cli-highlight");
16
+ // 成功消息 (绿色)
17
+ function success(message) {
18
+ console.log(chalk_1.default.green('✓'), message);
19
+ }
20
+ // 错误消息 (红色)
21
+ function error(message) {
22
+ console.error(chalk_1.default.red('✗'), message);
23
+ }
24
+ // 警告消息 (黄色)
25
+ function warn(message) {
26
+ console.log(chalk_1.default.yellow('!'), message);
27
+ }
28
+ // 信息消息 (灰色)
29
+ function info(message) {
30
+ console.log(chalk_1.default.gray('•'), message);
31
+ }
32
+ // 高亮 JSON 输出
33
+ function highlightJson(json) {
34
+ const jsonString = JSON.stringify(json, null, 2);
35
+ return (0, cli_highlight_1.highlight)(jsonString, { language: 'json', ignoreIllegals: true });
36
+ }
37
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;AAOA,0BAEC;AAGD,sBAEC;AAGD,oBAEC;AAGD,oBAEC;AAGD,sCAGC;AA9BD;;GAEG;AACH,kDAA0B;AAC1B,iDAA0C;AAE1C,YAAY;AACZ,SAAgB,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,YAAY;AACZ,SAAgB,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,YAAY;AACZ,SAAgB,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,YAAY;AACZ,SAAgB,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,aAAa;AACb,SAAgB,aAAa,CAAC,IAAY;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,OAAO,IAAA,yBAAS,EAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 配置格式规范化工具
3
+ */
4
+ import type { ClaudeSettings } from '../types';
5
+ /**
6
+ * 规范化 ClaudeSettings 配置
7
+ * 确保配置格式符合标准
8
+ *
9
+ * 注意:仅在 permissions 字段存在时才规范化其结构,
10
+ * 避免强制创建空数组导致配置文件膨胀
11
+ */
12
+ export declare function normalizeSettings(settings: ClaudeSettings): ClaudeSettings;
13
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,cAAc,CAqB1E"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * 配置格式规范化工具
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.normalizeSettings = normalizeSettings;
7
+ /**
8
+ * 规范化 ClaudeSettings 配置
9
+ * 确保配置格式符合标准
10
+ *
11
+ * 注意:仅在 permissions 字段存在时才规范化其结构,
12
+ * 避免强制创建空数组导致配置文件膨胀
13
+ */
14
+ function normalizeSettings(settings) {
15
+ const result = { ...settings };
16
+ // 仅在 permissions 存在时规范化其结构
17
+ if (result.permissions) {
18
+ result.permissions = {
19
+ // 仅在字段不存在或为空时才设置默认空数组
20
+ ...(result.permissions.allow === undefined ? {} : { allow: result.permissions.allow }),
21
+ ...(result.permissions.deny === undefined ? {} : { deny: result.permissions.deny })
22
+ };
23
+ // 如果 permissions 对象完全为空,移除它
24
+ if (Object.keys(result.permissions).length === 0) {
25
+ delete result.permissions;
26
+ }
27
+ }
28
+ // 移除 undefined 值,保持格式整洁
29
+ return Object.fromEntries(Object.entries(result).filter(([_, v]) => v !== undefined));
30
+ }
31
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAWH,8CAqBC;AA5BD;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,QAAwB;IACxD,MAAM,MAAM,GAAmB,EAAE,GAAG,QAAQ,EAAE,CAAC;IAE/C,2BAA2B;IAC3B,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,WAAW,GAAG;YACnB,sBAAsB;YACtB,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACtF,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;SACpF,CAAC;QAEF,4BAA4B;QAC5B,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CACzC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 配置验证工具
3
+ */
4
+ import type { ClaudeSettings, ValidationResult } from '../types';
5
+ /**
6
+ * 验证 Profile 名称
7
+ * - 只允许字母、数字、连字符、下划线
8
+ * - 防止路径遍历攻击(禁止 .. / \ 等)
9
+ * - 限制长度
10
+ */
11
+ export declare function validateProfileName(name: string): boolean;
12
+ /**
13
+ * 验证 Profile 名称并返回详细结果
14
+ */
15
+ export declare function validateProfileNameWithResult(name: string): ValidationResult;
16
+ /**
17
+ * 验证 Settings 结构
18
+ */
19
+ export declare function validateSettings(settings: ClaudeSettings): boolean;
20
+ /**
21
+ * 验证 Settings 结构并返回详细结果
22
+ */
23
+ export declare function validateSettingsWithResult(settings: unknown): ValidationResult;
24
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAKjE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQzD;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAe5E;AA2HD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAElE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,OAAO,GAAG,gBAAgB,CAE9E"}