@mycodemap/mycodemap 0.4.2 → 0.5.1
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 +105 -3
- package/README.md +192 -53
- 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/analyze.d.ts +18 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -1
- package/dist/cli/commands/analyze.js +239 -6
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/check.d.ts +22 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +168 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/ci.d.ts +25 -0
- package/dist/cli/commands/ci.d.ts.map +1 -1
- package/dist/cli/commands/ci.js +139 -36
- package/dist/cli/commands/ci.js.map +1 -1
- package/dist/cli/commands/complexity.d.ts.map +1 -1
- package/dist/cli/commands/complexity.js +6 -0
- package/dist/cli/commands/complexity.js.map +1 -1
- package/dist/cli/commands/design.d.ts +52 -0
- package/dist/cli/commands/design.d.ts.map +1 -0
- package/dist/cli/commands/design.js +274 -0
- package/dist/cli/commands/design.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +1 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +121 -8
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/history.d.ts +26 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +92 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +13 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +108 -0
- package/dist/cli/commands/mcp.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/commands/workflow.d.ts.map +1 -1
- package/dist/cli/commands/workflow.js +22 -2
- package/dist/cli/commands/workflow.js.map +1 -1
- package/dist/cli/config-loader.d.ts.map +1 -1
- package/dist/cli/config-loader.js +3 -2
- package/dist/cli/config-loader.js.map +1 -1
- package/dist/cli/contract-checker.d.ts +33 -0
- package/dist/cli/contract-checker.d.ts.map +1 -0
- package/dist/cli/contract-checker.js +719 -0
- package/dist/cli/contract-checker.js.map +1 -0
- package/dist/cli/contract-diff-scope.d.ts +14 -0
- package/dist/cli/contract-diff-scope.d.ts.map +1 -0
- package/dist/cli/contract-diff-scope.js +127 -0
- package/dist/cli/contract-diff-scope.js.map +1 -0
- package/dist/cli/contract-gate-thresholds.d.ts +14 -0
- package/dist/cli/contract-gate-thresholds.d.ts.map +1 -0
- package/dist/cli/contract-gate-thresholds.js +19 -0
- package/dist/cli/contract-gate-thresholds.js.map +1 -0
- 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 +527 -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 +760 -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 +20 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/paths.d.ts.map +1 -1
- package/dist/cli/paths.js +30 -7
- package/dist/cli/paths.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/core/analyzer.d.ts.map +1 -1
- package/dist/core/analyzer.js +16 -0
- package/dist/core/analyzer.js.map +1 -1
- package/dist/domain/entities/CodeGraph.d.ts +5 -1
- package/dist/domain/entities/CodeGraph.d.ts.map +1 -1
- package/dist/domain/entities/CodeGraph.js +29 -12
- package/dist/domain/entities/CodeGraph.js.map +1 -1
- package/dist/domain/entities/Dependency.d.ts +8 -1
- package/dist/domain/entities/Dependency.d.ts.map +1 -1
- package/dist/domain/entities/Dependency.js +19 -4
- package/dist/domain/entities/Dependency.js.map +1 -1
- package/dist/domain/entities/Symbol.d.ts +2 -1
- package/dist/domain/entities/Symbol.d.ts.map +1 -1
- package/dist/domain/entities/Symbol.js +6 -3
- package/dist/domain/entities/Symbol.js.map +1 -1
- 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 +13 -5
- package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -1
- package/dist/infrastructure/storage/StorageFactory.js +62 -16
- package/dist/infrastructure/storage/StorageFactory.js.map +1 -1
- package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts +3 -1
- package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts.map +1 -1
- package/dist/infrastructure/storage/adapters/FileSystemStorage.js +10 -2
- package/dist/infrastructure/storage/adapters/FileSystemStorage.js.map +1 -1
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts +3 -1
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts.map +1 -1
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.js +9 -1
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.js.map +1 -1
- package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts +3 -1
- package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts.map +1 -1
- package/dist/infrastructure/storage/adapters/MemoryStorage.js +9 -1
- package/dist/infrastructure/storage/adapters/MemoryStorage.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/infrastructure/storage/adapters/SQLiteStorage.d.ts +53 -0
- package/dist/infrastructure/storage/adapters/SQLiteStorage.d.ts.map +1 -0
- package/dist/infrastructure/storage/adapters/SQLiteStorage.js +879 -0
- package/dist/infrastructure/storage/adapters/SQLiteStorage.js.map +1 -0
- package/dist/infrastructure/storage/graph-helpers.d.ts +3 -1
- package/dist/infrastructure/storage/graph-helpers.d.ts.map +1 -1
- package/dist/infrastructure/storage/graph-helpers.js +90 -0
- package/dist/infrastructure/storage/graph-helpers.js.map +1 -1
- package/dist/infrastructure/storage/index.d.ts +1 -1
- package/dist/infrastructure/storage/index.d.ts.map +1 -1
- package/dist/infrastructure/storage/interfaces/StorageBase.d.ts +3 -1
- package/dist/infrastructure/storage/interfaces/StorageBase.d.ts.map +1 -1
- package/dist/infrastructure/storage/interfaces/StorageBase.js.map +1 -1
- package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.d.ts +27 -0
- package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.js +246 -0
- package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/perf-thresholds.d.ts +25 -0
- package/dist/infrastructure/storage/sqlite/perf-thresholds.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/perf-thresholds.js +25 -0
- package/dist/infrastructure/storage/sqlite/perf-thresholds.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/schema.d.ts +4 -0
- package/dist/infrastructure/storage/sqlite/schema.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/schema.js +111 -0
- package/dist/infrastructure/storage/sqlite/schema.js.map +1 -0
- package/dist/interface/types/design-check.d.ts +73 -0
- package/dist/interface/types/design-check.d.ts.map +1 -0
- package/dist/interface/types/design-check.js +4 -0
- package/dist/interface/types/design-check.js.map +1 -0
- package/dist/interface/types/design-contract.d.ts +123 -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/history-risk.d.ts +90 -0
- package/dist/interface/types/history-risk.d.ts.map +1 -0
- package/dist/interface/types/history-risk.js +4 -0
- package/dist/interface/types/history-risk.js.map +1 -0
- package/dist/interface/types/index.d.ts +20 -1
- package/dist/interface/types/index.d.ts.map +1 -1
- package/dist/interface/types/storage.d.ts +28 -1
- package/dist/interface/types/storage.d.ts.map +1 -1
- package/dist/orchestrator/adapters/ast-grep-adapter.d.ts +10 -0
- package/dist/orchestrator/adapters/ast-grep-adapter.d.ts.map +1 -1
- package/dist/orchestrator/adapters/ast-grep-adapter.js +46 -17
- package/dist/orchestrator/adapters/ast-grep-adapter.js.map +1 -1
- package/dist/orchestrator/adapters/codemap-adapter.d.ts.map +1 -1
- package/dist/orchestrator/adapters/codemap-adapter.js +2 -22
- package/dist/orchestrator/adapters/codemap-adapter.js.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/dist/orchestrator/history-risk-service.d.ts +55 -0
- package/dist/orchestrator/history-risk-service.d.ts.map +1 -0
- package/dist/orchestrator/history-risk-service.js +680 -0
- package/dist/orchestrator/history-risk-service.js.map +1 -0
- package/dist/orchestrator/types.d.ts +19 -1
- package/dist/orchestrator/types.d.ts.map +1 -1
- package/dist/orchestrator/types.js +19 -0
- package/dist/orchestrator/types.js.map +1 -1
- package/dist/server/mcp/index.d.ts +4 -0
- package/dist/server/mcp/index.d.ts.map +1 -0
- package/dist/server/mcp/index.js +5 -0
- package/dist/server/mcp/index.js.map +1 -0
- package/dist/server/mcp/server.d.ts +17 -0
- package/dist/server/mcp/server.d.ts.map +1 -0
- package/dist/server/mcp/server.js +84 -0
- package/dist/server/mcp/server.js.map +1 -0
- package/dist/server/mcp/service.d.ts +22 -0
- package/dist/server/mcp/service.d.ts.map +1 -0
- package/dist/server/mcp/service.js +177 -0
- package/dist/server/mcp/service.js.map +1 -0
- package/dist/server/mcp/types.d.ts +56 -0
- package/dist/server/mcp/types.d.ts.map +1 -0
- package/dist/server/mcp/types.js +4 -0
- package/dist/server/mcp/types.js.map +1 -0
- package/docs/AI_ASSISTANT_SETUP.md +1 -1
- package/docs/SETUP_GUIDE.md +6 -6
- package/docs/ai-guide/COMMANDS.md +171 -4
- package/docs/ai-guide/INTEGRATION.md +137 -433
- package/docs/ai-guide/OUTPUT.md +890 -5
- package/docs/ai-guide/PATTERNS.md +54 -14
- package/docs/ai-guide/PROMPTS.md +17 -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/backlog.md +177 -0
- package/docs/eatdogfood-reports/2026-04-17-eatdogfood-agent-experience.md +231 -0
- package/docs/exec-plans/completed/2026-04-17-eatdogfood-codemap-cli.md +103 -0
- package/docs/ideation/2026-04-15-executable-architecture-constitution-ideation.md +102 -0
- package/docs/product-specs/DESIGN_CONTRACT_TEMPLATE.md +126 -0
- package/docs/product-specs/MVP3-ARCHITECTURE-COMPARISON.md +11 -10
- package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-PRD.md +10 -10
- package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-TECH-PRD.md +17 -12
- package/docs/product-specs/README.md +2 -1
- package/docs/rules/README.md +16 -11
- package/docs/rules/architecture-guardrails.md +24 -336
- package/docs/rules/code-quality-redlines.md +25 -311
- package/docs/rules/engineering-with-codex-openai.md +20 -3
- package/docs/rules/validation.md +90 -37
- package/mycodemap.config.schema.json +3 -3
- package/package.json +7 -2
- package/scripts/benchmark-governance-graph.mjs +132 -0
- package/scripts/calibrate-contract-gate.mjs +221 -0
- package/scripts/capability-report.py +255 -0
- package/scripts/experiments/arcadedb-http-smoke.mjs +90 -0
- package/scripts/qa-rule-control.sh +254 -0
- package/scripts/report-high-risk-files.mjs +395 -0
- package/scripts/rule-context.mjs +155 -0
- package/scripts/smoke-sqlite-impact.mjs +85 -0
- package/scripts/sync-analyze-docs.js +1 -0
- package/scripts/tests/test_capability_report.py +89 -0
- package/scripts/tests/test_rule_control_workflow.py +51 -0
- package/scripts/tests/test_validate_rules.py +81 -0
- package/scripts/validate-ai-docs.js +283 -1
- package/scripts/validate-docs.js +479 -25
- package/scripts/validate-rules.py +254 -0
|
@@ -54,9 +54,9 @@ MVP3 重构的原始目的,是把 CodeMap 从“CLI 直接拼接分析逻辑
|
|
|
54
54
|
|------|------|------|
|
|
55
55
|
| `filesystem` | shipped | 默认、最稳定 |
|
|
56
56
|
| `memory` | shipped | 测试/内存场景 |
|
|
57
|
-
| `
|
|
58
|
-
| `auto` | shipped surface |
|
|
59
|
-
| `neo4j` | removed | 不再是正式支持 backend;旧配置返回显式迁移错误 |
|
|
57
|
+
| `sqlite` | shipped | 当前图存储主线 |
|
|
58
|
+
| `auto` | shipped surface | 配置面存在,当前优先选择 `sqlite`;SQLite 不可用时回退 `filesystem` |
|
|
59
|
+
| `neo4j` / `kuzudb` | removed | 不再是正式支持 backend;旧配置返回显式迁移错误 |
|
|
60
60
|
|
|
61
61
|
### 3.3 解析器能力
|
|
62
62
|
|
|
@@ -108,7 +108,7 @@ analyze / ci / workflow / export / ship
|
|
|
108
108
|
| 需求 | 当前状态 |
|
|
109
109
|
|------|----------|
|
|
110
110
|
| 五层架构与命名边界稳定 | 已满足 |
|
|
111
|
-
|
|
|
111
|
+
| SQLite 图存储主线 + 显式迁移诊断 | 已满足 |
|
|
112
112
|
| 历史 `neo4j` 配置迁移诊断 | 已满足 |
|
|
113
113
|
| 解析器注册机制与 3 类实现 | 已满足 |
|
|
114
114
|
| `analyze` / `workflow` / `server` 边界收口 | 已满足 |
|
|
@@ -122,7 +122,7 @@ analyze / ci / workflow / export / ship
|
|
|
122
122
|
| Java / Rust / C/C++ 等更多 parser 实现 | Deferred |
|
|
123
123
|
| `viz` / `tui` / 更丰富 CLI 可视化 | Deferred |
|
|
124
124
|
| 公共 HTTP API / `mycodemap server` 产品面 | Deferred |
|
|
125
|
-
| 更深的
|
|
125
|
+
| 更深的 SQLite / in-memory 协同查询优化 | Deferred |
|
|
126
126
|
|
|
127
127
|
### 4.3 明确不在当前基线内
|
|
128
128
|
|
|
@@ -170,8 +170,8 @@ analyze / ci / workflow / export / ship
|
|
|
170
170
|
|
|
171
171
|
当前交付:
|
|
172
172
|
|
|
173
|
-
- `filesystem` / `memory` / `
|
|
174
|
-
- 旧 `neo4j` 配置会显式报错,不再静默 fallback
|
|
173
|
+
- `filesystem` / `memory` / `sqlite` / `auto` 为正式配置面
|
|
174
|
+
- 旧 `neo4j` / `kuzudb` 配置会显式报错,不再静默 fallback
|
|
175
175
|
|
|
176
176
|
---
|
|
177
177
|
|
|
@@ -194,7 +194,7 @@ analyze / ci / workflow / export / ship
|
|
|
194
194
|
|
|
195
195
|
更准确的当前表达是:
|
|
196
196
|
|
|
197
|
-
-
|
|
197
|
+
- SQLite 路径已接入正式产品面;显式 `sqlite` 缺少 `better-sqlite3` 或 Node.js `<20` 时会返回 `SQLITE_NOT_AVAILABLE`
|
|
198
198
|
- 更激进的 DB-native 查询优化属于后续候选项,而非 `v1.3` 既成事实
|
|
199
199
|
|
|
200
200
|
---
|
|
@@ -206,7 +206,7 @@ analyze / ci / workflow / export / ship
|
|
|
206
206
|
| `v1.0` | AI-first 定位、公共 CLI 收口、analyze/workflow/ship/docs guardrail 基线 |
|
|
207
207
|
| `v1.1` | 插件扩展点产品化 |
|
|
208
208
|
| `v1.2` | 图数据库后端生产化 |
|
|
209
|
-
| `v1.3` |
|
|
209
|
+
| `v1.3` | SQLite 主线收口、高信号 debt 清偿、docs/CI 自动验证闭环 |
|
|
210
210
|
|
|
211
211
|
---
|
|
212
212
|
|
|
@@ -216,7 +216,7 @@ analyze / ci / workflow / export / ship
|
|
|
216
216
|
|------|----------|----------|
|
|
217
217
|
| 文档继续把历史设计写成当前现实 | 高信号风险 | 持续运行 `docs:check` 与 `ci check-docs-sync` |
|
|
218
218
|
| `Server Layer` 与公共 `server` 命令再次混淆 | 高信号风险 | 在 README / AI docs / 架构文档统一措辞 |
|
|
219
|
-
| `auto` 被误读为“已完成智能切换” | 中 |
|
|
219
|
+
| `auto` 被误读为“已完成智能切换” | 中 | 文档明确写明当前优先选择 `sqlite`,仅在 SQLite 不可用时回退 `filesystem` |
|
|
220
220
|
| repo-wide lint warnings 演变成阻断项 | 中 | 单独开新 milestone 清理 warning baseline |
|
|
221
221
|
|
|
222
222
|
---
|
|
@@ -87,7 +87,7 @@ src/
|
|
|
87
87
|
### 4.1 当前类型契约
|
|
88
88
|
|
|
89
89
|
```typescript
|
|
90
|
-
export type StorageType = 'filesystem' | '
|
|
90
|
+
export type StorageType = 'filesystem' | 'sqlite' | 'memory';
|
|
91
91
|
|
|
92
92
|
export interface StorageConfig {
|
|
93
93
|
type: StorageType | 'auto';
|
|
@@ -106,27 +106,31 @@ export interface StorageConfig {
|
|
|
106
106
|
|------|------|----------|
|
|
107
107
|
| `filesystem` | `FileSystemStorage` | shipped |
|
|
108
108
|
| `memory` | `MemoryStorage` | shipped |
|
|
109
|
-
| `
|
|
110
|
-
| `auto` | `StorageFactory.determineStorageType()` | shipped surface
|
|
109
|
+
| `sqlite` | `SQLiteStorage` | shipped |
|
|
110
|
+
| `auto` | `StorageFactory.determineStorageType()` | shipped surface,当前优先返回 `sqlite`,不可用时 warning 后回退 `filesystem` |
|
|
111
111
|
|
|
112
112
|
### 4.3 已移除的正式产品面
|
|
113
113
|
|
|
114
|
-
`neo4j` 已不再是正式支持 backend。
|
|
114
|
+
`neo4j` 与 `kuzudb` 已不再是正式支持 backend。
|
|
115
115
|
|
|
116
116
|
当前技术语义:
|
|
117
117
|
|
|
118
118
|
- 旧配置若出现 `neo4j`,`StorageFactory` 会抛出 `UNSUPPORTED_STORAGE_TYPE`
|
|
119
|
-
-
|
|
119
|
+
- 旧配置若出现 `kuzudb`,`StorageFactory` 会抛出 `STORAGE_BACKEND_MIGRATED`
|
|
120
|
+
- 显式选择 `sqlite` 且运行时缺少 `better-sqlite3` 或 Node.js `<20` 时,`StorageFactory` 会抛出 `SQLITE_NOT_AVAILABLE`
|
|
121
|
+
- 文档和实现都不再承诺 Neo4j / Kùzu runtime surface
|
|
120
122
|
|
|
121
123
|
### 4.4 `auto` 的真实状态
|
|
122
124
|
|
|
123
|
-
`autoThresholds` 仍保留在契约里,但当前 `StorageFactory`
|
|
125
|
+
`autoThresholds` 仍保留在契约里,但当前 `StorageFactory` 的实际行为是:
|
|
124
126
|
|
|
125
127
|
```typescript
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
128
|
+
const sqliteAvailable = await this.checkSQLiteAvailability();
|
|
129
|
+
if (sqliteAvailable) {
|
|
130
|
+
return 'sqlite';
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
console.warn('[StorageFactory] SQLite unavailable, falling back to filesystem');
|
|
130
134
|
|
|
131
135
|
return 'filesystem';
|
|
132
136
|
```
|
|
@@ -134,6 +138,7 @@ return 'filesystem';
|
|
|
134
138
|
因此:
|
|
135
139
|
|
|
136
140
|
- `auto` 是稳定配置面
|
|
141
|
+
- `auto` 会先探测 SQLite runtime,可用时返回 `sqlite`,不可用时 warning 后回退 `filesystem`
|
|
137
142
|
- 但“按规模自动切到图数据库”的更强启发式仍是未来候选,而不是当前完成能力
|
|
138
143
|
|
|
139
144
|
---
|
|
@@ -279,11 +284,11 @@ find → read → link → show
|
|
|
279
284
|
|
|
280
285
|
| 项目 | 说明 |
|
|
281
286
|
|------|------|
|
|
282
|
-
| 更强的 auto storage heuristic |
|
|
287
|
+
| 更强的 auto storage heuristic | 当前仍只在 `sqlite` / `filesystem` 间切换,未按规模动态调度更多后端 |
|
|
283
288
|
| 更多 parser 实现 | 接口预留,当前未交付 |
|
|
284
289
|
| 公共 HTTP API 产品化 | 当前不在范围内 |
|
|
285
290
|
| `viz` / `tui` / 更强交互可视化 | 当前不在公共 CLI 基线中 |
|
|
286
|
-
|
|
|
291
|
+
| 更深的 SQLite / in-memory 协同查询优化 | 后续候选,不属于 `v1.3` 已交付事实 |
|
|
287
292
|
|
|
288
293
|
---
|
|
289
294
|
|
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
- `MVP3-ARCHITECTURE-COMPARISON.md`:把历史设计目标与 `v1.3` 已落地基线并列,防止把愿景误写成现实。
|
|
12
12
|
- `MVP3-ARCHITECTURE-REDESIGN-PRD.md`:记录当前产品边界、Deferred 范围与用户价值。
|
|
13
13
|
- `MVP3-ARCHITECTURE-REDESIGN-TECH-PRD.md`:记录当前技术基线、目录现实、护栏与迁移语义。
|
|
14
|
+
- `DESIGN_CONTRACT_TEMPLATE.md`:当前 human-authored design contract 的 canonical 模板,供 `mycodemap.design.md` 复制使用。
|
|
14
15
|
|
|
15
|
-
>
|
|
16
|
+
> 前 3 份规格属于“已交付基线同步版”;`DESIGN_CONTRACT_TEMPLATE.md` 是当前有效输入契约模板,不是新的待实施 roadmap。
|
|
16
17
|
|
|
17
18
|
## 应放内容
|
|
18
19
|
|
package/docs/rules/README.md
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
|
-
# docs/rules
|
|
1
|
+
# `docs/rules/` 速查索引
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> 只保留会直接影响 agent / 人类开发行为的规则。每份文档都应短、可执行、可 grep。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 先读哪份文档
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
- `
|
|
7
|
+
| 场景 | 文档 | 主命令 |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| 改 TypeScript / Python 实现,担心触发红线 | `code-quality-redlines.md` | `npm run typecheck` / `npm run lint` |
|
|
10
|
+
| 改分层、依赖方向、模块边界 | `architecture-guardrails.md` | `node dist/cli/index.js deps -m "<module>"` |
|
|
11
|
+
| 改测试、fixture、测试文件布局 | `testing.md` | `npm test` |
|
|
12
|
+
| 改 hooks、CI、验证顺序、repo-local guardrail | `validation.md` | `npm run docs:check` / `python3 scripts/validate-rules.py code --report-only` |
|
|
13
|
+
| 改 agent 执行协议、CLI/CI 工程护栏 | `engineering-with-codex-openai.md` | `node dist/cli/index.js ci check-docs-sync` |
|
|
14
|
+
| 改发布/打包流程 | `deployment.md` | `npm run build` / `npm run validate-pack` |
|
|
15
|
+
| 改发布前 checklist / 版本同步 | `pre-release-checklist.md` | `npm run docs:check:pre-release` |
|
|
11
16
|
|
|
12
|
-
##
|
|
17
|
+
## 使用规则
|
|
13
18
|
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
19
|
+
- 入口文档先路由,再按需下钻;不要一次性读完整个 `docs/rules/`。
|
|
20
|
+
- 若规则变化会影响 agent 行为,同步检查 `AGENTS.md`、`CLAUDE.md`、`AI_GUIDE.md` 与相关 `docs/ai-guide/*.md`。
|
|
21
|
+
- 若规则来自代码事实,优先用 `package.json`、`.githooks/*`、`.github/workflows/*`、`scripts/*` 作为真相来源。
|
|
@@ -1,348 +1,36 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 架构护栏
|
|
2
2
|
|
|
3
|
-
> MVP3
|
|
3
|
+
> 当前仓库采用 MVP3 分层架构。下面只保留会影响日常改动的最小 contract。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 分层地图
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
| 层 | 路径 | 允许依赖 |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| CLI | `src/cli/` | `src/server/`、`src/domain/`(经 Interface)、`src/interface/` |
|
|
10
|
+
| Server | `src/server/` | `src/domain/`(经 Interface)、`src/interface/` |
|
|
11
|
+
| Domain | `src/domain/` | `src/interface/` |
|
|
12
|
+
| Infrastructure | `src/infrastructure/` | `src/domain/`(接口实现)、`src/interface/` |
|
|
13
|
+
| Interface | `src/interface/` | 无 |
|
|
8
14
|
|
|
9
|
-
|
|
15
|
+
## 护栏表
|
|
10
16
|
|
|
11
|
-
|
|
|
12
|
-
|
|
13
|
-
|
|
|
14
|
-
|
|
|
15
|
-
|
|
|
16
|
-
|
|
|
17
|
-
| **Interface 层** | `src/interface/` | 类型定义、契约接口、配置 | 无(纯契约定义) |
|
|
17
|
+
| 规则 | 命令 | 阈值/级别 | 失败后果 | 恢复方式 |
|
|
18
|
+
|---|---|---|---|---|
|
|
19
|
+
| 禁止跨层反向依赖 | `node dist/cli/index.js deps -m "src/domain"` | `Domain` 不得依赖 `Infrastructure` 具体实现 | 阻断设计验收 / 需返工 | 提取接口到 `src/interface/`,改走注入 |
|
|
20
|
+
| 禁止 CLI 直接耦合实现细节 | `node dist/cli/index.js deps -m "src/cli"` | CLI 只依赖 Server / Interface contract | 阻断 | 下沉到 Server 或 Interface |
|
|
21
|
+
| 接口放在 Interface 层 | `rg "interface|type" src/interface src/domain src/infrastructure` | 跨层共享 contract 必须位于 `src/interface/` | 阻断 | 移动 contract,再改 import |
|
|
22
|
+
| 高层不直接 `new` 低层服务 | `rg "new .*Storage|new .*Parser" src/domain src/server src/cli` | 通过构造函数/工厂注入 | 返工 | 提取工厂或依赖注入 |
|
|
18
23
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
23
|
-
│ CLI Layer │
|
|
24
|
-
│ src/cli/ - 命令行接口,注册命令、参数解析、用户交互 │
|
|
25
|
-
├─────────────────────────────────────────────────────────────┤
|
|
26
|
-
│ Server Layer │
|
|
27
|
-
│ src/server/ - HTTP API 服务器,RESTful 端点,Handler 处理 │
|
|
28
|
-
├─────────────────────────────────────────────────────────────┤
|
|
29
|
-
│ Domain Layer │
|
|
30
|
-
│ src/domain/ - 核心业务逻辑,领域实体与服务 │
|
|
31
|
-
│ - entities/: Project, Module, Symbol, Dependency, CodeGraph │
|
|
32
|
-
│ - services/: CodeGraphBuilder │
|
|
33
|
-
│ - events/: DomainEvent │
|
|
34
|
-
│ - repositories/: 仓库接口(仅接口,非实现) │
|
|
35
|
-
├─────────────────────────────────────────────────────────────┤
|
|
36
|
-
│ Infrastructure Layer │
|
|
37
|
-
│ src/infrastructure/ - 技术实现细节 │
|
|
38
|
-
│ - storage/: FileSystemStorage, MemoryStorage, KuzuDBStorage
|
|
39
|
-
│ - parser/: TypeScriptParser, GoParser, PythonParser, ParserRegistry
|
|
40
|
-
│ - repositories/: CodeGraphRepositoryImpl(仓库接口实现) │
|
|
41
|
-
├─────────────────────────────────────────────────────────────┤
|
|
42
|
-
│ Interface Layer │
|
|
43
|
-
│ src/interface/ - 类型定义与契约,跨层共享的接口 │
|
|
44
|
-
│ - types/: 核心类型定义 │
|
|
45
|
-
│ - config/: 配置接口 │
|
|
46
|
-
└─────────────────────────────────────────────────────────────┘
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
**依赖方向**(严格自上而下):
|
|
50
|
-
- CLI → Server → Domain → Infrastructure → Interface
|
|
51
|
-
- **禁止跨层依赖**(如 Domain 层不得导入 CLI 模块)
|
|
52
|
-
- 同层内可以相互依赖
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## 2. 与旧架构的关系
|
|
57
|
-
|
|
58
|
-
### 2.1 历史架构(已迁移)
|
|
59
|
-
|
|
60
|
-
MVP3 之前的旧架构:
|
|
61
|
-
```
|
|
62
|
-
src/cli/ → src/orchestrator/ → src/core/ → src/parser/
|
|
63
|
-
↓
|
|
64
|
-
src/generator/
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### 2.2 迁移映射
|
|
68
|
-
|
|
69
|
-
| 旧架构 | MVP3 新架构 | 说明 |
|
|
70
|
-
|--------|------------|------|
|
|
71
|
-
| `src/cli/` | `src/cli/` | 保留,职责不变 |
|
|
72
|
-
| `src/orchestrator/` | 功能分散到 Server/CLI | 适配器部分移至 Infrastructure |
|
|
73
|
-
| `src/core/` | `src/domain/` | 核心业务逻辑下沉到 Domain 层 |
|
|
74
|
-
| `src/parser/` | `src/infrastructure/parser/` | 解析器作为基础设施 |
|
|
75
|
-
| `src/generator/` | `src/domain/services/` | 生成逻辑作为领域服务 |
|
|
76
|
-
| `src/types/` | `src/interface/` | 类型定义提升为独立层 |
|
|
77
|
-
| 新增 | `src/server/` | MVP3 新增 HTTP API 层 |
|
|
78
|
-
| 新增 | `src/infrastructure/storage/` | MVP3 新增存储抽象 |
|
|
79
|
-
| 新增 | `src/infrastructure/repositories/` | MVP3 新增仓库实现 |
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
## 3. 依赖流向规则
|
|
84
|
-
|
|
85
|
-
### 3.1 禁止的依赖方向
|
|
86
|
-
|
|
87
|
-
```
|
|
88
|
-
Domain ←── 禁止 ── CLI 层不得直接依赖 Domain 具体实现(应通过 Interface)
|
|
89
|
-
Infrastructure ←── 禁止 ── Domain 层不得依赖 Infrastructure 具体实现
|
|
90
|
-
Server ←── 禁止 ── CLI 层不得直接依赖 Server 层(应通过 Interface)
|
|
91
|
-
Interface ←── 禁止 ── 任何层不得修改 Interface 层(只读)
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### 3.2 允许的依赖方向
|
|
95
|
-
|
|
96
|
-
```
|
|
97
|
-
CLI → Server → Domain → Infrastructure → Interface
|
|
98
|
-
CLI → Interface
|
|
99
|
-
Server → Interface
|
|
100
|
-
Domain → Interface
|
|
101
|
-
Infrastructure → Interface
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## 4. 依赖注入规范
|
|
107
|
-
|
|
108
|
-
### 4.1 原则
|
|
109
|
-
|
|
110
|
-
- 高层模块不应依赖低层模块,两者都应依赖抽象(Interface 层契约)
|
|
111
|
-
- 使用构造函数注入或工厂函数注入
|
|
112
|
-
- 禁止在模块内部直接 `new` 高阶服务
|
|
113
|
-
|
|
114
|
-
### 4.2 合规示例
|
|
115
|
-
|
|
116
|
-
```typescript
|
|
117
|
-
// ✅ 合规:通过 Interface 层契约注入
|
|
118
|
-
// src/domain/services/CodeGraphBuilder.ts
|
|
119
|
-
import type { IStorage } from '../../interface/types/storage';
|
|
120
|
-
import type { IParserRegistry } from '../../interface/types/parser';
|
|
121
|
-
|
|
122
|
-
export interface CodeGraphBuilderDeps {
|
|
123
|
-
storage: IStorage;
|
|
124
|
-
parserRegistry: IParserRegistry;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export class CodeGraphBuilder {
|
|
128
|
-
constructor(private deps: CodeGraphBuilderDeps) {}
|
|
129
|
-
|
|
130
|
-
async build(files: string[]) {
|
|
131
|
-
const parser = this.deps.parserRegistry.getParser('typescript');
|
|
132
|
-
const ast = await parser.parse(files);
|
|
133
|
-
return this.deps.storage.save(ast);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
```typescript
|
|
139
|
-
// ❌ 违规:直接实例化 Infrastructure 具体实现
|
|
140
|
-
// src/domain/services/CodeGraphBuilder.ts
|
|
141
|
-
import { FileSystemStorage } from '../../infrastructure/storage/FileSystemStorage';
|
|
142
|
-
import { TypeScriptParser } from '../../infrastructure/parser/implementations/TypeScriptParser';
|
|
143
|
-
|
|
144
|
-
export class CodeGraphBuilder {
|
|
145
|
-
private storage = new FileSystemStorage(); // 错误!硬编码实现
|
|
146
|
-
private parser = new TypeScriptParser(); // 错误!难以测试和替换
|
|
147
|
-
}
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## 5. 文件组织规范
|
|
153
|
-
|
|
154
|
-
### 5.1 目录结构(MVP3)
|
|
155
|
-
|
|
156
|
-
```
|
|
157
|
-
src/
|
|
158
|
-
cli/ # CLI 层
|
|
159
|
-
commands/ # 子命令实现
|
|
160
|
-
index.ts # CLI 入口
|
|
161
|
-
server/ # Server 层(MVP3 新增)
|
|
162
|
-
CodeMapServer.ts # HTTP 服务器
|
|
163
|
-
handlers/ # 请求处理器
|
|
164
|
-
routes/ # 路由定义
|
|
165
|
-
domain/ # Domain 层
|
|
166
|
-
entities/ # 领域实体
|
|
167
|
-
Project.ts
|
|
168
|
-
Module.ts
|
|
169
|
-
Symbol.ts
|
|
170
|
-
Dependency.ts
|
|
171
|
-
CodeGraph.ts
|
|
172
|
-
services/ # 领域服务
|
|
173
|
-
CodeGraphBuilder.ts
|
|
174
|
-
events/ # 领域事件
|
|
175
|
-
DomainEvent.ts
|
|
176
|
-
repositories/ # 仓库接口(仅接口)
|
|
177
|
-
CodeGraphRepository.ts
|
|
178
|
-
infrastructure/ # Infrastructure 层
|
|
179
|
-
storage/ # 存储适配器
|
|
180
|
-
FileSystemStorage.ts
|
|
181
|
-
MemoryStorage.ts
|
|
182
|
-
KuzuDBStorage.ts
|
|
183
|
-
StorageFactory.ts
|
|
184
|
-
parser/ # 解析器
|
|
185
|
-
interfaces/
|
|
186
|
-
implementations/
|
|
187
|
-
registry/
|
|
188
|
-
repositories/ # 仓库实现
|
|
189
|
-
CodeGraphRepositoryImpl.ts
|
|
190
|
-
interface/ # Interface 层
|
|
191
|
-
types/ # 类型定义
|
|
192
|
-
config/ # 配置接口
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
### 5.2 文件命名规范
|
|
196
|
-
|
|
197
|
-
- **实现文件**:`kebab-case.ts`(如 `code-graph-builder.ts`)
|
|
198
|
-
- **接口文件**:`I{PascalCase}.ts`(如 `IStorage.ts`)或 `types.ts`
|
|
199
|
-
- **测试文件**:`{name}.test.ts` 或 `__tests__/{name}.test.ts`
|
|
200
|
-
- **实体文件**:`PascalCase.ts`(如 `CodeGraph.ts`)
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## 6. Enforcement 策略
|
|
205
|
-
|
|
206
|
-
### 6.1 自动检测
|
|
207
|
-
|
|
208
|
-
使用 `dependency-cruiser` 配置架构规则:
|
|
209
|
-
|
|
210
|
-
```javascript
|
|
211
|
-
// .dependency-cruiser.js(待配置)
|
|
212
|
-
module.exports = {
|
|
213
|
-
forbidden: [
|
|
214
|
-
{
|
|
215
|
-
name: 'no-domain-in-cli',
|
|
216
|
-
comment: 'CLI 层不得直接依赖 Domain 层(应通过 Interface)',
|
|
217
|
-
severity: 'error',
|
|
218
|
-
from: { path: '^src/cli' },
|
|
219
|
-
to: { path: '^src/domain', pathNot: '^src/domain/[^/]+\.ts$' }
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
name: 'no-infrastructure-in-domain',
|
|
223
|
-
comment: 'Domain 层不得依赖 Infrastructure 层',
|
|
224
|
-
severity: 'error',
|
|
225
|
-
from: { path: '^src/domain' },
|
|
226
|
-
to: { path: '^src/infrastructure' }
|
|
227
|
-
},
|
|
228
|
-
{
|
|
229
|
-
name: 'no-server-in-cli',
|
|
230
|
-
comment: 'CLI 层不得依赖 Server 层',
|
|
231
|
-
severity: 'error',
|
|
232
|
-
from: { path: '^src/cli' },
|
|
233
|
-
to: { path: '^src/server' }
|
|
234
|
-
}
|
|
235
|
-
]
|
|
236
|
-
};
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
### 6.2 手动检查
|
|
240
|
-
|
|
241
|
-
使用 CodeMap CLI 检查模块依赖:
|
|
24
|
+
## 快速验证
|
|
242
25
|
|
|
243
26
|
```bash
|
|
244
|
-
|
|
245
|
-
node dist/cli/index.js deps -m "src/domain/services"
|
|
246
|
-
|
|
247
|
-
# 检查某文件的影响范围
|
|
27
|
+
node dist/cli/index.js deps -m "src/domain"
|
|
248
28
|
node dist/cli/index.js impact -f "src/interface/types/index.ts"
|
|
249
|
-
|
|
250
|
-
# 检查跨层依赖(使用 analyze)
|
|
251
|
-
node dist/cli/index.js analyze -i dependency -t src/domain
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
### 6.3 CI 检查
|
|
255
|
-
|
|
256
|
-
在 CI 中添加架构合规检查:
|
|
257
|
-
|
|
258
|
-
```yaml
|
|
259
|
-
# .github/workflows/ci-gateway.yml
|
|
260
|
-
- name: Check architecture compliance
|
|
261
|
-
run: npm run check:architecture
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
---
|
|
265
|
-
|
|
266
|
-
## 7. 违规处理
|
|
267
|
-
|
|
268
|
-
### 7.1 发现违规时
|
|
269
|
-
|
|
270
|
-
1. **暂停任务**:不得继续添加更多代码
|
|
271
|
-
2. **评估影响**:使用 `impact` 命令评估影响范围
|
|
272
|
-
3. **重构方案**:将直接依赖改为接口注入
|
|
273
|
-
4. **验证修复**:重新运行架构检查
|
|
274
|
-
|
|
275
|
-
### 7.2 临时例外
|
|
276
|
-
|
|
277
|
-
若因紧急需求必须暂时违规,必须按技术债务标记:
|
|
278
|
-
|
|
279
|
-
```typescript
|
|
280
|
-
// TODO-DEBT [L2] [日期:2026-03-20] [作者:AI] [原因:紧急修复]
|
|
281
|
-
// 问题:Domain 层临时依赖 Infrastructure 具体实现
|
|
282
|
-
// 风险:破坏分层架构,难以单元测试
|
|
283
|
-
// 偿还计划:提取接口,通过依赖注入传递
|
|
284
|
-
import { FileSystemStorage } from '../infrastructure/storage/FileSystemStorage';
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
---
|
|
288
|
-
|
|
289
|
-
## 8. 最佳实践
|
|
290
|
-
|
|
291
|
-
### 8.1 依赖注入模式
|
|
292
|
-
|
|
293
|
-
```typescript
|
|
294
|
-
// 推荐:工厂函数模式
|
|
295
|
-
export function createCodeGraphBuilder(deps: Partial<CodeGraphBuilderDeps> = {}) {
|
|
296
|
-
return new CodeGraphBuilder({
|
|
297
|
-
storage: deps.storage ?? createStorage(),
|
|
298
|
-
parserRegistry: deps.parserRegistry ?? createParserRegistry(),
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// 使用
|
|
303
|
-
const builder = createCodeGraphBuilder(); // 生产环境
|
|
304
|
-
const testBuilder = createCodeGraphBuilder({ storage: mockStorage }); // 测试环境
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
### 8.2 接口定义位置
|
|
308
|
-
|
|
309
|
-
- 接口定义在 **Interface 层**(`src/interface/`)
|
|
310
|
-
- 或定义在被依赖方的接口目录
|
|
311
|
-
|
|
312
|
-
```typescript
|
|
313
|
-
// src/interface/types/storage.ts
|
|
314
|
-
export interface IStorage {
|
|
315
|
-
save(data: unknown): Promise<void>;
|
|
316
|
-
load(): Promise<unknown>;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// src/infrastructure/storage/FileSystemStorage.ts
|
|
320
|
-
import type { IStorage } from '../../interface/types/storage';
|
|
321
|
-
export class FileSystemStorage implements IStorage { ... }
|
|
322
|
-
|
|
323
|
-
// src/domain/services/CodeGraphBuilder.ts
|
|
324
|
-
import type { IStorage } from '../../interface/types/storage';
|
|
325
|
-
export class CodeGraphBuilder {
|
|
326
|
-
constructor(private storage: IStorage) {}
|
|
327
|
-
}
|
|
29
|
+
npm run check:architecture
|
|
328
30
|
```
|
|
329
31
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
## 9. 验证清单
|
|
333
|
-
|
|
334
|
-
修改架构相关代码前,检查:
|
|
335
|
-
|
|
336
|
-
- [ ] 新模块的依赖方向是否符合 MVP3 分层规则
|
|
337
|
-
- [ ] 是否使用了依赖注入而非直接实例化
|
|
338
|
-
- [ ] 接口定义是否在 Interface 层
|
|
339
|
-
- [ ] 是否可以通过 `check:architecture` 验证
|
|
340
|
-
|
|
341
|
-
---
|
|
342
|
-
|
|
343
|
-
## 10. 相关文档
|
|
32
|
+
## 常见误区
|
|
344
33
|
|
|
345
|
-
- `
|
|
346
|
-
- `
|
|
347
|
-
-
|
|
348
|
-
- `docs/exec-plans/MVP3-IMPLEMENTATION-ROADMAP.md` - MVP3 重构路线图
|
|
34
|
+
- `Server Layer` 是内部架构层,不等于公共产品面的 `mycodemap server`。
|
|
35
|
+
- `src/domain/` 可以依赖接口,不能依赖实现。
|
|
36
|
+
- 做小改动也不能顺手把跨层 import 当成“临时方便”。
|