@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.
Files changed (120) hide show
  1. package/CHANGELOG.md +92 -3
  2. package/README.md +117 -46
  3. package/dist/ai/claude.d.ts +38 -0
  4. package/dist/ai/claude.d.ts.map +1 -0
  5. package/dist/ai/claude.js +169 -0
  6. package/dist/ai/claude.js.map +1 -0
  7. package/dist/ai/codex.d.ts +38 -0
  8. package/dist/ai/codex.d.ts.map +1 -0
  9. package/dist/ai/codex.js +169 -0
  10. package/dist/ai/codex.js.map +1 -0
  11. package/dist/ai/factory.d.ts +48 -0
  12. package/dist/ai/factory.d.ts.map +1 -0
  13. package/dist/ai/factory.js +95 -0
  14. package/dist/ai/factory.js.map +1 -0
  15. package/dist/ai/index.d.ts +12 -0
  16. package/dist/ai/index.d.ts.map +1 -0
  17. package/dist/ai/index.js +29 -0
  18. package/dist/ai/index.js.map +1 -0
  19. package/dist/ai/provider.d.ts +70 -0
  20. package/dist/ai/provider.d.ts.map +1 -0
  21. package/dist/ai/provider.js +31 -0
  22. package/dist/ai/provider.js.map +1 -0
  23. package/dist/ai/subagent-caller.d.ts +90 -0
  24. package/dist/ai/subagent-caller.d.ts.map +1 -0
  25. package/dist/ai/subagent-caller.js +280 -0
  26. package/dist/ai/subagent-caller.js.map +1 -0
  27. package/dist/ai/types.d.ts +70 -0
  28. package/dist/ai/types.d.ts.map +1 -0
  29. package/dist/ai/types.js +5 -0
  30. package/dist/ai/types.js.map +1 -0
  31. package/dist/cli/commands/design.d.ts +47 -0
  32. package/dist/cli/commands/design.d.ts.map +1 -0
  33. package/dist/cli/commands/design.js +268 -0
  34. package/dist/cli/commands/design.js.map +1 -0
  35. package/dist/cli/commands/server.d.ts +9 -0
  36. package/dist/cli/commands/server.d.ts.map +1 -0
  37. package/dist/cli/commands/server.js +65 -0
  38. package/dist/cli/commands/server.js.map +1 -0
  39. package/dist/cli/commands/ship/pipeline.d.ts.map +1 -1
  40. package/dist/cli/commands/ship/pipeline.js +8 -1
  41. package/dist/cli/commands/ship/pipeline.js.map +1 -1
  42. package/dist/cli/commands/ship/publisher.d.ts +9 -1
  43. package/dist/cli/commands/ship/publisher.d.ts.map +1 -1
  44. package/dist/cli/commands/ship/publisher.js +149 -6
  45. package/dist/cli/commands/ship/publisher.js.map +1 -1
  46. package/dist/cli/design-contract-loader.d.ts +15 -0
  47. package/dist/cli/design-contract-loader.d.ts.map +1 -0
  48. package/dist/cli/design-contract-loader.js +175 -0
  49. package/dist/cli/design-contract-loader.js.map +1 -0
  50. package/dist/cli/design-contract-schema.d.ts +11 -0
  51. package/dist/cli/design-contract-schema.d.ts.map +1 -0
  52. package/dist/cli/design-contract-schema.js +75 -0
  53. package/dist/cli/design-contract-schema.js.map +1 -0
  54. package/dist/cli/design-handoff-builder.d.ts +15 -0
  55. package/dist/cli/design-handoff-builder.d.ts.map +1 -0
  56. package/dist/cli/design-handoff-builder.js +345 -0
  57. package/dist/cli/design-handoff-builder.js.map +1 -0
  58. package/dist/cli/design-scope-resolver.d.ts +8 -0
  59. package/dist/cli/design-scope-resolver.d.ts.map +1 -0
  60. package/dist/cli/design-scope-resolver.js +712 -0
  61. package/dist/cli/design-scope-resolver.js.map +1 -0
  62. package/dist/cli/design-verification-builder.d.ts +8 -0
  63. package/dist/cli/design-verification-builder.d.ts.map +1 -0
  64. package/dist/cli/design-verification-builder.js +369 -0
  65. package/dist/cli/design-verification-builder.js.map +1 -0
  66. package/dist/cli/index.js +2 -0
  67. package/dist/cli/index.js.map +1 -1
  68. package/dist/cli-new/commands/server.d.ts +13 -0
  69. package/dist/cli-new/commands/server.d.ts.map +1 -0
  70. package/dist/cli-new/commands/server.js +90 -0
  71. package/dist/cli-new/commands/server.js.map +1 -0
  72. package/dist/generator/ai-overview.d.ts +51 -0
  73. package/dist/generator/ai-overview.d.ts.map +1 -0
  74. package/dist/generator/ai-overview.js +160 -0
  75. package/dist/generator/ai-overview.js.map +1 -0
  76. package/dist/infrastructure/storage/StorageFactory.d.ts +12 -5
  77. package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -1
  78. package/dist/infrastructure/storage/StorageFactory.js +55 -14
  79. package/dist/infrastructure/storage/StorageFactory.js.map +1 -1
  80. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts +41 -0
  81. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +1 -0
  82. package/dist/infrastructure/storage/adapters/Neo4jStorage.js +162 -0
  83. package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +1 -0
  84. package/dist/interface/types/design-contract.d.ts +68 -0
  85. package/dist/interface/types/design-contract.d.ts.map +1 -0
  86. package/dist/interface/types/design-contract.js +7 -0
  87. package/dist/interface/types/design-contract.js.map +1 -0
  88. package/dist/interface/types/design-handoff.d.ts +68 -0
  89. package/dist/interface/types/design-handoff.d.ts.map +1 -0
  90. package/dist/interface/types/design-handoff.js +4 -0
  91. package/dist/interface/types/design-handoff.js.map +1 -0
  92. package/dist/interface/types/design-mapping.d.ts +51 -0
  93. package/dist/interface/types/design-mapping.d.ts.map +1 -0
  94. package/dist/interface/types/design-mapping.js +4 -0
  95. package/dist/interface/types/design-mapping.js.map +1 -0
  96. package/dist/interface/types/design-verification.d.ts +49 -0
  97. package/dist/interface/types/design-verification.d.ts.map +1 -0
  98. package/dist/interface/types/design-verification.js +4 -0
  99. package/dist/interface/types/design-verification.js.map +1 -0
  100. package/dist/interface/types/index.d.ts +4 -0
  101. package/dist/interface/types/index.d.ts.map +1 -1
  102. package/dist/orchestrator/ai-feed-generator.d.ts +210 -0
  103. package/dist/orchestrator/ai-feed-generator.d.ts.map +1 -0
  104. package/dist/orchestrator/ai-feed-generator.js +377 -0
  105. package/dist/orchestrator/ai-feed-generator.js.map +1 -0
  106. package/docs/ai-guide/COMMANDS.md +73 -0
  107. package/docs/ai-guide/OUTPUT.md +415 -0
  108. package/docs/ai-guide/PATTERNS.md +14 -4
  109. package/docs/ai-guide/PROMPTS.md +12 -6
  110. package/docs/archive/test-report-symbol-search.md +384 -0
  111. package/docs/archive/test-scenario-4-complexity-analysis.md +460 -0
  112. package/docs/archive/test_report_scenario5.md +615 -0
  113. package/docs/archive/test_scenario_3_impact_analysis_report.md +520 -0
  114. package/docs/product-specs/DESIGN_CONTRACT_TEMPLATE.md +79 -0
  115. package/docs/product-specs/README.md +2 -1
  116. package/docs/rules/engineering-with-codex-openai.md +6 -2
  117. package/docs/rules/validation.md +9 -6
  118. package/package.json +1 -1
  119. package/scripts/experiments/arcadedb-http-smoke.mjs +90 -0
  120. 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
- * - 小项目(<100文件): 文件系统
30
- * - 中等项目(100-1000文件): 文件系统
31
- * - 大项目(>1000文件): KùzuDB
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;IAqCtD;;;;;OAKG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;IAMrF;;;;;;;;;OASG;YACW,oBAAoB;IAWlC;;;;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"}
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
- const storageType = config.type === 'auto'
38
- ? await this.determineStorageType(config)
39
- : config.type;
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
- * - 小项目(<100文件): 文件系统
75
- * - 中等项目(100-1000文件): 文件系统
76
- * - 大项目(>1000文件): KùzuDB
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
- const thresholds = config.autoThresholds ?? {
82
- useGraphDBWhenFileCount: 1000,
83
- useGraphDBWhenNodeCount: 10000,
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":"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"}
1
+ {"version":3,"file":"StorageFactory.js","sourceRoot":"","sources":["../../../src/infrastructure/storage/StorageFactory.ts"],"names":[],"mappings":"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"}
@@ -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