ccman 1.0.1 → 2.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/.env.development +3 -0
- package/.env.production +3 -0
- package/.github/workflows/release.yml +5 -5
- package/CLAUDE.md +246 -185
- package/README.md +282 -249
- package/README_zh.md +283 -250
- package/dev-test.sh +40 -0
- package/dist/cli.js +425 -369
- package/dist/cli.js.map +1 -1
- package/dist/commands/lang.d.ts +3 -0
- package/dist/commands/lang.d.ts.map +1 -0
- package/dist/commands/lang.js +99 -0
- package/dist/commands/lang.js.map +1 -0
- package/dist/config/static-env.d.ts +14 -0
- package/dist/config/static-env.d.ts.map +1 -0
- package/dist/config/static-env.js +17 -0
- package/dist/config/static-env.js.map +1 -0
- package/dist/core/CCMConfigManager.d.ts +52 -0
- package/dist/core/CCMConfigManager.d.ts.map +1 -0
- package/dist/core/CCMConfigManager.js +203 -0
- package/dist/core/CCMConfigManager.js.map +1 -0
- package/dist/core/ClaudeConfigManager.d.ts +35 -0
- package/dist/core/ClaudeConfigManager.d.ts.map +1 -0
- package/dist/core/ClaudeConfigManager.js +149 -0
- package/dist/core/ClaudeConfigManager.js.map +1 -0
- package/dist/i18n/LanguageManager.d.ts +43 -0
- package/dist/i18n/LanguageManager.d.ts.map +1 -0
- package/dist/i18n/LanguageManager.js +157 -0
- package/dist/i18n/LanguageManager.js.map +1 -0
- package/dist/i18n/messages.d.ts +65 -0
- package/dist/i18n/messages.d.ts.map +1 -0
- package/dist/i18n/messages.js +144 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -8
- package/dist/index.js.map +1 -1
- package/dist/providers/ProviderManager.d.ts +58 -0
- package/dist/providers/ProviderManager.d.ts.map +1 -0
- package/dist/providers/ProviderManager.js +335 -0
- package/dist/providers/ProviderManager.js.map +1 -0
- package/dist/types/index.d.ts +78 -38
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/env-config.d.ts +27 -0
- package/dist/utils/env-config.d.ts.map +1 -0
- package/dist/{config/constants.js → utils/env-config.js} +36 -50
- package/dist/utils/env-config.js.map +1 -0
- package/dist/utils/version.d.ts +2 -64
- package/dist/utils/version.d.ts.map +1 -1
- package/dist/utils/version.js +12 -158
- package/dist/utils/version.js.map +1 -1
- package/package.json +17 -16
- package/release-temp/README.md +282 -249
- package/release-temp/package.json +17 -16
- package/scripts/build-env.js +75 -0
- package/scripts/modules/create-tag.sh +53 -10
- package/scripts/modules/monitor-release.sh +40 -12
- package/scripts/modules/version-bump.sh +14 -17
- package/scripts/smart-release-v3.sh +20 -26
- package/src/cli.ts +462 -394
- package/src/commands/lang.ts +105 -0
- package/src/core/CCMConfigManager.ts +185 -0
- package/src/core/ClaudeConfigManager.ts +125 -0
- package/src/i18n/LanguageManager.ts +169 -0
- package/src/i18n/messages.ts +233 -0
- package/src/index.ts +4 -5
- package/src/providers/ProviderManager.ts +393 -0
- package/src/types/index.ts +80 -39
- package/src/utils/env-config.ts +53 -0
- package/src/utils/version.ts +11 -184
- package/dist/config/ConfigManager.d.ts +0 -67
- package/dist/config/ConfigManager.d.ts.map +0 -1
- package/dist/config/ConfigManager.js +0 -226
- package/dist/config/ConfigManager.js.map +0 -1
- package/dist/config/EnvironmentManager.d.ts +0 -83
- package/dist/config/EnvironmentManager.d.ts.map +0 -1
- package/dist/config/EnvironmentManager.js +0 -280
- package/dist/config/EnvironmentManager.js.map +0 -1
- package/dist/config/constants.d.ts +0 -40
- package/dist/config/constants.d.ts.map +0 -1
- package/dist/config/constants.js.map +0 -1
- package/dist/shell/ShellManager.d.ts +0 -81
- package/dist/shell/ShellManager.d.ts.map +0 -1
- package/dist/shell/ShellManager.js +0 -490
- package/dist/shell/ShellManager.js.map +0 -1
- package/src/config/ConfigManager.ts +0 -227
- package/src/config/EnvironmentManager.ts +0 -327
- package/src/config/constants.ts +0 -64
- package/src/shell/ShellManager.ts +0 -526
package/src/types/index.ts
CHANGED
|
@@ -1,60 +1,101 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Claude Code Manager 类型定义
|
|
3
|
+
* 新架构:直接修改 ~/.claude/settings.json
|
|
3
4
|
*/
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Claude settings.json 结构
|
|
8
|
+
*/
|
|
9
|
+
export interface ClaudeSettings {
|
|
10
|
+
env: {
|
|
11
|
+
ANTHROPIC_AUTH_TOKEN: string;
|
|
12
|
+
ANTHROPIC_BASE_URL: string;
|
|
13
|
+
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC?: number;
|
|
14
|
+
};
|
|
15
|
+
permissions: {
|
|
16
|
+
allow: string[];
|
|
17
|
+
deny: string[];
|
|
18
|
+
};
|
|
19
|
+
apiKeyHelper: string;
|
|
16
20
|
}
|
|
17
21
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
/**
|
|
23
|
+
* 供应商配置
|
|
24
|
+
*/
|
|
25
|
+
export interface ProviderConfig {
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
config: ClaudeSettings;
|
|
29
|
+
metadata: {
|
|
30
|
+
createdAt: string;
|
|
31
|
+
updatedAt: string;
|
|
32
|
+
usageCount: number;
|
|
33
|
+
};
|
|
25
34
|
}
|
|
26
35
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
/**
|
|
37
|
+
* CCM 主配置
|
|
38
|
+
*/
|
|
39
|
+
export interface CCMConfig {
|
|
40
|
+
currentProvider: string;
|
|
41
|
+
claudeConfigPath: string;
|
|
42
|
+
providers: {
|
|
43
|
+
[providerId: string]: {
|
|
44
|
+
name: string;
|
|
45
|
+
configFile: string;
|
|
46
|
+
lastUsed: string;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
settings: {
|
|
50
|
+
language: 'zh' | 'en' | 'auto' | null;
|
|
51
|
+
firstRun: boolean;
|
|
52
|
+
};
|
|
53
|
+
metadata: {
|
|
54
|
+
version: string;
|
|
55
|
+
createdAt: string;
|
|
56
|
+
updatedAt: string;
|
|
57
|
+
};
|
|
34
58
|
}
|
|
35
59
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
60
|
+
/**
|
|
61
|
+
* 添加供应商选项
|
|
62
|
+
*/
|
|
63
|
+
export interface AddProviderOptions {
|
|
64
|
+
id: string;
|
|
65
|
+
name: string;
|
|
66
|
+
description?: string;
|
|
67
|
+
baseUrl: string;
|
|
68
|
+
apiKey: string;
|
|
69
|
+
apiKeyHelper?: string;
|
|
39
70
|
}
|
|
40
71
|
|
|
41
|
-
|
|
72
|
+
/**
|
|
73
|
+
* 供应商列表项
|
|
74
|
+
*/
|
|
75
|
+
export interface ProviderListItem {
|
|
76
|
+
id: string;
|
|
42
77
|
name: string;
|
|
78
|
+
description: string;
|
|
43
79
|
baseUrl: string;
|
|
44
|
-
|
|
45
|
-
|
|
80
|
+
isCurrent: boolean;
|
|
81
|
+
lastUsed?: string;
|
|
82
|
+
usageCount: number;
|
|
46
83
|
}
|
|
47
84
|
|
|
48
|
-
|
|
85
|
+
/**
|
|
86
|
+
* 操作结果
|
|
87
|
+
*/
|
|
88
|
+
export interface OperationResult {
|
|
49
89
|
success: boolean;
|
|
50
|
-
filePath: string;
|
|
51
90
|
message: string;
|
|
52
91
|
error?: string;
|
|
53
92
|
}
|
|
54
93
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
94
|
+
/**
|
|
95
|
+
* 语言配置统计
|
|
96
|
+
*/
|
|
97
|
+
export interface LanguageStats {
|
|
98
|
+
current: 'zh' | 'en' | 'auto';
|
|
99
|
+
isFirstRun: boolean;
|
|
100
|
+
autoDetected?: string;
|
|
101
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as os from 'os';
|
|
3
|
+
import { CCM_CONFIG_DIR, CLAUDE_CONFIG_PATH, STATIC_ENV } from '../config/static-env';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 环境配置管理器
|
|
7
|
+
* 使用编译时生成的静态配置
|
|
8
|
+
*/
|
|
9
|
+
export class EnvConfigManager {
|
|
10
|
+
private static instance: EnvConfigManager | null = null;
|
|
11
|
+
|
|
12
|
+
private constructor() {}
|
|
13
|
+
|
|
14
|
+
static getInstance(): EnvConfigManager {
|
|
15
|
+
if (!EnvConfigManager.instance) {
|
|
16
|
+
EnvConfigManager.instance = new EnvConfigManager();
|
|
17
|
+
}
|
|
18
|
+
return EnvConfigManager.instance;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 获取CCM配置目录路径
|
|
23
|
+
*/
|
|
24
|
+
getCCMConfigDir(): string {
|
|
25
|
+
return this.expandPath(CCM_CONFIG_DIR);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 获取Claude配置文件路径
|
|
30
|
+
*/
|
|
31
|
+
getClaudeConfigPath(): string {
|
|
32
|
+
return this.expandPath(CLAUDE_CONFIG_PATH);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 扩展路径中的~符号
|
|
37
|
+
*/
|
|
38
|
+
private expandPath(configPath: string): string {
|
|
39
|
+
return configPath.startsWith('~')
|
|
40
|
+
? path.join(os.homedir(), configPath.slice(2))
|
|
41
|
+
: configPath;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 获取当前环境(从编译时确定的NODE_ENV)
|
|
46
|
+
*/
|
|
47
|
+
getCurrentEnvironment(): 'development' | 'production' {
|
|
48
|
+
return STATIC_ENV.NODE_ENV as 'development' | 'production';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// 全局实例
|
|
53
|
+
export const envConfig = EnvConfigManager.getInstance();
|
package/src/utils/version.ts
CHANGED
|
@@ -1,189 +1,16 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* 读取 package.json 中的版本号
|
|
6
6
|
*/
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* 版本工具类
|
|
17
|
-
*/
|
|
18
|
-
export class VersionManager {
|
|
19
|
-
private static instance: VersionManager;
|
|
20
|
-
private cachedVersion?: VersionInfo;
|
|
21
|
-
|
|
22
|
-
private constructor() {}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* 获取单例实例
|
|
26
|
-
*/
|
|
27
|
-
static getInstance(): VersionManager {
|
|
28
|
-
if (!VersionManager.instance) {
|
|
29
|
-
VersionManager.instance = new VersionManager();
|
|
30
|
-
}
|
|
31
|
-
return VersionManager.instance;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* 获取当前版本信息
|
|
36
|
-
*/
|
|
37
|
-
getCurrentVersion(): VersionInfo {
|
|
38
|
-
if (this.cachedVersion) {
|
|
39
|
-
return this.cachedVersion;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
try {
|
|
43
|
-
const packageJsonPath = this.getPackageJsonPath();
|
|
44
|
-
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
45
|
-
const version = packageJson.version;
|
|
46
|
-
|
|
47
|
-
this.cachedVersion = this.parseVersion(version);
|
|
48
|
-
return this.cachedVersion;
|
|
49
|
-
} catch (error) {
|
|
50
|
-
console.warn('⚠️ 无法读取版本信息,使用默认版本');
|
|
51
|
-
this.cachedVersion = this.parseVersion('0.0.1');
|
|
52
|
-
return this.cachedVersion;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 获取版本字符串
|
|
58
|
-
*/
|
|
59
|
-
getVersionString(): string {
|
|
60
|
-
return this.getCurrentVersion().version;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* 解析版本字符串
|
|
65
|
-
*/
|
|
66
|
-
private parseVersion(versionString: string): VersionInfo {
|
|
67
|
-
const match = versionString.match(/^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/);
|
|
68
|
-
|
|
69
|
-
if (!match) {
|
|
70
|
-
throw new Error(`无效的版本格式: ${versionString}`);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const [, major, minor, patch, prerelease] = match;
|
|
74
|
-
|
|
75
|
-
return {
|
|
76
|
-
version: versionString,
|
|
77
|
-
major: parseInt(major, 10),
|
|
78
|
-
minor: parseInt(minor, 10),
|
|
79
|
-
patch: parseInt(patch, 10),
|
|
80
|
-
prerelease
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* 获取 package.json 路径
|
|
86
|
-
*/
|
|
87
|
-
private getPackageJsonPath(): string {
|
|
88
|
-
// 在构建后的环境中,package.json 在 ../package.json
|
|
89
|
-
// 在开发环境中,可能在不同的位置
|
|
90
|
-
const paths = [
|
|
91
|
-
join(__dirname, '../package.json'), // 构建后
|
|
92
|
-
join(__dirname, '../../package.json'), // 开发环境
|
|
93
|
-
join(process.cwd(), 'package.json') // 当前工作目录
|
|
94
|
-
];
|
|
95
|
-
|
|
96
|
-
for (const path of paths) {
|
|
97
|
-
try {
|
|
98
|
-
readFileSync(path, 'utf8');
|
|
99
|
-
return path;
|
|
100
|
-
} catch {
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
throw new Error('找不到 package.json 文件');
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* 预测下一个版本
|
|
110
|
-
*/
|
|
111
|
-
getNextVersion(type: 'patch' | 'minor' | 'major'): string {
|
|
112
|
-
const current = this.getCurrentVersion();
|
|
113
|
-
|
|
114
|
-
switch (type) {
|
|
115
|
-
case 'patch':
|
|
116
|
-
return `${current.major}.${current.minor}.${current.patch + 1}`;
|
|
117
|
-
case 'minor':
|
|
118
|
-
return `${current.major}.${current.minor + 1}.0`;
|
|
119
|
-
case 'major':
|
|
120
|
-
return `${current.major + 1}.0.0`;
|
|
121
|
-
default:
|
|
122
|
-
throw new Error(`不支持的版本类型: ${type}`);
|
|
123
|
-
}
|
|
7
|
+
export function getPackageVersion(): string {
|
|
8
|
+
try {
|
|
9
|
+
const packageJsonPath = path.join(__dirname, '../../package.json');
|
|
10
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
11
|
+
return packageJson.version || '0.0.0';
|
|
12
|
+
} catch (error) {
|
|
13
|
+
console.warn('Failed to read package.json version, using fallback');
|
|
14
|
+
return '0.0.0';
|
|
124
15
|
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* 获取版本变更建议(基于 git 历史分析)
|
|
128
|
-
*/
|
|
129
|
-
async getVersionSuggestion(): Promise<'patch' | 'minor' | 'major'> {
|
|
130
|
-
try {
|
|
131
|
-
// 这里可以添加 git 历史分析逻辑
|
|
132
|
-
// 比如分析提交信息中的关键词来推荐版本类型
|
|
133
|
-
const { exec } = await import('child_process');
|
|
134
|
-
const { promisify } = await import('util');
|
|
135
|
-
const execAsync = promisify(exec);
|
|
136
|
-
|
|
137
|
-
// 获取最近的提交信息
|
|
138
|
-
const { stdout } = await execAsync('git log --oneline -10');
|
|
139
|
-
const commits = stdout.toLowerCase();
|
|
140
|
-
|
|
141
|
-
// 简单的启发式规则
|
|
142
|
-
if (commits.includes('breaking') || commits.includes('major')) {
|
|
143
|
-
return 'major';
|
|
144
|
-
} else if (commits.includes('feat') || commits.includes('feature') || commits.includes('add')) {
|
|
145
|
-
return 'minor';
|
|
146
|
-
} else {
|
|
147
|
-
return 'patch';
|
|
148
|
-
}
|
|
149
|
-
} catch {
|
|
150
|
-
// 默认推荐 patch
|
|
151
|
-
return 'patch';
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* 清除缓存(测试用)
|
|
157
|
-
*/
|
|
158
|
-
clearCache(): void {
|
|
159
|
-
this.cachedVersion = undefined;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* 便捷函数:获取当前版本字符串
|
|
165
|
-
*/
|
|
166
|
-
export function getCurrentVersion(): string {
|
|
167
|
-
return VersionManager.getInstance().getVersionString();
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* 便捷函数:获取版本信息
|
|
172
|
-
*/
|
|
173
|
-
export function getVersionInfo(): VersionInfo {
|
|
174
|
-
return VersionManager.getInstance().getCurrentVersion();
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* 便捷函数:获取下一个版本
|
|
179
|
-
*/
|
|
180
|
-
export function getNextVersion(type: 'patch' | 'minor' | 'major'): string {
|
|
181
|
-
return VersionManager.getInstance().getNextVersion(type);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* 便捷函数:获取版本建议
|
|
186
|
-
*/
|
|
187
|
-
export async function getVersionSuggestion(): Promise<'patch' | 'minor' | 'major'> {
|
|
188
|
-
return VersionManager.getInstance().getVersionSuggestion();
|
|
189
16
|
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { Config, ClaudeEnv, GlobalSettings, AddEnvOptions, EnvironmentListItem } from '../types';
|
|
2
|
-
export declare class ConfigManager {
|
|
3
|
-
private readonly configDir;
|
|
4
|
-
private readonly configFile;
|
|
5
|
-
constructor();
|
|
6
|
-
/**
|
|
7
|
-
* 确保配置目录存在
|
|
8
|
-
*/
|
|
9
|
-
private ensureConfigDir;
|
|
10
|
-
/**
|
|
11
|
-
* 获取配置
|
|
12
|
-
*/
|
|
13
|
-
getConfig(): Config;
|
|
14
|
-
/**
|
|
15
|
-
* 保存配置
|
|
16
|
-
*/
|
|
17
|
-
saveConfig(config: Config): void;
|
|
18
|
-
/**
|
|
19
|
-
* 添加环境
|
|
20
|
-
*/
|
|
21
|
-
addEnvironment(options: AddEnvOptions): ClaudeEnv;
|
|
22
|
-
/**
|
|
23
|
-
* 删除环境
|
|
24
|
-
*/
|
|
25
|
-
removeEnvironment(name: string): void;
|
|
26
|
-
/**
|
|
27
|
-
* 设置当前环境
|
|
28
|
-
*/
|
|
29
|
-
setCurrentEnvironment(name: string): ClaudeEnv;
|
|
30
|
-
/**
|
|
31
|
-
* 获取当前环境
|
|
32
|
-
*/
|
|
33
|
-
getCurrentEnvironment(): ClaudeEnv | null;
|
|
34
|
-
/**
|
|
35
|
-
* 获取所有环境列表
|
|
36
|
-
*/
|
|
37
|
-
listEnvironments(): EnvironmentListItem[];
|
|
38
|
-
/**
|
|
39
|
-
* 获取指定环境
|
|
40
|
-
*/
|
|
41
|
-
getEnvironment(name: string): ClaudeEnv | null;
|
|
42
|
-
/**
|
|
43
|
-
* 更新环境
|
|
44
|
-
*/
|
|
45
|
-
updateEnvironment(name: string, updates: Partial<Omit<ClaudeEnv, 'name' | 'createdAt'>>): ClaudeEnv;
|
|
46
|
-
/**
|
|
47
|
-
* 更新全局设置
|
|
48
|
-
*/
|
|
49
|
-
updateSettings(settings: Partial<GlobalSettings>): GlobalSettings;
|
|
50
|
-
/**
|
|
51
|
-
* 获取全局设置
|
|
52
|
-
*/
|
|
53
|
-
getSettings(): GlobalSettings;
|
|
54
|
-
/**
|
|
55
|
-
* 检查环境是否存在
|
|
56
|
-
*/
|
|
57
|
-
hasEnvironment(name: string): boolean;
|
|
58
|
-
/**
|
|
59
|
-
* 获取环境数量
|
|
60
|
-
*/
|
|
61
|
-
getEnvironmentCount(): number;
|
|
62
|
-
/**
|
|
63
|
-
* 清除所有环境和重置配置
|
|
64
|
-
*/
|
|
65
|
-
clearAll(): void;
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=ConfigManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAGjG,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;;IAQpC;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,SAAS,IAAI,MAAM;IAsBnB;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQhC;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS;IAyBjD;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAkBrC;;OAEG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAc9C;;OAEG;IACH,qBAAqB,IAAI,SAAS,GAAG,IAAI;IAUzC;;OAEG;IACH,gBAAgB,IAAI,mBAAmB,EAAE;IASzC;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAK9C;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,GAAG,SAAS;IAgBnG;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc;IAUjE;;OAEG;IACH,WAAW,IAAI,cAAc;IAI7B;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKrC;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAK7B;;OAEG;IACH,QAAQ,IAAI,IAAI;CAUjB"}
|
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.ConfigManager = void 0;
|
|
37
|
-
const fs = __importStar(require("fs"));
|
|
38
|
-
const constants_1 = require("./constants");
|
|
39
|
-
class ConfigManager {
|
|
40
|
-
constructor() {
|
|
41
|
-
this.configDir = (0, constants_1.getConfigDir)();
|
|
42
|
-
this.configFile = (0, constants_1.getConfigFile)();
|
|
43
|
-
this.ensureConfigDir();
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* 确保配置目录存在
|
|
47
|
-
*/
|
|
48
|
-
ensureConfigDir() {
|
|
49
|
-
if (!fs.existsSync(this.configDir)) {
|
|
50
|
-
fs.mkdirSync(this.configDir, { recursive: true });
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* 获取配置
|
|
55
|
-
*/
|
|
56
|
-
getConfig() {
|
|
57
|
-
if (!fs.existsSync(this.configFile)) {
|
|
58
|
-
const defaultConfig = {
|
|
59
|
-
current: null,
|
|
60
|
-
environments: {},
|
|
61
|
-
settings: {
|
|
62
|
-
autoWriteShell: true,
|
|
63
|
-
preferredShell: 'auto'
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
this.saveConfig(defaultConfig);
|
|
67
|
-
return defaultConfig;
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
const content = fs.readFileSync(this.configFile, 'utf8');
|
|
71
|
-
return JSON.parse(content);
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
throw new Error(`Failed to read config: ${error}`);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* 保存配置
|
|
79
|
-
*/
|
|
80
|
-
saveConfig(config) {
|
|
81
|
-
try {
|
|
82
|
-
fs.writeFileSync(this.configFile, JSON.stringify(config, null, 2));
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
throw new Error(`Failed to save config: ${error}`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* 添加环境
|
|
90
|
-
*/
|
|
91
|
-
addEnvironment(options) {
|
|
92
|
-
const config = this.getConfig();
|
|
93
|
-
if (config.environments[options.name]) {
|
|
94
|
-
throw new Error(`Environment "${options.name}" already exists`);
|
|
95
|
-
}
|
|
96
|
-
const newEnv = {
|
|
97
|
-
name: options.name,
|
|
98
|
-
baseUrl: options.baseUrl,
|
|
99
|
-
apiKey: options.apiKey,
|
|
100
|
-
createdAt: new Date().toISOString()
|
|
101
|
-
};
|
|
102
|
-
config.environments[options.name] = newEnv;
|
|
103
|
-
// 如果是第一个环境,设为当前环境
|
|
104
|
-
if (!config.current) {
|
|
105
|
-
config.current = options.name;
|
|
106
|
-
}
|
|
107
|
-
this.saveConfig(config);
|
|
108
|
-
return newEnv;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* 删除环境
|
|
112
|
-
*/
|
|
113
|
-
removeEnvironment(name) {
|
|
114
|
-
const config = this.getConfig();
|
|
115
|
-
if (!config.environments[name]) {
|
|
116
|
-
throw new Error(`Environment "${name}" not found`);
|
|
117
|
-
}
|
|
118
|
-
delete config.environments[name];
|
|
119
|
-
// 如果删除的是当前环境,清空当前环境或切换到第一个可用环境
|
|
120
|
-
if (config.current === name) {
|
|
121
|
-
const remainingEnvs = Object.keys(config.environments);
|
|
122
|
-
config.current = remainingEnvs.length > 0 ? remainingEnvs[0] : null;
|
|
123
|
-
}
|
|
124
|
-
this.saveConfig(config);
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* 设置当前环境
|
|
128
|
-
*/
|
|
129
|
-
setCurrentEnvironment(name) {
|
|
130
|
-
const config = this.getConfig();
|
|
131
|
-
if (!config.environments[name]) {
|
|
132
|
-
throw new Error(`Environment "${name}" not found`);
|
|
133
|
-
}
|
|
134
|
-
config.current = name;
|
|
135
|
-
config.environments[name].lastUsed = new Date().toISOString();
|
|
136
|
-
this.saveConfig(config);
|
|
137
|
-
return config.environments[name];
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* 获取当前环境
|
|
141
|
-
*/
|
|
142
|
-
getCurrentEnvironment() {
|
|
143
|
-
const config = this.getConfig();
|
|
144
|
-
if (!config.current || !config.environments[config.current]) {
|
|
145
|
-
return null;
|
|
146
|
-
}
|
|
147
|
-
return config.environments[config.current];
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* 获取所有环境列表
|
|
151
|
-
*/
|
|
152
|
-
listEnvironments() {
|
|
153
|
-
const config = this.getConfig();
|
|
154
|
-
return Object.values(config.environments).map(env => ({
|
|
155
|
-
...env,
|
|
156
|
-
isCurrent: env.name === config.current
|
|
157
|
-
}));
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* 获取指定环境
|
|
161
|
-
*/
|
|
162
|
-
getEnvironment(name) {
|
|
163
|
-
const config = this.getConfig();
|
|
164
|
-
return config.environments[name] || null;
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* 更新环境
|
|
168
|
-
*/
|
|
169
|
-
updateEnvironment(name, updates) {
|
|
170
|
-
const config = this.getConfig();
|
|
171
|
-
if (!config.environments[name]) {
|
|
172
|
-
throw new Error(`Environment "${name}" not found`);
|
|
173
|
-
}
|
|
174
|
-
config.environments[name] = {
|
|
175
|
-
...config.environments[name],
|
|
176
|
-
...updates
|
|
177
|
-
};
|
|
178
|
-
this.saveConfig(config);
|
|
179
|
-
return config.environments[name];
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* 更新全局设置
|
|
183
|
-
*/
|
|
184
|
-
updateSettings(settings) {
|
|
185
|
-
const config = this.getConfig();
|
|
186
|
-
config.settings = {
|
|
187
|
-
...config.settings,
|
|
188
|
-
...settings
|
|
189
|
-
};
|
|
190
|
-
this.saveConfig(config);
|
|
191
|
-
return config.settings;
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* 获取全局设置
|
|
195
|
-
*/
|
|
196
|
-
getSettings() {
|
|
197
|
-
return this.getConfig().settings;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* 检查环境是否存在
|
|
201
|
-
*/
|
|
202
|
-
hasEnvironment(name) {
|
|
203
|
-
const config = this.getConfig();
|
|
204
|
-
return !!config.environments[name];
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* 获取环境数量
|
|
208
|
-
*/
|
|
209
|
-
getEnvironmentCount() {
|
|
210
|
-
const config = this.getConfig();
|
|
211
|
-
return Object.keys(config.environments).length;
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* 清除所有环境和重置配置
|
|
215
|
-
*/
|
|
216
|
-
clearAll() {
|
|
217
|
-
const config = this.getConfig();
|
|
218
|
-
// 重置配置到初始状态
|
|
219
|
-
config.current = null;
|
|
220
|
-
config.environments = {};
|
|
221
|
-
// 保存重置后的配置
|
|
222
|
-
this.saveConfig(config);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
exports.ConfigManager = ConfigManager;
|
|
226
|
-
//# sourceMappingURL=ConfigManager.js.map
|