grf-cli 1.0.0

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 (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +503 -0
  3. package/README.zh-CN.md +503 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +74 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/add.d.ts +7 -0
  9. package/dist/commands/add.d.ts.map +1 -0
  10. package/dist/commands/add.js +92 -0
  11. package/dist/commands/add.js.map +1 -0
  12. package/dist/commands/clean.d.ts +7 -0
  13. package/dist/commands/clean.d.ts.map +1 -0
  14. package/dist/commands/clean.js +171 -0
  15. package/dist/commands/clean.js.map +1 -0
  16. package/dist/commands/config.d.ts +7 -0
  17. package/dist/commands/config.d.ts.map +1 -0
  18. package/dist/commands/config.js +170 -0
  19. package/dist/commands/config.js.map +1 -0
  20. package/dist/commands/list.d.ts +7 -0
  21. package/dist/commands/list.d.ts.map +1 -0
  22. package/dist/commands/list.js +149 -0
  23. package/dist/commands/list.js.map +1 -0
  24. package/dist/commands/load.d.ts +8 -0
  25. package/dist/commands/load.d.ts.map +1 -0
  26. package/dist/commands/load.js +239 -0
  27. package/dist/commands/load.js.map +1 -0
  28. package/dist/commands/unload.d.ts +7 -0
  29. package/dist/commands/unload.d.ts.map +1 -0
  30. package/dist/commands/unload.js +738 -0
  31. package/dist/commands/unload.js.map +1 -0
  32. package/dist/commands/update.d.ts +7 -0
  33. package/dist/commands/update.d.ts.map +1 -0
  34. package/dist/commands/update.js +471 -0
  35. package/dist/commands/update.js.map +1 -0
  36. package/dist/commands/use.d.ts +8 -0
  37. package/dist/commands/use.d.ts.map +1 -0
  38. package/dist/commands/use.js +224 -0
  39. package/dist/commands/use.js.map +1 -0
  40. package/dist/core/config.d.ts +55 -0
  41. package/dist/core/config.d.ts.map +1 -0
  42. package/dist/core/config.js +179 -0
  43. package/dist/core/config.js.map +1 -0
  44. package/dist/core/filesystem.d.ts +74 -0
  45. package/dist/core/filesystem.d.ts.map +1 -0
  46. package/dist/core/filesystem.js +300 -0
  47. package/dist/core/filesystem.js.map +1 -0
  48. package/dist/core/git.d.ts +75 -0
  49. package/dist/core/git.d.ts.map +1 -0
  50. package/dist/core/git.js +169 -0
  51. package/dist/core/git.js.map +1 -0
  52. package/dist/core/loading.d.ts +85 -0
  53. package/dist/core/loading.d.ts.map +1 -0
  54. package/dist/core/loading.js +224 -0
  55. package/dist/core/loading.js.map +1 -0
  56. package/dist/core/repository.d.ts +120 -0
  57. package/dist/core/repository.d.ts.map +1 -0
  58. package/dist/core/repository.js +374 -0
  59. package/dist/core/repository.js.map +1 -0
  60. package/dist/core/sync.d.ts +72 -0
  61. package/dist/core/sync.d.ts.map +1 -0
  62. package/dist/core/sync.js +226 -0
  63. package/dist/core/sync.js.map +1 -0
  64. package/dist/types/index.d.ts +135 -0
  65. package/dist/types/index.d.ts.map +1 -0
  66. package/dist/types/index.js +63 -0
  67. package/dist/types/index.js.map +1 -0
  68. package/package.json +59 -0
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ /**
3
+ * use 命令
4
+ * 将缓存的仓库内容复制到当前工作目录
5
+ * 支持直接传入 git URL,会自动先 add 再 use
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.useCommand = void 0;
45
+ const commander_1 = require("commander");
46
+ const chalk_1 = __importDefault(require("chalk"));
47
+ const ora_1 = __importDefault(require("ora"));
48
+ const path_1 = __importDefault(require("path"));
49
+ const repository = __importStar(require("../core/repository.js"));
50
+ const filesystem = __importStar(require("../core/filesystem.js"));
51
+ const index_js_1 = require("../types/index.js");
52
+ /**
53
+ * 检查字符串是否为 Git URL
54
+ * 支持 HTTPS 和 SSH 格式
55
+ */
56
+ function isGitUrl(str) {
57
+ // HTTPS 格式: https://github.com/user/repo.git
58
+ const httpsRegex = /^https?:\/\/[^/]+\/[^/]+\/[^/]+/;
59
+ // SSH 格式: git@github.com:user/repo.git
60
+ const sshRegex = /^git@[^:]+:[^/]+\/[^/]+/;
61
+ return httpsRegex.test(str) || sshRegex.test(str);
62
+ }
63
+ exports.useCommand = new commander_1.Command('use')
64
+ .description('Copy reference repository to current directory (supports Git URL)')
65
+ .argument('<name>', 'Repository name, short name, or Git URL')
66
+ .argument('[path]', 'Target path (default: .gitreference/<repo-path>)')
67
+ .option('-s, --subdir <path>', 'Copy only a specific subdirectory')
68
+ .option('--no-ignore', 'Do not update .gitignore')
69
+ .option('-b, --branch <branch>', 'Specify branch (only for Git URL)')
70
+ .action(async (name, targetPath, options) => {
71
+ let repoName = name;
72
+ // 检查是否为 Git URL
73
+ if (isGitUrl(name)) {
74
+ const addSpinner = (0, ora_1.default)('Adding repository...').start();
75
+ try {
76
+ // 检查仓库是否已存在
77
+ const parsed = repository.parseRepoUrl(name);
78
+ const fullName = `${parsed.host}/${parsed.owner}/${parsed.repo}`;
79
+ if (await repository.exists(fullName)) {
80
+ addSpinner.info(chalk_1.default.blue('Repository already exists, skipping add...'));
81
+ repoName = fullName;
82
+ }
83
+ else {
84
+ // 自动添加仓库
85
+ const repoInfo = await repository.add(name, {
86
+ branch: options.branch,
87
+ shallow: true,
88
+ depth: 1,
89
+ });
90
+ addSpinner.succeed(chalk_1.default.green('Repository added successfully!'));
91
+ console.log(` ${chalk_1.default.gray('Name:')} ${repoInfo.name}`);
92
+ console.log(` ${chalk_1.default.gray('Commit:')} ${repoInfo.commitId.substring(0, 7)}...`);
93
+ console.log();
94
+ repoName = repoInfo.name;
95
+ }
96
+ }
97
+ catch (error) {
98
+ addSpinner.fail(chalk_1.default.red('Failed to add repository'));
99
+ if (error instanceof index_js_1.GrfError) {
100
+ console.error(chalk_1.default.red(`\n${chalk_1.default.bold('✗')} ${error.message}`));
101
+ }
102
+ else if (error instanceof Error) {
103
+ console.error(chalk_1.default.red(`\n${chalk_1.default.bold('✗')} ${error.message}`));
104
+ }
105
+ else {
106
+ console.error(chalk_1.default.red(`\n${chalk_1.default.bold('✗')} An unknown error occurred`));
107
+ }
108
+ process.exit(1);
109
+ }
110
+ }
111
+ const spinner = (0, ora_1.default)('Copying repository...').start();
112
+ try {
113
+ // 检查仓库是否存在
114
+ if (!await repository.exists(repoName)) {
115
+ spinner.fail(chalk_1.default.red('Repository not found'));
116
+ console.error(chalk_1.default.red(`\n${chalk_1.default.bold('✗')} Repository "${repoName}" does not exist.`));
117
+ console.error(chalk_1.default.gray(` Use ${chalk_1.default.cyan('grf add <url>')} to add a repository first.`));
118
+ console.error(chalk_1.default.gray(` Or use ${chalk_1.default.cyan('grf use <url>')} to add and use in one step.`));
119
+ process.exit(1);
120
+ }
121
+ // 获取仓库信息
122
+ let repoInfo = await repository.get(repoName);
123
+ if (!repoInfo) {
124
+ spinner.fail(chalk_1.default.red('Failed to get repository info'));
125
+ process.exit(1);
126
+ }
127
+ // 如果指定了分支且与当前分支不同,则切换分支
128
+ if (options.branch && repoInfo.branch !== options.branch) {
129
+ spinner.text = `Switching to branch ${options.branch}...`;
130
+ try {
131
+ repoInfo = await repository.switchBranch(repoName, options.branch);
132
+ spinner.text = 'Copying repository...';
133
+ }
134
+ catch (error) {
135
+ spinner.fail(chalk_1.default.red(`Failed to switch branch`));
136
+ if (error instanceof index_js_1.GrfError) {
137
+ console.error(chalk_1.default.red(`\n${chalk_1.default.bold('✗')} ${error.message}`));
138
+ if (error.code === index_js_1.ErrorCode.GIT_CHECKOUT_FAILED) {
139
+ console.error(chalk_1.default.gray(` Branch "${options.branch}" may not exist. Use ${chalk_1.default.cyan('git branch -r')} to list available branches.`));
140
+ }
141
+ }
142
+ else if (error instanceof Error) {
143
+ console.error(chalk_1.default.red(`\n${chalk_1.default.bold('✗')} ${error.message}`));
144
+ }
145
+ else {
146
+ console.error(chalk_1.default.red(`\n${chalk_1.default.bold('✗')} An unknown error occurred`));
147
+ }
148
+ process.exit(1);
149
+ }
150
+ }
151
+ // 解析仓库路径
152
+ const repoPath = await repository.resolvePath(repoName);
153
+ // 确定源路径(如果指定了 subdir,则使用子目录)
154
+ const sourcePath = options.subdir
155
+ ? path_1.default.join(repoPath, options.subdir)
156
+ : repoPath;
157
+ // 检查源路径是否存在(特别是子目录情况)
158
+ if (options.subdir && !await filesystem.exists(sourcePath)) {
159
+ spinner.fail(chalk_1.default.red('Subdirectory not found'));
160
+ console.error(chalk_1.default.red(`\n${chalk_1.default.bold('✗')} Subdirectory "${options.subdir}" does not exist in repository "${repoInfo.name}".`));
161
+ process.exit(1);
162
+ }
163
+ // 确定目标路径
164
+ const finalTargetPath = targetPath
165
+ ? path_1.default.resolve(process.cwd(), targetPath)
166
+ : path_1.default.join(process.cwd(), '.gitreference', repoInfo.name);
167
+ // 确保目标目录的父目录存在
168
+ await filesystem.ensureDir(path_1.default.dirname(finalTargetPath));
169
+ // 复制文件(排除 .git 和 meta.json)
170
+ await filesystem.copyDir(sourcePath, finalTargetPath, {
171
+ exclude: ['.git', 'meta.json', '.grf-meta.json'],
172
+ overwrite: true,
173
+ });
174
+ // 更新 .gitignore(如果没有 --no-ignore 选项)
175
+ if (options.ignore !== false) {
176
+ // 始终添加 .gitreference/ 条目(默认行为)
177
+ await filesystem.updateGitignore(process.cwd(), '.gitreference/');
178
+ // 如果用户指定了自定义路径,额外添加该路径
179
+ if (targetPath) {
180
+ // 计算相对于工作目录的路径
181
+ const relativePath = path_1.default.relative(process.cwd(), finalTargetPath);
182
+ // 确保路径使用正斜杠(跨平台兼容)并以 / 结尾(表示目录)
183
+ const normalizedPath = relativePath.replace(/\\/g, '/');
184
+ const gitignoreEntry = normalizedPath.endsWith('/') ? normalizedPath : normalizedPath + '/';
185
+ // 避免重复添加(如果自定义路径在 .gitreference/ 下则跳过)
186
+ if (!gitignoreEntry.startsWith('.gitreference/')) {
187
+ await filesystem.updateGitignore(process.cwd(), gitignoreEntry);
188
+ }
189
+ }
190
+ }
191
+ spinner.succeed(chalk_1.default.green('Repository copied successfully!'));
192
+ // 显示复制信息
193
+ console.log();
194
+ console.log(` ${chalk_1.default.gray('Source:')} ${sourcePath}`);
195
+ console.log(` ${chalk_1.default.gray('Target:')} ${finalTargetPath}`);
196
+ console.log(` ${chalk_1.default.gray('Commit:')} ${repoInfo.commitId.substring(0, 7)}...`);
197
+ }
198
+ catch (error) {
199
+ spinner.fail(chalk_1.default.red('Failed to copy repository'));
200
+ if (error instanceof index_js_1.GrfError) {
201
+ console.error(chalk_1.default.red(`\n${chalk_1.default.bold('✗')} ${error.message}`));
202
+ // 提供更具体的错误提示
203
+ if (error.code === index_js_1.ErrorCode.REPO_NOT_FOUND) {
204
+ console.error(chalk_1.default.gray(` Use ${chalk_1.default.cyan('grf add <url>')} to add a repository first.`));
205
+ }
206
+ else if (error.code === index_js_1.ErrorCode.FS_PATH_NOT_FOUND) {
207
+ console.error(chalk_1.default.gray(` The source path does not exist. Please check the repository or subdirectory.`));
208
+ }
209
+ else if (error.code === index_js_1.ErrorCode.FS_PERMISSION_DENIED) {
210
+ console.error(chalk_1.default.gray(` Permission denied. Please check your file permissions.`));
211
+ }
212
+ process.exit(1);
213
+ }
214
+ // 未知错误
215
+ if (error instanceof Error) {
216
+ console.error(chalk_1.default.red(`\n${chalk_1.default.bold('✗')} ${error.message}`));
217
+ }
218
+ else {
219
+ console.error(chalk_1.default.red(`\n${chalk_1.default.bold('✗')} An unknown error occurred`));
220
+ }
221
+ process.exit(1);
222
+ }
223
+ });
224
+ //# sourceMappingURL=use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.js","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * grf 配置模块
3
+ * 负责管理全局配置和仓库元信息的读写
4
+ */
5
+ import { GlobalConfig, RepoMeta } from "../types/index.js";
6
+ /**
7
+ * 获取 grf 根目录路径
8
+ * @returns grf 根目录的绝对路径 (~/.gitreference/)
9
+ */
10
+ export declare function getGrfRoot(): string;
11
+ /**
12
+ * 获取仓库存储根目录
13
+ * @returns 仓库存储目录的绝对路径 (~/.gitreference/repos/)
14
+ */
15
+ export declare function getReposRoot(): string;
16
+ /**
17
+ * 获取配置文件路径
18
+ * @returns 配置文件的绝对路径 (~/.gitreference/config.json)
19
+ */
20
+ export declare function getConfigPath(): string;
21
+ /**
22
+ * 获取默认配置
23
+ * @returns 默认的全局配置对象
24
+ */
25
+ export declare function getDefaultConfig(): GlobalConfig;
26
+ /**
27
+ * 确保配置目录存在
28
+ * 如果目录不存在则创建
29
+ */
30
+ export declare function ensureConfigDir(): Promise<void>;
31
+ /**
32
+ * 读取全局配置
33
+ * 如果配置文件不存在,返回默认配置
34
+ * @returns 全局配置对象
35
+ */
36
+ export declare function readGlobalConfig(): Promise<GlobalConfig>;
37
+ /**
38
+ * 写入全局配置
39
+ * 自动创建配置目录(如果不存在)
40
+ * @param config 要写入的配置对象
41
+ */
42
+ export declare function writeGlobalConfig(config: GlobalConfig): Promise<void>;
43
+ /**
44
+ * 读取仓库元信息
45
+ * @param repoPath 仓库目录路径
46
+ * @returns 仓库元信息对象,如果不存在则返回 null
47
+ */
48
+ export declare function readRepoMeta(repoPath: string): Promise<RepoMeta | null>;
49
+ /**
50
+ * 写入仓库元信息
51
+ * @param repoPath 仓库目录路径
52
+ * @param meta 要写入的元信息对象
53
+ */
54
+ export declare function writeRepoMeta(repoPath: string, meta: RepoMeta): Promise<void>;
55
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAuB,MAAM,mBAAmB,CAAC;AAahF;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAQ/C;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAcrD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAoC9D;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB3E;AAWD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA8B7E;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ /**
3
+ * grf 配置模块
4
+ * 负责管理全局配置和仓库元信息的读写
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.getGrfRoot = getGrfRoot;
11
+ exports.getReposRoot = getReposRoot;
12
+ exports.getConfigPath = getConfigPath;
13
+ exports.getDefaultConfig = getDefaultConfig;
14
+ exports.ensureConfigDir = ensureConfigDir;
15
+ exports.readGlobalConfig = readGlobalConfig;
16
+ exports.writeGlobalConfig = writeGlobalConfig;
17
+ exports.readRepoMeta = readRepoMeta;
18
+ exports.writeRepoMeta = writeRepoMeta;
19
+ const fs_extra_1 = __importDefault(require("fs-extra"));
20
+ const os_1 = __importDefault(require("os"));
21
+ const path_1 = __importDefault(require("path"));
22
+ const index_js_1 = require("../types/index.js");
23
+ /** grf 根目录名称 */
24
+ const GRF_DIR_NAME = ".gitreference";
25
+ /** 全局配置文件名 */
26
+ const CONFIG_FILE_NAME = "config.json";
27
+ /** 仓库存储目录名 */
28
+ const REPOS_DIR_NAME = "repos";
29
+ /** 仓库元信息文件名 */
30
+ const REPO_META_FILE_NAME = ".gitreference-meta.json";
31
+ /** 当前配置版本 */
32
+ const CONFIG_VERSION = "1.0.0";
33
+ /**
34
+ * 获取 grf 根目录路径
35
+ * @returns grf 根目录的绝对路径 (~/.gitreference/)
36
+ */
37
+ function getGrfRoot() {
38
+ return path_1.default.join(os_1.default.homedir(), GRF_DIR_NAME);
39
+ }
40
+ /**
41
+ * 获取仓库存储根目录
42
+ * @returns 仓库存储目录的绝对路径 (~/.gitreference/repos/)
43
+ */
44
+ function getReposRoot() {
45
+ return path_1.default.join(getGrfRoot(), REPOS_DIR_NAME);
46
+ }
47
+ /**
48
+ * 获取配置文件路径
49
+ * @returns 配置文件的绝对路径 (~/.gitreference/config.json)
50
+ */
51
+ function getConfigPath() {
52
+ return path_1.default.join(getGrfRoot(), CONFIG_FILE_NAME);
53
+ }
54
+ /**
55
+ * 获取默认配置
56
+ * @returns 默认的全局配置对象
57
+ */
58
+ function getDefaultConfig() {
59
+ return {
60
+ version: CONFIG_VERSION,
61
+ defaultBranch: "main",
62
+ shallowClone: true,
63
+ shallowDepth: 1,
64
+ repos: {},
65
+ };
66
+ }
67
+ /**
68
+ * 确保配置目录存在
69
+ * 如果目录不存在则创建
70
+ */
71
+ async function ensureConfigDir() {
72
+ try {
73
+ const grfRoot = getGrfRoot();
74
+ const reposRoot = getReposRoot();
75
+ await fs_extra_1.default.ensureDir(grfRoot);
76
+ await fs_extra_1.default.ensureDir(reposRoot);
77
+ }
78
+ catch (error) {
79
+ throw new index_js_1.GrfError(index_js_1.ErrorCode.FS_PERMISSION_DENIED, `无法创建配置目录: ${error.message}`, error);
80
+ }
81
+ }
82
+ /**
83
+ * 读取全局配置
84
+ * 如果配置文件不存在,返回默认配置
85
+ * @returns 全局配置对象
86
+ */
87
+ async function readGlobalConfig() {
88
+ const configPath = getConfigPath();
89
+ try {
90
+ const exists = await fs_extra_1.default.pathExists(configPath);
91
+ if (!exists) {
92
+ return getDefaultConfig();
93
+ }
94
+ const content = await fs_extra_1.default.readFile(configPath, "utf-8");
95
+ const config = JSON.parse(content);
96
+ // 确保配置对象包含所有必要字段
97
+ return {
98
+ ...getDefaultConfig(),
99
+ ...config,
100
+ };
101
+ }
102
+ catch (error) {
103
+ if (error.code === "ENOENT") {
104
+ return getDefaultConfig();
105
+ }
106
+ if (error instanceof SyntaxError) {
107
+ throw new index_js_1.GrfError(index_js_1.ErrorCode.CONFIG_PARSE_ERROR, `配置文件解析失败: ${error.message}`, error);
108
+ }
109
+ throw new index_js_1.GrfError(index_js_1.ErrorCode.CONFIG_NOT_FOUND, `读取配置文件失败: ${error.message}`, error);
110
+ }
111
+ }
112
+ /**
113
+ * 写入全局配置
114
+ * 自动创建配置目录(如果不存在)
115
+ * @param config 要写入的配置对象
116
+ */
117
+ async function writeGlobalConfig(config) {
118
+ try {
119
+ await ensureConfigDir();
120
+ const configPath = getConfigPath();
121
+ const content = JSON.stringify(config, null, 2);
122
+ await fs_extra_1.default.writeFile(configPath, content, "utf-8");
123
+ }
124
+ catch (error) {
125
+ if (error instanceof index_js_1.GrfError) {
126
+ throw error;
127
+ }
128
+ throw new index_js_1.GrfError(index_js_1.ErrorCode.CONFIG_WRITE_ERROR, `写入配置文件失败: ${error.message}`, error);
129
+ }
130
+ }
131
+ /**
132
+ * 获取仓库元信息文件路径
133
+ * @param repoPath 仓库目录路径
134
+ * @returns 元信息文件的绝对路径
135
+ */
136
+ function getRepoMetaPath(repoPath) {
137
+ return path_1.default.join(repoPath, REPO_META_FILE_NAME);
138
+ }
139
+ /**
140
+ * 读取仓库元信息
141
+ * @param repoPath 仓库目录路径
142
+ * @returns 仓库元信息对象,如果不存在则返回 null
143
+ */
144
+ async function readRepoMeta(repoPath) {
145
+ const metaPath = getRepoMetaPath(repoPath);
146
+ try {
147
+ const exists = await fs_extra_1.default.pathExists(metaPath);
148
+ if (!exists) {
149
+ return null;
150
+ }
151
+ const content = await fs_extra_1.default.readFile(metaPath, "utf-8");
152
+ return JSON.parse(content);
153
+ }
154
+ catch (error) {
155
+ if (error.code === "ENOENT") {
156
+ return null;
157
+ }
158
+ if (error instanceof SyntaxError) {
159
+ throw new index_js_1.GrfError(index_js_1.ErrorCode.CONFIG_PARSE_ERROR, `仓库元信息解析失败: ${error.message}`, error);
160
+ }
161
+ throw new index_js_1.GrfError(index_js_1.ErrorCode.CONFIG_NOT_FOUND, `读取仓库元信息失败: ${error.message}`, error);
162
+ }
163
+ }
164
+ /**
165
+ * 写入仓库元信息
166
+ * @param repoPath 仓库目录路径
167
+ * @param meta 要写入的元信息对象
168
+ */
169
+ async function writeRepoMeta(repoPath, meta) {
170
+ try {
171
+ const metaPath = getRepoMetaPath(repoPath);
172
+ const content = JSON.stringify(meta, null, 2);
173
+ await fs_extra_1.default.writeFile(metaPath, content, "utf-8");
174
+ }
175
+ catch (error) {
176
+ throw new index_js_1.GrfError(index_js_1.ErrorCode.CONFIG_WRITE_ERROR, `写入仓库元信息失败: ${error.message}`, error);
177
+ }
178
+ }
179
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * FileSystem 模块
3
+ * 封装文件系统操作,提供复制、删除等功能
4
+ */
5
+ /**
6
+ * 复制选项接口
7
+ */
8
+ export interface CopyOptions {
9
+ /** 要排除的文件/目录模式(如 ['.git', 'node_modules']) */
10
+ exclude?: string[];
11
+ /** 是否覆盖已存在的文件 */
12
+ overwrite?: boolean;
13
+ }
14
+ /**
15
+ * 复制目录
16
+ * @param src 源目录路径
17
+ * @param dest 目标目录路径
18
+ * @param options 复制选项
19
+ */
20
+ export declare function copyDir(src: string, dest: string, options?: CopyOptions): Promise<void>;
21
+ /**
22
+ * 复制单个文件
23
+ * @param src 源文件路径
24
+ * @param dest 目标文件路径
25
+ */
26
+ export declare function copyFile(src: string, dest: string): Promise<void>;
27
+ /**
28
+ * 删除目录(递归删除)
29
+ * @param dirPath 要删除的目录路径
30
+ */
31
+ export declare function removeDir(dirPath: string): Promise<void>;
32
+ /**
33
+ * 检查路径是否存在
34
+ * @param filePath 要检查的路径
35
+ * @returns 路径是否存在
36
+ */
37
+ export declare function exists(filePath: string): Promise<boolean>;
38
+ /**
39
+ * 确保目录存在(不存在则创建)
40
+ * @param dirPath 目录路径
41
+ */
42
+ export declare function ensureDir(dirPath: string): Promise<void>;
43
+ /**
44
+ * 更新 .gitignore 文件
45
+ * 如果指定条目不存在,则追加到文件末尾
46
+ * 优化:将所有 gitreference 管理的条目放在同一个注释块下
47
+ * @param dir 目录路径
48
+ * @param entry 要添加的条目
49
+ */
50
+ export declare function updateGitignore(dir: string, entry: string): Promise<void>;
51
+ /**
52
+ * 读取目录内容
53
+ * @param dirPath 目录路径
54
+ * @returns 文件/目录名数组
55
+ */
56
+ export declare function readDir(dirPath: string): Promise<string[]>;
57
+ /**
58
+ * 检查路径是否为目录
59
+ * @param filePath 要检查的路径
60
+ * @returns 是否为目录
61
+ */
62
+ export declare function isDirectory(filePath: string): Promise<boolean>;
63
+ /**
64
+ * 从 .gitignore 文件中移除指定条目
65
+ * @param dir 目录路径(包含 .gitignore 的目录)
66
+ * @param entry 要移除的条目
67
+ * @param options 移除选项
68
+ * @returns 是否成功移除(条目存在并被移除返回 true)
69
+ */
70
+ export declare function removeFromGitignore(dir: string, entry: string, options?: {
71
+ /** 是否同时移除关联的注释行(# Added by gitreference) */
72
+ removeComment?: boolean;
73
+ }): Promise<boolean>;
74
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/core/filesystem.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,iBAAiB;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BvE;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB9D;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/D;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB9D;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CA0Ef;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBhE;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BpE;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACR,4CAA4C;IAC5C,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACA,OAAO,CAAC,OAAO,CAAC,CA0FlB"}