@mycodemap/mycodemap 0.4.2 → 0.5.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.
- package/CHANGELOG.md +92 -3
- package/README.md +117 -46
- package/dist/ai/claude.d.ts +38 -0
- package/dist/ai/claude.d.ts.map +1 -0
- package/dist/ai/claude.js +169 -0
- package/dist/ai/claude.js.map +1 -0
- package/dist/ai/codex.d.ts +38 -0
- package/dist/ai/codex.d.ts.map +1 -0
- package/dist/ai/codex.js +169 -0
- package/dist/ai/codex.js.map +1 -0
- package/dist/ai/factory.d.ts +48 -0
- package/dist/ai/factory.d.ts.map +1 -0
- package/dist/ai/factory.js +95 -0
- package/dist/ai/factory.js.map +1 -0
- package/dist/ai/index.d.ts +12 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +29 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/provider.d.ts +70 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +31 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/subagent-caller.d.ts +90 -0
- package/dist/ai/subagent-caller.d.ts.map +1 -0
- package/dist/ai/subagent-caller.js +280 -0
- package/dist/ai/subagent-caller.js.map +1 -0
- package/dist/ai/types.d.ts +70 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +5 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cli/commands/design.d.ts +47 -0
- package/dist/cli/commands/design.d.ts.map +1 -0
- package/dist/cli/commands/design.js +268 -0
- package/dist/cli/commands/design.js.map +1 -0
- package/dist/cli/commands/server.d.ts +9 -0
- package/dist/cli/commands/server.d.ts.map +1 -0
- package/dist/cli/commands/server.js +65 -0
- package/dist/cli/commands/server.js.map +1 -0
- package/dist/cli/commands/ship/pipeline.d.ts.map +1 -1
- package/dist/cli/commands/ship/pipeline.js +8 -1
- package/dist/cli/commands/ship/pipeline.js.map +1 -1
- package/dist/cli/commands/ship/publisher.d.ts +9 -1
- package/dist/cli/commands/ship/publisher.d.ts.map +1 -1
- package/dist/cli/commands/ship/publisher.js +149 -6
- package/dist/cli/commands/ship/publisher.js.map +1 -1
- package/dist/cli/design-contract-loader.d.ts +15 -0
- package/dist/cli/design-contract-loader.d.ts.map +1 -0
- package/dist/cli/design-contract-loader.js +175 -0
- package/dist/cli/design-contract-loader.js.map +1 -0
- package/dist/cli/design-contract-schema.d.ts +11 -0
- package/dist/cli/design-contract-schema.d.ts.map +1 -0
- package/dist/cli/design-contract-schema.js +75 -0
- package/dist/cli/design-contract-schema.js.map +1 -0
- package/dist/cli/design-handoff-builder.d.ts +15 -0
- package/dist/cli/design-handoff-builder.d.ts.map +1 -0
- package/dist/cli/design-handoff-builder.js +345 -0
- package/dist/cli/design-handoff-builder.js.map +1 -0
- package/dist/cli/design-scope-resolver.d.ts +8 -0
- package/dist/cli/design-scope-resolver.d.ts.map +1 -0
- package/dist/cli/design-scope-resolver.js +712 -0
- package/dist/cli/design-scope-resolver.js.map +1 -0
- package/dist/cli/design-verification-builder.d.ts +8 -0
- package/dist/cli/design-verification-builder.d.ts.map +1 -0
- package/dist/cli/design-verification-builder.js +369 -0
- package/dist/cli/design-verification-builder.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli-new/commands/server.d.ts +13 -0
- package/dist/cli-new/commands/server.d.ts.map +1 -0
- package/dist/cli-new/commands/server.js +90 -0
- package/dist/cli-new/commands/server.js.map +1 -0
- package/dist/generator/ai-overview.d.ts +51 -0
- package/dist/generator/ai-overview.d.ts.map +1 -0
- package/dist/generator/ai-overview.js +160 -0
- package/dist/generator/ai-overview.js.map +1 -0
- package/dist/infrastructure/storage/StorageFactory.d.ts +12 -5
- package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -1
- package/dist/infrastructure/storage/StorageFactory.js +55 -14
- package/dist/infrastructure/storage/StorageFactory.js.map +1 -1
- package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts +41 -0
- package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +1 -0
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js +162 -0
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +1 -0
- package/dist/interface/types/design-contract.d.ts +68 -0
- package/dist/interface/types/design-contract.d.ts.map +1 -0
- package/dist/interface/types/design-contract.js +7 -0
- package/dist/interface/types/design-contract.js.map +1 -0
- package/dist/interface/types/design-handoff.d.ts +68 -0
- package/dist/interface/types/design-handoff.d.ts.map +1 -0
- package/dist/interface/types/design-handoff.js +4 -0
- package/dist/interface/types/design-handoff.js.map +1 -0
- package/dist/interface/types/design-mapping.d.ts +51 -0
- package/dist/interface/types/design-mapping.d.ts.map +1 -0
- package/dist/interface/types/design-mapping.js +4 -0
- package/dist/interface/types/design-mapping.js.map +1 -0
- package/dist/interface/types/design-verification.d.ts +49 -0
- package/dist/interface/types/design-verification.d.ts.map +1 -0
- package/dist/interface/types/design-verification.js +4 -0
- package/dist/interface/types/design-verification.js.map +1 -0
- package/dist/interface/types/index.d.ts +4 -0
- package/dist/interface/types/index.d.ts.map +1 -1
- package/dist/orchestrator/ai-feed-generator.d.ts +210 -0
- package/dist/orchestrator/ai-feed-generator.d.ts.map +1 -0
- package/dist/orchestrator/ai-feed-generator.js +377 -0
- package/dist/orchestrator/ai-feed-generator.js.map +1 -0
- package/docs/ai-guide/COMMANDS.md +73 -0
- package/docs/ai-guide/OUTPUT.md +415 -0
- package/docs/ai-guide/PATTERNS.md +14 -4
- package/docs/ai-guide/PROMPTS.md +12 -6
- package/docs/archive/test-report-symbol-search.md +384 -0
- package/docs/archive/test-scenario-4-complexity-analysis.md +460 -0
- package/docs/archive/test_report_scenario5.md +615 -0
- package/docs/archive/test_scenario_3_impact_analysis_report.md +520 -0
- package/docs/product-specs/DESIGN_CONTRACT_TEMPLATE.md +79 -0
- package/docs/product-specs/README.md +2 -1
- package/docs/rules/engineering-with-codex-openai.md +6 -2
- package/docs/rules/validation.md +9 -6
- package/package.json +1 -1
- package/scripts/experiments/arcadedb-http-smoke.mjs +90 -0
- package/scripts/validate-docs.js +247 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { CodeMap } from '../types/index.js';
|
|
2
|
+
import type { SubagentOutput } from '../ai/subagent-caller.js';
|
|
3
|
+
/**
|
|
4
|
+
* AI Overview Generator 配置
|
|
5
|
+
*/
|
|
6
|
+
export interface AIOverviewConfig {
|
|
7
|
+
/** 输出目录 */
|
|
8
|
+
outputDir: string;
|
|
9
|
+
/** 是否启用 AI 生成 */
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
/** 输出文件名 */
|
|
12
|
+
filename?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* AI Overview Generator - 生成并保存 AI 概述
|
|
16
|
+
*/
|
|
17
|
+
export declare class AIOverviewGenerator {
|
|
18
|
+
private outputDir;
|
|
19
|
+
private enabled;
|
|
20
|
+
private filename;
|
|
21
|
+
constructor(config: AIOverviewConfig);
|
|
22
|
+
/**
|
|
23
|
+
* 生成并保存 AI 概述
|
|
24
|
+
*/
|
|
25
|
+
generate(codeMap: CodeMap, aiOutput: SubagentOutput): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* 构建 Markdown 内容
|
|
28
|
+
*/
|
|
29
|
+
private buildMarkdown;
|
|
30
|
+
/**
|
|
31
|
+
* 读取已保存的概述
|
|
32
|
+
*/
|
|
33
|
+
read(): Promise<string | null>;
|
|
34
|
+
/**
|
|
35
|
+
* 检查概述是否存在
|
|
36
|
+
*/
|
|
37
|
+
exists(): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* 获取输出文件路径
|
|
40
|
+
*/
|
|
41
|
+
getOutputPath(): string;
|
|
42
|
+
/**
|
|
43
|
+
* 是否启用
|
|
44
|
+
*/
|
|
45
|
+
isEnabled(): boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 创建 AI Overview Generator 实例
|
|
49
|
+
*/
|
|
50
|
+
export declare function createAIOverviewGenerator(config: AIOverviewConfig): AIOverviewGenerator;
|
|
51
|
+
//# sourceMappingURL=ai-overview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-overview.d.ts","sourceRoot":"","sources":["../../src/generator/ai-overview.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,gBAAgB;IAMpC;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAe3E;;OAEG;IACH,OAAO,CAAC,aAAa;IAgGrB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUpC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAWhC;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,GAAG,mBAAmB,CAEvF"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// AI Overview Generator - AI 概述生成与保存
|
|
3
|
+
// ============================================
|
|
4
|
+
import * as fs from 'fs/promises';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
/**
|
|
7
|
+
* AI Overview Generator - 生成并保存 AI 概述
|
|
8
|
+
*/
|
|
9
|
+
export class AIOverviewGenerator {
|
|
10
|
+
outputDir;
|
|
11
|
+
enabled;
|
|
12
|
+
filename;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.outputDir = config.outputDir;
|
|
15
|
+
this.enabled = config.enabled ?? true;
|
|
16
|
+
this.filename = config.filename || 'AI_OVERVIEW.md';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 生成并保存 AI 概述
|
|
20
|
+
*/
|
|
21
|
+
async generate(codeMap, aiOutput) {
|
|
22
|
+
const outputPath = path.join(this.outputDir, this.filename);
|
|
23
|
+
// 构建 Markdown 内容
|
|
24
|
+
const content = this.buildMarkdown(codeMap, aiOutput);
|
|
25
|
+
// 确保输出目录存在
|
|
26
|
+
await fs.mkdir(this.outputDir, { recursive: true });
|
|
27
|
+
// 写入文件
|
|
28
|
+
await fs.writeFile(outputPath, content, 'utf-8');
|
|
29
|
+
return outputPath;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 构建 Markdown 内容
|
|
33
|
+
*/
|
|
34
|
+
buildMarkdown(codeMap, aiOutput) {
|
|
35
|
+
const lines = [];
|
|
36
|
+
// 标题
|
|
37
|
+
lines.push('# ' + aiOutput.title);
|
|
38
|
+
lines.push('');
|
|
39
|
+
// 元数据
|
|
40
|
+
lines.push('<!-- AI Generated Overview -->');
|
|
41
|
+
lines.push(`- **生成时间**: ${new Date(aiOutput.metadata.generatedAt).toLocaleString('zh-CN')}`);
|
|
42
|
+
lines.push(`- **模型**: ${aiOutput.metadata.model}`);
|
|
43
|
+
lines.push('');
|
|
44
|
+
// 项目统计
|
|
45
|
+
lines.push('## 项目统计');
|
|
46
|
+
lines.push('');
|
|
47
|
+
lines.push(`| 指标 | 数值 |`);
|
|
48
|
+
lines.push(`|------|------|`);
|
|
49
|
+
lines.push(`| 文件总数 | ${codeMap.summary.totalFiles} |`);
|
|
50
|
+
lines.push(`| 代码行数 | ${codeMap.summary.totalLines} |`);
|
|
51
|
+
lines.push(`| 模块数量 | ${codeMap.summary.totalModules} |`);
|
|
52
|
+
lines.push(`| 导出符号 | ${codeMap.summary.totalExports} |`);
|
|
53
|
+
lines.push(`| 类型定义 | ${codeMap.summary.totalTypes} |`);
|
|
54
|
+
lines.push('');
|
|
55
|
+
// 架构信息
|
|
56
|
+
if (aiOutput.architecture) {
|
|
57
|
+
lines.push('## 架构分析');
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push(`- **架构模式**: ${aiOutput.architecture.pattern || '未识别'}`);
|
|
60
|
+
lines.push('');
|
|
61
|
+
if (aiOutput.architecture.layers && aiOutput.architecture.layers.length > 0) {
|
|
62
|
+
lines.push('### 分层结构');
|
|
63
|
+
lines.push('');
|
|
64
|
+
for (const layer of aiOutput.architecture.layers) {
|
|
65
|
+
lines.push(`#### ${layer.name}`);
|
|
66
|
+
lines.push(`- **职责**: ${layer.responsibility}`);
|
|
67
|
+
if (layer.modules.length > 0) {
|
|
68
|
+
lines.push(`- **模块**: ${layer.modules.join(', ')}`);
|
|
69
|
+
}
|
|
70
|
+
lines.push('');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (aiOutput.architecture.metrics) {
|
|
74
|
+
lines.push('### 架构指标');
|
|
75
|
+
lines.push('');
|
|
76
|
+
lines.push(`- **耦合度**: ${aiOutput.architecture.metrics.coupling}`);
|
|
77
|
+
lines.push(`- **内聚度**: ${aiOutput.architecture.metrics.cohesion}`);
|
|
78
|
+
lines.push(`- **复杂度**: ${aiOutput.architecture.metrics.complexity}`);
|
|
79
|
+
lines.push('');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// AI 生成的内容
|
|
83
|
+
lines.push('## 项目概述');
|
|
84
|
+
lines.push('');
|
|
85
|
+
lines.push(aiOutput.content);
|
|
86
|
+
lines.push('');
|
|
87
|
+
// 亮点模块
|
|
88
|
+
if (aiOutput.highlights.length > 0) {
|
|
89
|
+
lines.push('## 亮点模块');
|
|
90
|
+
lines.push('');
|
|
91
|
+
for (const highlight of aiOutput.highlights) {
|
|
92
|
+
lines.push(`- ${highlight}`);
|
|
93
|
+
}
|
|
94
|
+
lines.push('');
|
|
95
|
+
}
|
|
96
|
+
// 模块列表(简要)
|
|
97
|
+
lines.push('## 模块列表');
|
|
98
|
+
lines.push('');
|
|
99
|
+
lines.push('| 模块路径 | 导出数 | 依赖数 |');
|
|
100
|
+
lines.push('|----------|--------|--------|');
|
|
101
|
+
for (const mod of codeMap.modules.slice(0, 20)) {
|
|
102
|
+
const exportsCount = mod.exports.length;
|
|
103
|
+
const depsCount = mod.dependencies.length;
|
|
104
|
+
const relPath = path.relative(codeMap.project.rootDir, mod.path);
|
|
105
|
+
lines.push(`| ${relPath} | ${exportsCount} | ${depsCount} |`);
|
|
106
|
+
}
|
|
107
|
+
if (codeMap.modules.length > 20) {
|
|
108
|
+
lines.push(`| ... | ... | ... |`);
|
|
109
|
+
}
|
|
110
|
+
lines.push('');
|
|
111
|
+
lines.push('---');
|
|
112
|
+
lines.push('');
|
|
113
|
+
lines.push('*由 CodeMap AI Generator 生成*');
|
|
114
|
+
return lines.join('\n');
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 读取已保存的概述
|
|
118
|
+
*/
|
|
119
|
+
async read() {
|
|
120
|
+
const outputPath = path.join(this.outputDir, this.filename);
|
|
121
|
+
try {
|
|
122
|
+
return await fs.readFile(outputPath, 'utf-8');
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 检查概述是否存在
|
|
130
|
+
*/
|
|
131
|
+
async exists() {
|
|
132
|
+
const outputPath = path.join(this.outputDir, this.filename);
|
|
133
|
+
try {
|
|
134
|
+
await fs.access(outputPath);
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 获取输出文件路径
|
|
143
|
+
*/
|
|
144
|
+
getOutputPath() {
|
|
145
|
+
return path.join(this.outputDir, this.filename);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 是否启用
|
|
149
|
+
*/
|
|
150
|
+
isEnabled() {
|
|
151
|
+
return this.enabled;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 创建 AI Overview Generator 实例
|
|
156
|
+
*/
|
|
157
|
+
export function createAIOverviewGenerator(config) {
|
|
158
|
+
return new AIOverviewGenerator(config);
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=ai-overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-overview.js","sourceRoot":"","sources":["../../src/generator/ai-overview.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,15 +22,22 @@ export declare class StorageFactory implements IStorageFactory {
|
|
|
22
22
|
* @returns 初始化的存储实例
|
|
23
23
|
*/
|
|
24
24
|
createForProject(projectPath: string, config: StorageConfig): Promise<IStorage>;
|
|
25
|
+
/**
|
|
26
|
+
* 检查 KùzuDB 是否可用
|
|
27
|
+
* 尝试动态导入 kuzu 并创建临时数据库验证功能正常
|
|
28
|
+
*/
|
|
29
|
+
private checkKuzuAvailability;
|
|
25
30
|
/**
|
|
26
31
|
* 自动确定存储类型
|
|
27
32
|
*
|
|
28
|
-
*
|
|
29
|
-
* -
|
|
30
|
-
* -
|
|
31
|
-
* -
|
|
33
|
+
* 策略(DEC-01):
|
|
34
|
+
* - 优先尝试 KùzuDB(如果可用)
|
|
35
|
+
* - KùzuDB 不可用时 fallback 到文件系统
|
|
36
|
+
* - 显式配置优先于自动选择
|
|
32
37
|
*
|
|
33
|
-
*
|
|
38
|
+
* 降级策略(DEC-03):
|
|
39
|
+
* - auto 模式:静默 fallback 到 filesystem
|
|
40
|
+
* - kuzudb 模式:抛出错误,由调用者处理降级
|
|
34
41
|
*/
|
|
35
42
|
private determineStorageType;
|
|
36
43
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageFactory.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/storage/StorageFactory.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,aAAa,EACb,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAmB1C;;;;;;;;GAQG;AACH,qBAAa,cAAe,YAAW,eAAe;IACpD;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"StorageFactory.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/storage/StorageFactory.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,aAAa,EACb,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAmB1C;;;;;;;;GAQG;AACH,qBAAa,cAAe,YAAW,eAAe;IACpD;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiDtD;;;;;OAKG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;IAMrF;;;OAGG;YACW,qBAAqB;IAcnC;;;;;;;;;;;OAWG;YACW,oBAAoB;IAwBlC;;;;OAIG;IACH,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAkBzD;;;OAGG;IACH,MAAM,CAAC,wBAAwB,IAAI,WAAW,EAAE;CAIjD;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
|
@@ -34,9 +34,22 @@ export class StorageFactory {
|
|
|
34
34
|
* @returns 存储实例
|
|
35
35
|
*/
|
|
36
36
|
async create(config) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
let storageType;
|
|
38
|
+
try {
|
|
39
|
+
storageType = config.type === 'auto'
|
|
40
|
+
? await this.determineStorageType(config)
|
|
41
|
+
: config.type;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
// 如果确定类型失败且是 kuzudb 请求,fallback 到 filesystem
|
|
45
|
+
if (config.type === 'kuzudb' && error instanceof StorageError && error.code === 'KUZU_NOT_AVAILABLE') {
|
|
46
|
+
console.warn('[StorageFactory] KùzuDB unavailable, falling back to filesystem');
|
|
47
|
+
storageType = 'filesystem';
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
40
53
|
switch (storageType) {
|
|
41
54
|
case 'filesystem':
|
|
42
55
|
return new FileSystemStorage(config);
|
|
@@ -67,23 +80,51 @@ export class StorageFactory {
|
|
|
67
80
|
await storage.initialize(projectPath);
|
|
68
81
|
return storage;
|
|
69
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* 检查 KùzuDB 是否可用
|
|
85
|
+
* 尝试动态导入 kuzu 并创建临时数据库验证功能正常
|
|
86
|
+
*/
|
|
87
|
+
async checkKuzuAvailability() {
|
|
88
|
+
try {
|
|
89
|
+
// @ts-ignore kuzu is an optional dependency, not installed in CI
|
|
90
|
+
const kuzu = await import('kuzu');
|
|
91
|
+
const tempDb = new kuzu.Database(':memory:');
|
|
92
|
+
if (typeof tempDb.close === 'function') {
|
|
93
|
+
await tempDb.close();
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
70
101
|
/**
|
|
71
102
|
* 自动确定存储类型
|
|
72
103
|
*
|
|
73
|
-
*
|
|
74
|
-
* -
|
|
75
|
-
* -
|
|
76
|
-
* -
|
|
104
|
+
* 策略(DEC-01):
|
|
105
|
+
* - 优先尝试 KùzuDB(如果可用)
|
|
106
|
+
* - KùzuDB 不可用时 fallback 到文件系统
|
|
107
|
+
* - 显式配置优先于自动选择
|
|
77
108
|
*
|
|
78
|
-
*
|
|
109
|
+
* 降级策略(DEC-03):
|
|
110
|
+
* - auto 模式:静默 fallback 到 filesystem
|
|
111
|
+
* - kuzudb 模式:抛出错误,由调用者处理降级
|
|
79
112
|
*/
|
|
80
113
|
async determineStorageType(config) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
//
|
|
86
|
-
|
|
114
|
+
// 如果明确指定了非 auto 类型,直接返回
|
|
115
|
+
if (config.type !== 'auto' && config.type !== 'kuzudb') {
|
|
116
|
+
return config.type;
|
|
117
|
+
}
|
|
118
|
+
// 优先尝试 KùzuDB
|
|
119
|
+
const kuzuAvailable = await this.checkKuzuAvailability();
|
|
120
|
+
if (kuzuAvailable) {
|
|
121
|
+
return 'kuzudb';
|
|
122
|
+
}
|
|
123
|
+
// 如果明确指定 kuzudb 但不可用,抛出错误让调用者处理降级
|
|
124
|
+
if (config.type === 'kuzudb') {
|
|
125
|
+
throw new StorageError('KùzuDB is not available. Install with: npm install kuzu', 'KUZU_NOT_AVAILABLE');
|
|
126
|
+
}
|
|
127
|
+
// auto 模式下 fallback 到 filesystem
|
|
87
128
|
return 'filesystem';
|
|
88
129
|
}
|
|
89
130
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageFactory.js","sourceRoot":"","sources":["../../../src/infrastructure/storage/StorageFactory.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,qFAAqF;AACrF,+CAA+C;AAC/C,uBAAuB;AACvB,+CAA+C;AAQ/C,OAAO,EAAe,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,WAAW;AACX,IAAI,aAAa,GAAsE,IAAI,CAAC;AAE5F;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC3D,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IACvC,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,cAAc;IACzB;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,MAAqB;QAChC,
|
|
1
|
+
{"version":3,"file":"StorageFactory.js","sourceRoot":"","sources":["../../../src/infrastructure/storage/StorageFactory.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,qFAAqF;AACrF,+CAA+C;AAC/C,uBAAuB;AACvB,+CAA+C;AAQ/C,OAAO,EAAe,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,WAAW;AACX,IAAI,aAAa,GAAsE,IAAI,CAAC;AAE5F;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC3D,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IACvC,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,cAAc;IACzB;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,MAAqB;QAChC,IAAI,WAAwB,CAAC;QAE7B,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM;gBAClC,CAAC,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;gBACzC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6CAA6C;YAC7C,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;gBACrG,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;gBAChF,WAAW,GAAG,YAAY,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,YAAY;gBACf,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAEvC,KAAK,QAAQ;gBACX,OAAO,IAAI,aAAa,EAAE,CAAC;YAE7B,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,WAAW,GAAG,MAAM,iBAAiB,EAAE,CAAC;gBAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,IAAI,YAAY,CACpB,sEAAsE,EACtE,uBAAuB,CACxB,CAAC;gBACJ,CAAC;gBACD,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;YAED;gBACE,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,OAAO,EAAE,CAAC;oBACpC,MAAM,IAAI,YAAY,CACpB,wFAAwF,EACxF,0BAA0B,CAC3B,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,YAAY,CACpB,yBAAyB,MAAM,CAAC,WAAW,CAAC,EAAE,EAC9C,sBAAsB,CACvB,CAAC;QACN,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,MAAqB;QAC/D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,qBAAqB;QACjC,IAAI,CAAC;YACH,iEAAiE;YACjE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBACvC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACK,KAAK,CAAC,oBAAoB,CAAC,MAAqB;QACtD,wBAAwB;QACxB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAED,cAAc;QACd,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACzD,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,kCAAkC;QAClC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,YAAY,CACpB,yDAAyD,EACzD,oBAAoB,CACrB,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,sBAAsB,CAAC,IAAiB;QAC7C,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,YAAY,CAAC;YAClB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC;YACd,KAAK,QAAQ;gBACX,gBAAgB;gBAChB,IAAI,CAAC;oBACH,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACxB,OAAO,IAAI,CAAC;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,wBAAwB;QAC7B,MAAM,QAAQ,GAAkB,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { StorageConfig, Cycle, ImpactResult, ProjectStatistics } from '../../../interface/types/storage.js';
|
|
2
|
+
import type { CodeGraph, Module, Symbol, Dependency } from '../../../interface/types/index.js';
|
|
3
|
+
import { StorageBase } from '../interfaces/StorageBase.js';
|
|
4
|
+
/**
|
|
5
|
+
* Neo4j 存储适配器(可选依赖)
|
|
6
|
+
*
|
|
7
|
+
* 安装:npm install neo4j-driver
|
|
8
|
+
*
|
|
9
|
+
* 特点:
|
|
10
|
+
* - 连接远程/本地 Neo4j 实例
|
|
11
|
+
* - 用 snapshot 节点持久化完整 CodeGraph
|
|
12
|
+
* - 查询/分析接口与共享 storage contract 保持一致
|
|
13
|
+
* - 错误语义显式暴露,不再静默 fallback
|
|
14
|
+
*/
|
|
15
|
+
export declare class Neo4jStorage extends StorageBase {
|
|
16
|
+
readonly type: "neo4j";
|
|
17
|
+
private driver;
|
|
18
|
+
private readonly dbConfig;
|
|
19
|
+
constructor(config: StorageConfig);
|
|
20
|
+
protected doInitialize(): Promise<void>;
|
|
21
|
+
protected doClose(): Promise<void>;
|
|
22
|
+
saveCodeGraph(graph: CodeGraph): Promise<void>;
|
|
23
|
+
loadCodeGraph(): Promise<CodeGraph>;
|
|
24
|
+
deleteProject(): Promise<void>;
|
|
25
|
+
updateModule(module: Module): Promise<void>;
|
|
26
|
+
deleteModule(moduleId: string): Promise<void>;
|
|
27
|
+
findModuleById(id: string): Promise<Module | null>;
|
|
28
|
+
findModulesByPath(path: string): Promise<Module[]>;
|
|
29
|
+
findSymbolByName(name: string): Promise<Symbol[]>;
|
|
30
|
+
findSymbolById(id: string): Promise<Symbol | null>;
|
|
31
|
+
findDependencies(moduleId: string): Promise<Dependency[]>;
|
|
32
|
+
findDependents(moduleId: string): Promise<Dependency[]>;
|
|
33
|
+
findCallers(functionId: string): Promise<Symbol[]>;
|
|
34
|
+
findCallees(functionId: string): Promise<Symbol[]>;
|
|
35
|
+
detectCycles(): Promise<Cycle[]>;
|
|
36
|
+
calculateImpact(moduleId: string, depth: number): Promise<ImpactResult>;
|
|
37
|
+
getStatistics(): Promise<ProjectStatistics>;
|
|
38
|
+
private getDriver;
|
|
39
|
+
private runStatement;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=Neo4jStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Neo4jStorage.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/storage/adapters/Neo4jStorage.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,aAAa,EACb,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;AA4DzE;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IAEjC,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAE7B,MAAM,EAAE,aAAa;cAKjB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;cAkB7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQlC,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9C,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC;IAkBnC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMlD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMlD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMjD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMlD,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;IAKlD,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;IAKjD,OAAO,CAAC,SAAS;YAWH,YAAY;CAkB3B"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// [META] since:2026-03 | owner:architecture-team | stable:false
|
|
2
|
+
// [WHY] Neo4j storage adapter - enterprise graph database backend
|
|
3
|
+
// ============================================
|
|
4
|
+
// Neo4j 存储适配器 - 企业级图数据库后端
|
|
5
|
+
// ============================================
|
|
6
|
+
import { StorageBase, StorageError } from '../interfaces/StorageBase.js';
|
|
7
|
+
import { calculateImpactInGraph, createEmptyCodeGraph, deleteModuleFromGraph, deserializeCodeGraphSnapshot, detectCyclesInGraph, findCalleesInGraph, findCallersInGraph, findDependenciesInGraph, findDependentsInGraph, getProjectStatisticsFromGraph, serializeCodeGraphSnapshot, upsertModuleInGraph, } from '../graph-helpers.js';
|
|
8
|
+
async function loadNeo4jModule() {
|
|
9
|
+
const moduleName = 'neo4j-driver';
|
|
10
|
+
return await import(moduleName);
|
|
11
|
+
}
|
|
12
|
+
function normalizeNeo4jValue(value) {
|
|
13
|
+
if (typeof value === 'object' &&
|
|
14
|
+
value !== null &&
|
|
15
|
+
'toNumber' in value &&
|
|
16
|
+
typeof value.toNumber === 'function') {
|
|
17
|
+
return value.toNumber();
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Neo4j 存储适配器(可选依赖)
|
|
23
|
+
*
|
|
24
|
+
* 安装:npm install neo4j-driver
|
|
25
|
+
*
|
|
26
|
+
* 特点:
|
|
27
|
+
* - 连接远程/本地 Neo4j 实例
|
|
28
|
+
* - 用 snapshot 节点持久化完整 CodeGraph
|
|
29
|
+
* - 查询/分析接口与共享 storage contract 保持一致
|
|
30
|
+
* - 错误语义显式暴露,不再静默 fallback
|
|
31
|
+
*/
|
|
32
|
+
export class Neo4jStorage extends StorageBase {
|
|
33
|
+
type = 'neo4j';
|
|
34
|
+
driver = null;
|
|
35
|
+
dbConfig;
|
|
36
|
+
constructor(config) {
|
|
37
|
+
super();
|
|
38
|
+
this.dbConfig = config;
|
|
39
|
+
}
|
|
40
|
+
async doInitialize() {
|
|
41
|
+
try {
|
|
42
|
+
const neo4j = await loadNeo4jModule();
|
|
43
|
+
const uri = this.dbConfig.uri ?? 'bolt://localhost:7687';
|
|
44
|
+
const username = this.dbConfig.username ?? 'neo4j';
|
|
45
|
+
const password = this.dbConfig.password ?? 'password';
|
|
46
|
+
this.driver = neo4j.driver(uri, neo4j.auth.basic(username, password));
|
|
47
|
+
await this.driver.verifyConnectivity();
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
throw new StorageError('Failed to initialize Neo4j storage', 'NEO4J_INIT_FAILED', error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async doClose() {
|
|
54
|
+
if (this.driver) {
|
|
55
|
+
await this.driver.close();
|
|
56
|
+
}
|
|
57
|
+
this.driver = null;
|
|
58
|
+
}
|
|
59
|
+
async saveCodeGraph(graph) {
|
|
60
|
+
this.ensureInitialized();
|
|
61
|
+
await this.runStatement('MATCH (s:CodeMapSnapshot) DETACH DELETE s');
|
|
62
|
+
await this.runStatement('CREATE (s:CodeMapSnapshot {id: $id, projectId: $projectId, graph: $graph, updatedAt: $updatedAt})', {
|
|
63
|
+
id: 'codemap-snapshot',
|
|
64
|
+
projectId: graph.project.id,
|
|
65
|
+
graph: serializeCodeGraphSnapshot(graph),
|
|
66
|
+
updatedAt: new Date().toISOString(),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async loadCodeGraph() {
|
|
70
|
+
this.ensureInitialized();
|
|
71
|
+
const result = await this.runStatement('MATCH (s:CodeMapSnapshot) RETURN s.graph AS graph LIMIT 1');
|
|
72
|
+
const record = result.records[0];
|
|
73
|
+
const snapshot = typeof record?.get === 'function'
|
|
74
|
+
? normalizeNeo4jValue(record.get('graph'))
|
|
75
|
+
: null;
|
|
76
|
+
if (typeof snapshot !== 'string') {
|
|
77
|
+
return createEmptyCodeGraph(this.projectPath ?? '');
|
|
78
|
+
}
|
|
79
|
+
return deserializeCodeGraphSnapshot(snapshot, this.projectPath ?? '');
|
|
80
|
+
}
|
|
81
|
+
async deleteProject() {
|
|
82
|
+
this.ensureInitialized();
|
|
83
|
+
await this.runStatement('MATCH (s:CodeMapSnapshot) DETACH DELETE s');
|
|
84
|
+
}
|
|
85
|
+
async updateModule(module) {
|
|
86
|
+
this.ensureInitialized();
|
|
87
|
+
const graph = await this.loadCodeGraph();
|
|
88
|
+
await this.saveCodeGraph(upsertModuleInGraph(graph, module));
|
|
89
|
+
}
|
|
90
|
+
async deleteModule(moduleId) {
|
|
91
|
+
this.ensureInitialized();
|
|
92
|
+
const graph = await this.loadCodeGraph();
|
|
93
|
+
await this.saveCodeGraph(deleteModuleFromGraph(graph, moduleId));
|
|
94
|
+
}
|
|
95
|
+
async findModuleById(id) {
|
|
96
|
+
this.ensureInitialized();
|
|
97
|
+
const graph = await this.loadCodeGraph();
|
|
98
|
+
return graph.modules.find(module => module.id === id) ?? null;
|
|
99
|
+
}
|
|
100
|
+
async findModulesByPath(path) {
|
|
101
|
+
this.ensureInitialized();
|
|
102
|
+
const graph = await this.loadCodeGraph();
|
|
103
|
+
return graph.modules.filter(module => module.path.includes(path));
|
|
104
|
+
}
|
|
105
|
+
async findSymbolByName(name) {
|
|
106
|
+
this.ensureInitialized();
|
|
107
|
+
const graph = await this.loadCodeGraph();
|
|
108
|
+
return graph.symbols.filter(symbol => symbol.name.includes(name));
|
|
109
|
+
}
|
|
110
|
+
async findSymbolById(id) {
|
|
111
|
+
this.ensureInitialized();
|
|
112
|
+
const graph = await this.loadCodeGraph();
|
|
113
|
+
return graph.symbols.find(symbol => symbol.id === id) ?? null;
|
|
114
|
+
}
|
|
115
|
+
async findDependencies(moduleId) {
|
|
116
|
+
this.ensureInitialized();
|
|
117
|
+
return findDependenciesInGraph(await this.loadCodeGraph(), moduleId);
|
|
118
|
+
}
|
|
119
|
+
async findDependents(moduleId) {
|
|
120
|
+
this.ensureInitialized();
|
|
121
|
+
return findDependentsInGraph(await this.loadCodeGraph(), moduleId);
|
|
122
|
+
}
|
|
123
|
+
async findCallers(functionId) {
|
|
124
|
+
this.ensureInitialized();
|
|
125
|
+
return findCallersInGraph(await this.loadCodeGraph(), functionId);
|
|
126
|
+
}
|
|
127
|
+
async findCallees(functionId) {
|
|
128
|
+
this.ensureInitialized();
|
|
129
|
+
return findCalleesInGraph(await this.loadCodeGraph(), functionId);
|
|
130
|
+
}
|
|
131
|
+
async detectCycles() {
|
|
132
|
+
this.ensureInitialized();
|
|
133
|
+
return detectCyclesInGraph(await this.loadCodeGraph());
|
|
134
|
+
}
|
|
135
|
+
async calculateImpact(moduleId, depth) {
|
|
136
|
+
this.ensureInitialized();
|
|
137
|
+
return calculateImpactInGraph(await this.loadCodeGraph(), moduleId, depth);
|
|
138
|
+
}
|
|
139
|
+
async getStatistics() {
|
|
140
|
+
this.ensureInitialized();
|
|
141
|
+
return getProjectStatisticsFromGraph(await this.loadCodeGraph());
|
|
142
|
+
}
|
|
143
|
+
getDriver() {
|
|
144
|
+
if (!this.driver) {
|
|
145
|
+
throw new StorageError('Neo4j driver not initialized', 'NEO4J_DRIVER_NOT_READY');
|
|
146
|
+
}
|
|
147
|
+
return this.driver;
|
|
148
|
+
}
|
|
149
|
+
async runStatement(query, params) {
|
|
150
|
+
const session = this.getDriver().session();
|
|
151
|
+
try {
|
|
152
|
+
return await session.run(query, params);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
throw new StorageError('Failed to execute Neo4j query', 'NEO4J_QUERY_FAILED', error);
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
await session.close();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=Neo4jStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Neo4jStorage.js","sourceRoot":"","sources":["../../../../src/infrastructure/storage/adapters/Neo4jStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 必填 section
|
|
3
|
+
*/
|
|
4
|
+
export type DesignContractRequiredSectionId = 'goal' | 'constraints' | 'acceptanceCriteria' | 'nonGoals';
|
|
5
|
+
/**
|
|
6
|
+
* 可选 section
|
|
7
|
+
*/
|
|
8
|
+
export type DesignContractOptionalSectionId = 'context' | 'openQuestions' | 'notes';
|
|
9
|
+
/**
|
|
10
|
+
* 全量 section 标识
|
|
11
|
+
*/
|
|
12
|
+
export type DesignContractSectionId = DesignContractRequiredSectionId | DesignContractOptionalSectionId;
|
|
13
|
+
/**
|
|
14
|
+
* 结构化诊断严重级别
|
|
15
|
+
*/
|
|
16
|
+
export type DesignContractDiagnosticSeverity = 'error' | 'warning' | 'info';
|
|
17
|
+
/**
|
|
18
|
+
* 结构化诊断代码
|
|
19
|
+
*/
|
|
20
|
+
export type DesignContractDiagnosticCode = 'file-not-found' | 'missing-section' | 'duplicate-section' | 'empty-section' | 'unknown-section' | 'ambiguous-heading';
|
|
21
|
+
/**
|
|
22
|
+
* 原始/归一化 section 内容
|
|
23
|
+
*/
|
|
24
|
+
export interface DesignContractSection {
|
|
25
|
+
id: DesignContractSectionId;
|
|
26
|
+
title: string;
|
|
27
|
+
rawHeading: string;
|
|
28
|
+
content: string[];
|
|
29
|
+
line: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 设计契约元数据
|
|
33
|
+
*/
|
|
34
|
+
export interface DesignContractMetadata {
|
|
35
|
+
version: 'v1';
|
|
36
|
+
title?: string;
|
|
37
|
+
sourcePath?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 结构化诊断
|
|
41
|
+
*/
|
|
42
|
+
export interface DesignContractDiagnostic {
|
|
43
|
+
code: DesignContractDiagnosticCode;
|
|
44
|
+
severity: DesignContractDiagnosticSeverity;
|
|
45
|
+
message: string;
|
|
46
|
+
section?: DesignContractSectionId;
|
|
47
|
+
heading?: string;
|
|
48
|
+
line?: number;
|
|
49
|
+
suggestion?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 原始设计契约文档
|
|
53
|
+
*/
|
|
54
|
+
export interface DesignContract {
|
|
55
|
+
metadata: DesignContractMetadata;
|
|
56
|
+
sections: DesignContractSection[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 归一化设计契约(允许带缺失段,供 validator/CLI 决策)
|
|
60
|
+
*/
|
|
61
|
+
export interface NormalizedDesignContract {
|
|
62
|
+
metadata: DesignContractMetadata;
|
|
63
|
+
sections: Partial<Record<DesignContractSectionId, DesignContractSection>>;
|
|
64
|
+
orderedSections: DesignContractSection[];
|
|
65
|
+
missingRequiredSections: DesignContractRequiredSectionId[];
|
|
66
|
+
diagnostics: DesignContractDiagnostic[];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=design-contract.d.ts.map
|