@mycodemap/mycodemap 0.4.0 → 0.4.2

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 (246) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +214 -221
  3. package/dist/cli/commands/analyze-options.d.ts +36 -0
  4. package/dist/cli/commands/analyze-options.d.ts.map +1 -0
  5. package/dist/cli/commands/analyze-options.js +147 -0
  6. package/dist/cli/commands/analyze-options.js.map +1 -0
  7. package/dist/cli/commands/analyze.d.ts +93 -4
  8. package/dist/cli/commands/analyze.d.ts.map +1 -1
  9. package/dist/cli/commands/analyze.js +592 -176
  10. package/dist/cli/commands/analyze.js.map +1 -1
  11. package/dist/cli/commands/ci.d.ts +47 -1
  12. package/dist/cli/commands/ci.d.ts.map +1 -1
  13. package/dist/cli/commands/ci.js +208 -1
  14. package/dist/cli/commands/ci.js.map +1 -1
  15. package/dist/cli/commands/export.d.ts.map +1 -1
  16. package/dist/cli/commands/export.js +2 -2
  17. package/dist/cli/commands/export.js.map +1 -1
  18. package/dist/cli/commands/generate.d.ts +8 -2
  19. package/dist/cli/commands/generate.d.ts.map +1 -1
  20. package/dist/cli/commands/generate.js +151 -22
  21. package/dist/cli/commands/generate.js.map +1 -1
  22. package/dist/cli/commands/init.d.ts.map +1 -1
  23. package/dist/cli/commands/init.js +2 -13
  24. package/dist/cli/commands/init.js.map +1 -1
  25. package/dist/cli/commands/ship/analyzer.d.ts +1 -1
  26. package/dist/cli/commands/ship/analyzer.d.ts.map +1 -1
  27. package/dist/cli/commands/ship/analyzer.js +8 -1
  28. package/dist/cli/commands/ship/analyzer.js.map +1 -1
  29. package/dist/cli/commands/ship/checker.d.ts +1 -1
  30. package/dist/cli/commands/ship/checker.d.ts.map +1 -1
  31. package/dist/cli/commands/ship/checker.js +17 -6
  32. package/dist/cli/commands/ship/checker.js.map +1 -1
  33. package/dist/cli/commands/ship/index.js +2 -2
  34. package/dist/cli/commands/ship/index.js.map +1 -1
  35. package/dist/cli/commands/ship/monitor.d.ts +17 -2
  36. package/dist/cli/commands/ship/monitor.d.ts.map +1 -1
  37. package/dist/cli/commands/ship/monitor.js +116 -29
  38. package/dist/cli/commands/ship/monitor.js.map +1 -1
  39. package/dist/cli/commands/ship/pipeline.d.ts.map +1 -1
  40. package/dist/cli/commands/ship/pipeline.js +97 -18
  41. package/dist/cli/commands/ship/pipeline.js.map +1 -1
  42. package/dist/cli/commands/ship/publisher.d.ts +12 -2
  43. package/dist/cli/commands/ship/publisher.d.ts.map +1 -1
  44. package/dist/cli/commands/ship/publisher.js +217 -37
  45. package/dist/cli/commands/ship/publisher.js.map +1 -1
  46. package/dist/cli/commands/ship/rules/quality-rules.d.ts +2 -2
  47. package/dist/cli/commands/ship/rules/quality-rules.d.ts.map +1 -1
  48. package/dist/cli/commands/ship/rules/quality-rules.js +53 -54
  49. package/dist/cli/commands/ship/rules/quality-rules.js.map +1 -1
  50. package/dist/cli/commands/ship/versioner.d.ts +1 -1
  51. package/dist/cli/commands/ship/versioner.d.ts.map +1 -1
  52. package/dist/cli/commands/ship/versioner.js +4 -2
  53. package/dist/cli/commands/ship/versioner.js.map +1 -1
  54. package/dist/cli/commands/workflow.js +4 -4
  55. package/dist/cli/commands/workflow.js.map +1 -1
  56. package/dist/cli/config-loader.d.ts +31 -0
  57. package/dist/cli/config-loader.d.ts.map +1 -0
  58. package/dist/cli/config-loader.js +235 -0
  59. package/dist/cli/config-loader.js.map +1 -0
  60. package/dist/cli/index.js +19 -64
  61. package/dist/cli/index.js.map +1 -1
  62. package/dist/cli/removed-commands.d.ts +9 -0
  63. package/dist/cli/removed-commands.d.ts.map +1 -0
  64. package/dist/cli/removed-commands.js +48 -0
  65. package/dist/cli/removed-commands.js.map +1 -0
  66. package/dist/cli/storage-runtime.d.ts +8 -0
  67. package/dist/cli/storage-runtime.d.ts.map +1 -0
  68. package/dist/cli/storage-runtime.js +14 -0
  69. package/dist/cli/storage-runtime.js.map +1 -0
  70. package/dist/cli/tree-sitter-check.d.ts.map +1 -1
  71. package/dist/cli/tree-sitter-check.js +0 -1
  72. package/dist/cli/tree-sitter-check.js.map +1 -1
  73. package/dist/cli-new/commands/export.d.ts.map +1 -1
  74. package/dist/cli-new/commands/export.js +2 -2
  75. package/dist/cli-new/commands/export.js.map +1 -1
  76. package/dist/cli-new/commands/query.d.ts.map +1 -1
  77. package/dist/cli-new/commands/query.js +5 -4
  78. package/dist/cli-new/commands/query.js.map +1 -1
  79. package/dist/cli-new/index.d.ts.map +1 -1
  80. package/dist/cli-new/index.js +0 -2
  81. package/dist/cli-new/index.js.map +1 -1
  82. package/dist/core/analyzer.d.ts.map +1 -1
  83. package/dist/core/analyzer.js +7 -39
  84. package/dist/core/analyzer.js.map +1 -1
  85. package/dist/core/file-discovery.d.ts +17 -0
  86. package/dist/core/file-discovery.d.ts.map +1 -0
  87. package/dist/core/file-discovery.js +75 -0
  88. package/dist/core/file-discovery.js.map +1 -0
  89. package/dist/core/global-index.d.ts +5 -0
  90. package/dist/core/global-index.d.ts.map +1 -1
  91. package/dist/core/global-index.js +71 -21
  92. package/dist/core/global-index.js.map +1 -1
  93. package/dist/generator/index.d.ts.map +1 -1
  94. package/dist/generator/index.js +8 -0
  95. package/dist/generator/index.js.map +1 -1
  96. package/dist/infrastructure/parser/implementations/GoParser.d.ts +2 -5
  97. package/dist/infrastructure/parser/implementations/GoParser.d.ts.map +1 -1
  98. package/dist/infrastructure/parser/implementations/GoParser.js +2 -5
  99. package/dist/infrastructure/parser/implementations/GoParser.js.map +1 -1
  100. package/dist/infrastructure/parser/implementations/PythonParser.d.ts +1 -5
  101. package/dist/infrastructure/parser/implementations/PythonParser.d.ts.map +1 -1
  102. package/dist/infrastructure/parser/implementations/PythonParser.js +1 -5
  103. package/dist/infrastructure/parser/implementations/PythonParser.js.map +1 -1
  104. package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts +1 -5
  105. package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts.map +1 -1
  106. package/dist/infrastructure/parser/implementations/TypeScriptParser.js +1 -5
  107. package/dist/infrastructure/parser/implementations/TypeScriptParser.js.map +1 -1
  108. package/dist/infrastructure/storage/StorageFactory.d.ts +0 -1
  109. package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -1
  110. package/dist/infrastructure/storage/StorageFactory.js +4 -29
  111. package/dist/infrastructure/storage/StorageFactory.js.map +1 -1
  112. package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts.map +1 -1
  113. package/dist/infrastructure/storage/adapters/FileSystemStorage.js +24 -137
  114. package/dist/infrastructure/storage/adapters/FileSystemStorage.js.map +1 -1
  115. package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts +10 -18
  116. package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts.map +1 -1
  117. package/dist/infrastructure/storage/adapters/KuzuDBStorage.js +103 -146
  118. package/dist/infrastructure/storage/adapters/KuzuDBStorage.js.map +1 -1
  119. package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts +0 -1
  120. package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts.map +1 -1
  121. package/dist/infrastructure/storage/adapters/MemoryStorage.js +16 -136
  122. package/dist/infrastructure/storage/adapters/MemoryStorage.js.map +1 -1
  123. package/dist/infrastructure/storage/graph-helpers.d.ts +16 -0
  124. package/dist/infrastructure/storage/graph-helpers.d.ts.map +1 -0
  125. package/dist/infrastructure/storage/graph-helpers.js +161 -0
  126. package/dist/infrastructure/storage/graph-helpers.js.map +1 -0
  127. package/dist/infrastructure/storage/index.d.ts.map +1 -1
  128. package/dist/interface/config/index.d.ts +10 -1
  129. package/dist/interface/config/index.d.ts.map +1 -1
  130. package/dist/interface/types/index.d.ts +13 -0
  131. package/dist/interface/types/index.d.ts.map +1 -1
  132. package/dist/interface/types/storage.d.ts +1 -4
  133. package/dist/interface/types/storage.d.ts.map +1 -1
  134. package/dist/orchestrator/confidence.d.ts +9 -9
  135. package/dist/orchestrator/confidence.d.ts.map +1 -1
  136. package/dist/orchestrator/confidence.js +44 -67
  137. package/dist/orchestrator/confidence.js.map +1 -1
  138. package/dist/orchestrator/file-header-scanner.d.ts.map +1 -1
  139. package/dist/orchestrator/file-header-scanner.js +22 -31
  140. package/dist/orchestrator/file-header-scanner.js.map +1 -1
  141. package/dist/orchestrator/intent-router.d.ts +2 -11
  142. package/dist/orchestrator/intent-router.d.ts.map +1 -1
  143. package/dist/orchestrator/intent-router.js +58 -49
  144. package/dist/orchestrator/intent-router.js.map +1 -1
  145. package/dist/orchestrator/tool-orchestrator.d.ts.map +1 -1
  146. package/dist/orchestrator/tool-orchestrator.js +6 -4
  147. package/dist/orchestrator/tool-orchestrator.js.map +1 -1
  148. package/dist/orchestrator/types.d.ts +113 -2
  149. package/dist/orchestrator/types.d.ts.map +1 -1
  150. package/dist/orchestrator/types.js +29 -0
  151. package/dist/orchestrator/types.js.map +1 -1
  152. package/dist/orchestrator/workflow/config.d.ts +4 -12
  153. package/dist/orchestrator/workflow/config.d.ts.map +1 -1
  154. package/dist/orchestrator/workflow/config.js +4 -6
  155. package/dist/orchestrator/workflow/config.js.map +1 -1
  156. package/dist/orchestrator/workflow/git-analyzer.d.ts.map +1 -1
  157. package/dist/orchestrator/workflow/git-analyzer.js +9 -19
  158. package/dist/orchestrator/workflow/git-analyzer.js.map +1 -1
  159. package/dist/orchestrator/workflow/phase-inheritance.d.ts.map +1 -1
  160. package/dist/orchestrator/workflow/phase-inheritance.js +14 -23
  161. package/dist/orchestrator/workflow/phase-inheritance.js.map +1 -1
  162. package/dist/orchestrator/workflow/result-fusion.d.ts.map +1 -1
  163. package/dist/orchestrator/workflow/result-fusion.js +9 -11
  164. package/dist/orchestrator/workflow/result-fusion.js.map +1 -1
  165. package/dist/orchestrator/workflow/templates.d.ts +4 -1
  166. package/dist/orchestrator/workflow/templates.d.ts.map +1 -1
  167. package/dist/orchestrator/workflow/templates.js +49 -207
  168. package/dist/orchestrator/workflow/templates.js.map +1 -1
  169. package/dist/orchestrator/workflow/test-linker.d.ts.map +1 -1
  170. package/dist/orchestrator/workflow/test-linker.js +12 -24
  171. package/dist/orchestrator/workflow/test-linker.js.map +1 -1
  172. package/dist/orchestrator/workflow/types.d.ts +11 -8
  173. package/dist/orchestrator/workflow/types.d.ts.map +1 -1
  174. package/dist/orchestrator/workflow/types.js +8 -1
  175. package/dist/orchestrator/workflow/types.js.map +1 -1
  176. package/dist/orchestrator/workflow/visualizer.d.ts.map +1 -1
  177. package/dist/orchestrator/workflow/visualizer.js +7 -9
  178. package/dist/orchestrator/workflow/visualizer.js.map +1 -1
  179. package/dist/orchestrator/workflow/workflow-context.d.ts.map +1 -1
  180. package/dist/orchestrator/workflow/workflow-context.js +3 -5
  181. package/dist/orchestrator/workflow/workflow-context.js.map +1 -1
  182. package/dist/orchestrator/workflow/workflow-orchestrator.d.ts +0 -4
  183. package/dist/orchestrator/workflow/workflow-orchestrator.d.ts.map +1 -1
  184. package/dist/orchestrator/workflow/workflow-orchestrator.js +7 -99
  185. package/dist/orchestrator/workflow/workflow-orchestrator.js.map +1 -1
  186. package/dist/parser/index.d.ts.map +1 -1
  187. package/dist/parser/index.js +2 -2
  188. package/dist/parser/index.js.map +1 -1
  189. package/dist/plugins/index.d.ts +5 -3
  190. package/dist/plugins/index.d.ts.map +1 -1
  191. package/dist/plugins/index.js +19 -8
  192. package/dist/plugins/index.js.map +1 -1
  193. package/dist/plugins/plugin-loader.d.ts +21 -6
  194. package/dist/plugins/plugin-loader.d.ts.map +1 -1
  195. package/dist/plugins/plugin-loader.js +170 -54
  196. package/dist/plugins/plugin-loader.js.map +1 -1
  197. package/dist/plugins/plugin-registry.d.ts +7 -4
  198. package/dist/plugins/plugin-registry.d.ts.map +1 -1
  199. package/dist/plugins/plugin-registry.js +62 -14
  200. package/dist/plugins/plugin-registry.js.map +1 -1
  201. package/dist/plugins/types.d.ts +16 -6
  202. package/dist/plugins/types.d.ts.map +1 -1
  203. package/dist/plugins/types.js +2 -0
  204. package/dist/plugins/types.js.map +1 -1
  205. package/dist/server/handlers/AnalysisHandler.d.ts +16 -2
  206. package/dist/server/handlers/AnalysisHandler.d.ts.map +1 -1
  207. package/dist/server/handlers/AnalysisHandler.js +31 -47
  208. package/dist/server/handlers/AnalysisHandler.js.map +1 -1
  209. package/dist/server/routes/api.d.ts.map +1 -1
  210. package/dist/server/routes/api.js +31 -12
  211. package/dist/server/routes/api.js.map +1 -1
  212. package/docs/AI_ASSISTANT_SETUP.md +3 -1
  213. package/docs/PUBLISHING.md +18 -4
  214. package/docs/SETUP_GUIDE.md +41 -17
  215. package/docs/ai-guide/COMMANDS.md +107 -103
  216. package/docs/ai-guide/INTEGRATION.md +23 -21
  217. package/docs/ai-guide/OUTPUT.md +206 -10
  218. package/docs/ai-guide/PATTERNS.md +64 -15
  219. package/docs/ai-guide/PROMPTS.md +50 -12
  220. package/docs/ai-guide/QUICKSTART.md +35 -19
  221. package/docs/ai-guide/README.md +22 -4
  222. package/docs/product-specs/MVP3-ARCHITECTURE-COMPARISON.md +159 -434
  223. package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-PRD.md +169 -261
  224. package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-TECH-PRD.md +201 -1259
  225. package/docs/product-specs/README.md +8 -1
  226. package/docs/rules/architecture-guardrails.md +1 -2
  227. package/docs/rules/engineering-with-codex-openai.md +15 -9
  228. package/docs/rules/validation.md +26 -4
  229. package/mycodemap.config.schema.json +76 -5
  230. package/package.json +1 -1
  231. package/scripts/pre-release-check.js +21 -3
  232. package/scripts/sync-analyze-docs.js +500 -0
  233. package/scripts/validate-ai-docs.js +54 -1
  234. package/scripts/validate-docs.js +746 -26
  235. package/dist/cli/commands/server.d.ts +0 -9
  236. package/dist/cli/commands/server.d.ts.map +0 -1
  237. package/dist/cli/commands/server.js +0 -68
  238. package/dist/cli/commands/server.js.map +0 -1
  239. package/dist/cli-new/commands/server.d.ts +0 -13
  240. package/dist/cli-new/commands/server.d.ts.map +0 -1
  241. package/dist/cli-new/commands/server.js +0 -94
  242. package/dist/cli-new/commands/server.js.map +0 -1
  243. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts +0 -49
  244. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +0 -1
  245. package/dist/infrastructure/storage/adapters/Neo4jStorage.js +0 -222
  246. package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +0 -1
@@ -5,6 +5,21 @@
5
5
  // ============================================
6
6
  import { join } from 'path';
7
7
  import { StorageBase, StorageError } from '../interfaces/StorageBase.js';
8
+ import { calculateImpactInGraph, createEmptyCodeGraph, deleteModuleFromGraph, deserializeCodeGraphSnapshot, detectCyclesInGraph, findCalleesInGraph, findCallersInGraph, findDependenciesInGraph, findDependentsInGraph, getProjectStatisticsFromGraph, serializeCodeGraphSnapshot, upsertModuleInGraph, } from '../graph-helpers.js';
9
+ async function loadKuzuModule() {
10
+ const moduleName = 'kuzu';
11
+ return await import(moduleName);
12
+ }
13
+ function normalizeKuzuResults(result) {
14
+ return Array.isArray(result) ? result : [result];
15
+ }
16
+ async function closeKuzuResults(results) {
17
+ for (const result of results) {
18
+ if (typeof result.close === 'function') {
19
+ await result.close();
20
+ }
21
+ }
22
+ }
8
23
  /**
9
24
  * KùzuDB 存储适配器(可选依赖)
10
25
  *
@@ -12,224 +27,166 @@ import { StorageBase, StorageError } from '../interfaces/StorageBase.js';
12
27
  *
13
28
  * 特点:
14
29
  * - 嵌入式图数据库
15
- * - 高性能图查询
16
- * - 适合大型项目(>1000文件)
17
- * - 支持复杂关系分析
18
- *
19
- * TODO-DEBT [L1] [日期:2026-03-17] [作者:AI] [原因:MVP阶段暂不实现完整功能]
20
- * 问题:目前使用内存 fallback 实现
21
- * 风险:无法持久化到 KùzuDB
22
- * 偿还计划:V1.0 实现完整 KùzuDB 集成
30
+ * - 本地持久化,无需单独服务进程
31
+ * - 对 CodeGraph 提供 snapshot-backed persistence
32
+ * - 查询/分析接口与共享 storage contract 保持一致
23
33
  */
24
34
  export class KuzuDBStorage extends StorageBase {
25
35
  type = 'kuzudb';
26
- /** KùzuDB 数据库实例 */
27
36
  db = null;
28
- /** 连接实例 */
29
37
  conn = null;
30
- /** 内存 fallback */
31
- memoryGraph = this.createEmptyGraph();
32
- /** 存储配置 */
33
38
  dbConfig;
34
39
  constructor(config) {
35
40
  super();
36
41
  this.dbConfig = config;
37
42
  }
38
- // ============================================
39
- // 生命周期管理
40
- // ============================================
41
43
  async doInitialize() {
44
+ if (!this.projectPath) {
45
+ throw new StorageError('Project path not set', 'PROJECT_PATH_NOT_SET');
46
+ }
42
47
  try {
43
- // 动态导入 kuzu 以避免未安装时的错误
44
- // @ts-expect-error kuzu is optional dependency
45
- const kuzu = await import('kuzu');
48
+ const kuzu = await loadKuzuModule();
46
49
  const dbPath = this.dbConfig.databasePath
47
50
  ? join(this.projectPath, this.dbConfig.databasePath)
48
51
  : join(this.projectPath, '.codemap', 'kuzudb');
49
52
  this.db = new kuzu.Database(dbPath);
50
53
  this.conn = new kuzu.Connection(this.db);
51
- // 初始化 schema
52
- await this.initializeSchema();
54
+ await this.runQuery('CREATE NODE TABLE IF NOT EXISTS Snapshot(id STRING PRIMARY KEY, projectId STRING, graph STRING, updatedAt STRING);');
53
55
  }
54
- catch {
55
- // 如果 kuzu 未安装,回退到内存模式
56
- // eslint-disable-next-line no-console
57
- console.warn('KùzuDB not available, falling back to memory mode');
58
- this.memoryGraph = this.createEmptyGraph();
56
+ catch (error) {
57
+ throw new StorageError('Failed to initialize KùzuDB storage', 'KUZU_INIT_FAILED', error);
59
58
  }
60
59
  }
61
60
  async doClose() {
62
61
  if (this.conn && typeof this.conn.close === 'function') {
63
62
  await this.conn.close();
64
63
  }
65
- this.db = null;
64
+ if (this.db && typeof this.db.close === 'function') {
65
+ await this.db.close();
66
+ }
66
67
  this.conn = null;
68
+ this.db = null;
67
69
  }
68
- // ============================================
69
- // 项目级别操作
70
- // ============================================
71
70
  async saveCodeGraph(graph) {
72
71
  this.ensureInitialized();
73
- if (!this.db) {
74
- // Fallback 到内存
75
- this.memoryGraph = {
76
- project: { ...graph.project },
77
- modules: [...graph.modules],
78
- symbols: [...graph.symbols],
79
- dependencies: [...graph.dependencies],
80
- };
81
- return;
82
- }
83
- // TODO: 实现 KùzuDB 持久化
84
- throw new StorageError('KùzuDB persistence not yet implemented', 'NOT_IMPLEMENTED');
72
+ await this.runQuery('MATCH (s:Snapshot) DELETE s;');
73
+ await this.executePrepared('CREATE (s:Snapshot {id: $id, projectId: $projectId, graph: $graph, updatedAt: $updatedAt});', {
74
+ id: 'codemap-snapshot',
75
+ projectId: graph.project.id,
76
+ graph: serializeCodeGraphSnapshot(graph),
77
+ updatedAt: new Date().toISOString(),
78
+ });
85
79
  }
86
80
  async loadCodeGraph() {
87
81
  this.ensureInitialized();
88
- if (!this.db) {
89
- return {
90
- project: { ...this.memoryGraph.project },
91
- modules: [...this.memoryGraph.modules],
92
- symbols: [...this.memoryGraph.symbols],
93
- dependencies: [...this.memoryGraph.dependencies],
94
- };
82
+ const rows = await this.queryRows('MATCH (s:Snapshot) RETURN s.graph AS graph LIMIT 1;');
83
+ const snapshot = typeof rows[0]?.graph === 'string' ? rows[0].graph : null;
84
+ if (!snapshot) {
85
+ return createEmptyCodeGraph(this.projectPath ?? '');
95
86
  }
96
- // TODO: 实现从 KùzuDB 加载
97
- throw new StorageError('KùzuDB loading not yet implemented', 'NOT_IMPLEMENTED');
87
+ return deserializeCodeGraphSnapshot(snapshot, this.projectPath ?? '');
98
88
  }
99
89
  async deleteProject() {
100
90
  this.ensureInitialized();
101
- this.memoryGraph = this.createEmptyGraph();
102
- // TODO: 删除 KùzuDB 数据
91
+ await this.runQuery('MATCH (s:Snapshot) DELETE s;');
103
92
  }
104
- // ============================================
105
- // 增量更新
106
- // ============================================
107
93
  async updateModule(module) {
108
94
  this.ensureInitialized();
109
- if (!this.db) {
110
- const index = this.memoryGraph.modules.findIndex(m => m.id === module.id);
111
- if (index >= 0) {
112
- this.memoryGraph.modules[index] = { ...module };
113
- }
114
- else {
115
- this.memoryGraph.modules.push({ ...module });
116
- }
117
- return;
118
- }
119
- // TODO: 实现 KùzuDB 更新
95
+ const graph = await this.loadCodeGraph();
96
+ await this.saveCodeGraph(upsertModuleInGraph(graph, module));
120
97
  }
121
98
  async deleteModule(moduleId) {
122
99
  this.ensureInitialized();
123
- if (!this.db) {
124
- this.memoryGraph.modules = this.memoryGraph.modules.filter(m => m.id !== moduleId);
125
- this.memoryGraph.symbols = this.memoryGraph.symbols.filter(s => s.moduleId !== moduleId);
126
- this.memoryGraph.dependencies = this.memoryGraph.dependencies.filter(d => d.sourceId !== moduleId && d.targetId !== moduleId);
127
- return;
128
- }
129
- // TODO: 实现 KùzuDB 删除
100
+ const graph = await this.loadCodeGraph();
101
+ await this.saveCodeGraph(deleteModuleFromGraph(graph, moduleId));
130
102
  }
131
- // ============================================
132
- // 查询操作
133
- // ============================================
134
103
  async findModuleById(id) {
135
104
  this.ensureInitialized();
136
- if (!this.db) {
137
- return this.memoryGraph.modules.find(m => m.id === id) ?? null;
138
- }
139
- // TODO: 实现 KùzuDB 查询
140
- return null;
105
+ const graph = await this.loadCodeGraph();
106
+ return graph.modules.find(module => module.id === id) ?? null;
141
107
  }
142
108
  async findModulesByPath(path) {
143
109
  this.ensureInitialized();
144
- if (!this.db) {
145
- return this.memoryGraph.modules.filter(m => m.path.includes(path));
146
- }
147
- return [];
110
+ const graph = await this.loadCodeGraph();
111
+ return graph.modules.filter(module => module.path.includes(path));
148
112
  }
149
113
  async findSymbolByName(name) {
150
114
  this.ensureInitialized();
151
- if (!this.db) {
152
- return this.memoryGraph.symbols.filter(s => s.name.includes(name));
153
- }
154
- return [];
115
+ const graph = await this.loadCodeGraph();
116
+ return graph.symbols.filter(symbol => symbol.name.includes(name));
155
117
  }
156
118
  async findSymbolById(id) {
157
119
  this.ensureInitialized();
158
- if (!this.db) {
159
- return this.memoryGraph.symbols.find(s => s.id === id) ?? null;
160
- }
161
- return null;
120
+ const graph = await this.loadCodeGraph();
121
+ return graph.symbols.find(symbol => symbol.id === id) ?? null;
162
122
  }
163
123
  async findDependencies(moduleId) {
164
124
  this.ensureInitialized();
165
- if (!this.db) {
166
- return this.memoryGraph.dependencies.filter(d => d.sourceId === moduleId);
167
- }
168
- return [];
125
+ return findDependenciesInGraph(await this.loadCodeGraph(), moduleId);
169
126
  }
170
127
  async findDependents(moduleId) {
171
128
  this.ensureInitialized();
172
- if (!this.db) {
173
- return this.memoryGraph.dependencies.filter(d => d.targetId === moduleId);
174
- }
175
- return [];
129
+ return findDependentsInGraph(await this.loadCodeGraph(), moduleId);
176
130
  }
177
- async findCallers(_functionId) {
131
+ async findCallers(functionId) {
178
132
  this.ensureInitialized();
179
- return []; // TODO
133
+ return findCallersInGraph(await this.loadCodeGraph(), functionId);
180
134
  }
181
- async findCallees(_functionId) {
135
+ async findCallees(functionId) {
182
136
  this.ensureInitialized();
183
- return []; // TODO
137
+ return findCalleesInGraph(await this.loadCodeGraph(), functionId);
184
138
  }
185
- // ============================================
186
- // 分析操作
187
- // ============================================
188
139
  async detectCycles() {
189
140
  this.ensureInitialized();
190
- return []; // TODO
141
+ return detectCyclesInGraph(await this.loadCodeGraph());
191
142
  }
192
143
  async calculateImpact(moduleId, depth) {
193
144
  this.ensureInitialized();
194
- return {
195
- rootModule: moduleId,
196
- affectedModules: [],
197
- depth,
198
- };
145
+ return calculateImpactInGraph(await this.loadCodeGraph(), moduleId, depth);
199
146
  }
200
147
  async getStatistics() {
201
148
  this.ensureInitialized();
202
- return {
203
- totalModules: this.memoryGraph.modules.length,
204
- totalSymbols: this.memoryGraph.symbols.length,
205
- totalDependencies: this.memoryGraph.dependencies.length,
206
- totalLines: this.memoryGraph.modules.reduce((sum, m) => sum + m.stats.lines, 0),
207
- averageComplexity: 0,
208
- };
209
- }
210
- // ============================================
211
- // 私有方法
212
- // ============================================
213
- async initializeSchema() {
214
- // TODO: 创建 KùzuDB schema
215
- // CREATE NODE TABLE Module(...)
216
- // CREATE NODE TABLE Symbol(...)
217
- // CREATE REL TABLE DependsOn(...)
218
- // CREATE REL TABLE Calls(...)
219
- }
220
- createEmptyGraph() {
221
- return {
222
- project: {
223
- id: '',
224
- name: '',
225
- rootPath: this.projectPath ?? '',
226
- createdAt: new Date(),
227
- updatedAt: new Date(),
228
- },
229
- modules: [],
230
- symbols: [],
231
- dependencies: [],
232
- };
149
+ return getProjectStatisticsFromGraph(await this.loadCodeGraph());
150
+ }
151
+ getConnection() {
152
+ if (!this.conn) {
153
+ throw new StorageError('KùzuDB connection not initialized', 'KUZU_CONNECTION_NOT_READY');
154
+ }
155
+ return this.conn;
156
+ }
157
+ async runQuery(statement) {
158
+ const result = await this.getConnection().query(statement);
159
+ await closeKuzuResults(normalizeKuzuResults(result));
160
+ }
161
+ async executePrepared(statement, params) {
162
+ const connection = this.getConnection();
163
+ if (typeof connection.prepare !== 'function' || typeof connection.execute !== 'function') {
164
+ throw new StorageError('KùzuDB prepared execution API is unavailable', 'KUZU_PREPARE_NOT_SUPPORTED');
165
+ }
166
+ const preparedStatement = await connection.prepare(statement);
167
+ if (typeof preparedStatement.isSuccess === 'function' &&
168
+ !preparedStatement.isSuccess()) {
169
+ const reason = typeof preparedStatement.getErrorMessage === 'function'
170
+ ? preparedStatement.getErrorMessage()
171
+ : 'Unknown Kùzu prepared statement error';
172
+ throw new StorageError(`Failed to prepare KùzuDB statement: ${reason}`, 'KUZU_PREPARE_FAILED');
173
+ }
174
+ const result = await connection.execute(preparedStatement, params);
175
+ await closeKuzuResults(normalizeKuzuResults(result));
176
+ }
177
+ async queryRows(statement) {
178
+ const result = await this.getConnection().query(statement);
179
+ const results = normalizeKuzuResults(result);
180
+ try {
181
+ const firstResult = results[0];
182
+ if (!firstResult) {
183
+ return [];
184
+ }
185
+ return await firstResult.getAll();
186
+ }
187
+ finally {
188
+ await closeKuzuResults(results);
189
+ }
233
190
  }
234
191
  }
235
192
  //# sourceMappingURL=KuzuDBStorage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"KuzuDBStorage.js","sourceRoot":"","sources":["../../../../src/infrastructure/storage/adapters/KuzuDBStorage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"KuzuDBStorage.js","sourceRoot":"","sources":["../../../../src/infrastructure/storage/adapters/KuzuDBStorage.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,5 @@ export declare class MemoryStorage extends StorageBase {
32
32
  detectCycles(): Promise<Cycle[]>;
33
33
  calculateImpact(moduleId: string, depth: number): Promise<ImpactResult>;
34
34
  getStatistics(): Promise<ProjectStatistics>;
35
- private createEmptyGraph;
36
35
  }
37
36
  //# sourceMappingURL=MemoryStorage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryStorage.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/storage/adapters/MemoryStorage.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,KAAK,EACL,YAAY,EACZ,iBAAiB,EAClB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EACV,SAAS,EACT,MAAM,EACN,MAAM,EACN,UAAU,EACX,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAgB,MAAM,8BAA8B,CAAC;AAEzE;;;;;;;;GAQG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC,cAAc;IACd,OAAO,CAAC,KAAK,CAAsC;cAMnC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;cAK7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASlC,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9C,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC;IAUnC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKlD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKjD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKlD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAKzD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAKvD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmBlD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAuBlD,YAAY,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IA2ChC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoCvE,aAAa,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAkBjD,OAAO,CAAC,gBAAgB;CAczB"}
1
+ {"version":3,"file":"MemoryStorage.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/storage/adapters/MemoryStorage.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,KAAK,EACL,YAAY,EACZ,iBAAiB,EAClB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EACV,SAAS,EACT,MAAM,EACN,MAAM,EACN,UAAU,EACX,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAe3D;;;;;;;;GAQG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC,cAAc;IACd,OAAO,CAAC,KAAK,CAAqC;cAMlC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;cAK7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASlC,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC;IAKnC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKlD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKjD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKlD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAKzD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAKvD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IASlD,YAAY,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAKhC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAKvE,aAAa,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAIlD"}
@@ -4,6 +4,7 @@
4
4
  // 内存存储适配器 - 用于测试和轻量级场景的内存存储
5
5
  // ============================================
6
6
  import { StorageBase } from '../interfaces/StorageBase.js';
7
+ import { calculateImpactInGraph, cloneCodeGraph, createEmptyCodeGraph, deleteModuleFromGraph, detectCyclesInGraph, findCalleesInGraph, findCallersInGraph, findDependenciesInGraph, findDependentsInGraph, getProjectStatisticsFromGraph, upsertModuleInGraph, } from '../graph-helpers.js';
7
8
  /**
8
9
  * 内存存储适配器
9
10
  *
@@ -16,61 +17,43 @@ import { StorageBase } from '../interfaces/StorageBase.js';
16
17
  export class MemoryStorage extends StorageBase {
17
18
  type = 'memory';
18
19
  /** 内存中的代码图 */
19
- graph = this.createEmptyGraph();
20
+ graph = createEmptyCodeGraph();
20
21
  // ============================================
21
22
  // 生命周期管理
22
23
  // ============================================
23
24
  async doInitialize() {
24
25
  // 内存存储无需特殊初始化
25
- this.graph = this.createEmptyGraph();
26
+ this.graph = createEmptyCodeGraph(this.projectPath ?? '');
26
27
  }
27
28
  async doClose() {
28
29
  // 清理内存
29
- this.graph = this.createEmptyGraph();
30
+ this.graph = createEmptyCodeGraph(this.projectPath ?? '');
30
31
  }
31
32
  // ============================================
32
33
  // 项目级别操作
33
34
  // ============================================
34
35
  async saveCodeGraph(graph) {
35
36
  this.ensureInitialized();
36
- this.graph = {
37
- project: { ...graph.project },
38
- modules: [...graph.modules],
39
- symbols: [...graph.symbols],
40
- dependencies: [...graph.dependencies],
41
- };
37
+ this.graph = cloneCodeGraph(graph);
42
38
  }
43
39
  async loadCodeGraph() {
44
40
  this.ensureInitialized();
45
- return {
46
- project: { ...this.graph.project },
47
- modules: [...this.graph.modules],
48
- symbols: [...this.graph.symbols],
49
- dependencies: [...this.graph.dependencies],
50
- };
41
+ return cloneCodeGraph(this.graph);
51
42
  }
52
43
  async deleteProject() {
53
44
  this.ensureInitialized();
54
- this.graph = this.createEmptyGraph();
45
+ this.graph = createEmptyCodeGraph(this.projectPath ?? '');
55
46
  }
56
47
  // ============================================
57
48
  // 增量更新
58
49
  // ============================================
59
50
  async updateModule(module) {
60
51
  this.ensureInitialized();
61
- const index = this.graph.modules.findIndex(m => m.id === module.id);
62
- if (index >= 0) {
63
- this.graph.modules[index] = { ...module };
64
- }
65
- else {
66
- this.graph.modules.push({ ...module });
67
- }
52
+ this.graph = upsertModuleInGraph(this.graph, module);
68
53
  }
69
54
  async deleteModule(moduleId) {
70
55
  this.ensureInitialized();
71
- this.graph.modules = this.graph.modules.filter(m => m.id !== moduleId);
72
- this.graph.symbols = this.graph.symbols.filter(s => s.moduleId !== moduleId);
73
- this.graph.dependencies = this.graph.dependencies.filter(d => d.sourceId !== moduleId && d.targetId !== moduleId);
56
+ this.graph = deleteModuleFromGraph(this.graph, moduleId);
74
57
  }
75
58
  // ============================================
76
59
  // 查询操作
@@ -93,137 +76,34 @@ export class MemoryStorage extends StorageBase {
93
76
  }
94
77
  async findDependencies(moduleId) {
95
78
  this.ensureInitialized();
96
- return this.graph.dependencies.filter(d => d.sourceId === moduleId);
79
+ return findDependenciesInGraph(this.graph, moduleId);
97
80
  }
98
81
  async findDependents(moduleId) {
99
82
  this.ensureInitialized();
100
- return this.graph.dependencies.filter(d => d.targetId === moduleId);
83
+ return findDependentsInGraph(this.graph, moduleId);
101
84
  }
102
85
  async findCallers(functionId) {
103
86
  this.ensureInitialized();
104
- const callerIds = new Set();
105
- for (const dep of this.graph.dependencies) {
106
- if (dep.targetId === functionId && dep.type === 'call') {
107
- callerIds.add(dep.sourceId);
108
- }
109
- }
110
- const results = [];
111
- for (const id of callerIds) {
112
- const symbol = this.graph.symbols.find(s => s.id === id);
113
- if (symbol)
114
- results.push(symbol);
115
- }
116
- return results;
87
+ return findCallersInGraph(this.graph, functionId);
117
88
  }
118
89
  async findCallees(functionId) {
119
90
  this.ensureInitialized();
120
- const calleeIds = new Set();
121
- for (const dep of this.graph.dependencies) {
122
- if (dep.sourceId === functionId && dep.type === 'call') {
123
- calleeIds.add(dep.targetId);
124
- }
125
- }
126
- const results = [];
127
- for (const id of calleeIds) {
128
- const symbol = this.graph.symbols.find(s => s.id === id);
129
- if (symbol)
130
- results.push(symbol);
131
- }
132
- return results;
91
+ return findCalleesInGraph(this.graph, functionId);
133
92
  }
134
93
  // ============================================
135
94
  // 分析操作
136
95
  // ============================================
137
96
  async detectCycles() {
138
97
  this.ensureInitialized();
139
- const cycles = [];
140
- const visited = new Set();
141
- const inStack = new Set();
142
- const dfs = (nodeId, path) => {
143
- if (inStack.has(nodeId)) {
144
- const cycleStart = path.indexOf(nodeId);
145
- const cycleModules = path.slice(cycleStart);
146
- cycles.push({
147
- modules: cycleModules,
148
- length: cycleModules.length,
149
- });
150
- return;
151
- }
152
- if (visited.has(nodeId)) {
153
- return;
154
- }
155
- visited.add(nodeId);
156
- inStack.add(nodeId);
157
- for (const dep of this.graph.dependencies) {
158
- if (dep.sourceId === nodeId) {
159
- dfs(dep.targetId, [...path, nodeId]);
160
- }
161
- }
162
- inStack.delete(nodeId);
163
- };
164
- for (const module of this.graph.modules) {
165
- if (!visited.has(module.id)) {
166
- dfs(module.id, []);
167
- }
168
- }
169
- return cycles;
98
+ return detectCyclesInGraph(this.graph);
170
99
  }
171
100
  async calculateImpact(moduleId, depth) {
172
101
  this.ensureInitialized();
173
- const affectedModules = [];
174
- const visited = new Set();
175
- const queue = [{ id: moduleId, level: 0 }];
176
- while (queue.length > 0) {
177
- const { id, level } = queue.shift();
178
- if (visited.has(id) || level > depth) {
179
- continue;
180
- }
181
- visited.add(id);
182
- if (level > 0) {
183
- const module = this.graph.modules.find(m => m.id === id);
184
- if (module) {
185
- affectedModules.push({ ...module });
186
- }
187
- }
188
- for (const dep of this.graph.dependencies) {
189
- if (dep.targetId === id && !visited.has(dep.sourceId)) {
190
- queue.push({ id: dep.sourceId, level: level + 1 });
191
- }
192
- }
193
- }
194
- return {
195
- rootModule: moduleId,
196
- affectedModules,
197
- depth,
198
- };
102
+ return calculateImpactInGraph(this.graph, moduleId, depth);
199
103
  }
200
104
  async getStatistics() {
201
105
  this.ensureInitialized();
202
- const totalLines = this.graph.modules.reduce((sum, m) => sum + m.stats.lines, 0);
203
- return {
204
- totalModules: this.graph.modules.length,
205
- totalSymbols: this.graph.symbols.length,
206
- totalDependencies: this.graph.dependencies.length,
207
- totalLines,
208
- averageComplexity: 0,
209
- };
210
- }
211
- // ============================================
212
- // 私有方法
213
- // ============================================
214
- createEmptyGraph() {
215
- return {
216
- project: {
217
- id: '',
218
- name: '',
219
- rootPath: this.projectPath ?? '',
220
- createdAt: new Date(),
221
- updatedAt: new Date(),
222
- },
223
- modules: [],
224
- symbols: [],
225
- dependencies: [],
226
- };
106
+ return getProjectStatisticsFromGraph(this.graph);
227
107
  }
228
108
  }
229
109
  //# sourceMappingURL=MemoryStorage.js.map