@mycodemap/mycodemap 0.1.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 (329) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +559 -0
  4. package/dist/ai/claude.d.ts +38 -0
  5. package/dist/ai/claude.d.ts.map +1 -0
  6. package/dist/ai/claude.js +169 -0
  7. package/dist/ai/claude.js.map +1 -0
  8. package/dist/ai/codex.d.ts +38 -0
  9. package/dist/ai/codex.d.ts.map +1 -0
  10. package/dist/ai/codex.js +169 -0
  11. package/dist/ai/codex.js.map +1 -0
  12. package/dist/ai/factory.d.ts +48 -0
  13. package/dist/ai/factory.d.ts.map +1 -0
  14. package/dist/ai/factory.js +95 -0
  15. package/dist/ai/factory.js.map +1 -0
  16. package/dist/ai/index.d.ts +12 -0
  17. package/dist/ai/index.d.ts.map +1 -0
  18. package/dist/ai/index.js +29 -0
  19. package/dist/ai/index.js.map +1 -0
  20. package/dist/ai/provider.d.ts +70 -0
  21. package/dist/ai/provider.d.ts.map +1 -0
  22. package/dist/ai/provider.js +31 -0
  23. package/dist/ai/provider.js.map +1 -0
  24. package/dist/ai/subagent-caller.d.ts +90 -0
  25. package/dist/ai/subagent-caller.d.ts.map +1 -0
  26. package/dist/ai/subagent-caller.js +280 -0
  27. package/dist/ai/subagent-caller.js.map +1 -0
  28. package/dist/ai/types.d.ts +70 -0
  29. package/dist/ai/types.d.ts.map +1 -0
  30. package/dist/ai/types.js +5 -0
  31. package/dist/ai/types.js.map +1 -0
  32. package/dist/cache/file-hash-cache.d.ts +76 -0
  33. package/dist/cache/file-hash-cache.d.ts.map +1 -0
  34. package/dist/cache/file-hash-cache.js +159 -0
  35. package/dist/cache/file-hash-cache.js.map +1 -0
  36. package/dist/cache/index.d.ts +151 -0
  37. package/dist/cache/index.d.ts.map +1 -0
  38. package/dist/cache/index.js +303 -0
  39. package/dist/cache/index.js.map +1 -0
  40. package/dist/cache/lru-cache.d.ts +93 -0
  41. package/dist/cache/lru-cache.d.ts.map +1 -0
  42. package/dist/cache/lru-cache.js +194 -0
  43. package/dist/cache/lru-cache.js.map +1 -0
  44. package/dist/cache/parse-cache.d.ts +68 -0
  45. package/dist/cache/parse-cache.d.ts.map +1 -0
  46. package/dist/cache/parse-cache.js +173 -0
  47. package/dist/cache/parse-cache.js.map +1 -0
  48. package/dist/cli/commands/analyze.d.ts +96 -0
  49. package/dist/cli/commands/analyze.d.ts.map +1 -0
  50. package/dist/cli/commands/analyze.js +567 -0
  51. package/dist/cli/commands/analyze.js.map +1 -0
  52. package/dist/cli/commands/ci.d.ts +25 -0
  53. package/dist/cli/commands/ci.d.ts.map +1 -0
  54. package/dist/cli/commands/ci.js +481 -0
  55. package/dist/cli/commands/ci.js.map +1 -0
  56. package/dist/cli/commands/complexity.d.ts +70 -0
  57. package/dist/cli/commands/complexity.d.ts.map +1 -0
  58. package/dist/cli/commands/complexity.js +479 -0
  59. package/dist/cli/commands/complexity.js.map +1 -0
  60. package/dist/cli/commands/cycles.d.ts +10 -0
  61. package/dist/cli/commands/cycles.d.ts.map +1 -0
  62. package/dist/cli/commands/cycles.js +202 -0
  63. package/dist/cli/commands/cycles.js.map +1 -0
  64. package/dist/cli/commands/deps.d.ts +61 -0
  65. package/dist/cli/commands/deps.d.ts.map +1 -0
  66. package/dist/cli/commands/deps.js +340 -0
  67. package/dist/cli/commands/deps.js.map +1 -0
  68. package/dist/cli/commands/generate.d.ts +8 -0
  69. package/dist/cli/commands/generate.d.ts.map +1 -0
  70. package/dist/cli/commands/generate.js +61 -0
  71. package/dist/cli/commands/generate.js.map +1 -0
  72. package/dist/cli/commands/impact.d.ts +55 -0
  73. package/dist/cli/commands/impact.d.ts.map +1 -0
  74. package/dist/cli/commands/impact.js +455 -0
  75. package/dist/cli/commands/impact.js.map +1 -0
  76. package/dist/cli/commands/init.d.ts +4 -0
  77. package/dist/cli/commands/init.d.ts.map +1 -0
  78. package/dist/cli/commands/init.js +50 -0
  79. package/dist/cli/commands/init.js.map +1 -0
  80. package/dist/cli/commands/query.d.ts +22 -0
  81. package/dist/cli/commands/query.d.ts.map +1 -0
  82. package/dist/cli/commands/query.js +718 -0
  83. package/dist/cli/commands/query.js.map +1 -0
  84. package/dist/cli/commands/watch-foreground.d.ts +9 -0
  85. package/dist/cli/commands/watch-foreground.d.ts.map +1 -0
  86. package/dist/cli/commands/watch-foreground.js +67 -0
  87. package/dist/cli/commands/watch-foreground.js.map +1 -0
  88. package/dist/cli/commands/watch.d.ts +12 -0
  89. package/dist/cli/commands/watch.d.ts.map +1 -0
  90. package/dist/cli/commands/watch.js +114 -0
  91. package/dist/cli/commands/watch.js.map +1 -0
  92. package/dist/cli/commands/workflow.d.ts +25 -0
  93. package/dist/cli/commands/workflow.d.ts.map +1 -0
  94. package/dist/cli/commands/workflow.js +488 -0
  95. package/dist/cli/commands/workflow.js.map +1 -0
  96. package/dist/cli/index.d.ts +3 -0
  97. package/dist/cli/index.d.ts.map +1 -0
  98. package/dist/cli/index.js +115 -0
  99. package/dist/cli/index.js.map +1 -0
  100. package/dist/cli/paths.d.ts +90 -0
  101. package/dist/cli/paths.d.ts.map +1 -0
  102. package/dist/cli/paths.js +136 -0
  103. package/dist/cli/paths.js.map +1 -0
  104. package/dist/cli/runtime-logger.d.ts +13 -0
  105. package/dist/cli/runtime-logger.d.ts.map +1 -0
  106. package/dist/cli/runtime-logger.js +213 -0
  107. package/dist/cli/runtime-logger.js.map +1 -0
  108. package/dist/core/analyzer.d.ts +3 -0
  109. package/dist/core/analyzer.d.ts.map +1 -0
  110. package/dist/core/analyzer.js +359 -0
  111. package/dist/core/analyzer.js.map +1 -0
  112. package/dist/core/ast-complexity-analyzer.d.ts +40 -0
  113. package/dist/core/ast-complexity-analyzer.d.ts.map +1 -0
  114. package/dist/core/ast-complexity-analyzer.js +279 -0
  115. package/dist/core/ast-complexity-analyzer.js.map +1 -0
  116. package/dist/core/global-index.d.ts +69 -0
  117. package/dist/core/global-index.d.ts.map +1 -0
  118. package/dist/core/global-index.js +388 -0
  119. package/dist/core/global-index.js.map +1 -0
  120. package/dist/generator/ai-overview.d.ts +51 -0
  121. package/dist/generator/ai-overview.d.ts.map +1 -0
  122. package/dist/generator/ai-overview.js +160 -0
  123. package/dist/generator/ai-overview.js.map +1 -0
  124. package/dist/generator/context.d.ts +5 -0
  125. package/dist/generator/context.d.ts.map +1 -0
  126. package/dist/generator/context.js +514 -0
  127. package/dist/generator/context.js.map +1 -0
  128. package/dist/generator/file-describer.d.ts +93 -0
  129. package/dist/generator/file-describer.d.ts.map +1 -0
  130. package/dist/generator/file-describer.js +375 -0
  131. package/dist/generator/file-describer.js.map +1 -0
  132. package/dist/generator/index.d.ts +8 -0
  133. package/dist/generator/index.d.ts.map +1 -0
  134. package/dist/generator/index.js +259 -0
  135. package/dist/generator/index.js.map +1 -0
  136. package/dist/index.d.ts +5 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +6 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/orchestrator/adapters/ast-grep-adapter.d.ts +75 -0
  141. package/dist/orchestrator/adapters/ast-grep-adapter.d.ts.map +1 -0
  142. package/dist/orchestrator/adapters/ast-grep-adapter.js +242 -0
  143. package/dist/orchestrator/adapters/ast-grep-adapter.js.map +1 -0
  144. package/dist/orchestrator/adapters/base-adapter.d.ts +24 -0
  145. package/dist/orchestrator/adapters/base-adapter.d.ts.map +1 -0
  146. package/dist/orchestrator/adapters/base-adapter.js +2 -0
  147. package/dist/orchestrator/adapters/base-adapter.js.map +1 -0
  148. package/dist/orchestrator/adapters/codemap-adapter.d.ts +56 -0
  149. package/dist/orchestrator/adapters/codemap-adapter.d.ts.map +1 -0
  150. package/dist/orchestrator/adapters/codemap-adapter.js +163 -0
  151. package/dist/orchestrator/adapters/codemap-adapter.js.map +1 -0
  152. package/dist/orchestrator/adapters/index.d.ts +10 -0
  153. package/dist/orchestrator/adapters/index.d.ts.map +1 -0
  154. package/dist/orchestrator/adapters/index.js +3 -0
  155. package/dist/orchestrator/adapters/index.js.map +1 -0
  156. package/dist/orchestrator/ai-feed-generator.d.ts +210 -0
  157. package/dist/orchestrator/ai-feed-generator.d.ts.map +1 -0
  158. package/dist/orchestrator/ai-feed-generator.js +377 -0
  159. package/dist/orchestrator/ai-feed-generator.js.map +1 -0
  160. package/dist/orchestrator/commit-validator.d.ts +30 -0
  161. package/dist/orchestrator/commit-validator.d.ts.map +1 -0
  162. package/dist/orchestrator/commit-validator.js +87 -0
  163. package/dist/orchestrator/commit-validator.js.map +1 -0
  164. package/dist/orchestrator/confidence.d.ts +25 -0
  165. package/dist/orchestrator/confidence.d.ts.map +1 -0
  166. package/dist/orchestrator/confidence.js +138 -0
  167. package/dist/orchestrator/confidence.js.map +1 -0
  168. package/dist/orchestrator/file-header-scanner.d.ts +48 -0
  169. package/dist/orchestrator/file-header-scanner.d.ts.map +1 -0
  170. package/dist/orchestrator/file-header-scanner.js +158 -0
  171. package/dist/orchestrator/file-header-scanner.js.map +1 -0
  172. package/dist/orchestrator/git-analyzer.d.ts +192 -0
  173. package/dist/orchestrator/git-analyzer.d.ts.map +1 -0
  174. package/dist/orchestrator/git-analyzer.js +539 -0
  175. package/dist/orchestrator/git-analyzer.js.map +1 -0
  176. package/dist/orchestrator/index.d.ts +20 -0
  177. package/dist/orchestrator/index.d.ts.map +1 -0
  178. package/dist/orchestrator/index.js +16 -0
  179. package/dist/orchestrator/index.js.map +1 -0
  180. package/dist/orchestrator/intent-router.d.ts +41 -0
  181. package/dist/orchestrator/intent-router.d.ts.map +1 -0
  182. package/dist/orchestrator/intent-router.js +98 -0
  183. package/dist/orchestrator/intent-router.js.map +1 -0
  184. package/dist/orchestrator/result-fusion.d.ts +114 -0
  185. package/dist/orchestrator/result-fusion.d.ts.map +1 -0
  186. package/dist/orchestrator/result-fusion.js +332 -0
  187. package/dist/orchestrator/result-fusion.js.map +1 -0
  188. package/dist/orchestrator/test-linker.d.ts +166 -0
  189. package/dist/orchestrator/test-linker.d.ts.map +1 -0
  190. package/dist/orchestrator/test-linker.js +570 -0
  191. package/dist/orchestrator/test-linker.js.map +1 -0
  192. package/dist/orchestrator/tool-orchestrator.d.ts +108 -0
  193. package/dist/orchestrator/tool-orchestrator.d.ts.map +1 -0
  194. package/dist/orchestrator/tool-orchestrator.js +247 -0
  195. package/dist/orchestrator/tool-orchestrator.js.map +1 -0
  196. package/dist/orchestrator/types.d.ts +162 -0
  197. package/dist/orchestrator/types.d.ts.map +1 -0
  198. package/dist/orchestrator/types.js +39 -0
  199. package/dist/orchestrator/types.js.map +1 -0
  200. package/dist/orchestrator/workflow/ci-executor.d.ts +157 -0
  201. package/dist/orchestrator/workflow/ci-executor.d.ts.map +1 -0
  202. package/dist/orchestrator/workflow/ci-executor.js +423 -0
  203. package/dist/orchestrator/workflow/ci-executor.js.map +1 -0
  204. package/dist/orchestrator/workflow/config.d.ts +97 -0
  205. package/dist/orchestrator/workflow/config.d.ts.map +1 -0
  206. package/dist/orchestrator/workflow/config.js +115 -0
  207. package/dist/orchestrator/workflow/config.js.map +1 -0
  208. package/dist/orchestrator/workflow/git-analyzer.d.ts +173 -0
  209. package/dist/orchestrator/workflow/git-analyzer.d.ts.map +1 -0
  210. package/dist/orchestrator/workflow/git-analyzer.js +473 -0
  211. package/dist/orchestrator/workflow/git-analyzer.js.map +1 -0
  212. package/dist/orchestrator/workflow/index.d.ts +21 -0
  213. package/dist/orchestrator/workflow/index.d.ts.map +1 -0
  214. package/dist/orchestrator/workflow/index.js +21 -0
  215. package/dist/orchestrator/workflow/index.js.map +1 -0
  216. package/dist/orchestrator/workflow/phase-checkpoint.d.ts +38 -0
  217. package/dist/orchestrator/workflow/phase-checkpoint.d.ts.map +1 -0
  218. package/dist/orchestrator/workflow/phase-checkpoint.js +75 -0
  219. package/dist/orchestrator/workflow/phase-checkpoint.js.map +1 -0
  220. package/dist/orchestrator/workflow/phase-inheritance.d.ts +128 -0
  221. package/dist/orchestrator/workflow/phase-inheritance.d.ts.map +1 -0
  222. package/dist/orchestrator/workflow/phase-inheritance.js +266 -0
  223. package/dist/orchestrator/workflow/phase-inheritance.js.map +1 -0
  224. package/dist/orchestrator/workflow/result-fusion.d.ts +117 -0
  225. package/dist/orchestrator/workflow/result-fusion.d.ts.map +1 -0
  226. package/dist/orchestrator/workflow/result-fusion.js +246 -0
  227. package/dist/orchestrator/workflow/result-fusion.js.map +1 -0
  228. package/dist/orchestrator/workflow/templates.d.ts +116 -0
  229. package/dist/orchestrator/workflow/templates.d.ts.map +1 -0
  230. package/dist/orchestrator/workflow/templates.js +546 -0
  231. package/dist/orchestrator/workflow/templates.js.map +1 -0
  232. package/dist/orchestrator/workflow/test-linker.d.ts +152 -0
  233. package/dist/orchestrator/workflow/test-linker.d.ts.map +1 -0
  234. package/dist/orchestrator/workflow/test-linker.js +342 -0
  235. package/dist/orchestrator/workflow/test-linker.js.map +1 -0
  236. package/dist/orchestrator/workflow/types.d.ts +202 -0
  237. package/dist/orchestrator/workflow/types.d.ts.map +1 -0
  238. package/dist/orchestrator/workflow/types.js +4 -0
  239. package/dist/orchestrator/workflow/types.js.map +1 -0
  240. package/dist/orchestrator/workflow/visualizer.d.ts +56 -0
  241. package/dist/orchestrator/workflow/visualizer.d.ts.map +1 -0
  242. package/dist/orchestrator/workflow/visualizer.js +300 -0
  243. package/dist/orchestrator/workflow/visualizer.js.map +1 -0
  244. package/dist/orchestrator/workflow/workflow-context.d.ts +50 -0
  245. package/dist/orchestrator/workflow/workflow-context.d.ts.map +1 -0
  246. package/dist/orchestrator/workflow/workflow-context.js +105 -0
  247. package/dist/orchestrator/workflow/workflow-context.js.map +1 -0
  248. package/dist/orchestrator/workflow/workflow-orchestrator.d.ts +126 -0
  249. package/dist/orchestrator/workflow/workflow-orchestrator.d.ts.map +1 -0
  250. package/dist/orchestrator/workflow/workflow-orchestrator.js +489 -0
  251. package/dist/orchestrator/workflow/workflow-orchestrator.js.map +1 -0
  252. package/dist/orchestrator/workflow/workflow-persistence.d.ts +38 -0
  253. package/dist/orchestrator/workflow/workflow-persistence.d.ts.map +1 -0
  254. package/dist/orchestrator/workflow/workflow-persistence.js +166 -0
  255. package/dist/orchestrator/workflow/workflow-persistence.js.map +1 -0
  256. package/dist/parser/implementations/fast-parser.d.ts +65 -0
  257. package/dist/parser/implementations/fast-parser.d.ts.map +1 -0
  258. package/dist/parser/implementations/fast-parser.js +299 -0
  259. package/dist/parser/implementations/fast-parser.js.map +1 -0
  260. package/dist/parser/implementations/smart-parser.d.ts +220 -0
  261. package/dist/parser/implementations/smart-parser.d.ts.map +1 -0
  262. package/dist/parser/implementations/smart-parser.js +1536 -0
  263. package/dist/parser/implementations/smart-parser.js.map +1 -0
  264. package/dist/parser/implementations/tree-sitter-parser.d.ts +57 -0
  265. package/dist/parser/implementations/tree-sitter-parser.d.ts.map +1 -0
  266. package/dist/parser/implementations/tree-sitter-parser.js +375 -0
  267. package/dist/parser/implementations/tree-sitter-parser.js.map +1 -0
  268. package/dist/parser/index.d.ts +19 -0
  269. package/dist/parser/index.d.ts.map +1 -0
  270. package/dist/parser/index.js +449 -0
  271. package/dist/parser/index.js.map +1 -0
  272. package/dist/parser/interfaces/IParser.d.ts +218 -0
  273. package/dist/parser/interfaces/IParser.d.ts.map +1 -0
  274. package/dist/parser/interfaces/IParser.js +22 -0
  275. package/dist/parser/interfaces/IParser.js.map +1 -0
  276. package/dist/plugins/built-in/call-graph.d.ts +38 -0
  277. package/dist/plugins/built-in/call-graph.d.ts.map +1 -0
  278. package/dist/plugins/built-in/call-graph.js +135 -0
  279. package/dist/plugins/built-in/call-graph.js.map +1 -0
  280. package/dist/plugins/built-in/complexity-analyzer.d.ts +45 -0
  281. package/dist/plugins/built-in/complexity-analyzer.d.ts.map +1 -0
  282. package/dist/plugins/built-in/complexity-analyzer.js +155 -0
  283. package/dist/plugins/built-in/complexity-analyzer.js.map +1 -0
  284. package/dist/plugins/index.d.ts +34 -0
  285. package/dist/plugins/index.d.ts.map +1 -0
  286. package/dist/plugins/index.js +103 -0
  287. package/dist/plugins/index.js.map +1 -0
  288. package/dist/plugins/plugin-loader.d.ts +22 -0
  289. package/dist/plugins/plugin-loader.d.ts.map +1 -0
  290. package/dist/plugins/plugin-loader.js +200 -0
  291. package/dist/plugins/plugin-loader.js.map +1 -0
  292. package/dist/plugins/plugin-registry.d.ts +20 -0
  293. package/dist/plugins/plugin-registry.d.ts.map +1 -0
  294. package/dist/plugins/plugin-registry.js +143 -0
  295. package/dist/plugins/plugin-registry.js.map +1 -0
  296. package/dist/plugins/types.d.ts +72 -0
  297. package/dist/plugins/types.d.ts.map +1 -0
  298. package/dist/plugins/types.js +5 -0
  299. package/dist/plugins/types.js.map +1 -0
  300. package/dist/types/index.d.ts +373 -0
  301. package/dist/types/index.d.ts.map +1 -0
  302. package/dist/types/index.js +7 -0
  303. package/dist/types/index.js.map +1 -0
  304. package/dist/watcher/daemon.d.ts +64 -0
  305. package/dist/watcher/daemon.d.ts.map +1 -0
  306. package/dist/watcher/daemon.js +189 -0
  307. package/dist/watcher/daemon.js.map +1 -0
  308. package/dist/watcher/file-watcher.d.ts +70 -0
  309. package/dist/watcher/file-watcher.d.ts.map +1 -0
  310. package/dist/watcher/file-watcher.js +127 -0
  311. package/dist/watcher/file-watcher.js.map +1 -0
  312. package/dist/watcher/index.d.ts +5 -0
  313. package/dist/watcher/index.d.ts.map +1 -0
  314. package/dist/watcher/index.js +6 -0
  315. package/dist/watcher/index.js.map +1 -0
  316. package/dist/watcher/watch-worker.d.ts +2 -0
  317. package/dist/watcher/watch-worker.d.ts.map +1 -0
  318. package/dist/watcher/watch-worker.js +57 -0
  319. package/dist/watcher/watch-worker.js.map +1 -0
  320. package/dist/worker/index.d.ts +76 -0
  321. package/dist/worker/index.d.ts.map +1 -0
  322. package/dist/worker/index.js +155 -0
  323. package/dist/worker/index.js.map +1 -0
  324. package/dist/worker/parse-worker.d.ts +2 -0
  325. package/dist/worker/parse-worker.d.ts.map +1 -0
  326. package/dist/worker/parse-worker.js +202 -0
  327. package/dist/worker/parse-worker.js.map +1 -0
  328. package/mycodemap.config.schema.json +42 -0
  329. package/package.json +69 -0
@@ -0,0 +1,159 @@
1
+ // ============================================
2
+ // File Hash Cache - 文件哈希缓存
3
+ // ============================================
4
+ import fs from 'fs/promises';
5
+ import crypto from 'crypto';
6
+ import path from 'path';
7
+ /**
8
+ * 计算文件的 SHA256 哈希值
9
+ * @param filePath 文件路径
10
+ * @returns 文件内容的 SHA256 哈希值(十六进制字符串)
11
+ */
12
+ export async function computeFileHash(filePath) {
13
+ const content = await fs.readFile(filePath);
14
+ const hash = crypto.createHash('sha256');
15
+ hash.update(content);
16
+ return hash.digest('hex');
17
+ }
18
+ /**
19
+ * 计算多个文件的哈希
20
+ * @param filePaths 文件路径数组
21
+ * @returns 文件路径到哈希值的映射
22
+ */
23
+ export async function computeFileHashes(filePaths) {
24
+ const hashMap = new Map();
25
+ await Promise.all(filePaths.map(async (filePath) => {
26
+ try {
27
+ const hash = await computeFileHash(filePath);
28
+ hashMap.set(filePath, hash);
29
+ }
30
+ catch (error) {
31
+ console.warn(`Warning: Failed to compute hash for ${filePath}: ${error}`);
32
+ hashMap.set(filePath, '');
33
+ }
34
+ }));
35
+ return hashMap;
36
+ }
37
+ /**
38
+ * 比较两个文件的哈希值
39
+ * @param filePath1 第一个文件路径
40
+ * @param filePath2 第二个文件路径
41
+ * @returns 是否相等
42
+ */
43
+ export async function compareFileHashes(filePath1, filePath2) {
44
+ const [hash1, hash2] = await Promise.all([
45
+ computeFileHash(filePath1),
46
+ computeFileHash(filePath2)
47
+ ]);
48
+ return hash1 === hash2;
49
+ }
50
+ /**
51
+ * 文件哈希缓存类
52
+ * 缓存文件的哈希值,避免重复计算
53
+ */
54
+ export class FileHashCache {
55
+ hashCache = new Map();
56
+ fsStatCache = new Map();
57
+ /**
58
+ * 获取文件的哈希值
59
+ * 如果文件未修改,返回缓存的哈希值
60
+ * @param filePath 文件路径
61
+ * @returns 文件的 SHA256 哈希值
62
+ */
63
+ async getHash(filePath) {
64
+ try {
65
+ const stats = await fs.stat(filePath);
66
+ const cached = this.hashCache.get(filePath);
67
+ // 检查是否使用缓存(基于 mtime)
68
+ if (cached && cached.mtime === stats.mtimeMs) {
69
+ return cached.hash;
70
+ }
71
+ // 重新计算哈希
72
+ const hash = await computeFileHash(filePath);
73
+ this.hashCache.set(filePath, { hash, mtime: stats.mtimeMs });
74
+ this.fsStatCache.set(filePath, { mtime: stats.mtimeMs, size: stats.size });
75
+ return hash;
76
+ }
77
+ catch (error) {
78
+ console.warn(`Warning: Failed to get hash for ${filePath}: ${error}`);
79
+ return '';
80
+ }
81
+ }
82
+ /**
83
+ * 获取多个文件的哈希值
84
+ * @param filePaths 文件路径数组
85
+ * @returns 文件路径到哈希值的映射
86
+ */
87
+ async getHashes(filePaths) {
88
+ const hashMap = new Map();
89
+ await Promise.all(filePaths.map(async (filePath) => {
90
+ const hash = await this.getHash(filePath);
91
+ hashMap.set(filePath, hash);
92
+ }));
93
+ return hashMap;
94
+ }
95
+ /**
96
+ * 检查文件是否已修改
97
+ * @param filePath 文件路径
98
+ * @returns 文件是否已修改
99
+ */
100
+ async hasChanged(filePath) {
101
+ try {
102
+ const stats = await fs.stat(filePath);
103
+ const cached = this.fsStatCache.get(filePath);
104
+ // 如果没有缓存,认为文件已修改
105
+ if (!cached) {
106
+ return true;
107
+ }
108
+ // 比较 mtime 和 size
109
+ return cached.mtime !== stats.mtimeMs || cached.size !== stats.size;
110
+ }
111
+ catch {
112
+ // 文件不存在或无法访问,认为已修改
113
+ return true;
114
+ }
115
+ }
116
+ /**
117
+ * 清除指定文件的缓存
118
+ * @param filePath 文件路径
119
+ */
120
+ invalidate(filePath) {
121
+ this.hashCache.delete(filePath);
122
+ this.fsStatCache.delete(filePath);
123
+ }
124
+ /**
125
+ * 清除所有缓存
126
+ */
127
+ clear() {
128
+ this.hashCache.clear();
129
+ this.fsStatCache.clear();
130
+ }
131
+ /**
132
+ * 获取缓存大小
133
+ */
134
+ get size() {
135
+ return this.hashCache.size;
136
+ }
137
+ }
138
+ /**
139
+ * 生成缓存键
140
+ * @param filePath 文件路径
141
+ * @param hash 文件哈希值
142
+ * @returns 缓存键
143
+ */
144
+ export function generateCacheKey(filePath, hash) {
145
+ return `${path.basename(filePath)}:${hash}`;
146
+ }
147
+ /**
148
+ * 解析缓存键
149
+ * @param cacheKey 缓存键
150
+ * @returns 文件名和哈希值
151
+ */
152
+ export function parseCacheKey(cacheKey) {
153
+ const colonIndex = cacheKey.lastIndexOf(':');
154
+ return {
155
+ filename: cacheKey.substring(0, colonIndex),
156
+ hash: cacheKey.substring(colonIndex + 1)
157
+ };
158
+ }
159
+ //# sourceMappingURL=file-hash-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-hash-cache.js","sourceRoot":"","sources":["../../src/cache/file-hash-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ import { LRUCacheWithTTL } from './lru-cache.js';
2
+ import { FileHashCache } from './file-hash-cache.js';
3
+ import { ParseCache } from './parse-cache.js';
4
+ import type { ModuleInfo } from '../types/index.js';
5
+ export { LRUCache, LRUCacheWithTTL } from './lru-cache.js';
6
+ export { FileHashCache, computeFileHash, computeFileHashes } from './file-hash-cache.js';
7
+ export { ParseCache } from './parse-cache.js';
8
+ export type { ParseCacheEntry } from './parse-cache.js';
9
+ export interface CacheConfig {
10
+ /** 内存缓存最大大小 */
11
+ maxSize?: number;
12
+ /** 缓存过期时间(毫秒) */
13
+ ttl?: number;
14
+ /** 缓存目录 */
15
+ cacheDir?: string;
16
+ /** 是否启用持久化缓存 */
17
+ persistent?: boolean;
18
+ }
19
+ /**
20
+ * 默认缓存配置
21
+ */
22
+ export declare const DEFAULT_CACHE_CONFIG: Required<CacheConfig>;
23
+ /**
24
+ * 缓存管理器
25
+ * 统一管理所有类型的缓存
26
+ */
27
+ export declare class CacheManager {
28
+ private lruCache;
29
+ private fileHashCache;
30
+ private parseCache;
31
+ private config;
32
+ private dependencyGraph;
33
+ constructor(config?: CacheConfig);
34
+ /**
35
+ * 初始化缓存目录
36
+ */
37
+ initialize(): Promise<void>;
38
+ /**
39
+ * 获取通用 LRU 缓存
40
+ */
41
+ getLRUCache<K, V>(): LRUCacheWithTTL<K, V>;
42
+ /**
43
+ * 获取文件哈希缓存
44
+ */
45
+ getFileHashCache(): FileHashCache;
46
+ /**
47
+ * 获取解析结果缓存
48
+ */
49
+ getParseCache(): ParseCache;
50
+ /**
51
+ * 解析文件并使用缓存
52
+ * @param filePath 文件路径
53
+ * @param parseFn 解析函数
54
+ * @returns 解析结果
55
+ */
56
+ parseWithCache(filePath: string, parseFn: (filePath: string) => Promise<ModuleInfo>): Promise<ModuleInfo>;
57
+ /**
58
+ * 批量解析文件并使用缓存
59
+ * @param filePaths 文件路径数组
60
+ * @param parseFn 解析函数
61
+ * @returns 解析结果数组
62
+ */
63
+ /**
64
+ * 批量解析文件并使用缓存(并行优化版)
65
+ * @param filePaths 文件路径数组
66
+ * @param parseFn 解析函数
67
+ * @param concurrency 并发数限制(默认 10)
68
+ * @returns 解析结果数组
69
+ */
70
+ parseBatchWithCache(filePaths: string[], parseFn: (filePath: string) => Promise<ModuleInfo>, concurrency?: number): Promise<ModuleInfo[]>;
71
+ /**
72
+ * 并发控制解析
73
+ * @param filePaths 文件路径数组
74
+ * @param parseFn 解析函数
75
+ * @param concurrency 并发数限制
76
+ * @returns 解析结果数组
77
+ */
78
+ private parseWithConcurrency;
79
+ /**
80
+ * 检查文件是否需要重新解析
81
+ * @param filePath 文件路径
82
+ * @returns 是否需要重新解析
83
+ */
84
+ needsReparse(filePath: string): Promise<boolean>;
85
+ /**
86
+ * 使指定文件缓存失效
87
+ * @param filePath 文件路径
88
+ */
89
+ invalidate(filePath: string): void;
90
+ /**
91
+ * 更新依赖图
92
+ * @param modules 模块信息数组,用于构建依赖关系
93
+ */
94
+ updateDependencyGraph(modules: ModuleInfo[]): void;
95
+ /**
96
+ * 解析模块路径
97
+ * 将相对依赖路径解析为绝对路径
98
+ */
99
+ private resolveModulePath;
100
+ /**
101
+ * 规范化路径
102
+ */
103
+ private normalizePath;
104
+ /**
105
+ * 级联失效 - 当依赖文件变更时,失效所有依赖它的文件
106
+ * @param filePath 变更的文件路径
107
+ * @param cascade 是否级联失效(默认 true)
108
+ * @returns 失效的文件数量
109
+ */
110
+ invalidateWithCascade(filePath: string, cascade?: boolean): number;
111
+ /**
112
+ * 批量级联失效
113
+ * @param filePaths 变更的文件路径数组
114
+ * @returns 失效的文件数量
115
+ */
116
+ invalidateBatchWithCascade(filePaths: string[]): number;
117
+ /**
118
+ * 清除所有缓存
119
+ */
120
+ clear(): void;
121
+ /**
122
+ * 清理过期缓存
123
+ */
124
+ cleanup(): number;
125
+ /**
126
+ * 获取缓存统计信息
127
+ */
128
+ getStats(): {
129
+ lruSize: number;
130
+ fileHashSize: number;
131
+ parseCache: {
132
+ memorySize: number;
133
+ ttl: number;
134
+ cacheDir: string;
135
+ };
136
+ config: Required<CacheConfig>;
137
+ };
138
+ }
139
+ /**
140
+ * 获取缓存管理器单例
141
+ */
142
+ export declare function getCacheManager(config?: CacheConfig): CacheManager;
143
+ /**
144
+ * 重置缓存管理器单例
145
+ */
146
+ export declare function resetCacheManager(): void;
147
+ /**
148
+ * 创建缓存管理器
149
+ */
150
+ export declare function createCacheManager(config?: CacheConfig): CacheManager;
151
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,303 @@
1
+ // ============================================
2
+ // Cache Module - 缓存系统入口
3
+ // ============================================
4
+ import path from 'path';
5
+ import fs from 'fs/promises';
6
+ import { LRUCacheWithTTL } from './lru-cache.js';
7
+ import { FileHashCache } from './file-hash-cache.js';
8
+ import { ParseCache } from './parse-cache.js';
9
+ // 导出类型
10
+ export { LRUCache, LRUCacheWithTTL } from './lru-cache.js';
11
+ export { FileHashCache, computeFileHash, computeFileHashes } from './file-hash-cache.js';
12
+ export { ParseCache } from './parse-cache.js';
13
+ /**
14
+ * 默认缓存配置
15
+ */
16
+ export const DEFAULT_CACHE_CONFIG = {
17
+ maxSize: 200,
18
+ ttl: 3600000, // 1 小时
19
+ cacheDir: path.join(process.cwd(), '.codemap', 'cache'),
20
+ persistent: true
21
+ };
22
+ /**
23
+ * 缓存管理器
24
+ * 统一管理所有类型的缓存
25
+ */
26
+ export class CacheManager {
27
+ lruCache;
28
+ fileHashCache;
29
+ parseCache;
30
+ config;
31
+ // 依赖图缓存: modulePath -> 依赖该模块的文件列表
32
+ dependencyGraph = new Map();
33
+ constructor(config = {}) {
34
+ this.config = { ...DEFAULT_CACHE_CONFIG, ...config };
35
+ this.lruCache = new LRUCacheWithTTL(this.config.maxSize, this.config.ttl);
36
+ this.fileHashCache = new FileHashCache();
37
+ this.parseCache = new ParseCache(this.config.cacheDir, this.config.ttl);
38
+ }
39
+ /**
40
+ * 初始化缓存目录
41
+ */
42
+ async initialize() {
43
+ if (this.config.persistent) {
44
+ await fs.mkdir(this.config.cacheDir, { recursive: true });
45
+ }
46
+ }
47
+ /**
48
+ * 获取通用 LRU 缓存
49
+ */
50
+ getLRUCache() {
51
+ return this.lruCache;
52
+ }
53
+ /**
54
+ * 获取文件哈希缓存
55
+ */
56
+ getFileHashCache() {
57
+ return this.fileHashCache;
58
+ }
59
+ /**
60
+ * 获取解析结果缓存
61
+ */
62
+ getParseCache() {
63
+ return this.parseCache;
64
+ }
65
+ /**
66
+ * 解析文件并使用缓存
67
+ * @param filePath 文件路径
68
+ * @param parseFn 解析函数
69
+ * @returns 解析结果
70
+ */
71
+ async parseWithCache(filePath, parseFn) {
72
+ // 尝试从缓存获取
73
+ const cached = await this.parseCache.get(filePath);
74
+ if (cached) {
75
+ return cached;
76
+ }
77
+ // 执行解析
78
+ const result = await parseFn(filePath);
79
+ // 存入缓存
80
+ await this.parseCache.set(filePath, result);
81
+ return result;
82
+ }
83
+ /**
84
+ * 批量解析文件并使用缓存
85
+ * @param filePaths 文件路径数组
86
+ * @param parseFn 解析函数
87
+ * @returns 解析结果数组
88
+ */
89
+ /**
90
+ * 批量解析文件并使用缓存(并行优化版)
91
+ * @param filePaths 文件路径数组
92
+ * @param parseFn 解析函数
93
+ * @param concurrency 并发数限制(默认 10)
94
+ * @returns 解析结果数组
95
+ */
96
+ async parseBatchWithCache(filePaths, parseFn, concurrency = 10) {
97
+ // 并行获取所有缓存
98
+ const cacheResults = await Promise.all(filePaths.map(async (filePath) => {
99
+ const cached = await this.parseCache.get(filePath);
100
+ return { filePath, cached };
101
+ }));
102
+ const results = [];
103
+ const uncachedFiles = [];
104
+ // 分类缓存命中和未命中
105
+ for (const result of cacheResults) {
106
+ if (result.cached) {
107
+ results.push(result.cached);
108
+ }
109
+ else {
110
+ uncachedFiles.push(result.filePath);
111
+ }
112
+ }
113
+ // 并行解析未缓存的文件(带并发控制)
114
+ if (uncachedFiles.length > 0) {
115
+ const parseResults = await this.parseWithConcurrency(uncachedFiles, parseFn, concurrency);
116
+ // 并行存入缓存
117
+ await Promise.all(uncachedFiles.map((filePath, index) => this.parseCache.set(filePath, parseResults[index])));
118
+ results.push(...parseResults);
119
+ }
120
+ return results;
121
+ }
122
+ /**
123
+ * 并发控制解析
124
+ * @param filePaths 文件路径数组
125
+ * @param parseFn 解析函数
126
+ * @param concurrency 并发数限制
127
+ * @returns 解析结果数组
128
+ */
129
+ async parseWithConcurrency(filePaths, parseFn, concurrency) {
130
+ const results = new Array(filePaths.length);
131
+ let currentIndex = 0;
132
+ const workers = Array.from({ length: Math.min(concurrency, filePaths.length) }, async () => {
133
+ while (currentIndex < filePaths.length) {
134
+ const index = currentIndex++;
135
+ const filePath = filePaths[index];
136
+ results[index] = await parseFn(filePath);
137
+ }
138
+ });
139
+ await Promise.all(workers);
140
+ return results;
141
+ }
142
+ /**
143
+ * 检查文件是否需要重新解析
144
+ * @param filePath 文件路径
145
+ * @returns 是否需要重新解析
146
+ */
147
+ async needsReparse(filePath) {
148
+ return this.fileHashCache.hasChanged(filePath);
149
+ }
150
+ /**
151
+ * 使指定文件缓存失效
152
+ * @param filePath 文件路径
153
+ */
154
+ invalidate(filePath) {
155
+ this.parseCache.invalidate(filePath);
156
+ this.fileHashCache.invalidate(filePath);
157
+ }
158
+ /**
159
+ * 更新依赖图
160
+ * @param modules 模块信息数组,用于构建依赖关系
161
+ */
162
+ updateDependencyGraph(modules) {
163
+ this.dependencyGraph.clear();
164
+ for (const mod of modules) {
165
+ const modPath = mod.path;
166
+ // 遍历该模块的依赖
167
+ for (const dep of mod.dependencies || []) {
168
+ // 获取依赖模块的相对路径
169
+ const depPath = this.resolveModulePath(modPath, dep);
170
+ // 将当前模块添加到依赖者的列表中
171
+ if (!this.dependencyGraph.has(depPath)) {
172
+ this.dependencyGraph.set(depPath, new Set());
173
+ }
174
+ this.dependencyGraph.get(depPath).add(modPath);
175
+ }
176
+ }
177
+ }
178
+ /**
179
+ * 解析模块路径
180
+ * 将相对依赖路径解析为绝对路径
181
+ */
182
+ resolveModulePath(fromPath, dep) {
183
+ // 去除 .js 后缀
184
+ let normalizedDep = dep.replace(/\.js$/, '');
185
+ // 如果是相对路径,需要解析
186
+ if (normalizedDep.startsWith('.')) {
187
+ const fromDir = fromPath.substring(0, fromPath.lastIndexOf('/'));
188
+ const resolved = fromDir + '/' + normalizedDep;
189
+ // 解析 .. 和 .
190
+ return this.normalizePath(resolved);
191
+ }
192
+ // 外部模块,返回原路径
193
+ return normalizedDep;
194
+ }
195
+ /**
196
+ * 规范化路径
197
+ */
198
+ normalizePath(path) {
199
+ const parts = path.split('/');
200
+ const result = [];
201
+ for (const part of parts) {
202
+ if (part === '..') {
203
+ result.pop();
204
+ }
205
+ else if (part !== '.' && part !== '') {
206
+ result.push(part);
207
+ }
208
+ }
209
+ return result.join('/');
210
+ }
211
+ /**
212
+ * 级联失效 - 当依赖文件变更时,失效所有依赖它的文件
213
+ * @param filePath 变更的文件路径
214
+ * @param cascade 是否级联失效(默认 true)
215
+ * @returns 失效的文件数量
216
+ */
217
+ invalidateWithCascade(filePath, cascade = true) {
218
+ let invalidatedCount = 0;
219
+ // 首先失效指定文件
220
+ this.invalidate(filePath);
221
+ invalidatedCount++;
222
+ if (cascade) {
223
+ // 查找所有依赖该文件的模块
224
+ const dependents = this.dependencyGraph.get(filePath);
225
+ if (dependents && dependents.size > 0) {
226
+ // 递归失效所有依赖者
227
+ for (const dependent of dependents) {
228
+ invalidatedCount += this.invalidateWithCascade(dependent, true);
229
+ }
230
+ }
231
+ }
232
+ return invalidatedCount;
233
+ }
234
+ /**
235
+ * 批量级联失效
236
+ * @param filePaths 变更的文件路径数组
237
+ * @returns 失效的文件数量
238
+ */
239
+ invalidateBatchWithCascade(filePaths) {
240
+ let totalInvalidated = 0;
241
+ const processed = new Set();
242
+ for (const filePath of filePaths) {
243
+ if (!processed.has(filePath)) {
244
+ const count = this.invalidateWithCascade(filePath, true);
245
+ totalInvalidated += count;
246
+ processed.add(filePath);
247
+ }
248
+ }
249
+ return totalInvalidated;
250
+ }
251
+ /**
252
+ * 清除所有缓存
253
+ */
254
+ clear() {
255
+ this.lruCache.clear();
256
+ this.fileHashCache.clear();
257
+ this.parseCache.clear();
258
+ }
259
+ /**
260
+ * 清理过期缓存
261
+ */
262
+ cleanup() {
263
+ return this.parseCache.cleanup();
264
+ }
265
+ /**
266
+ * 获取缓存统计信息
267
+ */
268
+ getStats() {
269
+ return {
270
+ lruSize: this.lruCache.size,
271
+ fileHashSize: this.fileHashCache.size,
272
+ parseCache: this.parseCache.getStats(),
273
+ config: this.config
274
+ };
275
+ }
276
+ }
277
+ // 单例实例
278
+ let cacheManagerInstance = null;
279
+ /**
280
+ * 获取缓存管理器单例
281
+ */
282
+ export function getCacheManager(config) {
283
+ if (!cacheManagerInstance) {
284
+ cacheManagerInstance = new CacheManager(config);
285
+ }
286
+ return cacheManagerInstance;
287
+ }
288
+ /**
289
+ * 重置缓存管理器单例
290
+ */
291
+ export function resetCacheManager() {
292
+ if (cacheManagerInstance) {
293
+ cacheManagerInstance.clear();
294
+ cacheManagerInstance = null;
295
+ }
296
+ }
297
+ /**
298
+ * 创建缓存管理器
299
+ */
300
+ export function createCacheManager(config) {
301
+ return new CacheManager(config);
302
+ }
303
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"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"}