@mycodemap/mycodemap 0.5.0 → 0.5.2-beta.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 +25 -0
- package/README.md +77 -9
- 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 +5 -0
- package/dist/cli/commands/design.d.ts.map +1 -1
- package/dist/cli/commands/design.js +6 -0
- package/dist/cli/commands/design.js.map +1 -1
- 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/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.map +1 -1
- package/dist/cli/design-contract-loader.js +355 -3
- package/dist/cli/design-contract-loader.js.map +1 -1
- package/dist/cli/design-scope-resolver.d.ts.map +1 -1
- package/dist/cli/design-scope-resolver.js +89 -41
- package/dist/cli/design-scope-resolver.js.map +1 -1
- package/dist/cli/index.js +18 -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/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/infrastructure/storage/StorageFactory.d.ts +1 -0
- package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -1
- package/dist/infrastructure/storage/StorageFactory.js +7 -2
- 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/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 +56 -1
- package/dist/interface/types/design-contract.d.ts.map +1 -1
- 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 +17 -2
- 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/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/PUBLISHING.md +41 -12
- package/docs/SETUP_GUIDE.md +6 -6
- package/docs/ai-guide/COMMANDS.md +98 -4
- package/docs/ai-guide/INTEGRATION.md +137 -433
- package/docs/ai-guide/OUTPUT.md +476 -6
- package/docs/ai-guide/PATTERNS.md +41 -11
- package/docs/ai-guide/PROMPTS.md +11 -6
- 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 +47 -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/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 +14 -1
- package/docs/rules/pre-release-checklist.md +9 -4
- package/docs/rules/validation.md +91 -40
- 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/pre-release-check.js +2 -2
- 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 +249 -42
- package/scripts/validate-rules.py +254 -0
- package/dist/ai/claude.d.ts +0 -38
- package/dist/ai/claude.d.ts.map +0 -1
- package/dist/ai/claude.js +0 -169
- package/dist/ai/claude.js.map +0 -1
- package/dist/ai/codex.d.ts +0 -38
- package/dist/ai/codex.d.ts.map +0 -1
- package/dist/ai/codex.js +0 -169
- package/dist/ai/codex.js.map +0 -1
- package/dist/ai/factory.d.ts +0 -48
- package/dist/ai/factory.d.ts.map +0 -1
- package/dist/ai/factory.js +0 -95
- package/dist/ai/factory.js.map +0 -1
- package/dist/ai/index.d.ts +0 -12
- package/dist/ai/index.d.ts.map +0 -1
- package/dist/ai/index.js +0 -29
- package/dist/ai/index.js.map +0 -1
- package/dist/ai/provider.d.ts +0 -70
- package/dist/ai/provider.d.ts.map +0 -1
- package/dist/ai/provider.js +0 -31
- package/dist/ai/provider.js.map +0 -1
- package/dist/ai/subagent-caller.d.ts +0 -90
- package/dist/ai/subagent-caller.d.ts.map +0 -1
- package/dist/ai/subagent-caller.js +0 -280
- package/dist/ai/subagent-caller.js.map +0 -1
- package/dist/ai/types.d.ts +0 -70
- package/dist/ai/types.d.ts.map +0 -1
- package/dist/ai/types.js +0 -5
- package/dist/ai/types.js.map +0 -1
- package/dist/cli/commands/server.d.ts +0 -9
- package/dist/cli/commands/server.d.ts.map +0 -1
- package/dist/cli/commands/server.js +0 -65
- package/dist/cli/commands/server.js.map +0 -1
- package/dist/cli-new/commands/server.d.ts +0 -13
- package/dist/cli-new/commands/server.d.ts.map +0 -1
- package/dist/cli-new/commands/server.js +0 -90
- package/dist/cli-new/commands/server.js.map +0 -1
- package/dist/generator/ai-overview.d.ts +0 -51
- package/dist/generator/ai-overview.d.ts.map +0 -1
- package/dist/generator/ai-overview.js +0 -160
- package/dist/generator/ai-overview.js.map +0 -1
- package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts +0 -41
- package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +0 -1
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js +0 -162
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +0 -1
- package/dist/orchestrator/ai-feed-generator.d.ts +0 -210
- package/dist/orchestrator/ai-feed-generator.d.ts.map +0 -1
- package/dist/orchestrator/ai-feed-generator.js +0 -377
- package/dist/orchestrator/ai-feed-generator.js.map +0 -1
- package/docs/archive/test-report-symbol-search.md +0 -384
- package/docs/archive/test-scenario-4-complexity-analysis.md +0 -460
- package/docs/archive/test_report_scenario5.md +0 -615
- package/docs/archive/test_scenario_3_impact_analysis_report.md +0 -520
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.5.2-beta.1] - 2026-04-19 - Trusted Publishing Verification
|
|
6
|
+
|
|
7
|
+
### 🛠️ Infrastructure
|
|
8
|
+
|
|
9
|
+
- **ci**: 升级 `publish.yml` 到 `actions/checkout@v6`、`actions/setup-node@v6`、Node `24` 与 `npm@11.5.1`
|
|
10
|
+
- **release**: OIDC trusted publishing 路径移除显式 `--provenance`,保留 `NPM_TOKEN` fallback 以兼容 registry 偶发问题
|
|
11
|
+
|
|
12
|
+
### 📝 Documentation
|
|
13
|
+
|
|
14
|
+
- **release**: 同步 `llms.txt`、`AI_GUIDE.md`、`AI_DISCOVERY.md`、`ai-document-index.yaml` 到 `v0.5.2-beta.1`
|
|
15
|
+
- **changelog**: 新增 beta 验证版本条目,用于自动发布链路验证与 GitHub Release 说明
|
|
16
|
+
|
|
17
|
+
## [0.5.1] - 2026-04-19 - Rule Control Hardening & Release Sync
|
|
18
|
+
|
|
19
|
+
### 🚀 New Features
|
|
20
|
+
|
|
21
|
+
- **rules**: 发布 repo-local rule control baseline,包括 capability report、validator exit-code contract、hooks/CI backstop、scoped subagent rule context 与 executable QA
|
|
22
|
+
- **workflow**: Claude / Codex 执行流现在会在常见执行路径中注入 scoped `<rule_context>`,减少规则遗漏与 prompt 串味
|
|
23
|
+
|
|
24
|
+
### 📝 Documentation
|
|
25
|
+
|
|
26
|
+
- **release**: 同步 `llms.txt`、`AI_GUIDE.md`、`AI_DISCOVERY.md`、`ai-document-index.yaml` 到 `v0.5.1`
|
|
27
|
+
- **changelog**: 补齐本版本发布条目,确保 pre-release guardrail 与 GitHub Release notes 可用
|
|
28
|
+
- **claude**: 补齐 `CLAUDE.md` 对 `docs/ai-guide/` 的入口引用,消除发布前 AI 文档交叉引用 warning
|
|
29
|
+
|
|
5
30
|
## [0.5.0] - 2026-04-15 - Design Contract Surface
|
|
6
31
|
|
|
7
32
|
### 🏗️ v1.4 Milestone: Design-to-Code Mapping & Handoff Package
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ CodeMap 是一个面向 TypeScript/JavaScript/Go 项目的 AI-first 代码地图
|
|
|
7
7
|
## 特性
|
|
8
8
|
|
|
9
9
|
- **AI-first 代码地图** - 生成 `AI_MAP.md`、`CONTEXT.md`、`codemap.json` 等 AI/Agent 可直接消费的上下文
|
|
10
|
-
- **核心分析命令** - 提供 `generate`、`query`、`deps`、`impact`、`complexity`、`cycles`、`analyze`、`design`、`export`、`ci`
|
|
10
|
+
- **核心分析命令** - 提供 `generate`、`query`、`deps`、`impact`、`complexity`、`cycles`、`analyze`、`design`、`export`、`ci`,并提供 experimental `mcp`
|
|
11
11
|
- **机器可读优先** - 结构化输出是产品基线;当前 CLI 过渡期仍主要通过 `--json` 暴露机器可读结果
|
|
12
12
|
- **分层架构 (MVP3)** - 保持 `Interface → Infrastructure → Domain → Server → CLI` 的明确边界
|
|
13
13
|
- **双层解析模式** - 提供 `fast`(快速正则)和 `smart`(TypeScript AST)两种解析模式
|
|
@@ -25,7 +25,7 @@ CodeMap 是一个面向 TypeScript/JavaScript/Go 项目的 AI-first 代码地图
|
|
|
25
25
|
| 输出契约 | 目标是机器可读优先;`当前 CLI 现实` 是多数命令通过 `--json` 提供结构化结果,`analyze` 额外支持 `--output-mode machine|human` |
|
|
26
26
|
| 架构边界 | `Server Layer` 是内部架构层,不等于公共 `mycodemap server` 命令 |
|
|
27
27
|
|
|
28
|
-
当前公共 CLI 聚焦 `init`、`generate`、`query`、`deps`、`cycles`、`complexity`、`impact`、`analyze`、`design`、`ci`、`workflow`、`export`、`ship`;`server`、`watch`、`report`、`logs` 已从 public CLI 移除,并在调用时给出迁移提示。
|
|
28
|
+
当前公共 CLI 聚焦 `init`、`generate`、`query`、`deps`、`cycles`、`complexity`、`impact`、`analyze`、`design`、`ci`、`workflow`、`export`、`ship`,以及 experimental 的 `mcp`;`server`、`watch`、`report`、`logs` 已从 public CLI 移除,并在调用时给出迁移提示。
|
|
29
29
|
|
|
30
30
|
## 安装
|
|
31
31
|
|
|
@@ -145,6 +145,7 @@ mycodemap init -y # 使用默认配置直接创建
|
|
|
145
145
|
mycodemap generate # 使用默认 hybrid 模式
|
|
146
146
|
mycodemap generate -m smart # 使用 smart 模式(AST 深度分析)
|
|
147
147
|
mycodemap generate -o ./docs/codemap # 指定输出目录
|
|
148
|
+
mycodemap generate --symbol-level # 额外 materialize symbol-level 调用依赖(实验性首期切片)
|
|
148
149
|
|
|
149
150
|
# 别名:codemap generate 也可以使用
|
|
150
151
|
```
|
|
@@ -153,8 +154,12 @@ mycodemap generate -o ./docs/codemap # 指定输出目录
|
|
|
153
154
|
|------|------|--------|
|
|
154
155
|
| `-m, --mode <mode>` | 分析模式:`fast`(正则匹配)、`smart`(TypeScript AST)或 `hybrid`(自动选择) | `hybrid` |
|
|
155
156
|
| `-o, --output <dir>` | 输出目录 | `.mycodemap` |
|
|
157
|
+
| `--symbol-level` | 额外把可解析的 symbol-level `call` 依赖写入图存储;默认 generate 行为不变 | `false` |
|
|
156
158
|
| `--ai-context` | 为每个文件生成描述 | - |
|
|
157
159
|
|
|
160
|
+
- `codemap.json` 现在会显式写出 `graphStatus`、`failedFileCount` 与可选 `parseFailureFiles`。
|
|
161
|
+
- 当某些发现到的文件没有成功进入最终图时,`graphStatus` 会降级为 `partial`;不要把这种结果当成完整图继续做自动化决策。
|
|
162
|
+
|
|
158
163
|
**模式说明:**
|
|
159
164
|
|
|
160
165
|
| 模式 | 速度 | 精度 | 适用场景 |
|
|
@@ -241,6 +246,30 @@ mycodemap impact -f src/cli/index.ts -j # JSON 格式输出
|
|
|
241
246
|
| `-t, --transitive` | 包含传递依赖(间接影响) | - |
|
|
242
247
|
| `-j, --json` | 以 JSON 格式输出 | - |
|
|
243
248
|
|
|
249
|
+
### `mycodemap mcp`(experimental)
|
|
250
|
+
|
|
251
|
+
本地只读的 stdio MCP 薄切片。当前只提供两个工具:`codemap_query`、`codemap_impact`。
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# 先生成 symbol-level 图
|
|
255
|
+
mycodemap generate --symbol-level
|
|
256
|
+
|
|
257
|
+
# 把当前仓库写入本地 MCP host 配置
|
|
258
|
+
mycodemap mcp install
|
|
259
|
+
|
|
260
|
+
# 由 MCP host 启动 stdio server
|
|
261
|
+
mycodemap mcp start
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
| 子命令 | 说明 |
|
|
265
|
+
|--------|------|
|
|
266
|
+
| `mcp install` | 把 experimental 本地 server 写入当前仓库 `.mcp.json` |
|
|
267
|
+
| `mcp start` | 启动本地 stdio MCP server;`stdout` 仅承载协议帧 |
|
|
268
|
+
|
|
269
|
+
- `mcp` 当前是 **experimental / local-only / read-only** surface,不是稳定长期 public API。
|
|
270
|
+
- 使用前必须先执行 `mycodemap generate --symbol-level`;否则工具会返回 `GRAPH_NOT_FOUND`。
|
|
271
|
+
- canonical 集成文档见 `docs/ai-guide/INTEGRATION.md`;若宿主暂时不支持真正 MCP,可先回退到传统 CLI wrapper 方式。
|
|
272
|
+
|
|
244
273
|
### 已移除的公共 CLI 命令
|
|
245
274
|
|
|
246
275
|
以下命令已从 public CLI 移除;直接调用时,CLI 会显式失败并给出迁移提示,而不是继续执行旧功能。
|
|
@@ -419,6 +448,8 @@ mycodemap ci assess-risk -f src/cache/lru-cache.ts
|
|
|
419
448
|
mycodemap ci check-output-contract
|
|
420
449
|
```
|
|
421
450
|
|
|
451
|
+
> `ci assess-risk` 现在输出 `status/confidence/freshness/source` 与统一 risk level;若 Git history 不可用,会显式打印 `unavailable` / warning,并说明阈值未被应用。
|
|
452
|
+
|
|
422
453
|
## 配置说明
|
|
423
454
|
|
|
424
455
|
通过 `mycodemap init` 生成的 `mycodemap.config.json` 配置文件支持以下选项:
|
|
@@ -475,9 +506,9 @@ mycodemap ci check-output-contract
|
|
|
475
506
|
| `exclude` | `string[]` | 排除的文件 glob 模式 | `["node_modules/**", "dist/**", ...]` |
|
|
476
507
|
| `output` | `string` | 输出目录路径 | `".mycodemap"` |
|
|
477
508
|
| `watch` | `boolean` | 监听模式预留配置 | `false` |
|
|
478
|
-
| `storage.type` | `"filesystem" \| "
|
|
509
|
+
| `storage.type` | `"filesystem" \| "sqlite" \| "memory" \| "auto"` | 图存储后端类型 | `"filesystem"` |
|
|
479
510
|
| `storage.outputPath` | `string` | 文件系统存储目录 | `".codemap/storage"` |
|
|
480
|
-
| `storage.databasePath` | `string` |
|
|
511
|
+
| `storage.databasePath` | `string` | SQLite 数据目录(相对项目根目录) | `".codemap/governance.sqlite"` |
|
|
481
512
|
| `storage.autoThresholds` | `object` | `auto` 后端选择阈值 | - |
|
|
482
513
|
| `plugins.builtInPlugins` | `boolean` | 是否启用内置插件 | `true` |
|
|
483
514
|
| `plugins.pluginDir` | `string` | 额外插件目录 | - |
|
|
@@ -489,16 +520,16 @@ mycodemap ci check-output-contract
|
|
|
489
520
|
```jsonc
|
|
490
521
|
{
|
|
491
522
|
"storage": {
|
|
492
|
-
"type": "
|
|
493
|
-
"databasePath": ".codemap/
|
|
523
|
+
"type": "sqlite",
|
|
524
|
+
"databasePath": ".codemap/governance.sqlite"
|
|
494
525
|
}
|
|
495
526
|
}
|
|
496
527
|
```
|
|
497
528
|
|
|
498
529
|
- `generate` 会把 CodeGraph 写入配置的 `storage` 后端,`export` 与内部 `Server Layer` handler 会读取同一份后端数据。
|
|
499
|
-
- `neo4j` 已不再是正式支持的 backend;旧配置会返回显式迁移错误,不会静默 fallback 到 `filesystem`。
|
|
500
|
-
-
|
|
501
|
-
- `storage.type = "auto"`
|
|
530
|
+
- `neo4j` 与 `kuzudb` 已不再是正式支持的 backend;旧配置会返回显式迁移错误,不会静默 fallback 到 `filesystem`。
|
|
531
|
+
- 显式选择 `sqlite` 且运行时缺少 `better-sqlite3` 或 Node.js `<20` 时,会返回显式错误。
|
|
532
|
+
- `storage.type = "auto"` 当前优先选择 `sqlite`;若运行时缺少 `better-sqlite3` 或 Node.js `<20` 导致 SQLite 不可用,则 warning 后回退到 `filesystem`。
|
|
502
533
|
- 图存储后端生产化不等于重新开放公共 HTTP API 产品面;`Server Layer` 仍是内部架构层。
|
|
503
534
|
|
|
504
535
|
### 插件运行时说明
|
|
@@ -703,6 +734,41 @@ mycodemap design verify mycodemap.design.md --json
|
|
|
703
734
|
> `design handoff` 会基于 validated design contract + mapping truth 返回 `readyForExecution`、`approvals`、`assumptions`、`openQuestions`;human mode 默认写出 `.mycodemap/handoffs/{stem}.handoff.md|json`。
|
|
704
735
|
> `design verify` 会把 `Acceptance Criteria` 固定映射为 `checklist`,并输出 `drift` / `diagnostics`;当结果只是 `needs-review` 时保持零退出码,只有 `ok=false` 或 blocker diagnostics 才返回非零 exit code。
|
|
705
736
|
|
|
737
|
+
### `mycodemap check`
|
|
738
|
+
|
|
739
|
+
执行 design contract contract gate,默认输出机器可读 JSON。
|
|
740
|
+
|
|
741
|
+
```bash
|
|
742
|
+
# 默认 full scan
|
|
743
|
+
mycodemap check --contract mycodemap.design.md --against src
|
|
744
|
+
|
|
745
|
+
# GitHub PR annotations
|
|
746
|
+
mycodemap check --contract mycodemap.design.md --against src --base origin/main --annotation-format github
|
|
747
|
+
|
|
748
|
+
# GitLab code quality artifact
|
|
749
|
+
mycodemap check --contract mycodemap.design.md --against src --base origin/main --annotation-format gitlab --annotation-file gl-code-quality-report.json
|
|
750
|
+
|
|
751
|
+
# 校准当前仓库是否允许默认 hard gate
|
|
752
|
+
node scripts/calibrate-contract-gate.mjs --max-changed-files 10 --max-false-positive-rate 0.10
|
|
753
|
+
```
|
|
754
|
+
|
|
755
|
+
> PR 默认 hard gate 只在 calibration 通过且 `changed files <= 10` 时开启;超窗、`diff-scope-fallback` 或 `false-positive rate >10%` 时必须显式切回 `warn-only / fallback`。
|
|
756
|
+
|
|
757
|
+
### `mycodemap history`
|
|
758
|
+
|
|
759
|
+
符号级 Git history / risk 查询:
|
|
760
|
+
|
|
761
|
+
```bash
|
|
762
|
+
# 默认输出 machine-first JSON
|
|
763
|
+
mycodemap history --symbol createCheckCommand
|
|
764
|
+
|
|
765
|
+
# 查询某个符号的历史轨迹与风险摘要
|
|
766
|
+
mycodemap history --symbol createCheckCommand
|
|
767
|
+
|
|
768
|
+
# 人类可读摘要
|
|
769
|
+
mycodemap history --symbol createCheckCommand --human
|
|
770
|
+
```
|
|
771
|
+
|
|
706
772
|
### `mycodemap analyze`
|
|
707
773
|
|
|
708
774
|
统一分析入口,当前公共契约只暴露四个 intent,并统一返回结构化输出:
|
|
@@ -752,6 +818,8 @@ mycodemap analyze -i link -t src/index.ts --structured --json
|
|
|
752
818
|
> 产品目标是机器可读优先;当前实现仍以显式 `--json` / `--output-mode` 作为主要入口。
|
|
753
819
|
>
|
|
754
820
|
> legacy 兼容映射:`search → find`、`impact/complexity → read`、`dependency/reference → link`、`overview/documentation → show`;`refactor` 会返回 `E0001_INVALID_INTENT`。
|
|
821
|
+
>
|
|
822
|
+
> `--include-git-history` 现在只会在 `read` intent 上附加统一的 Git history enrichment;其他 intent 会显式给出 warning,而不是 silent noop。
|
|
755
823
|
|
|
756
824
|
|
|
757
825
|
## 贡献指南
|
|
@@ -71,6 +71,24 @@ export declare class AnalyzeCommand {
|
|
|
71
71
|
* find fallback
|
|
72
72
|
*/
|
|
73
73
|
private executeFind;
|
|
74
|
+
private executeConfigAwareTextFallback;
|
|
75
|
+
private runConfigAwareTextFallback;
|
|
76
|
+
private resolveFallbackSearchScope;
|
|
77
|
+
private searchFileWithFallback;
|
|
78
|
+
private createExplicitPathFallbackResults;
|
|
79
|
+
private createFallbackResult;
|
|
80
|
+
private matchDiscoveredTargetFiles;
|
|
81
|
+
private isPathLikeTarget;
|
|
82
|
+
private uniqueNonEmptyStrings;
|
|
83
|
+
private toProjectRelativePath;
|
|
84
|
+
private toPosixPath;
|
|
85
|
+
private withDiagnostics;
|
|
86
|
+
private createSuccessDiagnostics;
|
|
87
|
+
private createPartialFailureDiagnostics;
|
|
88
|
+
private createFailureDiagnostics;
|
|
89
|
+
private createDiagnostic;
|
|
90
|
+
private errorMessage;
|
|
91
|
+
private isMachineOutputMode;
|
|
74
92
|
/**
|
|
75
93
|
* 执行 read 聚合
|
|
76
94
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,8 @@ import { CodemapAdapter } from '../../orchestrator/adapters/codemap-adapter.js';
|
|
|
18
18
|
import { AstGrepAdapter } from '../../orchestrator/adapters/ast-grep-adapter.js';
|
|
19
19
|
import { IntentRouter } from '../../orchestrator/intent-router.js';
|
|
20
20
|
import { resolveDataPath, resolveOutputDir } from '../paths.js';
|
|
21
|
+
import { discoverProjectFiles } from '../../core/file-discovery.js';
|
|
22
|
+
import { loadCodemapConfig } from '../config-loader.js';
|
|
21
23
|
/**
|
|
22
24
|
* 错误码定义
|
|
23
25
|
*/
|
|
@@ -132,11 +134,26 @@ export class AnalyzeCommand {
|
|
|
132
134
|
*/
|
|
133
135
|
async executeFindWithFallback(intentObj, topK) {
|
|
134
136
|
try {
|
|
135
|
-
|
|
137
|
+
const orchestratedOutput = await this.executeWithOrchestrator(intentObj, topK);
|
|
138
|
+
if (orchestratedOutput.results.length > 0) {
|
|
139
|
+
return this.withCompatibility(this.withDiagnostics(orchestratedOutput, this.createSuccessDiagnostics()), intentObj.compatibility);
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
await this.executeFind(intentObj, topK, { failOnScanError: true });
|
|
143
|
+
}
|
|
144
|
+
catch (scanError) {
|
|
145
|
+
return this.withCompatibility(await this.executeConfigAwareTextFallback(intentObj, topK, scanError, undefined), intentObj.compatibility);
|
|
146
|
+
}
|
|
147
|
+
return this.withCompatibility(this.withDiagnostics(orchestratedOutput, this.createSuccessDiagnostics()), intentObj.compatibility);
|
|
136
148
|
}
|
|
137
|
-
catch {
|
|
149
|
+
catch (orchestratorError) {
|
|
138
150
|
console.warn('[Analyze] Orchestrator not available, falling back to AstGrep search');
|
|
139
|
-
|
|
151
|
+
try {
|
|
152
|
+
return await this.executeFind(intentObj, topK, { failOnScanError: true });
|
|
153
|
+
}
|
|
154
|
+
catch (scanError) {
|
|
155
|
+
return this.withCompatibility(await this.executeConfigAwareTextFallback(intentObj, topK, scanError, orchestratorError), intentObj.compatibility);
|
|
156
|
+
}
|
|
140
157
|
}
|
|
141
158
|
}
|
|
142
159
|
/**
|
|
@@ -146,7 +163,7 @@ export class AnalyzeCommand {
|
|
|
146
163
|
const orchestrator = new ToolOrchestrator();
|
|
147
164
|
// 注册适配器
|
|
148
165
|
const codemapAdapter = new CodemapAdapter({ codemapPath: resolveOutputDir().outputDir });
|
|
149
|
-
const astGrepAdapter = new AstGrepAdapter();
|
|
166
|
+
const astGrepAdapter = new AstGrepAdapter({ includeTests: this.args.includeTests ?? true });
|
|
150
167
|
orchestrator.registerAdapter(codemapAdapter);
|
|
151
168
|
orchestrator.registerAdapter(astGrepAdapter);
|
|
152
169
|
const fusion = new ResultFusion();
|
|
@@ -230,9 +247,12 @@ export class AnalyzeCommand {
|
|
|
230
247
|
/**
|
|
231
248
|
* find fallback
|
|
232
249
|
*/
|
|
233
|
-
async executeFind(intentObj, topK) {
|
|
250
|
+
async executeFind(intentObj, topK, options = {}) {
|
|
234
251
|
const searchTerms = intentObj.keywords.length > 0 ? intentObj.keywords : intentObj.targets;
|
|
235
|
-
const adapter = new AstGrepAdapter({
|
|
252
|
+
const adapter = new AstGrepAdapter({
|
|
253
|
+
includeTests: this.args.includeTests ?? true,
|
|
254
|
+
failOnScanError: options.failOnScanError ?? false
|
|
255
|
+
});
|
|
236
256
|
const rawResults = await adapter.execute(searchTerms, {
|
|
237
257
|
topK,
|
|
238
258
|
includeTests: this.args.includeTests,
|
|
@@ -246,6 +266,7 @@ export class AnalyzeCommand {
|
|
|
246
266
|
tool: 'ast-grep-find',
|
|
247
267
|
confidence,
|
|
248
268
|
results,
|
|
269
|
+
diagnostics: this.createSuccessDiagnostics(),
|
|
249
270
|
metadata: {
|
|
250
271
|
total: results.length,
|
|
251
272
|
resultCount: results.length,
|
|
@@ -253,6 +274,218 @@ export class AnalyzeCommand {
|
|
|
253
274
|
}
|
|
254
275
|
}, intentObj.compatibility);
|
|
255
276
|
}
|
|
277
|
+
async executeConfigAwareTextFallback(intentObj, topK, scanError, orchestratorError) {
|
|
278
|
+
try {
|
|
279
|
+
const results = await this.runConfigAwareTextFallback(intentObj, topK);
|
|
280
|
+
const diagnostics = this.createPartialFailureDiagnostics(scanError, orchestratorError);
|
|
281
|
+
return {
|
|
282
|
+
schemaVersion: 'v1.0.0',
|
|
283
|
+
intent: 'find',
|
|
284
|
+
tool: 'codemap-find-fallback',
|
|
285
|
+
confidence: this.buildConfidence(results.length > 0 ? 0.65 : 0),
|
|
286
|
+
results,
|
|
287
|
+
diagnostics,
|
|
288
|
+
metadata: {
|
|
289
|
+
total: results.length,
|
|
290
|
+
resultCount: results.length,
|
|
291
|
+
scope: intentObj.scope
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
catch (fallbackError) {
|
|
296
|
+
if (this.isMachineOutputMode()) {
|
|
297
|
+
process.exitCode = 1;
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
schemaVersion: 'v1.0.0',
|
|
301
|
+
intent: 'find',
|
|
302
|
+
tool: 'codemap-find-fallback',
|
|
303
|
+
confidence: this.buildConfidence(0),
|
|
304
|
+
results: [],
|
|
305
|
+
diagnostics: this.createFailureDiagnostics(scanError, fallbackError, orchestratorError),
|
|
306
|
+
metadata: {
|
|
307
|
+
total: 0,
|
|
308
|
+
resultCount: 0,
|
|
309
|
+
scope: intentObj.scope
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
async runConfigAwareTextFallback(intentObj, topK) {
|
|
315
|
+
const { config } = await loadCodemapConfig(process.cwd());
|
|
316
|
+
const discoveredFiles = await discoverProjectFiles({
|
|
317
|
+
rootDir: process.cwd(),
|
|
318
|
+
include: config.include,
|
|
319
|
+
exclude: config.exclude,
|
|
320
|
+
absolute: true,
|
|
321
|
+
gitignore: true
|
|
322
|
+
});
|
|
323
|
+
const { files, searchTerms, explicitPathMode } = this.resolveFallbackSearchScope(discoveredFiles, intentObj);
|
|
324
|
+
const results = [];
|
|
325
|
+
for (const file of files) {
|
|
326
|
+
const fileResults = await this.searchFileWithFallback(file, searchTerms, topK - results.length);
|
|
327
|
+
results.push(...fileResults);
|
|
328
|
+
if (results.length >= topK) {
|
|
329
|
+
return results.slice(0, topK);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (explicitPathMode && intentObj.keywords.length === 0 && results.length === 0) {
|
|
333
|
+
const anchoredResults = await this.createExplicitPathFallbackResults(files, searchTerms, topK);
|
|
334
|
+
results.push(...anchoredResults);
|
|
335
|
+
}
|
|
336
|
+
return results.slice(0, topK);
|
|
337
|
+
}
|
|
338
|
+
resolveFallbackSearchScope(discoveredFiles, intentObj) {
|
|
339
|
+
const explicitPathTargets = intentObj.targets.filter(target => this.isPathLikeTarget(target));
|
|
340
|
+
const matchedTargetFiles = this.matchDiscoveredTargetFiles(discoveredFiles, explicitPathTargets);
|
|
341
|
+
if (matchedTargetFiles.length > 0) {
|
|
342
|
+
const pathTerms = explicitPathTargets.flatMap(target => {
|
|
343
|
+
const basename = path.basename(target);
|
|
344
|
+
return [basename, this.stripModuleExtension(basename)];
|
|
345
|
+
});
|
|
346
|
+
return {
|
|
347
|
+
files: matchedTargetFiles,
|
|
348
|
+
searchTerms: this.uniqueNonEmptyStrings(intentObj.keywords.length > 0 ? intentObj.keywords : pathTerms),
|
|
349
|
+
explicitPathMode: true
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
return {
|
|
353
|
+
files: discoveredFiles,
|
|
354
|
+
searchTerms: this.uniqueNonEmptyStrings(intentObj.keywords.length > 0 ? intentObj.keywords : intentObj.targets),
|
|
355
|
+
explicitPathMode: false
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
async searchFileWithFallback(file, searchTerms, remainingSlots) {
|
|
359
|
+
if (remainingSlots <= 0 || searchTerms.length === 0) {
|
|
360
|
+
return [];
|
|
361
|
+
}
|
|
362
|
+
const content = await readFile(file, 'utf-8');
|
|
363
|
+
const lines = content.split(/\r?\n/);
|
|
364
|
+
const results = [];
|
|
365
|
+
for (const [index, line] of lines.entries()) {
|
|
366
|
+
const matchedTerms = searchTerms.filter(term => line.includes(term));
|
|
367
|
+
if (matchedTerms.length === 0) {
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
const relativeFile = this.toProjectRelativePath(file);
|
|
371
|
+
const lineNumber = index + 1;
|
|
372
|
+
results.push(this.createFallbackResult(relativeFile, lineNumber, line, matchedTerms));
|
|
373
|
+
if (results.length >= remainingSlots) {
|
|
374
|
+
break;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return results;
|
|
378
|
+
}
|
|
379
|
+
async createExplicitPathFallbackResults(files, searchTerms, topK) {
|
|
380
|
+
const results = [];
|
|
381
|
+
for (const file of files) {
|
|
382
|
+
const content = await readFile(file, 'utf-8');
|
|
383
|
+
const firstLine = content.split(/\r?\n/, 1)[0] ?? '';
|
|
384
|
+
const relativeFile = this.toProjectRelativePath(file);
|
|
385
|
+
results.push(this.createFallbackResult(relativeFile, 1, firstLine || `Matched file path ${relativeFile}`, searchTerms));
|
|
386
|
+
if (results.length >= topK) {
|
|
387
|
+
break;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return results;
|
|
391
|
+
}
|
|
392
|
+
createFallbackResult(relativeFile, lineNumber, content, keywords) {
|
|
393
|
+
return {
|
|
394
|
+
id: `codemap-fallback:${relativeFile}:${lineNumber}`,
|
|
395
|
+
source: 'codemap-fallback',
|
|
396
|
+
toolScore: 0.65,
|
|
397
|
+
type: 'code',
|
|
398
|
+
file: relativeFile,
|
|
399
|
+
line: lineNumber,
|
|
400
|
+
location: {
|
|
401
|
+
file: relativeFile,
|
|
402
|
+
line: lineNumber,
|
|
403
|
+
column: 1
|
|
404
|
+
},
|
|
405
|
+
content: content.substring(0, 200),
|
|
406
|
+
relevance: 0.65,
|
|
407
|
+
keywords,
|
|
408
|
+
metadata: {
|
|
409
|
+
stability: true,
|
|
410
|
+
riskLevel: 'low'
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
matchDiscoveredTargetFiles(discoveredFiles, targets) {
|
|
415
|
+
const normalizedTargets = new Set(targets.flatMap(target => {
|
|
416
|
+
const absoluteTarget = path.resolve(process.cwd(), target);
|
|
417
|
+
return [
|
|
418
|
+
this.toPosixPath(absoluteTarget),
|
|
419
|
+
this.toPosixPath(path.relative(process.cwd(), absoluteTarget)),
|
|
420
|
+
this.toPosixPath(target)
|
|
421
|
+
];
|
|
422
|
+
}));
|
|
423
|
+
return discoveredFiles.filter(file => {
|
|
424
|
+
const absoluteFile = path.resolve(file);
|
|
425
|
+
const relativeFile = path.relative(process.cwd(), absoluteFile);
|
|
426
|
+
return normalizedTargets.has(this.toPosixPath(absoluteFile))
|
|
427
|
+
|| normalizedTargets.has(this.toPosixPath(relativeFile));
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
isPathLikeTarget(target) {
|
|
431
|
+
return target.includes('/') || target.includes('\\') || /\.[cm]?[jt]sx?$/i.test(target);
|
|
432
|
+
}
|
|
433
|
+
uniqueNonEmptyStrings(values) {
|
|
434
|
+
return Array.from(new Set(values.map(value => value.trim()).filter(Boolean)));
|
|
435
|
+
}
|
|
436
|
+
toProjectRelativePath(file) {
|
|
437
|
+
return this.toPosixPath(path.relative(process.cwd(), path.resolve(file)));
|
|
438
|
+
}
|
|
439
|
+
toPosixPath(filePath) {
|
|
440
|
+
return filePath.replace(/\\/g, '/');
|
|
441
|
+
}
|
|
442
|
+
withDiagnostics(output, diagnostics) {
|
|
443
|
+
return {
|
|
444
|
+
...output,
|
|
445
|
+
diagnostics
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
createSuccessDiagnostics() {
|
|
449
|
+
return {
|
|
450
|
+
status: 'success',
|
|
451
|
+
items: []
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
createPartialFailureDiagnostics(scanError, orchestratorError) {
|
|
455
|
+
return {
|
|
456
|
+
status: 'partialFailure',
|
|
457
|
+
items: [
|
|
458
|
+
this.createDiagnostic('find-scanner-degraded', 'warning', `find 主扫描退化,已使用配置感知文本 fallback: ${this.errorMessage(scanError)}`, 'ast-grep', true, { orchestratorError: this.errorMessage(orchestratorError) })
|
|
459
|
+
],
|
|
460
|
+
degradedTools: ['ast-grep']
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
createFailureDiagnostics(scanError, fallbackError, orchestratorError) {
|
|
464
|
+
return {
|
|
465
|
+
status: 'failure',
|
|
466
|
+
items: [
|
|
467
|
+
this.createDiagnostic('find-scanner-failed', 'error', `find 主扫描失败: ${this.errorMessage(scanError)}`, 'ast-grep', false, { orchestratorError: this.errorMessage(orchestratorError) }),
|
|
468
|
+
this.createDiagnostic('find-fallback-failed', 'error', `配置感知文本 fallback 失败: ${this.errorMessage(fallbackError)}`, 'codemap-find-fallback', false)
|
|
469
|
+
],
|
|
470
|
+
failedTools: ['ast-grep', 'codemap-find-fallback']
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
createDiagnostic(code, severity, message, source, recoverable, details) {
|
|
474
|
+
return {
|
|
475
|
+
code,
|
|
476
|
+
severity,
|
|
477
|
+
message,
|
|
478
|
+
source,
|
|
479
|
+
recoverable,
|
|
480
|
+
...(details ? { details } : {})
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
errorMessage(error) {
|
|
484
|
+
return error instanceof Error ? error.message : String(error);
|
|
485
|
+
}
|
|
486
|
+
isMachineOutputMode() {
|
|
487
|
+
return this.args.json === true || this.args.structured === true || this.args.outputMode === 'machine';
|
|
488
|
+
}
|
|
256
489
|
/**
|
|
257
490
|
* 执行 read 聚合
|
|
258
491
|
*/
|