source-kb 0.2.2__py3-none-any.whl
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.
- cli/__init__.py +50 -0
- cli/__main__.py +5 -0
- cli/commands/__init__.py +1 -0
- cli/commands/anchor_fix.py +47 -0
- cli/commands/diff_doc.py +52 -0
- cli/commands/dispatch.py +77 -0
- cli/commands/extract.py +72 -0
- cli/commands/file_list.py +74 -0
- cli/commands/index.py +84 -0
- cli/commands/lock.py +89 -0
- cli/commands/merge.py +60 -0
- cli/commands/merge_delta.py +19 -0
- cli/commands/metadata.py +24 -0
- cli/commands/pipeline.py +45 -0
- cli/commands/post_merge.py +43 -0
- cli/commands/query.py +52 -0
- cli/commands/render.py +101 -0
- cli/commands/scan_repos.py +46 -0
- cli/commands/setup.py +94 -0
- cli/commands/split.py +196 -0
- cli/commands/stale_files.py +98 -0
- cli/commands/validate.py +191 -0
- core/__init__.py +32 -0
- core/config.py +261 -0
- core/docs/__init__.py +7 -0
- core/docs/section_updater.py +286 -0
- core/docs/shared.py +149 -0
- core/git.py +294 -0
- core/interfaces.py +249 -0
- core/monitor/__init__.py +5 -0
- core/monitor/progress.py +83 -0
- core/monitor/prompt_store.py +49 -0
- core/paths.py +141 -0
- core/preset.py +237 -0
- core/preset_accessors.py +202 -0
- core/preset_classify.py +132 -0
- core/preset_hooks.py +129 -0
- core/preset_profile.py +89 -0
- core/prompt/__init__.py +7 -0
- core/prompt/__main__.py +147 -0
- core/prompt/content.py +320 -0
- core/prompt/context_manager.py +164 -0
- core/prompt/renderer.py +236 -0
- core/prompt/response_parser.py +274 -0
- core/prompt/templates.py +357 -0
- core/prompt/validate_parity.py +162 -0
- core/prompt/variables.py +339 -0
- core/rag/__init__.py +22 -0
- core/rag/__main__.py +136 -0
- core/rag/bm25_index.py +268 -0
- core/rag/chunker.py +273 -0
- core/rag/embedder.py +151 -0
- core/rag/indexer.py +292 -0
- core/rag/loader.py +89 -0
- core/rag/retriever.py +82 -0
- core/skeleton/__init__.py +11 -0
- core/skeleton/__main__.py +934 -0
- core/skeleton/anchor_fix.py +250 -0
- core/skeleton/classify.py +331 -0
- core/skeleton/cmd_anchor_fix.py +43 -0
- core/skeleton/cmd_diff_doc.py +44 -0
- core/skeleton/cmd_lock.py +87 -0
- core/skeleton/cmd_merge_delta.py +41 -0
- core/skeleton/community.py +233 -0
- core/skeleton/dependency_graph.py +306 -0
- core/skeleton/diff_doc.py +248 -0
- core/skeleton/dispatch.py +273 -0
- core/skeleton/dispatch_render.py +319 -0
- core/skeleton/dispatch_source.py +111 -0
- core/skeleton/extract.py +218 -0
- core/skeleton/extract_methods.py +298 -0
- core/skeleton/file_list.py +239 -0
- core/skeleton/impact.py +278 -0
- core/skeleton/jar_download.py +177 -0
- core/skeleton/jar_resolver.py +186 -0
- core/skeleton/loader.py +162 -0
- core/skeleton/merge.py +278 -0
- core/skeleton/merge_delta.py +229 -0
- core/skeleton/metadata.py +96 -0
- core/skeleton/metadata_builders.py +264 -0
- core/skeleton/module_dag.py +330 -0
- core/skeleton/parsers/__init__.py +71 -0
- core/skeleton/parsers/jqassistant.py +300 -0
- core/skeleton/parsers/jqassistant_cypher.py +225 -0
- core/skeleton/parsers/regex.py +171 -0
- core/skeleton/parsers/treesitter.py +324 -0
- core/skeleton/parsers/treesitter_java.py +284 -0
- core/skeleton/parsers/treesitter_multi.py +289 -0
- core/skeleton/pom_parser.py +299 -0
- core/skeleton/post_merge.py +295 -0
- core/skeleton/post_merge_llm.py +82 -0
- core/skeleton/query.py +195 -0
- core/skeleton/shard_context.py +177 -0
- core/skeleton/split.py +180 -0
- core/skeleton/split_cache.py +107 -0
- core/skeleton/split_feedback.py +174 -0
- core/skeleton/split_plan.py +219 -0
- core/skeleton/split_plan_helpers.py +305 -0
- core/skeleton/split_plan_llm.py +274 -0
- core/utils.py +135 -0
- core/validators/__init__.py +65 -0
- core/validators/__main__.py +215 -0
- core/validators/consistency.py +203 -0
- core/validators/coverage.py +171 -0
- core/validators/duplicates.py +76 -0
- core/validators/engine.py +224 -0
- core/validators/links.py +76 -0
- core/validators/sampling.py +169 -0
- core/validators/structure.py +144 -0
- engine/__init__.py +7 -0
- engine/assembler.py +231 -0
- engine/confirm.py +65 -0
- engine/dedup.py +106 -0
- engine/main.py +211 -0
- engine/pipeline/__init__.py +163 -0
- engine/pipeline/recovery.py +250 -0
- engine/pipeline/steps/__init__.py +23 -0
- engine/pipeline/steps/audit.py +220 -0
- engine/pipeline/steps/audit_apply.py +195 -0
- engine/pipeline/steps/audit_helpers.py +155 -0
- engine/pipeline/steps/classify_llm.py +236 -0
- engine/pipeline/steps/classify_prompt.py +223 -0
- engine/pipeline/steps/finalize.py +160 -0
- engine/pipeline/steps/generate.py +169 -0
- engine/pipeline/steps/generate_batch.py +197 -0
- engine/pipeline/steps/generate_recovery.py +170 -0
- engine/pipeline/steps/llm_plan_split.py +253 -0
- engine/pipeline/steps/lock.py +64 -0
- engine/pipeline/steps/preflight.py +237 -0
- engine/pipeline/steps/preflight_adjust.py +147 -0
- engine/pipeline/steps/pregenerate.py +130 -0
- engine/pipeline/steps/quality.py +81 -0
- engine/pipeline/steps/skeleton.py +149 -0
- engine/pipeline/steps/source.py +163 -0
- engine/pipeline/steps/sync.py +117 -0
- engine/pipeline/steps/sync_finalize.py +237 -0
- engine/pipeline/steps/sync_update.py +341 -0
- engine/pipelines.py +91 -0
- engine/runner.py +335 -0
- engine/strategies/__init__.py +86 -0
- engine/strategies/api.py +128 -0
- engine/strategies/delegated.py +50 -0
- engine/strategies/dryrun.py +25 -0
- engine/two_phase.py +143 -0
- mcp_server/__init__.py +73 -0
- mcp_server/__main__.py +5 -0
- mcp_server/tools/__init__.py +1 -0
- mcp_server/tools/config.py +63 -0
- mcp_server/tools/discovery.py +276 -0
- mcp_server/tools/generation.py +184 -0
- mcp_server/tools/planning.py +144 -0
- mcp_server/tools/source.py +175 -0
- mcp_server/tools/validation.py +140 -0
- mcp_server/tools/workflow.py +166 -0
- mcp_server/workflow_loader.py +204 -0
- presets/generic/audit_dimensions.md +132 -0
- presets/generic/doc_types.yaml +152 -0
- presets/generic/preset.yaml +115 -0
- presets/java-spring/audit_dimensions.md +228 -0
- presets/java-spring/audit_dimensions.yaml +203 -0
- presets/java-spring/doc_types.yaml +269 -0
- presets/java-spring/hooks.py +122 -0
- presets/java-spring/preset.yaml +341 -0
- presets/java-spring/templates/README.md +34 -0
- presets/java-spring/templates/audit-system.md +15 -0
- presets/java-spring/templates/subagent-aop.md +105 -0
- presets/java-spring/templates/subagent-api.md +63 -0
- presets/java-spring/templates/subagent-architecture.md +111 -0
- presets/java-spring/templates/subagent-async-events.md +107 -0
- presets/java-spring/templates/subagent-audit-api-contracts.md +40 -0
- presets/java-spring/templates/subagent-audit-architecture.md +38 -0
- presets/java-spring/templates/subagent-audit-business.md +40 -0
- presets/java-spring/templates/subagent-audit-data-models.md +40 -0
- presets/java-spring/templates/subagent-business.md +129 -0
- presets/java-spring/templates/subagent-caching.md +75 -0
- presets/java-spring/templates/subagent-database-access.md +114 -0
- presets/java-spring/templates/subagent-enum.md +75 -0
- presets/java-spring/templates/subagent-error-handling.md +91 -0
- presets/java-spring/templates/subagent-external-integrations.md +80 -0
- presets/java-spring/templates/subagent-index.md +122 -0
- presets/java-spring/templates/subagent-messaging.md +97 -0
- presets/java-spring/templates/subagent-model.md +88 -0
- presets/java-spring/templates/subagent-observability.md +91 -0
- presets/java-spring/templates/subagent-scheduled.md +81 -0
- presets/java-spring/templates/subagent-security.md +102 -0
- presets/java-spring/templates/subagent-structure.md +101 -0
- presets/java-spring/templates/subagent-sync-section.md +34 -0
- presets/java-spring/templates/subagent-utils.md +73 -0
- presets/java-spring/templates/sync-system.md +8 -0
- presets/java-spring/workflow-extensions.md +112 -0
- skills/__init__.py +1 -0
- skills/_shared/README.md +30 -0
- skills/_shared/doc-coverage-shared.md +134 -0
- skills/_shared/doc-quality-standard.md +1058 -0
- skills/_shared/doc-subagent-rules.md +762 -0
- skills/_shared/windows-compat.md +89 -0
- skills/kb-audit/SKILL.md +52 -0
- skills/kb-audit/rules.md +88 -0
- skills/kb-audit/steps/step-01-prepare.md +75 -0
- skills/kb-audit/steps/step-02-audit.md +96 -0
- skills/kb-audit/steps/step-03-verify.md +65 -0
- skills/kb-audit/steps/step-04-report.md +64 -0
- skills/kb-init/SKILL.md +146 -0
- skills/kb-init/rules.md +187 -0
- skills/kb-init/steps/step-01-scope.md +62 -0
- skills/kb-init/steps/step-02-source.md +410 -0
- skills/kb-init/steps/step-03-generate.md +307 -0
- skills/kb-init/steps/step-04-quality.md +92 -0
- skills/kb-init/steps/step-05-finalize.md +132 -0
- skills/kb-init/templates/core/execution-modes.md +29 -0
- skills/kb-init/templates/core/output-only.md +4 -0
- skills/kb-init/templates/core/readwrite.md +33 -0
- skills/kb-search/SKILL.md +138 -0
- skills/kb-search/rules.md +64 -0
- skills/kb-sync/SKILL.md +43 -0
- skills/kb-sync/rules.md +70 -0
- skills/kb-sync/scripts/rebuild_module.py +91 -0
- skills/kb-sync/scripts/scan_repos.py +687 -0
- skills/kb-sync/steps/step-01-detect.md +72 -0
- skills/kb-sync/steps/step-02-update.md +71 -0
- skills/kb-sync/steps/step-03-verify.md +47 -0
- skills/kb-sync/steps/step-04-finalize.md +52 -0
- source_kb-0.2.2.dist-info/METADATA +194 -0
- source_kb-0.2.2.dist-info/RECORD +228 -0
- source_kb-0.2.2.dist-info/WHEEL +5 -0
- source_kb-0.2.2.dist-info/entry_points.txt +3 -0
- source_kb-0.2.2.dist-info/licenses/LICENSE +21 -0
- source_kb-0.2.2.dist-info/top_level.txt +6 -0
skills/kb-init/rules.md
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# kb-init 主会话调度规则
|
|
2
|
+
|
|
3
|
+
> 本文件供主会话在调度过程中参考。子代理规则已内嵌到 `templates/` 模板中。
|
|
4
|
+
|
|
5
|
+
## 1. 核心原则
|
|
6
|
+
|
|
7
|
+
主会话是**调度员**,通过工具链脚本获取信息、派发子代理、监控进度。
|
|
8
|
+
子代理是**执行者**,负责读源码、分析内容、生成文档。
|
|
9
|
+
|
|
10
|
+
### 1.1 硬规则速查
|
|
11
|
+
|
|
12
|
+
| 编号 | 规则 | 违反后果 |
|
|
13
|
+
|------|------|---------|
|
|
14
|
+
| R1 | 禁止编造,所有内容必须有源码出处 | 文档作废 |
|
|
15
|
+
| R4 | prompt 必须通过 render_prompt 渲染 | 重新构造 |
|
|
16
|
+
| R5 | 每步必须过 Gate | 回退重做 |
|
|
17
|
+
| R6 | 禁止降级补写,失败→拆分重试 | 流程违规 |
|
|
18
|
+
| R8 | 文件清单预提取,子代理不做文件发现 | 子代理空转 |
|
|
19
|
+
| R9 | Write-as-you-go,每 1-2 个包立即写盘 | 超时丢失 |
|
|
20
|
+
| R10 | 锁纪律,无论成功失败必须释放 `.kb-lock` | 死锁 |
|
|
21
|
+
| R11 | 禁止走捷径,不得跳过子代理或合并任务 | 质量降级 |
|
|
22
|
+
|
|
23
|
+
### 1.2 主会话操作边界
|
|
24
|
+
|
|
25
|
+
**允许**:
|
|
26
|
+
- 执行工具链脚本(render_prompt、render_dispatch_plan、extract_file_list、plan_subagents、check_progress、coverage_check)
|
|
27
|
+
- 读取脚本输出的统计数据(文件数、方法数、行数、覆盖率)
|
|
28
|
+
- 创建目录结构、管理锁文件
|
|
29
|
+
- 派发子代理(invokeSubAgent)
|
|
30
|
+
- 读取流程控制文件(step/rules/SKILL)
|
|
31
|
+
|
|
32
|
+
**禁止**:
|
|
33
|
+
- 读取 `.java` 源码文件内容
|
|
34
|
+
- 读取骨架 JSON 的具体条目(统计数字和 summary 除外)
|
|
35
|
+
- 直接写 `knowledge/` 下的 .md 文档
|
|
36
|
+
- 在子代理失败后自己补写文档内容
|
|
37
|
+
- 合并多个子代理为一个以"减少调用次数"
|
|
38
|
+
- 在 Gate 3A 用户确认前执行子代理
|
|
39
|
+
|
|
40
|
+
### 1.3 工具链保障
|
|
41
|
+
|
|
42
|
+
以下信息获取已由工具链自动处理,主会话无需手动操作:
|
|
43
|
+
|
|
44
|
+
| 需求 | 命令 | 说明 |
|
|
45
|
+
|------|------|------|
|
|
46
|
+
| 骨架提取 | `source-kb extract` | 自动选择解析器 |
|
|
47
|
+
| 骨架统计 | `source-kb query stats` | 文件数/方法数/行数 |
|
|
48
|
+
| 文件分类 | `source-kb file-list` | 按 doc-type 预提取 |
|
|
49
|
+
| 覆盖率检查 | `source-kb file-list --coverage-check` | 确认无遗漏 |
|
|
50
|
+
| 低置信度审计 | `source-kb audit` | 识别可能分错的文件 |
|
|
51
|
+
| 全局元数据 | `source-kb metadata` | 术语表 + 依赖摘要 |
|
|
52
|
+
| 分派计划 | `source-kb dispatch` | 一键生成表格 |
|
|
53
|
+
| 过期文件检测 | `source-kb stale-files` | 识别遗留文件 |
|
|
54
|
+
| prompt 渲染 | `source-kb render --mode readwrite` | 自动注入骨架 + 元数据 |
|
|
55
|
+
| 合并后精炼 | `source-kb post-merge` | 去重 + 术语一致性 + 锚点 |
|
|
56
|
+
| 拆分反馈 | `source-kb record-feedback` | 记录质量分数 |
|
|
57
|
+
| 数值抽样 | `source-kb validate sampling` | 枚举值/字段名抽样验证 |
|
|
58
|
+
|
|
59
|
+
## 2. 拆分规则
|
|
60
|
+
|
|
61
|
+
### 2.1 拆分阈值
|
|
62
|
+
|
|
63
|
+
> **唯一规则源**:`core/skeleton/split.py`
|
|
64
|
+
> 判断优先级:**字节数 > 行数 > 文件数**(文件数仅作上限保护)。
|
|
65
|
+
|
|
66
|
+
| 模式 | 字节上限 | 行数上限 | 文件数上限 |
|
|
67
|
+
|------|---------|---------|-----------|
|
|
68
|
+
| Agent(readwrite) | 500KB | 10000 行(business-logic: 6000) | 80/分片 |
|
|
69
|
+
| CLI(output-only) | 300KB | 8000 行(business-logic: 2000) | 80/分片 |
|
|
70
|
+
|
|
71
|
+
### 2.2 智能拆分优先级链
|
|
72
|
+
|
|
73
|
+
拆分决策按以下优先级链执行,前序成功则跳过后续:
|
|
74
|
+
|
|
75
|
+
| 优先级 | 策略 | 条件 | 成本 |
|
|
76
|
+
|--------|------|------|------|
|
|
77
|
+
| 1 | 缓存命中 | 骨架 hash 未变 | 0 |
|
|
78
|
+
| 2 | 社区检测 | 骨架含 imports/fields | 0 |
|
|
79
|
+
| 3 | LLM 智能拆分 | 社区检测无有效方案 | ~$0.01 |
|
|
80
|
+
| 4 | 代码规则拆分 | LLM 失败 | 0 |
|
|
81
|
+
| 5 | 简单拆分 | 以上全部失败 | 0 |
|
|
82
|
+
|
|
83
|
+
**社区检测**(`split_by_community.py`):
|
|
84
|
+
- 从骨架 imports、@Autowired 字段、extends/implements、方法体调用构建依赖图
|
|
85
|
+
- 检测 Kafka topic / Feign client 共享的隐式依赖
|
|
86
|
+
- Louvain 社区检测算法识别高内聚文件组
|
|
87
|
+
- resolution 参数从历史反馈自动优化
|
|
88
|
+
|
|
89
|
+
### 2.3 业务代理拆分(强制)
|
|
90
|
+
|
|
91
|
+
**硬约束**:超过阈值必须拆分,禁止因并发限制降级为单代理。
|
|
92
|
+
|
|
93
|
+
| 模式 | ≤阈值 | 2倍阈值 | 3倍阈值 | >3倍 |
|
|
94
|
+
|------|-------|--------|--------|------|
|
|
95
|
+
| Agent | 1 代理 | 2 代理 | 3 代理 | 4-6 代理 |
|
|
96
|
+
| CLI | 1 代理 | 2 代理 | 3 代理 | 4-6 代理 |
|
|
97
|
+
|
|
98
|
+
```shell
|
|
99
|
+
# 获取拆分方案(通过 dispatch-preview 间接调用 split_plan)
|
|
100
|
+
source-kb dispatch \
|
|
101
|
+
--kb {kb} --module {module_name} --mode {mode}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 2.4 文件清单覆盖验证 + 置信度审计(必须执行)
|
|
105
|
+
|
|
106
|
+
文件清单提取后,必须运行 coverage-check 确认所有文件已被分类(详见 step-02 §2.7):
|
|
107
|
+
|
|
108
|
+
```shell
|
|
109
|
+
source-kb file-list \
|
|
110
|
+
--skeleton "{module_dir}/.meta/skeleton/skeleton.json" \
|
|
111
|
+
--preset "{preset}" --coverage-check \
|
|
112
|
+
--module-dir "{module_dir}" \
|
|
113
|
+
--output "{module_dir}/.meta/file-lists/coverage-report.txt"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Phase A — 未分类文件**:
|
|
117
|
+
- Uncovered = 0 → 继续
|
|
118
|
+
- Uncovered > 0 → 分派子代理分类,追加到 file-lists,规则持久化需用户确认(详见 step-02 §2.7)
|
|
119
|
+
|
|
120
|
+
**Phase B — 低置信度审计**:
|
|
121
|
+
- 运行置信度评估(`find_suspicious_files(entries, preset, threshold=0.7)`)
|
|
122
|
+
- suspicious = 0 → 继续
|
|
123
|
+
- suspicious > 0 → 分派子代理审计,修正 file-lists,写入 exclude_if 规则(详见 step-02 §2.7b)
|
|
124
|
+
|
|
125
|
+
### 2.5 特殊文档拆分
|
|
126
|
+
|
|
127
|
+
| 文档类型 | 拆分条件 | 策略 |
|
|
128
|
+
|---------|---------|------|
|
|
129
|
+
| architecture | 输入 > 20KB | 20-40KB 拆 2,> 40KB 拆 3 |
|
|
130
|
+
| data-models | 骨架 > 100KB | 100-200KB 拆 2,> 200KB 拆 3-4 |
|
|
131
|
+
|
|
132
|
+
### 2.6 全局元数据注入
|
|
133
|
+
|
|
134
|
+
每个分片 prompt 自动注入(由 `render_prompt` 调用 `global_metadata.py`):
|
|
135
|
+
- **术语表**:类名 + JavaDoc 首行,确保各分片术语一致
|
|
136
|
+
- **依赖摘要**:核心类的注入关系图
|
|
137
|
+
- **交叉引用提示**:哪些类属于其他文档类型
|
|
138
|
+
|
|
139
|
+
### 2.7 合并后精炼
|
|
140
|
+
|
|
141
|
+
分片合并后自动执行(`post_merge.py`):
|
|
142
|
+
- 重复段落检测与移除(>80 字符的语义重复)
|
|
143
|
+
- 术语一致性修复(别名→标准名替换)
|
|
144
|
+
- 章节锚点补充(GitHub-style slugify)
|
|
145
|
+
|
|
146
|
+
Agent 模式需手动执行(见 step-03 §3.8)。
|
|
147
|
+
|
|
148
|
+
## 3. 失败恢复
|
|
149
|
+
|
|
150
|
+
### 3.1 状态判定
|
|
151
|
+
|
|
152
|
+
```shell
|
|
153
|
+
source-kb validate consistency \
|
|
154
|
+
--module-dir "{module_dir}" --preset "{preset}" --cleanup
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
| 状态 | 判定条件 | 处理 |
|
|
158
|
+
|------|---------|------|
|
|
159
|
+
| ✅ 完成 | progress 含 DONE + 文档 > 1KB | 跳过 |
|
|
160
|
+
| ⚠️ 空转 | 子代理返回但文档不存在或 < 1KB | 拆分重试 |
|
|
161
|
+
| ⚠️ 中断 | progress 含 START 无 DONE | 拆分重试 |
|
|
162
|
+
| ❌ 报错 | progress 含 ERROR | 分析原因后重试 |
|
|
163
|
+
|
|
164
|
+
### 3.2 恢复策略
|
|
165
|
+
|
|
166
|
+
1. 分析空转原因(输入过大?模型能力不足?偶发?)
|
|
167
|
+
2. 按拆分规则重新拆分 → 再次执行
|
|
168
|
+
3. 连续 2 次空转 → 标记 `FAILED`,继续后续文档
|
|
169
|
+
4. **禁止主会话降级补写**(R6)
|
|
170
|
+
|
|
171
|
+
## 4. 锁协议
|
|
172
|
+
|
|
173
|
+
锁文件:`{knowledge_dir}/.kb-lock`
|
|
174
|
+
|
|
175
|
+
- 获取:写入 `{"pid": <pid>, "timestamp": <time>, "operation": "kb-init"}`
|
|
176
|
+
- 超时:120 分钟(超时 → 视为过期,删除重建)
|
|
177
|
+
- 释放:流程结束(成功或失败)必须删除
|
|
178
|
+
|
|
179
|
+
## 5. 异常交互
|
|
180
|
+
|
|
181
|
+
| 严重级别 | 前缀 | 处理 |
|
|
182
|
+
|---------|------|------|
|
|
183
|
+
| 成功 | ✅ | 继续 |
|
|
184
|
+
| 需决策 | ⚠️ | 暂停,列选项,等用户回复 |
|
|
185
|
+
| 致命 | ❌ | 终止,释放锁,报告原因 |
|
|
186
|
+
|
|
187
|
+
**自动降级**(不询问用户):单个 JAR 下载失败、骨架单文件解析失败、可选文档未触发、空模块跳过。
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Step 1: 范围与准备
|
|
2
|
+
|
|
3
|
+
## 1.1 获取知识库锁
|
|
4
|
+
|
|
5
|
+
按 `rules.md` §4 锁协议获取 `{knowledge_dir}/.kb-lock`,超时 120 分钟。
|
|
6
|
+
|
|
7
|
+
```shell
|
|
8
|
+
# 检查锁文件
|
|
9
|
+
cat "{knowledge_dir}/.kb-lock" 2>/dev/null
|
|
10
|
+
# 不存在或已超时 → 创建
|
|
11
|
+
echo '{"pid": '$$', "timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'", "operation": "kb-init"}' > "{knowledge_dir}/.kb-lock"
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## 1.2 读取配置
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
读取 kb-project.yaml 配置文件
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
从中提取:
|
|
21
|
+
- `knowledge_dir`:知识库输出目录
|
|
22
|
+
- `preset`:语言 preset(如 `java-spring`)
|
|
23
|
+
- `repos`:模块列表(name、url/local、branch、type)
|
|
24
|
+
- `maven_repo`(如有):私服配置
|
|
25
|
+
|
|
26
|
+
## 1.3 配置校验(CP-0)
|
|
27
|
+
|
|
28
|
+
逐项校验,失败按严重级别处理:
|
|
29
|
+
|
|
30
|
+
| 检查项 | 校验方式 | 失败处理 |
|
|
31
|
+
|--------|---------|---------|
|
|
32
|
+
| `knowledge_dir` 可写 | 尝试创建目录 | ❌ 致命:提示修改路径 |
|
|
33
|
+
| `preset` 存在 | 检查 `presets/{preset}/` | ❌ 致命:列出可用 preset |
|
|
34
|
+
| Python 版本 3.10-3.12 | `py -3.12 --version` 或 `python3 --version` | ❌ 致命:tree-sitter-languages 不支持 3.13+,提示安装 3.12 |
|
|
35
|
+
| `tree-sitter-languages` 已安装 | `py -3.12 -c "import tree_sitter_languages"` | ❌ 致命:提示 `py -3.12 -m pip install tree-sitter-languages` |
|
|
36
|
+
| `maven_repo.url` 可达 | HTTP HEAD(5s 超时) | ⚠️ 询问用户(跳过/修正/终止) |
|
|
37
|
+
| `maven_repo.auth` 有效 | 认证请求 | ⚠️ 询问用户 |
|
|
38
|
+
|
|
39
|
+
> **Python 版本约束**:`tree-sitter-languages` 仅支持 Python 3.10-3.12。Windows 上使用 `py -3.12` 启动器,Linux/macOS 使用 `python3.12`。`source-kb` CLI 命令已通过 `pip install source-kb` 安装,直接使用 `source-kb {subcommand}` 即可。
|
|
40
|
+
|
|
41
|
+
> **tree-sitter 是质量底线**:没有 tree-sitter,骨架提取会降级到 regex,导致:
|
|
42
|
+
> - 无 imports 数据 → 无依赖图 → 无社区检测拆分
|
|
43
|
+
> - 无 annotation_values → 无 Kafka/Feign 隐式依赖检测
|
|
44
|
+
> - 无 JavaDoc 提取 → 无全局术语表
|
|
45
|
+
> - 方法边界不准确 → 复杂度评分失真
|
|
46
|
+
|
|
47
|
+
## 1.4 确定范围
|
|
48
|
+
|
|
49
|
+
- 用户指定 `--kb` → 直接使用
|
|
50
|
+
- 未指定 → 列出可用知识库让用户选择
|
|
51
|
+
- 用户指定 `--module` → 单模块模式
|
|
52
|
+
- 未指定 → 全自动执行所有模块
|
|
53
|
+
|
|
54
|
+
## Gate 1 检查清单
|
|
55
|
+
|
|
56
|
+
- [ ] `.kb-lock` 已创建
|
|
57
|
+
- [ ] `kb-project.yaml` 配置有效
|
|
58
|
+
- [ ] `tree-sitter-languages` 已安装(质量底线)
|
|
59
|
+
- [ ] 目标知识库和模块列表已确定
|
|
60
|
+
- [ ] preset 目录存在
|
|
61
|
+
|
|
62
|
+
全部通过 → 加载 `step-02-source.md`
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
# Step 2: 源码获取与骨架提取
|
|
2
|
+
|
|
3
|
+
## 执行顺序总览
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
2.1 获取源码 [必须]
|
|
7
|
+
→ 2.2 源码构建 [条件: build.enabled=true]
|
|
8
|
+
→ 2.3 依赖解析 [条件: 有 maven_repo]
|
|
9
|
+
→ 2.4 提取骨架 [必须]
|
|
10
|
+
→ 2.5 依赖骨架 [条件: 有 deps 目录]
|
|
11
|
+
→ 2.6 文件清单提取 [必须]
|
|
12
|
+
→ 2.7 未分类文件处理 [必须]
|
|
13
|
+
→ 2.8 覆盖率预检 [必须]
|
|
14
|
+
→ 2.9 全局元数据预生成 [必须]
|
|
15
|
+
→ 2.10 兄弟模块依赖 [必须]
|
|
16
|
+
→ Gate 2
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 条件步骤速查
|
|
20
|
+
|
|
21
|
+
| 步骤 | 执行条件 | 不满足时输出 |
|
|
22
|
+
|------|---------|-------------|
|
|
23
|
+
| 2.2 | `preset.yaml` → `build.enabled: true` | `[跳过] 2.2:build.enabled=false` |
|
|
24
|
+
| 2.3 | `kb-project.yaml` 含 `maven_repo` | `[跳过] 2.3:无 maven_repo 配置` |
|
|
25
|
+
| 2.5 | `.source-cache/{module}-deps/` 存在 | `[跳过] 2.5:无依赖源码` |
|
|
26
|
+
|
|
27
|
+
### 必须执行清单(Agent 逐条对照)
|
|
28
|
+
|
|
29
|
+
- [ ] 2.1 获取源码 + CP-1
|
|
30
|
+
- [ ] 2.4 提取骨架 + CP-3
|
|
31
|
+
- [ ] 2.6 文件清单提取(全部 doc-type)
|
|
32
|
+
- [ ] 2.7 未分类文件处理(coverage-check → Uncovered=0)
|
|
33
|
+
- [ ] 2.7b 低置信度分类审计(suspicious=0 或已修正)
|
|
34
|
+
- [ ] 2.8 覆盖率预检
|
|
35
|
+
- [ ] 2.9 全局元数据预生成(`.meta/global-metadata.md`)
|
|
36
|
+
- [ ] 2.10 兄弟模块依赖
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 2.1 获取源码 [必须]
|
|
41
|
+
|
|
42
|
+
### 多仓库模式(默认)
|
|
43
|
+
|
|
44
|
+
```shell
|
|
45
|
+
git clone --depth 1 --single-branch -b {branch} "{url_or_local}" ".source-cache/{module_name}"
|
|
46
|
+
# 已存在时:
|
|
47
|
+
git -C ".source-cache/{module_name}" pull
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 单仓库多模块模式(`structure: "monorepo"`)
|
|
51
|
+
|
|
52
|
+
仓库只 clone 一次到 `.source-cache/{repo_name}/`,后续各模块共享同一份源码:
|
|
53
|
+
|
|
54
|
+
```shell
|
|
55
|
+
# 首次 clone(整个仓库)
|
|
56
|
+
git clone --depth 1 --single-branch -b {branch} "{url}" ".source-cache/{repo_name}"
|
|
57
|
+
# 已存在时:
|
|
58
|
+
git -C ".source-cache/{repo_name}" pull
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
各模块的源码路径为 `.source-cache/{repo_name}/{module_path}`(`module_path` 来自 `kb-project.yaml` 的 `modules[].path`)。
|
|
62
|
+
|
|
63
|
+
> **跨平台**:PowerShell 中去掉 `#` 注释行。
|
|
64
|
+
|
|
65
|
+
安全校验:`{module_name}` 不得含 `..`、`/`、`\`。
|
|
66
|
+
|
|
67
|
+
**CP-1 检查**:
|
|
68
|
+
|
|
69
|
+
| 结果 | 处理 |
|
|
70
|
+
|------|------|
|
|
71
|
+
| `.git` 存在 + 源码文件 > 0 | ✅ 继续 |
|
|
72
|
+
| `.git` 存在 + 源码文件 = 0 | ⚠️ 询问用户 |
|
|
73
|
+
| `.git` 不存在 | ❌ 询问用户 |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 2.2 源码构建 [条件: `build.enabled: true`]
|
|
78
|
+
|
|
79
|
+
> 不满足条件 → 输出 `[跳过] 2.2:build.enabled=false`,进入 2.3
|
|
80
|
+
|
|
81
|
+
```shell
|
|
82
|
+
cd ".source-cache/{module_name}"
|
|
83
|
+
mvn compile -DskipTests -q
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
| 结果 | 处理 |
|
|
87
|
+
|------|------|
|
|
88
|
+
| exit 0 | ✅ jQAssistant 可用 |
|
|
89
|
+
| exit ≠ 0 / 超时 | ⚠️ 不阻塞,降级到 tree-sitter |
|
|
90
|
+
| 无 pom.xml | 跳过 |
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 2.3 依赖解析 [条件: 有 `maven_repo`]
|
|
95
|
+
|
|
96
|
+
> 不满足条件 → 输出 `[跳过] 2.3:无 maven_repo 配置`,进入 2.4
|
|
97
|
+
|
|
98
|
+
详见 `presets/{preset}/workflow-extensions.md` §1。
|
|
99
|
+
|
|
100
|
+
**CP-2**:`resolve_jar_sources.py` 输出 JSON 的 `status`/`failed`。部分失败 → ⚠️ 询问用户。
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 2.4 提取骨架 [必须]
|
|
105
|
+
|
|
106
|
+
根据文件数选择模式:
|
|
107
|
+
|
|
108
|
+
| 文件数 | 模式 | 命令 |
|
|
109
|
+
|--------|------|------|
|
|
110
|
+
| < 50 | 单文件 | `--compact` |
|
|
111
|
+
| 50-150 | 按包分片 | `--split-by-package` |
|
|
112
|
+
| > 150 | 概要 + 完整 | `--summary` 然后 `--compact` |
|
|
113
|
+
|
|
114
|
+
```shell
|
|
115
|
+
# > 150 文件时执行两次:
|
|
116
|
+
source-kb extract \
|
|
117
|
+
--repo "{repo}" --preset {preset} --summary \
|
|
118
|
+
--output "{module_dir}"
|
|
119
|
+
|
|
120
|
+
source-kb extract \
|
|
121
|
+
--repo "{repo}" --preset {preset} \
|
|
122
|
+
--output "{module_dir}"
|
|
123
|
+
|
|
124
|
+
# < 150 文件时执行一次(默认 compact):
|
|
125
|
+
source-kb extract \
|
|
126
|
+
--repo "{repo}" --preset {preset} \
|
|
127
|
+
--output "{module_dir}"
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
> **单仓库多模块**:添加 `--subpath {module_path}` 限定提取范围到模块子目录。
|
|
131
|
+
> 例如:`--subpath services/user-service`。骨架中的文件路径为模块相对路径。
|
|
132
|
+
|
|
133
|
+
> **注意**:`--output` 接受的是**模块目录**(如 `knowledge/promotion/promotion-common`),
|
|
134
|
+
> 脚本会自动在 `.meta/skeleton/` 下生成 `skeleton.json` 和 `skeleton-summary.json`。
|
|
135
|
+
|
|
136
|
+
**CP-3 检查**:
|
|
137
|
+
- `status: "ok"` + `methods > 0` → ✅ 继续
|
|
138
|
+
- `methods = 0` → 自动降级(跳过业务文档)
|
|
139
|
+
- 脚本异常 → ❌ 询问用户
|
|
140
|
+
|
|
141
|
+
**骨架大小 → 子代理读取策略**(R2):
|
|
142
|
+
|
|
143
|
+
| 大小 | 读取方式 |
|
|
144
|
+
|------|---------|
|
|
145
|
+
| < 50KB | 直接读 skeleton.json |
|
|
146
|
+
| 50-200KB | 只读 summary.json |
|
|
147
|
+
| > 200KB | 只读 summary,分批 offset/limit |
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 2.5 依赖骨架 [条件: 有 deps 目录]
|
|
152
|
+
|
|
153
|
+
> 不满足条件 → 输出 `[跳过] 2.5:无依赖源码`,进入 2.6
|
|
154
|
+
|
|
155
|
+
详见 `presets/{preset}/workflow-extensions.md` §7。
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 2.6 文件清单提取 [必须]
|
|
160
|
+
|
|
161
|
+
为**所有** doc-type 提取文件清单,同时判断可选文档触发条件。
|
|
162
|
+
|
|
163
|
+
```shell
|
|
164
|
+
# 一次性提取所有类型(bash 示例)
|
|
165
|
+
for DOC_TYPE in source-tree-analysis data-models enums-and-constants business-logic \
|
|
166
|
+
api-contracts architecture utils messaging caching external-integrations \
|
|
167
|
+
scheduled-tasks database-access aop-and-interceptors async-and-events error-handling security observability; do
|
|
168
|
+
source-kb file-list \
|
|
169
|
+
--skeleton "{module_dir}/.meta/skeleton/skeleton.json" \
|
|
170
|
+
--preset "{preset}" --doc-type "$DOC_TYPE" \
|
|
171
|
+
--source-cache ".source-cache/{module_name}" \
|
|
172
|
+
--output "{module_dir}/.meta/file-lists/${DOC_TYPE}.txt"
|
|
173
|
+
done
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**触发判定**:文件数 > 0 → 该文档需要生成。文件数 = 0 → 跳过。
|
|
177
|
+
|
|
178
|
+
> 不要用 grep 检测触发条件。`extract_file_list` 基于骨架注解精确匹配,排除测试文件。
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 2.7 未分类文件处理 [必须]
|
|
183
|
+
|
|
184
|
+
> ⚠️ **此步骤不可跳过。** 未分类文件 = 子代理遗漏源码 = 文档覆盖率不达标。
|
|
185
|
+
|
|
186
|
+
### 执行 coverage-check
|
|
187
|
+
|
|
188
|
+
```shell
|
|
189
|
+
source-kb file-list \
|
|
190
|
+
--skeleton "{module_dir}/.meta/skeleton/skeleton.json" \
|
|
191
|
+
--preset "{preset}" --coverage-check \
|
|
192
|
+
--module-dir "{module_dir}" \
|
|
193
|
+
--output "{module_dir}/.meta/file-lists/coverage-report.txt"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### 判定与处理
|
|
197
|
+
|
|
198
|
+
| 结果 | 处理 |
|
|
199
|
+
|------|------|
|
|
200
|
+
| Uncovered = 0 | ✅ 进入 2.8 |
|
|
201
|
+
| 全部在 `coverage_skip_patterns` 中(如 `.mvn/`) | ✅ 跳过 |
|
|
202
|
+
| 存在非跳过的 Uncovered 文件 | → 执行分类(见下方) |
|
|
203
|
+
|
|
204
|
+
### 分类流程(分派子代理执行)
|
|
205
|
+
|
|
206
|
+
> 主会话是调度员,不直接判断文件归属。分类判断由子代理完成。
|
|
207
|
+
|
|
208
|
+
1. **构建分类 prompt**:主会话从骨架提取未分类文件的摘要(类名、注解、方法名、字段类型、路径),拼接现有分类规则,构建 prompt
|
|
209
|
+
2. **分派子代理**:通过 `invokeSubAgent` 派发分类任务,子代理返回 JSON 格式的分类结果
|
|
210
|
+
3. **追加到 file-lists**(立即执行):主会话将分类结果中的文件路径追加到对应的 `.meta/file-lists/{doc-type}.txt`
|
|
211
|
+
4. **规则持久化**(⚠️ 需用户确认):
|
|
212
|
+
- 向用户展示建议的规则及影响范围
|
|
213
|
+
- 用户确认 → 写入 `presets/{preset}/custom_rules.yaml`
|
|
214
|
+
- 用户拒绝 → 只保留 file-list 追加(仅影响本次执行)
|
|
215
|
+
5. **验证**:重新运行 coverage-check 确认 Uncovered = 0
|
|
216
|
+
|
|
217
|
+
**子代理分类 Prompt 格式**:
|
|
218
|
+
|
|
219
|
+
System:
|
|
220
|
+
```
|
|
221
|
+
你是一个 Java/Spring Boot 源码分类专家。
|
|
222
|
+
对无法被现有规则自动分类的源码文件进行判断。
|
|
223
|
+
每个文件必须归入至少一个分类。优先归入现有分类。
|
|
224
|
+
输出严格 JSON 格式。
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
User(主会话拼接):
|
|
228
|
+
- 现有分类规则摘要(从 preset.yaml 的 file_classification 提取)
|
|
229
|
+
- 未分类文件骨架摘要(每个文件:路径、类名、注解、方法名前8个、字段类型前5个)
|
|
230
|
+
- 输出格式要求(见下方)
|
|
231
|
+
|
|
232
|
+
**子代理输出格式**:
|
|
233
|
+
```json
|
|
234
|
+
{
|
|
235
|
+
"classifications": [
|
|
236
|
+
{
|
|
237
|
+
"file": "com/example/handler/OrderHandler.java",
|
|
238
|
+
"category": "service",
|
|
239
|
+
"reason": "处理订单业务逻辑",
|
|
240
|
+
"rule_suggestion": {
|
|
241
|
+
"target_category": "service",
|
|
242
|
+
"action": "patterns_append",
|
|
243
|
+
"value": "/handler/"
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
]
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**规则精确度要求**(决定是否适合持久化):
|
|
251
|
+
|
|
252
|
+
| 规则类型 | 精确度 | 适合持久化 | 示例 |
|
|
253
|
+
|---------|--------|-----------|------|
|
|
254
|
+
| class_annotations | 高 | ✅ | `@TypeHandler` |
|
|
255
|
+
| field_types | 高 | ✅ | `TypeHandler` |
|
|
256
|
+
| 带包名前缀 pattern | 中 | ⚠️ 需确认 | `/dao/handlers/` |
|
|
257
|
+
| 纯目录名 pattern | 低 | ❌ 不推荐 | `/handlers/` |
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## 2.7b 低置信度分类审计 [必须]
|
|
262
|
+
|
|
263
|
+
> ⚠️ **此步骤不可跳过。** 规则命中但命中错误 = 文件出现在错误的文档中 = 文档质量下降。
|
|
264
|
+
|
|
265
|
+
### 目的
|
|
266
|
+
|
|
267
|
+
2.7 解决"漏网之鱼"(未分类文件),2.7b 解决"错误分类"——规则命中了但命中错了。
|
|
268
|
+
|
|
269
|
+
典型误判场景:
|
|
270
|
+
- `RedisLockHelper.java` 在 `/util/` 路径 → 被归入 util,实际应归 cache
|
|
271
|
+
- `KafkaProducerConfig.java` 在 `/producer/` 路径 → 被归入 kafka,实际是 config
|
|
272
|
+
- `DataSourceConfig.java` 有 `@Data` 注解 → 被归入 model,实际是 config
|
|
273
|
+
|
|
274
|
+
### 执行置信度评估
|
|
275
|
+
|
|
276
|
+
```python
|
|
277
|
+
from core.skeleton.classify import find_suspicious_files
|
|
278
|
+
from core.preset import load_preset
|
|
279
|
+
from core.skeleton.query import load_skeleton
|
|
280
|
+
from pathlib import Path
|
|
281
|
+
|
|
282
|
+
preset = load_preset("{preset}")
|
|
283
|
+
entries = load_skeleton(Path("{module_dir}/.meta/skeleton/skeleton.json"))
|
|
284
|
+
suspicious = find_suspicious_files(entries, preset, threshold=0.7)
|
|
285
|
+
# suspicious: list[ConfidenceEntry],每项有属性:
|
|
286
|
+
# .file: str — 文件路径
|
|
287
|
+
# .categories: list — 命中的分类列表
|
|
288
|
+
# .confidence: float — 置信度分数
|
|
289
|
+
# .match_reasons: list — 命中原因
|
|
290
|
+
# .suspicious_signals: list — 可疑信号
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### 判定与处理
|
|
294
|
+
|
|
295
|
+
| 结果 | 处理 |
|
|
296
|
+
|------|------|
|
|
297
|
+
| suspicious = 0 | ✅ 进入 2.8 |
|
|
298
|
+
| suspicious > 0 | → 分派子代理审计 |
|
|
299
|
+
|
|
300
|
+
### 子代理审计 Prompt
|
|
301
|
+
|
|
302
|
+
**System**:
|
|
303
|
+
```
|
|
304
|
+
你是一个 Java/Spring Boot 源码分类审计专家。
|
|
305
|
+
以下文件已被规则自动分类,但置信度较低。请审查分类是否正确。
|
|
306
|
+
如果正确放入 confirmed,如果错误放入 corrections。
|
|
307
|
+
输出严格 JSON 格式。
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
**User**(由主会话拼接):
|
|
311
|
+
1. 可用分类列表
|
|
312
|
+
2. 每个可疑文件的信息:
|
|
313
|
+
- 文件路径
|
|
314
|
+
- 当前分类 + 命中原因(如 "patterns 兜底")
|
|
315
|
+
- 置信度分数 + 可疑信号
|
|
316
|
+
- 类名、注解、方法名(前6个)、字段类型(前5个)
|
|
317
|
+
|
|
318
|
+
**输出格式**:
|
|
319
|
+
```json
|
|
320
|
+
{
|
|
321
|
+
"corrections": [
|
|
322
|
+
{
|
|
323
|
+
"file": "com/example/util/RedisLockHelper.java",
|
|
324
|
+
"current_category": "util",
|
|
325
|
+
"correct_category": "cache",
|
|
326
|
+
"reason": "核心逻辑是 Redis 分布式锁",
|
|
327
|
+
"rule_suggestion": {
|
|
328
|
+
"target_category": "util",
|
|
329
|
+
"action": "add_exclude_if",
|
|
330
|
+
"condition": "field_types_contains",
|
|
331
|
+
"value": "RedissonClient"
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
],
|
|
335
|
+
"confirmed": ["file1.java", "file2.java"]
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### 结果处理
|
|
340
|
+
|
|
341
|
+
1. **修正文件清单**:将 corrections 中的文件从错误分类的 file-list 移除,添加到正确分类的 file-list
|
|
342
|
+
2. **写入 exclude_if 规则**:将 `rule_suggestion` 写入 `presets/{preset}/custom_rules.yaml`
|
|
343
|
+
3. **验证**:重新运行置信度评估确认无新增低置信度文件
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## 2.8 覆盖率预检 [必须]
|
|
348
|
+
|
|
349
|
+
```shell
|
|
350
|
+
source-kb validate coverage check \
|
|
351
|
+
--skeleton {module_dir}/.meta/skeleton/skeleton.json \
|
|
352
|
+
--docs-dir {module_dir} --type {module_type}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**目的**:
|
|
356
|
+
- 确认每个 public 方法有文档归属
|
|
357
|
+
- 识别 high 复杂度方法(子代理必须读源码的方法)
|
|
358
|
+
|
|
359
|
+
**high 方法识别条件**:
|
|
360
|
+
- `complexity: "high"`
|
|
361
|
+
- 含 Lua 脚本(constants 含 SCRIPT/LUA/ARGV/KEYS)
|
|
362
|
+
- 含内嵌 SQL(constants 含 SELECT/INSERT/UPDATE/DELETE)
|
|
363
|
+
- 分布式 ID/池化(方法名含 generate/pool/allocate/batch 且 line_count > 3)
|
|
364
|
+
- 状态机(branches > 5 且多枚举引用)
|
|
365
|
+
- 复杂 @Bean(line_count > 20)
|
|
366
|
+
- medium 且 line_count > 20
|
|
367
|
+
|
|
368
|
+
> 初始化阶段覆盖率 = 0% 是预期的(尚无文档),此步骤主要提取 high 方法列表。
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## 2.9 全局元数据预生成 [必须]
|
|
373
|
+
|
|
374
|
+
骨架提取完成后,预生成全局元数据文件(术语表 + 依赖摘要),供后续所有子代理 prompt 共享:
|
|
375
|
+
|
|
376
|
+
```shell
|
|
377
|
+
source-kb metadata \
|
|
378
|
+
--module-dir "{module_dir}" --module-name "{module_name}"
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
输出:`{module_dir}/.meta/global-metadata.md`
|
|
382
|
+
|
|
383
|
+
**作用**:避免每个子代理渲染 prompt 时重复加载 2MB+ 骨架 JSON。Step 3 的 `render_prompt` 会自动读取此文件注入 prompt。
|
|
384
|
+
|
|
385
|
+
> CLI 模式由 `PregenerateMetadataStep` 自动执行,Agent 模式需手动执行此命令。
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## 2.10 兄弟模块依赖 [必须]
|
|
390
|
+
|
|
391
|
+
从本模块 pom.xml 提取 `<dependency>` 的 artifactId,与 `kb-project.yaml` 中同知识库的 repos 交叉匹配。
|
|
392
|
+
|
|
393
|
+
匹配到的兄弟模块信息将写入子代理 prompt(通过 render_prompt 自动注入)。
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## Gate 2 检查清单
|
|
398
|
+
|
|
399
|
+
| # | 检查项 | 对应步骤 |
|
|
400
|
+
|---|--------|---------|
|
|
401
|
+
| 1 | 源码已获取(CP-1 通过) | 2.1 |
|
|
402
|
+
| 2 | 骨架已提取且 methods > 0(CP-3 通过) | 2.4 |
|
|
403
|
+
| 3 | 所有 doc-type 文件清单已生成 | 2.6 |
|
|
404
|
+
| 4 | **未分类文件 Uncovered = 0** | 2.7 |
|
|
405
|
+
| 5 | **低置信度文件已审计(无未处理的 corrections)** | 2.7b |
|
|
406
|
+
| 6 | 覆盖率预检完成 + high 方法列表已提取 | 2.8 |
|
|
407
|
+
| 7 | 全局元数据已预生成(`.meta/global-metadata.md` 存在) | 2.9 |
|
|
408
|
+
| 8 | 兄弟模块依赖已识别 | 2.10 |
|
|
409
|
+
|
|
410
|
+
**全部通过 → 加载 `step-03-generate.md`**
|