grf-cli 1.0.0 → 1.0.3

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 (104) hide show
  1. package/README.md +5 -5
  2. package/README.zh-CN.md +5 -5
  3. package/dist/cli.js +2 -14
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/add.d.ts +5 -0
  6. package/dist/commands/add.d.ts.map +1 -1
  7. package/dist/commands/add.js +15 -16
  8. package/dist/commands/add.js.map +1 -1
  9. package/dist/commands/clean.d.ts +5 -0
  10. package/dist/commands/clean.d.ts.map +1 -1
  11. package/dist/commands/clean.js +15 -33
  12. package/dist/commands/clean.js.map +1 -1
  13. package/dist/commands/config.d.ts +5 -0
  14. package/dist/commands/config.d.ts.map +1 -1
  15. package/dist/commands/config.js +19 -39
  16. package/dist/commands/config.js.map +1 -1
  17. package/dist/commands/index.d.ts +27 -0
  18. package/dist/commands/index.d.ts.map +1 -0
  19. package/dist/commands/index.js +52 -0
  20. package/dist/commands/index.js.map +1 -0
  21. package/dist/commands/list.d.ts +5 -0
  22. package/dist/commands/list.d.ts.map +1 -1
  23. package/dist/commands/list.js +27 -59
  24. package/dist/commands/list.js.map +1 -1
  25. package/dist/commands/load.d.ts +5 -0
  26. package/dist/commands/load.d.ts.map +1 -1
  27. package/dist/commands/load.js +23 -61
  28. package/dist/commands/load.js.map +1 -1
  29. package/dist/commands/unload.d.ts +6 -1
  30. package/dist/commands/unload.d.ts.map +1 -1
  31. package/dist/commands/unload.js +157 -162
  32. package/dist/commands/unload.js.map +1 -1
  33. package/dist/commands/update.d.ts +6 -1
  34. package/dist/commands/update.d.ts.map +1 -1
  35. package/dist/commands/update.js +66 -74
  36. package/dist/commands/update.js.map +1 -1
  37. package/dist/core/config-manager.d.ts +83 -0
  38. package/dist/core/config-manager.d.ts.map +1 -0
  39. package/dist/core/config-manager.js +170 -0
  40. package/dist/core/config-manager.js.map +1 -0
  41. package/dist/core/config.d.ts +22 -2
  42. package/dist/core/config.d.ts.map +1 -1
  43. package/dist/core/config.js +71 -35
  44. package/dist/core/config.js.map +1 -1
  45. package/dist/core/loading-state.d.ts +125 -0
  46. package/dist/core/loading-state.d.ts.map +1 -0
  47. package/dist/core/loading-state.js +212 -0
  48. package/dist/core/loading-state.js.map +1 -0
  49. package/dist/core/loading.d.ts +21 -26
  50. package/dist/core/loading.d.ts.map +1 -1
  51. package/dist/core/loading.js +124 -87
  52. package/dist/core/loading.js.map +1 -1
  53. package/dist/core/migration.d.ts +54 -0
  54. package/dist/core/migration.d.ts.map +1 -0
  55. package/dist/core/migration.js +279 -0
  56. package/dist/core/migration.js.map +1 -0
  57. package/dist/core/paths.d.ts +58 -0
  58. package/dist/core/paths.d.ts.map +1 -0
  59. package/dist/core/paths.js +103 -0
  60. package/dist/core/paths.js.map +1 -0
  61. package/dist/core/repos-index.d.ts +113 -0
  62. package/dist/core/repos-index.d.ts.map +1 -0
  63. package/dist/core/repos-index.js +206 -0
  64. package/dist/core/repos-index.js.map +1 -0
  65. package/dist/core/sync.d.ts.map +1 -1
  66. package/dist/core/sync.js +3 -3
  67. package/dist/core/sync.js.map +1 -1
  68. package/dist/ui/format.d.ts +159 -0
  69. package/dist/ui/format.d.ts.map +1 -0
  70. package/dist/ui/format.js +300 -0
  71. package/dist/ui/format.js.map +1 -0
  72. package/dist/ui/index.d.ts +9 -0
  73. package/dist/ui/index.d.ts.map +1 -0
  74. package/dist/ui/index.js +53 -0
  75. package/dist/ui/index.js.map +1 -0
  76. package/dist/ui/prompt.d.ts +94 -0
  77. package/dist/ui/prompt.d.ts.map +1 -0
  78. package/dist/ui/prompt.js +223 -0
  79. package/dist/ui/prompt.js.map +1 -0
  80. package/dist/ui/spinner.d.ts +99 -0
  81. package/dist/ui/spinner.d.ts.map +1 -0
  82. package/dist/ui/spinner.js +136 -0
  83. package/dist/ui/spinner.js.map +1 -0
  84. package/dist/ui/table.d.ts +142 -0
  85. package/dist/ui/table.d.ts.map +1 -0
  86. package/dist/ui/table.js +213 -0
  87. package/dist/ui/table.js.map +1 -0
  88. package/dist/utils/constants.d.ts +152 -0
  89. package/dist/utils/constants.d.ts.map +1 -0
  90. package/dist/utils/constants.js +160 -0
  91. package/dist/utils/constants.js.map +1 -0
  92. package/dist/utils/error.d.ts +109 -0
  93. package/dist/utils/error.d.ts.map +1 -0
  94. package/dist/utils/error.js +212 -0
  95. package/dist/utils/error.js.map +1 -0
  96. package/dist/utils/index.d.ts +8 -0
  97. package/dist/utils/index.d.ts.map +1 -0
  98. package/dist/utils/index.js +44 -0
  99. package/dist/utils/index.js.map +1 -0
  100. package/dist/utils/validation.d.ts +122 -0
  101. package/dist/utils/validation.d.ts.map +1 -0
  102. package/dist/utils/validation.js +248 -0
  103. package/dist/utils/validation.js.map +1 -0
  104. package/package.json +4 -4
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ /**
3
+ * 加载状态管理模块
4
+ * 管理仓库的加载状态,存储到独立的 loading.json 文件中
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.loadingState = exports.LoadingStateManager = void 0;
11
+ exports.getAllLoadingStates = getAllLoadingStates;
12
+ exports.getLoadingState = getLoadingState;
13
+ exports.markAsLoaded = markAsLoaded;
14
+ exports.markAsUnloaded = markAsUnloaded;
15
+ exports.isRepoLoaded = isRepoLoaded;
16
+ const fs_extra_1 = __importDefault(require("fs-extra"));
17
+ const paths_js_1 = require("./paths.js");
18
+ // ============================================================================
19
+ // 加载状态管理类
20
+ // ============================================================================
21
+ /**
22
+ * 加载状态管理器
23
+ * 提供对仓库加载状态的 CRUD 操作
24
+ */
25
+ class LoadingStateManager {
26
+ constructor() {
27
+ this.cache = null;
28
+ }
29
+ /**
30
+ * 读取加载状态文件
31
+ * @returns 加载状态索引
32
+ */
33
+ async read() {
34
+ // 如果有缓存,直接返回
35
+ if (this.cache !== null) {
36
+ return this.cache;
37
+ }
38
+ const filePath = (0, paths_js_1.getLoadingStatePath)();
39
+ try {
40
+ const content = await fs_extra_1.default.readFile(filePath, "utf-8");
41
+ const parsed = JSON.parse(content);
42
+ // 验证数据格式,确保 loadedRepos 字段存在
43
+ // 兼容旧格式文件(可能包含 version 和 entries 而不是 loadedRepos)
44
+ if (!parsed.loadedRepos || typeof parsed.loadedRepos !== "object") {
45
+ this.cache = { loadedRepos: {} };
46
+ }
47
+ else {
48
+ this.cache = parsed;
49
+ }
50
+ return this.cache;
51
+ }
52
+ catch (error) {
53
+ // 文件不存在或解析失败,返回空结构
54
+ this.cache = { loadedRepos: {} };
55
+ return this.cache;
56
+ }
57
+ }
58
+ /**
59
+ * 写入加载状态文件
60
+ * @param data 加载状态索引
61
+ */
62
+ async write(data) {
63
+ await (0, paths_js_1.ensureGrfDirs)();
64
+ const filePath = (0, paths_js_1.getLoadingStatePath)();
65
+ await fs_extra_1.default.writeFile(filePath, JSON.stringify(data, null, 2), "utf-8");
66
+ this.cache = data;
67
+ }
68
+ /**
69
+ * 获取所有加载状态
70
+ * @returns 所有仓库的加载状态记录
71
+ */
72
+ async getAll() {
73
+ const data = await this.read();
74
+ return data.loadedRepos;
75
+ }
76
+ /**
77
+ * 获取单个仓库的加载状态
78
+ * @param repoName 仓库名称
79
+ * @returns 仓库的加载状态,如果不存在则返回 undefined
80
+ */
81
+ async get(repoName) {
82
+ const data = await this.read();
83
+ return data.loadedRepos[repoName];
84
+ }
85
+ /**
86
+ * 设置仓库的加载状态
87
+ * @param repoName 仓库名称
88
+ * @param state 加载状态
89
+ */
90
+ async set(repoName, state) {
91
+ const data = await this.read();
92
+ data.loadedRepos[repoName] = state;
93
+ await this.write(data);
94
+ }
95
+ /**
96
+ * 移除仓库的加载状态
97
+ * @param repoName 仓库名称
98
+ * @returns 是否成功移除(如果仓库不存在则返回 false)
99
+ */
100
+ async remove(repoName) {
101
+ const data = await this.read();
102
+ if (!(repoName in data.loadedRepos)) {
103
+ return false;
104
+ }
105
+ delete data.loadedRepos[repoName];
106
+ await this.write(data);
107
+ return true;
108
+ }
109
+ /**
110
+ * 检查仓库是否已加载
111
+ * @param repoName 仓库名称
112
+ * @returns 是否已加载
113
+ */
114
+ async isLoaded(repoName) {
115
+ const data = await this.read();
116
+ return repoName in data.loadedRepos;
117
+ }
118
+ /**
119
+ * 获取已加载的仓库数量
120
+ * @returns 已加载的仓库数量
121
+ */
122
+ async count() {
123
+ const data = await this.read();
124
+ return Object.keys(data.loadedRepos).length;
125
+ }
126
+ /**
127
+ * 获取所有已加载的仓库名称
128
+ * @returns 已加载的仓库名称列表
129
+ */
130
+ async names() {
131
+ const data = await this.read();
132
+ return Object.keys(data.loadedRepos);
133
+ }
134
+ /**
135
+ * 清空所有加载状态
136
+ */
137
+ async clear() {
138
+ await this.write({ loadedRepos: {} });
139
+ }
140
+ /**
141
+ * 批量设置加载状态(用于迁移)
142
+ * @param states 加载状态记录
143
+ */
144
+ async setAll(states) {
145
+ await this.write({ loadedRepos: states });
146
+ }
147
+ /**
148
+ * 清除缓存
149
+ */
150
+ clearCache() {
151
+ this.cache = null;
152
+ }
153
+ }
154
+ exports.LoadingStateManager = LoadingStateManager;
155
+ // ============================================================================
156
+ // 单例实例
157
+ // ============================================================================
158
+ /**
159
+ * 加载状态管理器单例实例
160
+ */
161
+ exports.loadingState = new LoadingStateManager();
162
+ // ============================================================================
163
+ // 便捷函数
164
+ // ============================================================================
165
+ /**
166
+ * 获取所有加载状态
167
+ * @returns 所有仓库的加载状态记录
168
+ */
169
+ async function getAllLoadingStates() {
170
+ return exports.loadingState.getAll();
171
+ }
172
+ /**
173
+ * 获取单个仓库的加载状态
174
+ * @param repoName 仓库名称
175
+ * @returns 仓库的加载状态,如果不存在则返回 undefined
176
+ */
177
+ async function getLoadingState(repoName) {
178
+ return exports.loadingState.get(repoName);
179
+ }
180
+ /**
181
+ * 标记仓库为已加载
182
+ * @param repoName 仓库名称
183
+ * @param targetPath 加载到的目标路径
184
+ * @param branch 加载的分支(可选)
185
+ */
186
+ async function markAsLoaded(repoName, targetPath, branch) {
187
+ const state = {
188
+ targetPath,
189
+ loadedAt: new Date().toISOString(),
190
+ };
191
+ if (branch !== undefined) {
192
+ state.branch = branch;
193
+ }
194
+ await exports.loadingState.set(repoName, state);
195
+ }
196
+ /**
197
+ * 标记仓库为已卸载
198
+ * @param repoName 仓库名称
199
+ * @returns 是否成功移除(如果仓库不存在则返回 false)
200
+ */
201
+ async function markAsUnloaded(repoName) {
202
+ return exports.loadingState.remove(repoName);
203
+ }
204
+ /**
205
+ * 检查仓库是否已加载
206
+ * @param repoName 仓库名称
207
+ * @returns 是否已加载
208
+ */
209
+ async function isRepoLoaded(repoName) {
210
+ return exports.loadingState.isLoaded(repoName);
211
+ }
212
+ //# sourceMappingURL=loading-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-state.js","sourceRoot":"","sources":["../../src/core/loading-state.ts"],"names":[],"mappings":"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"}
@@ -1,85 +1,80 @@
1
1
  /**
2
- * loading.json 管理模块
2
+ * loading.json 管理模块(兼容层)
3
3
  * 用于追踪已加载的参考代码仓库
4
+ *
5
+ * 此模块现在作为兼容层,内部使用 loading-state.ts 模块
6
+ * 保持原有 API 不变,确保向后兼容
4
7
  */
5
8
  import type { LoadingEntry, LoadingConfig } from "../types/index.js";
6
9
  /**
7
10
  * 获取 loading.json 文件路径
8
- * @param projectRoot 项目根目录,默认为当前工作目录
9
- * @returns loading.json 的绝对路径
11
+ * @returns loading.json 的绝对路径(位于用户主目录下)
10
12
  */
11
- export declare function getLoadingFilePath(projectRoot?: string): string;
13
+ export declare function getLoadingFilePath(): string;
12
14
  /**
13
15
  * 读取 loading.json 配置
14
- * @param projectRoot 项目根目录
15
16
  * @returns 加载配置,如果文件不存在则返回空配置
16
17
  */
17
- export declare function readLoadingConfig(projectRoot?: string): Promise<LoadingConfig>;
18
+ export declare function readLoadingConfig(): Promise<LoadingConfig>;
18
19
  /**
19
20
  * 写入 loading.json 配置
20
21
  * @param config 加载配置
21
- * @param projectRoot 项目根目录
22
+ * @deprecated 此函数保留用于兼容,但建议使用 addEntry/removeEntry 等函数
22
23
  */
23
- export declare function writeLoadingConfig(config: LoadingConfig, projectRoot?: string): Promise<void>;
24
+ export declare function writeLoadingConfig(config: LoadingConfig): Promise<void>;
24
25
  /**
25
26
  * 添加加载条目
26
27
  * @param entry 加载条目(不含 id 和 loadedAt)
27
- * @param projectRoot 项目根目录
28
28
  * @returns 添加的完整条目
29
29
  */
30
- export declare function addEntry(entry: Omit<LoadingEntry, "id" | "loadedAt">, projectRoot?: string): Promise<LoadingEntry>;
30
+ export declare function addEntry(entry: Omit<LoadingEntry, "id" | "loadedAt">): Promise<LoadingEntry>;
31
31
  /**
32
32
  * 获取所有加载条目
33
- * @param projectRoot 项目根目录
34
33
  * @returns 加载条目列表
35
34
  */
36
- export declare function getEntries(projectRoot?: string): Promise<LoadingEntry[]>;
35
+ export declare function getEntries(): Promise<LoadingEntry[]>;
37
36
  /**
38
37
  * 根据 ID 获取加载条目
39
38
  * @param id 条目 ID
40
- * @param projectRoot 项目根目录
41
39
  * @returns 加载条目,如果不存在则返回 undefined
40
+ * @deprecated 新模块不支持按 ID 查询,此函数功能受限
42
41
  */
43
- export declare function getEntryById(id: string, projectRoot?: string): Promise<LoadingEntry | undefined>;
42
+ export declare function getEntryById(id: string): Promise<LoadingEntry | undefined>;
44
43
  /**
45
44
  * 根据目标路径获取加载条目
46
45
  * @param targetPath 目标路径
47
- * @param projectRoot 项目根目录
48
46
  * @returns 加载条目,如果不存在则返回 undefined
49
47
  */
50
- export declare function getEntryByTargetPath(targetPath: string, projectRoot?: string): Promise<LoadingEntry | undefined>;
48
+ export declare function getEntryByTargetPath(targetPath: string): Promise<LoadingEntry | undefined>;
51
49
  /**
52
50
  * 根据仓库名称获取加载条目
53
51
  * @param repoName 仓库名称
54
- * @param projectRoot 项目根目录
55
52
  * @returns 匹配的加载条目列表
56
53
  */
57
- export declare function getEntriesByRepoName(repoName: string, projectRoot?: string): Promise<LoadingEntry[]>;
54
+ export declare function getEntriesByRepoName(repoName: string): Promise<LoadingEntry[]>;
58
55
  /**
59
56
  * 删除加载条目
60
57
  * @param id 条目 ID
61
- * @param projectRoot 项目根目录
62
58
  * @returns 是否成功删除
59
+ * @deprecated 新模块不支持按 ID 删除,此函数功能受限
63
60
  */
64
- export declare function removeEntry(id: string, projectRoot?: string): Promise<boolean>;
61
+ export declare function removeEntry(id: string): Promise<boolean>;
65
62
  /**
66
63
  * 根据目标路径删除加载条目
67
64
  * @param targetPath 目标路径
68
- * @param projectRoot 项目根目录
69
65
  * @returns 被删除的条目,如果不存在则返回 undefined
70
66
  */
71
- export declare function removeEntryByTargetPath(targetPath: string, projectRoot?: string): Promise<LoadingEntry | undefined>;
67
+ export declare function removeEntryByTargetPath(targetPath: string): Promise<LoadingEntry | undefined>;
72
68
  /**
73
69
  * 清空所有加载条目
74
- * @param projectRoot 项目根目录
75
70
  */
76
- export declare function clearAllEntries(projectRoot?: string): Promise<void>;
71
+ export declare function clearAllEntries(): Promise<void>;
77
72
  /**
78
73
  * 更新加载条目
79
74
  * @param id 条目 ID
80
75
  * @param updates 要更新的字段
81
- * @param projectRoot 项目根目录
82
76
  * @returns 更新后的条目,如果不存在则返回 undefined
77
+ * @deprecated 新模块不支持按 ID 更新,此函数功能受限
83
78
  */
84
- export declare function updateEntry(id: string, updates: Partial<Omit<LoadingEntry, "id" | "loadedAt">>, projectRoot?: string): Promise<LoadingEntry | undefined>;
79
+ export declare function updateEntry(id: string, updates: Partial<Omit<LoadingEntry, "id" | "loadedAt">>): Promise<LoadingEntry | undefined>;
85
80
  //# sourceMappingURL=loading.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loading.d.ts","sourceRoot":"","sources":["../../src/core/loading.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAWrE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,GAAE,MAAsB,GAClC,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,aAAa,CAAC,CAaxB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,UAAU,CAAC,EAC5C,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,YAAY,CAAC,CAavB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,YAAY,EAAE,CAAC,CAGzB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,EACV,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAGnC;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAOnC;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,YAAY,EAAE,CAAC,CAGzB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,MAAM,EACV,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAenC;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,UAAU,CAAC,CAAC,EACvD,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAiBnC"}
1
+ {"version":3,"file":"loading.d.ts","sourceRoot":"","sources":["../../src/core/loading.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AA2CrE;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAahE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7E;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,UAAU,CAAC,GAC3C,OAAO,CAAC,YAAY,CAAC,CAcvB;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAG1D;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAInC;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAYnC;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,EAAE,CAAC,CAYzB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW9D;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAcnC;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAGrD;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,UAAU,CAAC,CAAC,GACtD,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CA4BnC"}
@@ -1,7 +1,10 @@
1
1
  "use strict";
2
2
  /**
3
- * loading.json 管理模块
3
+ * loading.json 管理模块(兼容层)
4
4
  * 用于追踪已加载的参考代码仓库
5
+ *
6
+ * 此模块现在作为兼容层,内部使用 loading-state.ts 模块
7
+ * 保持原有 API 不变,确保向后兼容
5
8
  */
6
9
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
10
  if (k2 === undefined) k2 = k;
@@ -49,176 +52,210 @@ exports.removeEntry = removeEntry;
49
52
  exports.removeEntryByTargetPath = removeEntryByTargetPath;
50
53
  exports.clearAllEntries = clearAllEntries;
51
54
  exports.updateEntry = updateEntry;
52
- const fs = __importStar(require("fs/promises"));
53
55
  const path = __importStar(require("path"));
54
56
  const crypto_1 = require("crypto");
55
- /** loading.json 文件名 */
56
- const LOADING_FILE_NAME = "loading.json";
57
- /** .gitreference 目录名 */
58
- const GITREFERENCE_DIR = ".gitreference";
57
+ const paths_js_1 = require("./paths.js");
58
+ const loading_state_js_1 = require("./loading-state.js");
59
59
  /** 当前配置版本 */
60
60
  const CONFIG_VERSION = "1.0.0";
61
+ /**
62
+ * 内部缓存:存储完整的 LoadingEntry 数据
63
+ * 由于新的 loading-state.ts 只存储简化的状态,
64
+ * 我们需要在内存中维护完整的条目信息
65
+ */
66
+ let entriesCache = null;
67
+ /**
68
+ * 从 RepoLoadingState 和仓库名称构建 LoadingEntry
69
+ * @param repoName 仓库名称
70
+ * @param state 加载状态
71
+ * @returns LoadingEntry 对象
72
+ */
73
+ function buildEntryFromState(repoName, state) {
74
+ return {
75
+ id: (0, crypto_1.randomUUID)(), // 每次构建时生成新 ID(兼容层限制)
76
+ repoName,
77
+ repoUrl: "", // 新模块不存储此信息
78
+ commitId: "", // 新模块不存储此信息
79
+ branch: state.branch,
80
+ targetPath: state.targetPath,
81
+ loadedAt: state.loadedAt,
82
+ };
83
+ }
61
84
  /**
62
85
  * 获取 loading.json 文件路径
63
- * @param projectRoot 项目根目录,默认为当前工作目录
64
- * @returns loading.json 的绝对路径
86
+ * @returns loading.json 的绝对路径(位于用户主目录下)
65
87
  */
66
- function getLoadingFilePath(projectRoot = process.cwd()) {
67
- return path.join(projectRoot, GITREFERENCE_DIR, LOADING_FILE_NAME);
88
+ function getLoadingFilePath() {
89
+ // 使用新的路径管理模块
90
+ return (0, paths_js_1.getLoadingStatePath)();
68
91
  }
69
92
  /**
70
93
  * 读取 loading.json 配置
71
- * @param projectRoot 项目根目录
72
94
  * @returns 加载配置,如果文件不存在则返回空配置
73
95
  */
74
- async function readLoadingConfig(projectRoot = process.cwd()) {
75
- const filePath = getLoadingFilePath(projectRoot);
76
- try {
77
- const content = await fs.readFile(filePath, "utf-8");
78
- return JSON.parse(content);
79
- }
80
- catch (error) {
81
- // 文件不存在或解析失败,返回空配置
82
- return {
83
- version: CONFIG_VERSION,
84
- entries: [],
85
- };
86
- }
96
+ async function readLoadingConfig() {
97
+ // 从新模块获取所有加载状态
98
+ const states = await (0, loading_state_js_1.getAllLoadingStates)();
99
+ // 转换为 LoadingEntry 格式
100
+ const entries = Object.entries(states).map(([repoName, state]) => buildEntryFromState(repoName, state));
101
+ return {
102
+ version: CONFIG_VERSION,
103
+ entries,
104
+ };
87
105
  }
88
106
  /**
89
107
  * 写入 loading.json 配置
90
108
  * @param config 加载配置
91
- * @param projectRoot 项目根目录
109
+ * @deprecated 此函数保留用于兼容,但建议使用 addEntry/removeEntry 等函数
92
110
  */
93
- async function writeLoadingConfig(config, projectRoot = process.cwd()) {
94
- const filePath = getLoadingFilePath(projectRoot);
95
- const dirPath = path.dirname(filePath);
96
- // 确保目录存在
97
- await fs.mkdir(dirPath, { recursive: true });
98
- // 写入文件
99
- await fs.writeFile(filePath, JSON.stringify(config, null, 2), "utf-8");
111
+ async function writeLoadingConfig(config) {
112
+ // 清空现有状态
113
+ await loading_state_js_1.loadingState.clear();
114
+ // 逐个添加条目
115
+ for (const entry of config.entries) {
116
+ await (0, loading_state_js_1.markAsLoaded)(entry.repoName, entry.targetPath, entry.branch);
117
+ }
118
+ // 更新缓存
119
+ entriesCache = config.entries;
100
120
  }
101
121
  /**
102
122
  * 添加加载条目
103
123
  * @param entry 加载条目(不含 id 和 loadedAt)
104
- * @param projectRoot 项目根目录
105
124
  * @returns 添加的完整条目
106
125
  */
107
- async function addEntry(entry, projectRoot = process.cwd()) {
108
- const config = await readLoadingConfig(projectRoot);
126
+ async function addEntry(entry) {
127
+ const loadedAt = new Date().toISOString();
128
+ // 使用新模块标记为已加载
129
+ await (0, loading_state_js_1.markAsLoaded)(entry.repoName, entry.targetPath, entry.branch);
130
+ // 构建完整的条目
109
131
  const newEntry = {
110
132
  ...entry,
111
133
  id: (0, crypto_1.randomUUID)(),
112
- loadedAt: new Date().toISOString(),
134
+ loadedAt,
113
135
  };
114
- config.entries.push(newEntry);
115
- await writeLoadingConfig(config, projectRoot);
116
136
  return newEntry;
117
137
  }
118
138
  /**
119
139
  * 获取所有加载条目
120
- * @param projectRoot 项目根目录
121
140
  * @returns 加载条目列表
122
141
  */
123
- async function getEntries(projectRoot = process.cwd()) {
124
- const config = await readLoadingConfig(projectRoot);
142
+ async function getEntries() {
143
+ const config = await readLoadingConfig();
125
144
  return config.entries;
126
145
  }
127
146
  /**
128
147
  * 根据 ID 获取加载条目
129
148
  * @param id 条目 ID
130
- * @param projectRoot 项目根目录
131
149
  * @returns 加载条目,如果不存在则返回 undefined
150
+ * @deprecated 新模块不支持按 ID 查询,此函数功能受限
132
151
  */
133
- async function getEntryById(id, projectRoot = process.cwd()) {
134
- const config = await readLoadingConfig(projectRoot);
135
- return config.entries.find((entry) => entry.id === id);
152
+ async function getEntryById(id) {
153
+ // 新模块不支持按 ID 查询,遍历所有条目
154
+ const entries = await getEntries();
155
+ return entries.find((entry) => entry.id === id);
136
156
  }
137
157
  /**
138
158
  * 根据目标路径获取加载条目
139
159
  * @param targetPath 目标路径
140
- * @param projectRoot 项目根目录
141
160
  * @returns 加载条目,如果不存在则返回 undefined
142
161
  */
143
- async function getEntryByTargetPath(targetPath, projectRoot = process.cwd()) {
144
- const config = await readLoadingConfig(projectRoot);
145
- // 标准化路径进行比较
162
+ async function getEntryByTargetPath(targetPath) {
163
+ const states = await (0, loading_state_js_1.getAllLoadingStates)();
146
164
  const normalizedTarget = path.normalize(targetPath);
147
- return config.entries.find((entry) => path.normalize(entry.targetPath) === normalizedTarget);
165
+ // 查找匹配的条目
166
+ for (const [repoName, state] of Object.entries(states)) {
167
+ if (path.normalize(state.targetPath) === normalizedTarget) {
168
+ return buildEntryFromState(repoName, state);
169
+ }
170
+ }
171
+ return undefined;
148
172
  }
149
173
  /**
150
174
  * 根据仓库名称获取加载条目
151
175
  * @param repoName 仓库名称
152
- * @param projectRoot 项目根目录
153
176
  * @returns 匹配的加载条目列表
154
177
  */
155
- async function getEntriesByRepoName(repoName, projectRoot = process.cwd()) {
156
- const config = await readLoadingConfig(projectRoot);
157
- return config.entries.filter((entry) => entry.repoName.includes(repoName));
178
+ async function getEntriesByRepoName(repoName) {
179
+ const states = await (0, loading_state_js_1.getAllLoadingStates)();
180
+ const results = [];
181
+ // 查找包含指定名称的仓库
182
+ for (const [name, state] of Object.entries(states)) {
183
+ if (name.includes(repoName)) {
184
+ results.push(buildEntryFromState(name, state));
185
+ }
186
+ }
187
+ return results;
158
188
  }
159
189
  /**
160
190
  * 删除加载条目
161
191
  * @param id 条目 ID
162
- * @param projectRoot 项目根目录
163
192
  * @returns 是否成功删除
193
+ * @deprecated 新模块不支持按 ID 删除,此函数功能受限
164
194
  */
165
- async function removeEntry(id, projectRoot = process.cwd()) {
166
- const config = await readLoadingConfig(projectRoot);
167
- const index = config.entries.findIndex((entry) => entry.id === id);
168
- if (index === -1) {
195
+ async function removeEntry(id) {
196
+ // 新模块不支持按 ID 删除,需要先找到对应的仓库名称
197
+ const entries = await getEntries();
198
+ const entry = entries.find((e) => e.id === id);
199
+ if (!entry) {
169
200
  return false;
170
201
  }
171
- config.entries.splice(index, 1);
172
- await writeLoadingConfig(config, projectRoot);
173
- return true;
202
+ // 使用仓库名称删除
203
+ return (0, loading_state_js_1.markAsUnloaded)(entry.repoName);
174
204
  }
175
205
  /**
176
206
  * 根据目标路径删除加载条目
177
207
  * @param targetPath 目标路径
178
- * @param projectRoot 项目根目录
179
208
  * @returns 被删除的条目,如果不存在则返回 undefined
180
209
  */
181
- async function removeEntryByTargetPath(targetPath, projectRoot = process.cwd()) {
182
- const config = await readLoadingConfig(projectRoot);
210
+ async function removeEntryByTargetPath(targetPath) {
211
+ const states = await (0, loading_state_js_1.getAllLoadingStates)();
183
212
  const normalizedTarget = path.normalize(targetPath);
184
- const index = config.entries.findIndex((entry) => path.normalize(entry.targetPath) === normalizedTarget);
185
- if (index === -1) {
186
- return undefined;
213
+ // 查找匹配的条目
214
+ for (const [repoName, state] of Object.entries(states)) {
215
+ if (path.normalize(state.targetPath) === normalizedTarget) {
216
+ const entry = buildEntryFromState(repoName, state);
217
+ await (0, loading_state_js_1.markAsUnloaded)(repoName);
218
+ return entry;
219
+ }
187
220
  }
188
- const [removed] = config.entries.splice(index, 1);
189
- await writeLoadingConfig(config, projectRoot);
190
- return removed;
221
+ return undefined;
191
222
  }
192
223
  /**
193
224
  * 清空所有加载条目
194
- * @param projectRoot 项目根目录
195
225
  */
196
- async function clearAllEntries(projectRoot = process.cwd()) {
197
- const config = {
198
- version: CONFIG_VERSION,
199
- entries: [],
200
- };
201
- await writeLoadingConfig(config, projectRoot);
226
+ async function clearAllEntries() {
227
+ await loading_state_js_1.loadingState.clear();
228
+ entriesCache = null;
202
229
  }
203
230
  /**
204
231
  * 更新加载条目
205
232
  * @param id 条目 ID
206
233
  * @param updates 要更新的字段
207
- * @param projectRoot 项目根目录
208
234
  * @returns 更新后的条目,如果不存在则返回 undefined
235
+ * @deprecated 新模块不支持按 ID 更新,此函数功能受限
209
236
  */
210
- async function updateEntry(id, updates, projectRoot = process.cwd()) {
211
- const config = await readLoadingConfig(projectRoot);
212
- const index = config.entries.findIndex((entry) => entry.id === id);
213
- if (index === -1) {
237
+ async function updateEntry(id, updates) {
238
+ // 新模块不支持按 ID 更新,需要先找到对应的仓库名称
239
+ const entries = await getEntries();
240
+ const entry = entries.find((e) => e.id === id);
241
+ if (!entry) {
214
242
  return undefined;
215
243
  }
216
- config.entries[index] = {
217
- ...config.entries[index],
244
+ // 更新加载状态
245
+ const newRepoName = updates.repoName ?? entry.repoName;
246
+ const newTargetPath = updates.targetPath ?? entry.targetPath;
247
+ const newBranch = updates.branch ?? entry.branch;
248
+ // 如果仓库名称变了,需要先删除旧的
249
+ if (updates.repoName && updates.repoName !== entry.repoName) {
250
+ await (0, loading_state_js_1.markAsUnloaded)(entry.repoName);
251
+ }
252
+ // 设置新的状态
253
+ await (0, loading_state_js_1.markAsLoaded)(newRepoName, newTargetPath, newBranch);
254
+ // 返回更新后的条目
255
+ return {
256
+ ...entry,
218
257
  ...updates,
219
258
  updatedAt: new Date().toISOString(),
220
259
  };
221
- await writeLoadingConfig(config, projectRoot);
222
- return config.entries[index];
223
260
  }
224
261
  //# sourceMappingURL=loading.js.map