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
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kb-search
|
|
3
|
+
description: |
|
|
4
|
+
源码知识库检索与问答。根据 kb-project.yaml 配置自动识别可用知识库。
|
|
5
|
+
触发词:/kb-search、知识库查询、搜索知识库。
|
|
6
|
+
不适用:知识库初始化(用 kb-init)、增量同步(用 kb-sync)、文档自检(用 kb-audit)。
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 知识库检索与问答
|
|
10
|
+
|
|
11
|
+
两条检索路径:精确问题直读文档(快),模糊问题走向量检索(全)。
|
|
12
|
+
|
|
13
|
+
## 硬规则(所有步骤始终生效,违反任何一条即为失败)
|
|
14
|
+
|
|
15
|
+
- R1: 回答必须基于文档/源码,禁止编造 — 无法确认时写 `⚠️ 待验证`
|
|
16
|
+
- R2: 引用跟踪最多 1 层,不递归 — 跟踪引用中的引用会导致上下文膨胀
|
|
17
|
+
- R3: 大文档(≥2000 行)先读前 100 行目录区域再精确定位,不读全文
|
|
18
|
+
- R4: 来源标注必须包含知识库/模块/文档/章节 — 格式:`📚 来源:{kb}/{module}/{doc} > {section}`
|
|
19
|
+
- R5: 源码兜底时注明"来源:源码直读" — 与文档来源明确区分
|
|
20
|
+
|
|
21
|
+
## 前置
|
|
22
|
+
|
|
23
|
+
1. 读取 `kb-project.yaml`,获取可用知识库列表和 `knowledge_dir`(不存在则引导用户创建)
|
|
24
|
+
2. 读取本 skill 的 `rules.md`(检索规则,~60 行)
|
|
25
|
+
|
|
26
|
+
不再需要读取 `_shared/` 下的任何文件。所有执行规则已内嵌到本文件和 `rules.md` 中。
|
|
27
|
+
|
|
28
|
+
## 流程
|
|
29
|
+
|
|
30
|
+
### 1. 识别知识库
|
|
31
|
+
|
|
32
|
+
从 `kb-project.yaml` 的 `knowledge_bases` 中列出可用知识库。如果用户指定了 `--kb`,直接使用;否则根据问题内容自动选择最相关的知识库。
|
|
33
|
+
|
|
34
|
+
### 2. 路由判断
|
|
35
|
+
|
|
36
|
+
根据问题特征选择检索路径:
|
|
37
|
+
|
|
38
|
+
| 条件 | 路径 |
|
|
39
|
+
|------|------|
|
|
40
|
+
| 问题含具体类名、方法名或模块名 | → 步骤 3(文档直读) |
|
|
41
|
+
| 用户指定了模块(如 `--module point-transaction`) | → 步骤 3(文档直读) |
|
|
42
|
+
| 问题是概念性、流程性、跨模块问题 | → 步骤 4(向量检索) |
|
|
43
|
+
| 无法判断 | → 步骤 4(向量检索) |
|
|
44
|
+
|
|
45
|
+
### 3. 文档直读(精确问题优先路径)
|
|
46
|
+
|
|
47
|
+
直接用 Read 工具读取知识库文档,零脚本调用。
|
|
48
|
+
|
|
49
|
+
**3.1 定位模块**
|
|
50
|
+
|
|
51
|
+
- 用户指定了模块 → 直接定位
|
|
52
|
+
- 问题含模块名 → 匹配 `kb-project.yaml` 中的 repo name
|
|
53
|
+
- 未指定 → 读取 `{knowledge_dir}/` 下各模块的 `index.md` 首段(模块概述),选择最相关的 1-2 个模块
|
|
54
|
+
|
|
55
|
+
**3.2 定位文档**
|
|
56
|
+
|
|
57
|
+
根据问题类型选择目标文档。路由规则基于 preset 的 `doc_types[].search_keywords` 配置:
|
|
58
|
+
|
|
59
|
+
1. 列出 `{knowledge_dir}/{module}/` 下实际存在的 .md 文件
|
|
60
|
+
2. 将用户问题关键词与各文档的 `search_keywords` 匹配,选择最相关的 1-2 个文档
|
|
61
|
+
3. 无匹配时读取 index.md 的文档导航章节确定目标
|
|
62
|
+
|
|
63
|
+
完整路由规则和复合查询路径见 `rules.md`。
|
|
64
|
+
|
|
65
|
+
**3.3 章节定位**
|
|
66
|
+
|
|
67
|
+
文档按标准规范编写(`##` 业务域 → `###` 类名 → `####` 方法名):
|
|
68
|
+
|
|
69
|
+
- 小文档(< 2000 行):直接 Read 全文,在内容中定位
|
|
70
|
+
- 大文档(≥ 2000 行):先 Read 前 100 行(目录/概述区域),根据章节编号用 offset + limit 精确读取目标章节(R3)
|
|
71
|
+
|
|
72
|
+
**3.4 引用跟踪**
|
|
73
|
+
|
|
74
|
+
在目标文档中定位到相关章节后,如果章节内容包含引用链接(`详见 [xxx](./yyy.md#锚点)`),自动跟踪读取被引用文档的对应章节,合并后回答。
|
|
75
|
+
|
|
76
|
+
引用跟踪最多 1 层(R2),不递归跟踪引用中的引用。复合查询路径参考见 `rules.md`。
|
|
77
|
+
|
|
78
|
+
**3.5 回答**
|
|
79
|
+
|
|
80
|
+
基于文档内容回答(R1)。如果文档内容不充分 → 进入步骤 4(向量检索)补充。
|
|
81
|
+
|
|
82
|
+
### 4. 向量检索(模糊问题 / 兜底路径)
|
|
83
|
+
|
|
84
|
+
```shell
|
|
85
|
+
cd "{kb_project_yaml_dir}"
|
|
86
|
+
source-kb search --kb {kb_name} "{query}"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- 检索结果充分 → 直接回答
|
|
90
|
+
- 检索结果不充分 → 进入步骤 5(源码兜底)
|
|
91
|
+
|
|
92
|
+
### 5. 源码兜底
|
|
93
|
+
|
|
94
|
+
当文档直读和向量检索都无法回答时,或用户明确要求查看最新代码时:
|
|
95
|
+
|
|
96
|
+
1. 从 `kb-project.yaml` 获取对应模块的 git 仓库信息(含 `branch`,默认 `main`)
|
|
97
|
+
2. 优先从 `.source-cache/{module}/` 直接 Read 文件(如果缓存存在)
|
|
98
|
+
3. 缓存不存在时用 `git show origin/{branch}:{filepath}` 读取源码
|
|
99
|
+
4. 依赖模块源码(无 origin remote)用 `git show HEAD:{path}` 读取
|
|
100
|
+
5. 单次读取 ≤ 200 行,大文件分段读取
|
|
101
|
+
6. 基于源码内容回答,注明"来源:源码直读"(R5)
|
|
102
|
+
|
|
103
|
+
源码缓存刷新(仅在用户要求最新代码时执行):
|
|
104
|
+
|
|
105
|
+
```shell
|
|
106
|
+
git -C ".source-cache/{module}" fetch origin {branch} && git -C ".source-cache/{module}" reset --hard origin/{branch}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
刷新失败(网络不可达等)→ 警告但继续使用现有缓存,不阻塞查询。
|
|
110
|
+
|
|
111
|
+
### 6. 回答格式
|
|
112
|
+
|
|
113
|
+
```markdown
|
|
114
|
+
[回答内容]
|
|
115
|
+
|
|
116
|
+
📚 来源:{kb_name}/{module_name}/{doc_name} > {section}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
- 标题层级:`#` 文档标题 → `##` 章节 → `###` 子章节
|
|
120
|
+
- 代码块带语言标注(```java、```sql 等)
|
|
121
|
+
- 字段/参数列表用表格呈现
|
|
122
|
+
- 来源标注必须包含知识库/模块/文档/章节(R4)
|
|
123
|
+
|
|
124
|
+
## 降级策略
|
|
125
|
+
|
|
126
|
+
| 场景 | 处理 |
|
|
127
|
+
|------|------|
|
|
128
|
+
| index.md 不存在 | 跳过文档直读,走向量检索 |
|
|
129
|
+
| 目标文档不存在或为空 | 跳过文档直读,走向量检索 |
|
|
130
|
+
| 文档中找不到相关章节 | 走向量检索 |
|
|
131
|
+
| 向量检索无结果 | 走源码兜底 |
|
|
132
|
+
| 源码仓库不可达 | 告知用户,建议检查环境 |
|
|
133
|
+
|
|
134
|
+
## 触发方式
|
|
135
|
+
|
|
136
|
+
- `/kb-search {问题}` — 自动选择知识库
|
|
137
|
+
- `/kb-search --kb crm {问题}` — 指定知识库
|
|
138
|
+
- `/kb-search --kb point --module point-transaction {问题}` — 指定模块
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# kb-search 检索规则
|
|
2
|
+
|
|
3
|
+
> 本文件供主会话在检索过程中参考,~60 行。所有规则自包含,不引用 `_shared/` 文件。
|
|
4
|
+
|
|
5
|
+
## 1. 源码读取规则
|
|
6
|
+
|
|
7
|
+
| 场景 | 方式 |
|
|
8
|
+
|------|------|
|
|
9
|
+
| 缓存存在 | 优先 Read `.source-cache/{module}/` 下的文件 |
|
|
10
|
+
| 缓存不存在 | `git -C {repo} show origin/{branch}:{path}` |
|
|
11
|
+
| 依赖模块(无 origin) | `git show HEAD:{path}` |
|
|
12
|
+
|
|
13
|
+
- 单次读取 ≤ 200 行,大文件按 offset + limit 分段读取
|
|
14
|
+
- 缓存刷新仅在用户要求最新代码时执行,失败不阻塞查询
|
|
15
|
+
|
|
16
|
+
## 2. 文档路由
|
|
17
|
+
|
|
18
|
+
根据 preset 的 `doc_types[].search_keywords` 字段匹配问题关键词到目标文档。
|
|
19
|
+
|
|
20
|
+
路由流程:
|
|
21
|
+
1. 从 `{knowledge_dir}/{module}/` 列出实际存在的 .md 文件
|
|
22
|
+
2. 对每个文件,从 preset 的 doc_types 配置读取 `search_keywords`
|
|
23
|
+
3. 将用户问题与 search_keywords 做关键词匹配,选择最相关的 1-2 个文档
|
|
24
|
+
4. 如果无匹配,读取 index.md 的文档导航章节确定目标
|
|
25
|
+
5. 跨模块问题 → `_shared/cross-module-calls.md`
|
|
26
|
+
|
|
27
|
+
获取当前 preset 的路由映射(`{preset_name}` 从 `kb-project.yaml` 的 `knowledge_bases.{kb}.preset` 字段获取):
|
|
28
|
+
```shell
|
|
29
|
+
python -c "from core.preset import load_preset, get_search_routing; import json; print(json.dumps(get_search_routing(load_preset('{preset_name}')), ensure_ascii=False, indent=2))"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 3. 引用跟踪规则
|
|
33
|
+
|
|
34
|
+
- 最多跟踪 1 层引用,不递归
|
|
35
|
+
- 仅跟踪 `详见 [xxx](./yyy.md#锚点)` 格式的显式引用
|
|
36
|
+
- 跟踪后合并两个来源回答,分别标注出处
|
|
37
|
+
|
|
38
|
+
## 4. 复合查询路径表
|
|
39
|
+
|
|
40
|
+
| 问题类型 | 主文档 | 可能跟踪的引用 |
|
|
41
|
+
|---------|--------|--------------|
|
|
42
|
+
| 业务流程中的缓存细节 | business-logic.md | → caching.md |
|
|
43
|
+
| 业务流程中的消息体 | business-logic.md | → messaging.md |
|
|
44
|
+
| 业务流程中的参数校验 | business-logic.md | → api-contracts.md |
|
|
45
|
+
| 业务流程中的实体字段 | business-logic.md | → data-models.md |
|
|
46
|
+
| 业务流程中的线程池配置 | business-logic.md | → architecture.md |
|
|
47
|
+
| 接口的数据模型 | api-contracts.md | → data-models.md |
|
|
48
|
+
| 接口的错误码定义 | api-contracts.md | → enums-and-constants.md |
|
|
49
|
+
|
|
50
|
+
## 5. 大文件读取策略
|
|
51
|
+
|
|
52
|
+
| 文档大小 | 策略 |
|
|
53
|
+
|---------|------|
|
|
54
|
+
| < 2000 行 | 直接 Read 全文,在内容中定位 |
|
|
55
|
+
| ≥ 2000 行 | 先 Read 前 100 行(目录/概述区域),根据章节编号用 offset + limit 精确读取 |
|
|
56
|
+
|
|
57
|
+
章节定位依据文档标准层级:`##` 业务域 → `###` 类名 → `####` 方法名。
|
|
58
|
+
|
|
59
|
+
## 6. 源码缓存刷新规则
|
|
60
|
+
|
|
61
|
+
- 默认不刷新,使用现有缓存
|
|
62
|
+
- 用户明确要求"最新代码"时才执行 `fetch + reset`
|
|
63
|
+
- 刷新失败 → 警告但继续使用现有缓存,不阻塞查询
|
|
64
|
+
- 刷新命令:`git -C ".source-cache/{module}" fetch origin {branch} && git -C ".source-cache/{module}" reset --hard origin/{branch}`
|
skills/kb-sync/SKILL.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kb-sync
|
|
3
|
+
description: |
|
|
4
|
+
知识库增量同步。监听 git 变动,增量更新知识库文档并重建变动模块索引。
|
|
5
|
+
触发词:/kb-sync、知识库同步、同步知识库、更新知识库。
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 知识库增量同步
|
|
9
|
+
|
|
10
|
+
## 硬规则(所有步骤始终生效,违反任何一条即为失败)
|
|
11
|
+
|
|
12
|
+
- R1: 禁止编造 — 所有内容必须有源码出处,无法确认时写 `⚠️ 待验证`
|
|
13
|
+
- R2: 锁纪律 — `.kb-lock` 超时 30 分钟,无论成功失败必须释放
|
|
14
|
+
- R3: 降级阈值 — 变动文件 > 20 个 → 释放锁,终止 sync,提示用户执行 `/kb-audit`
|
|
15
|
+
- R4: 骨架读取上限 — >50KB 禁止子代理直接读,用 `.skeleton-summary.json`
|
|
16
|
+
- R5: 单次写入 ≤150 行 — 超出分块追加,首次 Write 后续 Edit
|
|
17
|
+
- R6: 每步必须过 Gate — 产出校验通过才能进入下一步,不跳过
|
|
18
|
+
- R7: 基线更新前置条件 — 文档更新 + 覆盖率校验都成功后才更新基线 commit
|
|
19
|
+
|
|
20
|
+
## 前置
|
|
21
|
+
|
|
22
|
+
1. 读取 `kb-project.yaml`
|
|
23
|
+
2. 读取 `presets/{preset}/audit_dimensions.md`(仅 grep 可选文档触发条件,不读全文)
|
|
24
|
+
3. 读取本 skill 的 `rules.md`(主会话调度规则,~80 行)
|
|
25
|
+
|
|
26
|
+
不再需要读取 `_shared/` 下的任何文件。所有执行规则已内嵌到 `rules.md` 和 `steps/` 中。
|
|
27
|
+
|
|
28
|
+
## 工作流
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
Step 1: 检测 ──→ Gate 1 ──→ Step 2: 更新 ──→ Gate 2
|
|
32
|
+
↓
|
|
33
|
+
Step 4: 收尾 ←── Gate 3 ←── Step 3: 校验
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 步骤索引(按需加载,不要一次性读取所有 step 文件)
|
|
37
|
+
|
|
38
|
+
| 步骤 | 文件 | 说明 | Gate 条件 |
|
|
39
|
+
|------|------|------|-----------|
|
|
40
|
+
| Step 1 | steps/step-01-detect.md | 锁获取、pull、变动检测、分类 | 锁已获取 + 变动已分类 + ≤20 文件 |
|
|
41
|
+
| Step 2 | steps/step-02-update.md | 骨架增量、文档更新、引用级联 | 所有目标文档已更新 |
|
|
42
|
+
| Step 3 | steps/step-03-verify.md | 覆盖率校验、共享文档检查 | 覆盖率 ≥80% + 共享文档已检查 |
|
|
43
|
+
| Step 4 | steps/step-04-finalize.md | 索引重建、基线更新、锁释放 | 索引可检索 + 锁已释放 |
|
skills/kb-sync/rules.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# kb-sync 主会话调度规则
|
|
2
|
+
|
|
3
|
+
> 本文件供主会话在调度过程中参考,~80 行。所有规则自包含,不引用外部 `_shared/` 文件。
|
|
4
|
+
|
|
5
|
+
## 1. 主会话 Context 纪律
|
|
6
|
+
|
|
7
|
+
主会话的职责是**调度**,不是**阅读**。
|
|
8
|
+
|
|
9
|
+
### 1.1 禁止读入的内容
|
|
10
|
+
|
|
11
|
+
| 文件 | 正确做法 |
|
|
12
|
+
|------|---------|
|
|
13
|
+
| `_shared/doc-quality-standard.md` | 规则已内嵌到 steps/,主会话不读 |
|
|
14
|
+
| `_shared/doc-subagent-rules.md` | 规则已内嵌到 rules.md + steps/,主会话不读 |
|
|
15
|
+
| `_shared/doc-coverage-shared.md` | 覆盖率命令已写入 step-03,主会话不读 |
|
|
16
|
+
| `audit_dimensions.md` | 只 grep 可选文档触发条件,不读全文 |
|
|
17
|
+
| 骨架 JSON 全文 | 用 `--summary` 或脚本提取摘要 |
|
|
18
|
+
| 已生成文档全文 | 只 grep `^## ` 标题,不读全文 |
|
|
19
|
+
|
|
20
|
+
### 1.2 进度检查频率
|
|
21
|
+
|
|
22
|
+
- 子代理启动后等待 5 分钟再首次检查
|
|
23
|
+
- 之后每 5 分钟检查一次
|
|
24
|
+
- 禁止在等待期间反复 glob 扫描目录
|
|
25
|
+
|
|
26
|
+
## 2. 降级规则
|
|
27
|
+
|
|
28
|
+
| 条件 | 处理 |
|
|
29
|
+
|------|------|
|
|
30
|
+
| 变动文件 > 20 个 | 释放锁 → 终止 sync → 提示用户执行 `/kb-audit --module {module}` |
|
|
31
|
+
| 变动文件 > 10 个(骨架) | 跳过增量 delta,直接全量重新提取骨架 |
|
|
32
|
+
| scan_repos.py 无变动 | 释放锁 → 正常结束,无需后续步骤 |
|
|
33
|
+
|
|
34
|
+
## 3. 锁协议
|
|
35
|
+
|
|
36
|
+
锁文件:`{knowledge_dir}/.kb-lock`
|
|
37
|
+
|
|
38
|
+
- 获取:写入 `{"pid": <pid>, "timestamp": <time>, "operation": "kb-sync"}`
|
|
39
|
+
- 超时:30 分钟(锁文件存在且超时 → 视为过期,删除重建)
|
|
40
|
+
- 释放:流程结束(成功或失败)必须删除 `.kb-lock`
|
|
41
|
+
|
|
42
|
+
## 4. 文档更新顺序(依赖链)
|
|
43
|
+
|
|
44
|
+
当同一批变动同时影响多个文档时,按 `doc_types.yaml` 的 `depends_on` 字段拓扑排序更新。无依赖的文档先更新,有依赖的后更新。
|
|
45
|
+
|
|
46
|
+
获取当前 preset 的更新顺序(`{preset_name}` 从 `kb-project.yaml` 的 `knowledge_bases.{kb}.preset` 字段获取):
|
|
47
|
+
```shell
|
|
48
|
+
python -c "from core.preset import load_preset, get_dependency_chain; print(get_dependency_chain(load_preset('{preset_name}')))"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
原因:
|
|
52
|
+
- 被依赖的文档是下游文档的基础(如 data-models 被 api-contracts、caching、messaging 引用)
|
|
53
|
+
- 中立文档的章节标题变更可能导致下游文档的引用锚点失效
|
|
54
|
+
- 拓扑排序确保更新时引用目标已是最新版本
|
|
55
|
+
|
|
56
|
+
## 5. 异常交互
|
|
57
|
+
|
|
58
|
+
| 严重级别 | 前缀 | 处理 |
|
|
59
|
+
|---------|------|------|
|
|
60
|
+
| 成功 | ✅ | 继续 |
|
|
61
|
+
| 需决策 | ⚠️ | 暂停,列选项,等用户回复 |
|
|
62
|
+
| 致命 | ❌ | 终止,释放锁,报告原因 |
|
|
63
|
+
|
|
64
|
+
自动降级(不询问用户):骨架单文件解析失败、可选文档未触发、空模块跳过。
|
|
65
|
+
|
|
66
|
+
## 6. 源码读取规则
|
|
67
|
+
|
|
68
|
+
- 优先读 `.source-cache/{module}` 下的文件(缓存模式)
|
|
69
|
+
- 缓存不存在时 fallback 到 `git show {commit}:{path}`
|
|
70
|
+
- 禁止直接 clone 或 checkout 到工作目录
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""
|
|
2
|
+
知识库同步 - 模块级/文件级索引重建脚本(通用版)
|
|
3
|
+
|
|
4
|
+
薄包装层:委托给 core.rag.build_index() 统一处理。
|
|
5
|
+
|
|
6
|
+
用法:
|
|
7
|
+
# 模块级全量重建
|
|
8
|
+
python rebuild_module.py --kb my-project --module user-service
|
|
9
|
+
|
|
10
|
+
# 文件级增量重建
|
|
11
|
+
python rebuild_module.py --kb my-project --module user-service --files business-logic.md data-models.md
|
|
12
|
+
|
|
13
|
+
# 指定配置文件
|
|
14
|
+
python rebuild_module.py --config /path/to/kb-project.yaml --kb my-project --module user-service
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import sys
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
sys.stdout.reconfigure(encoding="utf-8") # type: ignore[union-attr]
|
|
21
|
+
|
|
22
|
+
SCRIPT_DIR = Path(__file__).resolve().parent
|
|
23
|
+
PROJECT_ROOT = SCRIPT_DIR.parent.parent.parent # source-kb/
|
|
24
|
+
|
|
25
|
+
if str(PROJECT_ROOT) not in sys.path:
|
|
26
|
+
sys.path.append(str(PROJECT_ROOT))
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
from core.config import load_config, find_config
|
|
30
|
+
except ImportError:
|
|
31
|
+
print("错误:无法导入 core 模块,请确认 source-kb 目录结构完整", file=sys.stderr)
|
|
32
|
+
sys.exit(1)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def rebuild_module(config: dict, kb_name: str, module_name: str, files: list[str] | None = None):
|
|
36
|
+
"""重建模块索引(委托给 core.rag.build_index)"""
|
|
37
|
+
from core.rag import load_documents, chunk_documents, build_index
|
|
38
|
+
|
|
39
|
+
kb_config = config.get_kb(kb_name) if hasattr(config, 'get_kb') else config["knowledge_bases"][kb_name]
|
|
40
|
+
collection_name = kb_config["collection"]
|
|
41
|
+
knowledge_dir = Path(kb_config["knowledge_dir"])
|
|
42
|
+
module_dir = knowledge_dir / module_name
|
|
43
|
+
|
|
44
|
+
if not module_dir.is_dir():
|
|
45
|
+
print(f"错误:模块目录不存在 {module_dir}")
|
|
46
|
+
sys.exit(1)
|
|
47
|
+
|
|
48
|
+
docs = load_documents(knowledge_dir, module=module_name, files=files)
|
|
49
|
+
if not docs:
|
|
50
|
+
print(" 无文档文件")
|
|
51
|
+
return
|
|
52
|
+
|
|
53
|
+
print(f" 加载 {len(docs)} 个文档")
|
|
54
|
+
|
|
55
|
+
chunks = chunk_documents(
|
|
56
|
+
docs,
|
|
57
|
+
size=config.chunk_size if hasattr(config, 'chunk_size') else 512,
|
|
58
|
+
overlap=config.chunk_overlap if hasattr(config, 'chunk_overlap') else 100,
|
|
59
|
+
min_length=config.chunk_min_length if hasattr(config, 'chunk_min_length') else 50,
|
|
60
|
+
)
|
|
61
|
+
print(f" 生成 {len(chunks)} 个分块")
|
|
62
|
+
|
|
63
|
+
build_index(chunks, collection_name, kb_name=kb_name, module=module_name, files=files)
|
|
64
|
+
|
|
65
|
+
print(f"\n完成:{kb_name}/{module_name} 索引重建")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def main():
|
|
69
|
+
"""CLI 入口"""
|
|
70
|
+
import argparse
|
|
71
|
+
|
|
72
|
+
parser = argparse.ArgumentParser(description="模块级/文件级索引重建")
|
|
73
|
+
parser.add_argument("--config", help="kb-project.yaml 路径(默认自动查找)")
|
|
74
|
+
parser.add_argument("--kb", required=True, help="知识库名称")
|
|
75
|
+
parser.add_argument("--module", required=True, help="模块名称")
|
|
76
|
+
parser.add_argument("--files", nargs="+", help="指定重建的 .md 文件列表")
|
|
77
|
+
|
|
78
|
+
args = parser.parse_args()
|
|
79
|
+
|
|
80
|
+
config_path = Path(args.config) if args.config else None
|
|
81
|
+
config = load_config(config_path)
|
|
82
|
+
|
|
83
|
+
rebuild_module(config, args.kb, args.module, args.files)
|
|
84
|
+
|
|
85
|
+
import json as _json
|
|
86
|
+
print(_json.dumps({"status": "ok", "kb": args.kb, "module": args.module}, ensure_ascii=False))
|
|
87
|
+
sys.exit(0)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
if __name__ == "__main__":
|
|
91
|
+
main()
|