colyn-cli 3.1.4
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/README-en.md +85 -0
- package/README.md +85 -0
- package/bin/colyn +25 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +116 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +6 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.helpers.d.ts +48 -0
- package/dist/commands/add.helpers.d.ts.map +1 -0
- package/dist/commands/add.helpers.js +251 -0
- package/dist/commands/add.helpers.js.map +1 -0
- package/dist/commands/add.js +286 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/checkout.d.ts +16 -0
- package/dist/commands/checkout.d.ts.map +1 -0
- package/dist/commands/checkout.js +428 -0
- package/dist/commands/checkout.js.map +1 -0
- package/dist/commands/completion.d.ts +10 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +380 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +338 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +41 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/info.d.ts +6 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +374 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.handlers.d.ts +27 -0
- package/dist/commands/init.handlers.d.ts.map +1 -0
- package/dist/commands/init.handlers.js +314 -0
- package/dist/commands/init.handlers.js.map +1 -0
- package/dist/commands/init.helpers.d.ts +42 -0
- package/dist/commands/init.helpers.d.ts.map +1 -0
- package/dist/commands/init.helpers.js +275 -0
- package/dist/commands/init.helpers.js.map +1 -0
- package/dist/commands/init.js +61 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +6 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.helpers.d.ts +32 -0
- package/dist/commands/install.helpers.d.ts.map +1 -0
- package/dist/commands/install.helpers.js +124 -0
- package/dist/commands/install.helpers.js.map +1 -0
- package/dist/commands/install.js +104 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list-project.d.ts +11 -0
- package/dist/commands/list-project.d.ts.map +1 -0
- package/dist/commands/list-project.js +260 -0
- package/dist/commands/list-project.js.map +1 -0
- package/dist/commands/list.d.ts +15 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.helpers.d.ts +50 -0
- package/dist/commands/list.helpers.d.ts.map +1 -0
- package/dist/commands/list.helpers.js +143 -0
- package/dist/commands/list.helpers.js.map +1 -0
- package/dist/commands/list.js +530 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/merge.d.ts +6 -0
- package/dist/commands/merge.d.ts.map +1 -0
- package/dist/commands/merge.helpers.d.ts +74 -0
- package/dist/commands/merge.helpers.d.ts.map +1 -0
- package/dist/commands/merge.helpers.js +307 -0
- package/dist/commands/merge.helpers.js.map +1 -0
- package/dist/commands/merge.js +260 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/release.d.ts +6 -0
- package/dist/commands/release.d.ts.map +1 -0
- package/dist/commands/release.helpers.d.ts +61 -0
- package/dist/commands/release.helpers.d.ts.map +1 -0
- package/dist/commands/release.helpers.js +277 -0
- package/dist/commands/release.helpers.js.map +1 -0
- package/dist/commands/release.js +127 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/commands/remove.d.ts +6 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.helpers.d.ts +59 -0
- package/dist/commands/remove.helpers.d.ts.map +1 -0
- package/dist/commands/remove.helpers.js +190 -0
- package/dist/commands/remove.helpers.js.map +1 -0
- package/dist/commands/remove.js +137 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/repair.d.ts +6 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.helpers.d.ts +5 -0
- package/dist/commands/repair.helpers.d.ts.map +1 -0
- package/dist/commands/repair.helpers.js +499 -0
- package/dist/commands/repair.helpers.js.map +1 -0
- package/dist/commands/repair.js +28 -0
- package/dist/commands/repair.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +116 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/system-integration.d.ts +6 -0
- package/dist/commands/system-integration.d.ts.map +1 -0
- package/dist/commands/system-integration.helpers.d.ts +70 -0
- package/dist/commands/system-integration.helpers.d.ts.map +1 -0
- package/dist/commands/system-integration.helpers.js +313 -0
- package/dist/commands/system-integration.helpers.js.map +1 -0
- package/dist/commands/system-integration.js +132 -0
- package/dist/commands/system-integration.js.map +1 -0
- package/dist/commands/tmux.d.ts +11 -0
- package/dist/commands/tmux.d.ts.map +1 -0
- package/dist/commands/tmux.js +500 -0
- package/dist/commands/tmux.js.map +1 -0
- package/dist/commands/todo.d.ts +6 -0
- package/dist/commands/todo.d.ts.map +1 -0
- package/dist/commands/todo.helpers.d.ts +50 -0
- package/dist/commands/todo.helpers.d.ts.map +1 -0
- package/dist/commands/todo.helpers.js +297 -0
- package/dist/commands/todo.helpers.js.map +1 -0
- package/dist/commands/todo.js +579 -0
- package/dist/commands/todo.js.map +1 -0
- package/dist/commands/update.d.ts +18 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.helpers.d.ts +89 -0
- package/dist/commands/update.helpers.d.ts.map +1 -0
- package/dist/commands/update.helpers.js +335 -0
- package/dist/commands/update.helpers.js.map +1 -0
- package/dist/commands/update.js +187 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/core/config-loader.d.ts +47 -0
- package/dist/core/config-loader.d.ts.map +1 -0
- package/dist/core/config-loader.js +188 -0
- package/dist/core/config-loader.js.map +1 -0
- package/dist/core/config-merger.d.ts +29 -0
- package/dist/core/config-merger.d.ts.map +1 -0
- package/dist/core/config-merger.js +100 -0
- package/dist/core/config-merger.js.map +1 -0
- package/dist/core/config-migration.d.ts +64 -0
- package/dist/core/config-migration.d.ts.map +1 -0
- package/dist/core/config-migration.js +340 -0
- package/dist/core/config-migration.js.map +1 -0
- package/dist/core/config-new.d.ts +19 -0
- package/dist/core/config-new.d.ts.map +1 -0
- package/dist/core/config-new.js +58 -0
- package/dist/core/config-new.js.map +1 -0
- package/dist/core/config-schema.d.ts +221 -0
- package/dist/core/config-schema.d.ts.map +1 -0
- package/dist/core/config-schema.js +168 -0
- package/dist/core/config-schema.js.map +1 -0
- package/dist/core/config.d.ts +55 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +143 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/dev-server.d.ts +29 -0
- package/dist/core/dev-server.d.ts.map +1 -0
- package/dist/core/dev-server.js +54 -0
- package/dist/core/dev-server.js.map +1 -0
- package/dist/core/discovery.d.ts +51 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +247 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/env.d.ts +13 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/env.js +75 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/git.d.ts +31 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +56 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/paths.d.ts +86 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +256 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/tmux-config.d.ts +174 -0
- package/dist/core/tmux-config.d.ts.map +1 -0
- package/dist/core/tmux-config.js +545 -0
- package/dist/core/tmux-config.js.map +1 -0
- package/dist/core/tmux-config.legacy.d.ts +243 -0
- package/dist/core/tmux-config.legacy.d.ts.map +1 -0
- package/dist/core/tmux-config.legacy.js +896 -0
- package/dist/core/tmux-config.legacy.js.map +1 -0
- package/dist/core/tmux.d.ts +214 -0
- package/dist/core/tmux.d.ts.map +1 -0
- package/dist/core/tmux.js +712 -0
- package/dist/core/tmux.js.map +1 -0
- package/dist/core/toolchain-resolver.d.ts +51 -0
- package/dist/core/toolchain-resolver.d.ts.map +1 -0
- package/dist/core/toolchain-resolver.js +364 -0
- package/dist/core/toolchain-resolver.js.map +1 -0
- package/dist/core/worktree-status.d.ts +20 -0
- package/dist/core/worktree-status.d.ts.map +1 -0
- package/dist/core/worktree-status.js +67 -0
- package/dist/core/worktree-status.js.map +1 -0
- package/dist/i18n/index.d.ts +36 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +157 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/locales/en.d.ts +866 -0
- package/dist/i18n/locales/en.d.ts.map +1 -0
- package/dist/i18n/locales/en.js +985 -0
- package/dist/i18n/locales/en.js.map +1 -0
- package/dist/i18n/locales/zh-CN.d.ts +865 -0
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -0
- package/dist/i18n/locales/zh-CN.js +985 -0
- package/dist/i18n/locales/zh-CN.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/builtin/gradle.d.ts +9 -0
- package/dist/plugins/builtin/gradle.d.ts.map +1 -0
- package/dist/plugins/builtin/gradle.js +164 -0
- package/dist/plugins/builtin/gradle.js.map +1 -0
- package/dist/plugins/builtin/maven.d.ts +9 -0
- package/dist/plugins/builtin/maven.d.ts.map +1 -0
- package/dist/plugins/builtin/maven.js +127 -0
- package/dist/plugins/builtin/maven.js.map +1 -0
- package/dist/plugins/builtin/npm.d.ts +9 -0
- package/dist/plugins/builtin/npm.d.ts.map +1 -0
- package/dist/plugins/builtin/npm.js +238 -0
- package/dist/plugins/builtin/npm.js.map +1 -0
- package/dist/plugins/builtin/pip.d.ts +9 -0
- package/dist/plugins/builtin/pip.d.ts.map +1 -0
- package/dist/plugins/builtin/pip.js +210 -0
- package/dist/plugins/builtin/pip.js.map +1 -0
- package/dist/plugins/builtin/xcode.d.ts +12 -0
- package/dist/plugins/builtin/xcode.d.ts.map +1 -0
- package/dist/plugins/builtin/xcode.js +438 -0
- package/dist/plugins/builtin/xcode.js.map +1 -0
- package/dist/plugins/index.d.ts +13 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +24 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/manager.d.ts +93 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +270 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/utils.d.ts +42 -0
- package/dist/plugins/utils.d.ts.map +1 -0
- package/dist/plugins/utils.js +175 -0
- package/dist/plugins/utils.js.map +1 -0
- package/dist/types/index.d.ts +104 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/plugin.d.ts +200 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +19 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/utils/logger.d.ts +42 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +80 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/en/manual/04-command-reference/README.md +58 -0
- package/docs/en/manual/README.md +108 -0
- package/docs/zh-CN/manual/04-command-reference/README.md +58 -0
- package/docs/zh-CN/manual/README.md +108 -0
- package/package.json +65 -0
- package/shell/colyn.sh +55 -0
- package/shell/completion.bash +270 -0
- package/shell/completion.zsh +167 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置文件加载模块
|
|
3
|
+
*
|
|
4
|
+
* 支持从文件系统加载配置文件:
|
|
5
|
+
* - JSON 格式(使用 JSON5 解析,支持注释)
|
|
6
|
+
* - YAML 格式
|
|
7
|
+
*
|
|
8
|
+
* 配置文件位置:
|
|
9
|
+
* - 用户级:~/.config/colyn/settings.{json|yaml|yml}
|
|
10
|
+
* - 项目级:{projectRoot}/.colyn/settings.{json|yaml|yml}
|
|
11
|
+
*/
|
|
12
|
+
import type { Settings } from './config-schema.js';
|
|
13
|
+
/**
|
|
14
|
+
* 获取用户级配置目录
|
|
15
|
+
* @returns 用户配置目录路径
|
|
16
|
+
*/
|
|
17
|
+
export declare function getUserConfigDir(): string;
|
|
18
|
+
/**
|
|
19
|
+
* 获取项目级配置目录
|
|
20
|
+
* @param projectRoot 项目根目录
|
|
21
|
+
* @returns 项目配置目录路径
|
|
22
|
+
*/
|
|
23
|
+
export declare function getProjectConfigDir(projectRoot: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* 加载用户级配置
|
|
26
|
+
* @returns 用户配置对象,如果不存在则返回 null
|
|
27
|
+
*/
|
|
28
|
+
export declare function loadUserConfig(): Promise<Settings | null>;
|
|
29
|
+
/**
|
|
30
|
+
* 加载项目级配置
|
|
31
|
+
* @param projectRoot 项目根目录
|
|
32
|
+
* @returns 项目配置对象,如果不存在则返回 null
|
|
33
|
+
*/
|
|
34
|
+
export declare function loadProjectConfig(projectRoot: string): Promise<Settings | null>;
|
|
35
|
+
/**
|
|
36
|
+
* 保存配置到文件
|
|
37
|
+
* @param filepath 配置文件路径
|
|
38
|
+
* @param settings 配置对象
|
|
39
|
+
*/
|
|
40
|
+
export declare function saveConfigFile(filepath: string, settings: Settings): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* 查找配置文件路径
|
|
43
|
+
* @param dir 配置目录
|
|
44
|
+
* @returns 找到的配置文件路径,如果不存在则返回 null
|
|
45
|
+
*/
|
|
46
|
+
export declare function findConfigFilePath(dir: string): Promise<string | null>;
|
|
47
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/core/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAwGnD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAG/D;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAGrF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW5E"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置文件加载模块
|
|
3
|
+
*
|
|
4
|
+
* 支持从文件系统加载配置文件:
|
|
5
|
+
* - JSON 格式(使用 JSON5 解析,支持注释)
|
|
6
|
+
* - YAML 格式
|
|
7
|
+
*
|
|
8
|
+
* 配置文件位置:
|
|
9
|
+
* - 用户级:~/.config/colyn/settings.{json|yaml|yml}
|
|
10
|
+
* - 项目级:{projectRoot}/.colyn/settings.{json|yaml|yml}
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'fs/promises';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
import * as os from 'os';
|
|
15
|
+
import JSON5 from 'json5';
|
|
16
|
+
import yaml from 'js-yaml';
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
import { loadAndMigrateConfig } from './config-migration.js';
|
|
19
|
+
/**
|
|
20
|
+
* 配置文件名(按优先级排序)
|
|
21
|
+
*/
|
|
22
|
+
const CONFIG_FILENAMES = ['settings.json', 'settings.yaml', 'settings.yml'];
|
|
23
|
+
/**
|
|
24
|
+
* 配置文件目录
|
|
25
|
+
*/
|
|
26
|
+
const CONFIG_DIR = '.colyn';
|
|
27
|
+
const USER_CONFIG_DIR = '.config/colyn';
|
|
28
|
+
/**
|
|
29
|
+
* 从文件加载并解析配置
|
|
30
|
+
* @param filepath 配置文件路径
|
|
31
|
+
* @returns 包含配置对象和是否发生迁移的信息
|
|
32
|
+
* @throws Error 如果文件格式错误或验证失败
|
|
33
|
+
*/
|
|
34
|
+
async function loadConfigFile(filepath) {
|
|
35
|
+
try {
|
|
36
|
+
const content = await fs.readFile(filepath, 'utf-8');
|
|
37
|
+
const ext = path.extname(filepath);
|
|
38
|
+
let rawConfig;
|
|
39
|
+
if (ext === '.json') {
|
|
40
|
+
// 使用 JSON5 解析(支持注释和尾部逗号)
|
|
41
|
+
rawConfig = JSON5.parse(content);
|
|
42
|
+
}
|
|
43
|
+
else if (ext === '.yaml' || ext === '.yml') {
|
|
44
|
+
// 使用 js-yaml 解析
|
|
45
|
+
rawConfig = yaml.load(content);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
throw new Error(`不支持的配置文件格式: ${ext}`);
|
|
49
|
+
}
|
|
50
|
+
// 检查原始配置的版本号
|
|
51
|
+
const oldVersion = rawConfig.version ?? 0;
|
|
52
|
+
// 使用 Zod 验证和迁移配置
|
|
53
|
+
let migratedConfig;
|
|
54
|
+
try {
|
|
55
|
+
migratedConfig = loadAndMigrateConfig(rawConfig);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (error instanceof z.ZodError) {
|
|
59
|
+
const messages = error.issues
|
|
60
|
+
.map((e) => ` - ${e.path.join('.')}: ${e.message}`)
|
|
61
|
+
.join('\n');
|
|
62
|
+
throw new Error(`配置文件验证失败 (${filepath}):\n${messages}`);
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
// 检查是否发生了迁移
|
|
67
|
+
const wasMigrated = oldVersion !== migratedConfig.version;
|
|
68
|
+
return { config: migratedConfig, wasMigrated };
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error.code === 'ENOENT') {
|
|
72
|
+
return null; // 文件不存在
|
|
73
|
+
}
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 从目录加载配置(尝试多个文件名)
|
|
79
|
+
* @param dir 配置目录路径
|
|
80
|
+
* @returns 找到的第一个有效配置,如果都不存在则返回 null
|
|
81
|
+
*/
|
|
82
|
+
async function loadConfigFromDir(dir) {
|
|
83
|
+
for (const filename of CONFIG_FILENAMES) {
|
|
84
|
+
const filepath = path.join(dir, filename);
|
|
85
|
+
try {
|
|
86
|
+
const result = await loadConfigFile(filepath);
|
|
87
|
+
if (result !== null) {
|
|
88
|
+
// 如果配置发生了迁移,自动保存
|
|
89
|
+
if (result.wasMigrated) {
|
|
90
|
+
await saveConfigFile(filepath, result.config);
|
|
91
|
+
}
|
|
92
|
+
return result.config;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
// 如果是验证错误或格式错误,继续尝试下一个文件
|
|
97
|
+
// 但如果是其他错误(如权限问题),应该抛出
|
|
98
|
+
if (error instanceof Error &&
|
|
99
|
+
(error.message.includes('配置文件验证失败') ||
|
|
100
|
+
error.message.includes('不支持的配置文件格式'))) {
|
|
101
|
+
// 跳过格式错误的文件,继续尝试下一个
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
// 其他错误直接抛出
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 获取用户级配置目录
|
|
112
|
+
* @returns 用户配置目录路径
|
|
113
|
+
*/
|
|
114
|
+
export function getUserConfigDir() {
|
|
115
|
+
return path.join(os.homedir(), USER_CONFIG_DIR);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 获取项目级配置目录
|
|
119
|
+
* @param projectRoot 项目根目录
|
|
120
|
+
* @returns 项目配置目录路径
|
|
121
|
+
*/
|
|
122
|
+
export function getProjectConfigDir(projectRoot) {
|
|
123
|
+
return path.join(projectRoot, CONFIG_DIR);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 加载用户级配置
|
|
127
|
+
* @returns 用户配置对象,如果不存在则返回 null
|
|
128
|
+
*/
|
|
129
|
+
export async function loadUserConfig() {
|
|
130
|
+
const configDir = getUserConfigDir();
|
|
131
|
+
return loadConfigFromDir(configDir);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 加载项目级配置
|
|
135
|
+
* @param projectRoot 项目根目录
|
|
136
|
+
* @returns 项目配置对象,如果不存在则返回 null
|
|
137
|
+
*/
|
|
138
|
+
export async function loadProjectConfig(projectRoot) {
|
|
139
|
+
const configDir = getProjectConfigDir(projectRoot);
|
|
140
|
+
return loadConfigFromDir(configDir);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 保存配置到文件
|
|
144
|
+
* @param filepath 配置文件路径
|
|
145
|
+
* @param settings 配置对象
|
|
146
|
+
*/
|
|
147
|
+
export async function saveConfigFile(filepath, settings) {
|
|
148
|
+
const ext = path.extname(filepath);
|
|
149
|
+
let content;
|
|
150
|
+
if (ext === '.json') {
|
|
151
|
+
// JSON 格式(格式化输出)
|
|
152
|
+
content = JSON.stringify(settings, null, 2);
|
|
153
|
+
}
|
|
154
|
+
else if (ext === '.yaml' || ext === '.yml') {
|
|
155
|
+
// YAML 格式
|
|
156
|
+
content = yaml.dump(settings, {
|
|
157
|
+
indent: 2,
|
|
158
|
+
lineWidth: -1, // 不自动换行
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
throw new Error(`不支持的配置文件格式: ${ext}`);
|
|
163
|
+
}
|
|
164
|
+
// 确保目录存在
|
|
165
|
+
const dir = path.dirname(filepath);
|
|
166
|
+
await fs.mkdir(dir, { recursive: true });
|
|
167
|
+
// 写入文件
|
|
168
|
+
await fs.writeFile(filepath, content, 'utf-8');
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* 查找配置文件路径
|
|
172
|
+
* @param dir 配置目录
|
|
173
|
+
* @returns 找到的配置文件路径,如果不存在则返回 null
|
|
174
|
+
*/
|
|
175
|
+
export async function findConfigFilePath(dir) {
|
|
176
|
+
for (const filename of CONFIG_FILENAMES) {
|
|
177
|
+
const filepath = path.join(dir, filename);
|
|
178
|
+
try {
|
|
179
|
+
await fs.access(filepath);
|
|
180
|
+
return filepath;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/core/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAG7D;;GAEG;AACH,MAAM,gBAAgB,GAAG,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,CAAU,CAAC;AAErF;;GAEG;AACH,MAAM,UAAU,GAAG,QAAQ,CAAC;AAC5B,MAAM,eAAe,GAAG,eAAe,CAAC;AAExC;;;;;GAKG;AACH,KAAK,UAAU,cAAc,CAAC,QAAgB;IAI5C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,SAAkB,CAAC;QACvB,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,yBAAyB;YACzB,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC7C,gBAAgB;YAChB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,aAAa;QACb,MAAM,UAAU,GACb,SAAkC,CAAC,OAAO,IAAI,CAAC,CAAC;QAEnD,iBAAiB;QACjB,IAAI,cAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,cAAc,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM;qBAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;qBACnD,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEd,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,OAAO,QAAQ,EAAE,CAAC,CAAC;YAC1D,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,YAAY;QACZ,MAAM,WAAW,GAAG,UAAU,KAAK,cAAc,CAAC,OAAO,CAAC;QAE1D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC,CAAC,QAAQ;QACvB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,iBAAiB;gBACjB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACvB,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO,MAAM,CAAC,MAAM,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yBAAyB;YACzB,uBAAuB;YACvB,IACE,KAAK,YAAY,KAAK;gBACtB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;oBACjC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EACvC,CAAC;gBACD,oBAAoB;gBACpB,SAAS;YACX,CAAC;YACD,WAAW;YACX,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,MAAM,SAAS,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACnD,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,QAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,OAAe,CAAC;IACpB,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,iBAAiB;QACjB,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC7C,UAAU;QACV,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC5B,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC,CAAC,EAAE,QAAQ;SACxB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,SAAS;IACT,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,OAAO;IACP,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW;IAClD,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置合并模块
|
|
3
|
+
*
|
|
4
|
+
* 使用 deepmerge 实现多层配置的合并
|
|
5
|
+
* - 支持深度合并对象
|
|
6
|
+
* - 数组采用替换策略(而非合并)
|
|
7
|
+
* - 保持字段级覆盖(Field-level Override)
|
|
8
|
+
*/
|
|
9
|
+
import type { Settings, TmuxConfig } from './config-schema.js';
|
|
10
|
+
/**
|
|
11
|
+
* 合并多个配置对象
|
|
12
|
+
* @param configs 配置对象数组(null 会被过滤掉)
|
|
13
|
+
* @returns 合并后的配置对象
|
|
14
|
+
*/
|
|
15
|
+
export declare function mergeConfigs(...configs: Array<Settings | null>): Settings;
|
|
16
|
+
/**
|
|
17
|
+
* 合并 Tmux 配置
|
|
18
|
+
* @param configs Tmux 配置对象数组(null 会被过滤掉)
|
|
19
|
+
* @returns 合并后的 Tmux 配置对象
|
|
20
|
+
*/
|
|
21
|
+
export declare function mergeTmuxConfigs(...configs: Array<TmuxConfig | null | undefined>): TmuxConfig;
|
|
22
|
+
/**
|
|
23
|
+
* 应用分支特定的配置覆盖
|
|
24
|
+
* @param settings 基础配置
|
|
25
|
+
* @param branchName 分支名称
|
|
26
|
+
* @returns 应用分支覆盖后的配置
|
|
27
|
+
*/
|
|
28
|
+
export declare function applyBranchOverrides(settings: Settings, branchName: string): Settings;
|
|
29
|
+
//# sourceMappingURL=config-merger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-merger.d.ts","sourceRoot":"","sources":["../../src/core/config-merger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAkB/D;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,QAAQ,CAYzE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,OAAO,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,GAC/C,UAAU,CAcZ;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,GACjB,QAAQ,CA4CV"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置合并模块
|
|
3
|
+
*
|
|
4
|
+
* 使用 deepmerge 实现多层配置的合并
|
|
5
|
+
* - 支持深度合并对象
|
|
6
|
+
* - 数组采用替换策略(而非合并)
|
|
7
|
+
* - 保持字段级覆盖(Field-level Override)
|
|
8
|
+
*/
|
|
9
|
+
import deepmerge from 'deepmerge';
|
|
10
|
+
/**
|
|
11
|
+
* 合并配置选项
|
|
12
|
+
*/
|
|
13
|
+
const MERGE_OPTIONS = {
|
|
14
|
+
// 数组替换而非合并
|
|
15
|
+
// 例如:branchOverrides 中的数组应该完全替换,而不是合并
|
|
16
|
+
arrayMerge: (_target, source) => source,
|
|
17
|
+
// 自定义合并函数(可选)
|
|
18
|
+
customMerge: (_key) => {
|
|
19
|
+
// 对于特定字段可以自定义合并逻辑
|
|
20
|
+
// 目前使用默认行为
|
|
21
|
+
return undefined;
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* 合并多个配置对象
|
|
26
|
+
* @param configs 配置对象数组(null 会被过滤掉)
|
|
27
|
+
* @returns 合并后的配置对象
|
|
28
|
+
*/
|
|
29
|
+
export function mergeConfigs(...configs) {
|
|
30
|
+
const validConfigs = configs.filter((c) => c !== null);
|
|
31
|
+
if (validConfigs.length === 0) {
|
|
32
|
+
throw new Error('至少需要一个有效的配置对象');
|
|
33
|
+
}
|
|
34
|
+
if (validConfigs.length === 1) {
|
|
35
|
+
return validConfigs[0];
|
|
36
|
+
}
|
|
37
|
+
return deepmerge.all(validConfigs, MERGE_OPTIONS);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 合并 Tmux 配置
|
|
41
|
+
* @param configs Tmux 配置对象数组(null 会被过滤掉)
|
|
42
|
+
* @returns 合并后的 Tmux 配置对象
|
|
43
|
+
*/
|
|
44
|
+
export function mergeTmuxConfigs(...configs) {
|
|
45
|
+
const validConfigs = configs.filter((c) => c !== null && c !== undefined);
|
|
46
|
+
if (validConfigs.length === 0) {
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
if (validConfigs.length === 1) {
|
|
50
|
+
return validConfigs[0];
|
|
51
|
+
}
|
|
52
|
+
return deepmerge.all(validConfigs, MERGE_OPTIONS);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 应用分支特定的配置覆盖
|
|
56
|
+
* @param settings 基础配置
|
|
57
|
+
* @param branchName 分支名称
|
|
58
|
+
* @returns 应用分支覆盖后的配置
|
|
59
|
+
*/
|
|
60
|
+
export function applyBranchOverrides(settings, branchName) {
|
|
61
|
+
if (!settings.branchOverrides) {
|
|
62
|
+
return settings;
|
|
63
|
+
}
|
|
64
|
+
// 查找匹配的分支覆盖配置
|
|
65
|
+
let matchedOverride = null;
|
|
66
|
+
// 1. 精确匹配(优先级最高)
|
|
67
|
+
if (settings.branchOverrides[branchName]) {
|
|
68
|
+
matchedOverride = settings.branchOverrides[branchName];
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// 2. 通配符匹配
|
|
72
|
+
for (const [pattern, override] of Object.entries(settings.branchOverrides)) {
|
|
73
|
+
if (pattern.includes('*')) {
|
|
74
|
+
// 将通配符模式转换为正则表达式
|
|
75
|
+
const regexPattern = pattern
|
|
76
|
+
.replace(/[.+?^${}()|[\]\\]/g, '\\$&') // 转义特殊字符
|
|
77
|
+
.replace(/\*/g, '.*'); // 将 * 替换为 .*
|
|
78
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
79
|
+
if (regex.test(branchName)) {
|
|
80
|
+
matchedOverride = override;
|
|
81
|
+
break; // 使用第一个匹配的通配符模式
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// 如果没有匹配的覆盖配置,返回原配置
|
|
87
|
+
if (!matchedOverride) {
|
|
88
|
+
return settings;
|
|
89
|
+
}
|
|
90
|
+
// 合并基础配置和分支覆盖配置
|
|
91
|
+
// 注意:不包含 branchOverrides 本身,避免无限递归
|
|
92
|
+
const { branchOverrides, ...baseSettings } = settings;
|
|
93
|
+
const mergedSettings = deepmerge(baseSettings, matchedOverride, MERGE_OPTIONS);
|
|
94
|
+
// 保留原始的 branchOverrides
|
|
95
|
+
return {
|
|
96
|
+
...mergedSettings,
|
|
97
|
+
branchOverrides,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=config-merger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-merger.js","sourceRoot":"","sources":["../../src/core/config-merger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置版本迁移模块
|
|
3
|
+
*
|
|
4
|
+
* 使用 Zod transform 实现配置文件的版本迁移
|
|
5
|
+
* - V0 (无版本号) -> V3
|
|
6
|
+
* - V1 -> V2
|
|
7
|
+
* - V2 -> V3
|
|
8
|
+
* - V3 -> V4
|
|
9
|
+
*
|
|
10
|
+
* 迁移内容:
|
|
11
|
+
* - V0 -> V1: 添加版本号
|
|
12
|
+
* - V1 -> V2: 配置结构重构和废弃命令处理
|
|
13
|
+
* - V2 -> V3: 重命名内置命令(去掉 "auto" 前缀)
|
|
14
|
+
* - V3 -> V4: 插件系统重构(plugins/pluginSettings → toolchain/projects)
|
|
15
|
+
*/
|
|
16
|
+
import { z } from 'zod';
|
|
17
|
+
import { type Settings, type TmuxConfig } from './config-schema.js';
|
|
18
|
+
/**
|
|
19
|
+
* V1 Settings 类型(带有旧字段:npm, claudeCommand)
|
|
20
|
+
*/
|
|
21
|
+
type V1Settings = {
|
|
22
|
+
version?: number;
|
|
23
|
+
lang?: string;
|
|
24
|
+
npm?: string;
|
|
25
|
+
claudeCommand?: string;
|
|
26
|
+
tmux?: TmuxConfig;
|
|
27
|
+
branchOverrides?: Record<string, Partial<V1Settings>>;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* V2 Settings 类型(已有 systemCommands,但内置命令还有 "auto" 前缀)
|
|
31
|
+
*/
|
|
32
|
+
type V2Settings = Omit<Settings, 'version'> & {
|
|
33
|
+
version: 2;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* V3 Settings 类型(含旧字段:plugins, pluginSettings)
|
|
37
|
+
*/
|
|
38
|
+
type V3Settings = {
|
|
39
|
+
version: 3;
|
|
40
|
+
lang?: 'en' | 'zh-CN';
|
|
41
|
+
systemCommands?: {
|
|
42
|
+
npm?: string;
|
|
43
|
+
claude?: string;
|
|
44
|
+
};
|
|
45
|
+
tmux?: TmuxConfig;
|
|
46
|
+
plugins?: string[];
|
|
47
|
+
pluginSettings?: Record<string, Record<string, unknown>>;
|
|
48
|
+
branchOverrides?: Record<string, Partial<V3Settings>>;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* 统一的配置 Schema(支持所有版本)
|
|
52
|
+
* Zod 会自动选择匹配的 Schema 并执行 transform
|
|
53
|
+
*
|
|
54
|
+
* 注意:顺序很重要,version literal 更具体的 Schema 放在前面
|
|
55
|
+
*/
|
|
56
|
+
export declare const ConfigSchema: z.ZodUnion<readonly [z.ZodPipe<z.ZodType<V1Settings, unknown, z.core.$ZodTypeInternals<V1Settings, unknown>>, z.ZodTransform<Settings, V1Settings>>, z.ZodPipe<z.ZodType<V1Settings, unknown, z.core.$ZodTypeInternals<V1Settings, unknown>>, z.ZodTransform<V2Settings, V1Settings>>, z.ZodPipe<z.ZodType<V2Settings, unknown, z.core.$ZodTypeInternals<V2Settings, unknown>>, z.ZodTransform<Settings, V2Settings>>, z.ZodPipe<z.ZodType<V3Settings, unknown, z.core.$ZodTypeInternals<V3Settings, unknown>>, z.ZodTransform<Settings, V3Settings>>, z.ZodType<Settings, unknown, z.core.$ZodTypeInternals<Settings, unknown>>]>;
|
|
57
|
+
/**
|
|
58
|
+
* 加载并自动迁移配置
|
|
59
|
+
* @param rawConfig 原始配置数据
|
|
60
|
+
* @returns 迁移后的配置
|
|
61
|
+
*/
|
|
62
|
+
export declare function loadAndMigrateConfig(rawConfig: unknown): Settings;
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=config-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-migration.d.ts","sourceRoot":"","sources":["../../src/core/config-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAkB5B;;GAEG;AACH,KAAK,UAAU,GAAG;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;CACvD,CAAC;AAoBF;;GAEG;AACH,KAAK,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG;IAC5C,OAAO,EAAE,CAAC,CAAC;CACZ,CAAC;AAoPF;;GAEG;AACH,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;CACvD,CAAC;AAyIF;;;;;GAKG;AACH,eAAO,MAAM,YAAY,omBAMvB,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,QAAQ,CAEjE"}
|