a6f05ab2d5
- Phase 0: AGENTS.md cleanup (dedup quotes, renumber sections, merge qmd) - Phase 1: typed relations (manage-relations.py, graph-search.py, check-staleness.py, detect-conflicts.py) - Phase 2: frontmatter validator, weekly lint, knowledge promotion, git hooks - Fix .gitignore to track tools/ and .githooks/ - Fix git remote URL (remove plaintext token) - New wiki pages: 504 pages, 34 raw sources
496 lines
14 KiB
Markdown
496 lines
14 KiB
Markdown
# 知识库同步可行性分析与实施计划
|
||
|
||
> **任务目标**:定期将 `D:\TC_UP\home-wiki` 的笔记内容更新到 `D:\Applications\app\kepano-obsidian-main` 仓库
|
||
|
||
---
|
||
|
||
## 一、双仓库结构对比
|
||
|
||
### 1.1 目录结构映射
|
||
|
||
| 源仓库 (D:\TC_UP\home-wiki) | 目标仓库 (kepano-obsidian-main) | 兼容性 |
|
||
|---------------------------|-------------------------------|-------|
|
||
| `concepts/` (12 文件) | `wiki/` (464 文件,概念页) | ✅ 高度兼容 |
|
||
| `entities/` | `References/` + `wiki/` (实体页) | ✅ 可兼容 |
|
||
| `raw/` (48 文件) | `raw/` (480 文件) | ✅ 完全兼容 |
|
||
| `sources/` | `raw/` (已有,需合并) | ✅ 需映射 |
|
||
| `Daily/` | `Daily/` | ✅ 完全兼容 |
|
||
| `Templates/` | `Templates/` | ✅ 需检查冲突 |
|
||
| `MyNotes/` | `Notes/` | ✅ 可映射 |
|
||
| `scripts/` | `tools/scripts/` | ✅ 可兼容 |
|
||
| `04-Tools/` | 无对应(可作为知识卡片) | ⚠️ 需映射 |
|
||
| `syntheses/` | `wiki/` (概念/研究报告) | ✅ 可兼容 |
|
||
| `reports/` | `wiki/archive/` (归档报告) | ⚠️ 需过滤 |
|
||
|
||
### 1.2 核心规范对比
|
||
|
||
| 维度 | home-wiki | kepano-obsidian-main | 兼容性 |
|
||
|------|-----------|---------------------|-------|
|
||
| **Frontmatter** | `type`, `title`, `created`, `updated` | `categories`, `tags`, `created`, `source`, `type` | ⚠️ 格式不同 |
|
||
| **标签体系** | Canonical Tags ( predefined list) | 自由 tags (no whitelist) | ⚠️ 需转换 |
|
||
| **关系类型** | Wikilinks + `→`, `⊍` 符号 | 标准 Wikilinks | ⚠️ 需清理 |
|
||
| **Claims 规范** | 严格 source 追溯 | `[raw:文件名:行号]` 格式 | ⚠️ 需转换 |
|
||
| **文件命名** | 中文优先 | 中英文混合 | ✅ 兼容 |
|
||
| **日期格式** | `YYYY-MM-DD` | `YYYY-MM-DD` | ✅ 兼容 |
|
||
|
||
---
|
||
|
||
## 二、可行性分析
|
||
|
||
### 2.1 技术可行性 ✅ **可行**
|
||
|
||
1. **底层技术栈一致**:两个仓库都使用 Obsidian + Markdown + Git
|
||
2. **核心概念相似**:
|
||
- 都使用 `raw/` 存储原始来源
|
||
- 都使用 `Daily/` 存储日记
|
||
- 都使用概念/实体分离的组织方式
|
||
3. **内容高度互补**:
|
||
- home-wiki: 专注"高等教育 AI",12 个概念页,48 个 raw 文件
|
||
- kepano-obsidian-main: 综合性知识库,464 个 wiki 页面,480 个 raw 文件
|
||
|
||
### 2.2 内容冲突风险 ⚠️ **中等**
|
||
|
||
1. **Frontmatter 格式差异**:
|
||
```yaml
|
||
# home-wiki 格式
|
||
---
|
||
type: concept
|
||
title: 涌现
|
||
created: 2026-05-20
|
||
updated: 2026-05-20
|
||
tags: [phenomenon, systems-theory]
|
||
sources: [raw/articles/原始资料.html]
|
||
---
|
||
|
||
# kepano-obsidian-main 格式
|
||
---
|
||
categories:
|
||
- "[[LLM Wiki]]"
|
||
tags:
|
||
- wiki
|
||
- concept
|
||
created: 2026-06-30
|
||
source: "[[{source-file}]]"
|
||
type: concept
|
||
---
|
||
```
|
||
|
||
2. **关系符号**:home-wiki 使用 `→`, `⊍` 等符号,目标仓库不使用
|
||
3. **Claims 规范**:
|
||
```yaml
|
||
# home-wiki
|
||
claims:
|
||
- text: "事实陈述"
|
||
source: "raw/articles/原始资料.html"
|
||
confidence: 0.9
|
||
|
||
# kepano-obsidian-main
|
||
事实陈述[raw:文件名:行号]
|
||
```
|
||
|
||
### 2.3 数据规模 ⚠️ **需筛选**
|
||
|
||
| 类型 | home-wiki | kepano-obsidian-main | 策略 |
|
||
|------|-----------|---------------------|------|
|
||
| 概念页 | 12 | 177+ | ✅ 全部同步 |
|
||
| 实体页 | ~5 | 120+ | ✅ 全部同步 |
|
||
| 原始来源 | 48 | 480 | ⚠️ 需去重 |
|
||
| Daily | 未知 | 未知 | ✅ 合并 |
|
||
| 模板 | 未知 | 多个 | ⚠️ 需冲突检查 |
|
||
| 工具文档 | 7 | 26+ | ✅ 全部同步 |
|
||
|
||
---
|
||
|
||
## 三、实施计划
|
||
|
||
### 3.1 第一阶段:准备工作(Week 1)
|
||
|
||
#### 3.1.1 冲突检查与映射表创建
|
||
|
||
**任务**:创建 `tools/sync-mapping.json` 映射表
|
||
|
||
```json
|
||
{
|
||
"directoryMapping": {
|
||
"concepts/": "wiki/",
|
||
"entities/": ["wiki/", "References/"],
|
||
"raw/": "raw/",
|
||
"sources/": "raw/",
|
||
"Daily/": "Daily/",
|
||
"Templates/": "Templates/",
|
||
"MyNotes/": "Notes/",
|
||
"scripts/": "tools/scripts/",
|
||
"04-Tools/": "wiki/", // 作为工具知识卡片
|
||
"syntheses/": "wiki/",
|
||
"reports/": "wiki/archive/"
|
||
},
|
||
"tagMapping": {
|
||
"phenomenon": "concept/phenomenon",
|
||
"theory": "concept/theory",
|
||
"technology": "concept/technology",
|
||
"person": "people",
|
||
"organization": "entity/organization",
|
||
"AI-education": "ai/education",
|
||
"higher-ed": "education/higher-ed"
|
||
},
|
||
"conflictFiles": ["AGENTS.md", "SCHEMA.md", "Templates/*.md"]
|
||
}
|
||
```
|
||
|
||
**输出**:
|
||
- `tools/sync-mapping.json` — 目录和标签映射表
|
||
- `tools/sync-conflicts.md` — 冲突文件清单
|
||
|
||
#### 3.1.2 Frontmatter 转换器
|
||
|
||
**任务**:创建 `tools/sync/convert-frontmatter.py`
|
||
|
||
```python
|
||
# 转换规则
|
||
# 1. type: concept → categories: "[[LLM Wiki]]", type: concept
|
||
# 2. tags: [a, b] → tags: [wiki, a, b] (添加 wiki 标签)
|
||
# 3. sources: [...] → source: "[[{primary-source}]]"
|
||
# 4. updated: 删除(目标仓库不使用)
|
||
# 5. claims → 转换为 [raw:文件名:行号] 格式
|
||
# 6. 移除 →, ⊍ 等关系符号,替换为标准 Wikilinks
|
||
```
|
||
|
||
**输出**:
|
||
- `tools/sync/convert-frontmatter.py` — Frontmatter 转换脚本
|
||
- `tools/sync/convert-frontmatter-test.md` — 转换测试样例
|
||
|
||
### 3.2 第二阶段:核心内容同步(Week 2)
|
||
|
||
#### 3.2.1 概念页同步
|
||
|
||
**任务**:同步 `concepts/` → `wiki/`
|
||
|
||
**步骤**:
|
||
1. 读取 `D:\TC_UP\home-wiki\concepts\*.md`
|
||
2. 转换 frontmatter(使用转换器)
|
||
3. 转换关系符号(`→`, `⊍` → 标准 Wikilinks)
|
||
4. 转换 claims(`claims[].text[raw:source]` → `[raw:文件名:行号]`)
|
||
5. 写入 `wiki/`,避免冲突(添加后缀 `_from_homewiki`)
|
||
6. 更新 `wiki/index.md`(添加到核心概念章节)
|
||
|
||
**检查点**:
|
||
- [ ] 12 个概念页全部转换
|
||
- [ ] Frontmatter 格式符合目标仓库规范
|
||
- [ ] Wikilinks 无断链
|
||
- [ ] 索引更新完成
|
||
|
||
#### 3.2.2 实体页同步
|
||
|
||
**任务**:同步 `entities/` → `wiki/` + `References/`
|
||
|
||
**步骤**:
|
||
1. 读取 `D:\TC_UP\home-wiki\entities\*.md`
|
||
2. 根据实体类型分流:
|
||
- `subtype: person` → `wiki/` + `References/People.md` 添加条目
|
||
- `subtype: organization` → `References/` + `wiki/`
|
||
- `subtype: tool` → `wiki/`(工具页)
|
||
3. 转换 frontmatter(使用转换器)
|
||
4. 检查与现有实体页冲突(如郭朝晖是否已存在)
|
||
5. 写入目标位置,更新索引
|
||
|
||
**检查点**:
|
||
- [ ] ~5 个实体页全部转换
|
||
- [ ] 实体类型分类正确
|
||
- [ ] 无重复实体
|
||
- [ ] 索引更新完成
|
||
|
||
### 3.3 第三阶段:原始来源同步(Week 3)
|
||
|
||
#### 3.3.1 raw/ 去重与合并
|
||
|
||
**任务**:合并 `raw/` + `sources/` → `raw/`
|
||
|
||
**步骤**:
|
||
1. 扫描 `D:\TC_UP\home-wiki\raw/` + `sources/`
|
||
2. 计算文件哈希值,去重(避免重复文件)
|
||
3. 对比目标仓库 `raw/`,识别新文件
|
||
4. 创建新文件到 `raw/`(按类型分类:papers/, articles/, transcripts/)
|
||
5. 更新 Wiki 页面的 source 字段
|
||
|
||
**检查点**:
|
||
- [ ] 去重完成
|
||
- [ ] 新文件识别正确
|
||
- [ ] Source 字段更新完成
|
||
|
||
#### 3.3.2 claims 追溯转换
|
||
|
||
**任务**:转换 claims 为 `[raw:文件名:行号]` 格式
|
||
|
||
**步骤**:
|
||
1. 扫描所有 Wiki 页面中的 `claims` 字段
|
||
2. 提取 `claims[].source` 路径
|
||
3. 查找对应的 raw 文件行号
|
||
4. 转换格式:`text[raw:文件名:行号]`
|
||
5. 删除原 `claims` 字段
|
||
|
||
**检查点**:
|
||
- [ ] 所有 claims 转换完成
|
||
- [ ] 行号正确
|
||
- [ ] 溯源格式符合目标仓库规范
|
||
|
||
### 3.4 第四阶段:其他内容同步(Week 4)
|
||
|
||
#### 3.4.1 Daily/ 合并
|
||
|
||
**任务**:合并 `Daily/` → `Daily/`
|
||
|
||
**步骤**:
|
||
1. 扫描 `D:\TC_UP\home-wiki\Daily\*.md`
|
||
2. 按日期去重(同名文件需要合并内容)
|
||
3. 写入目标 `Daily/`
|
||
|
||
**检查点**:
|
||
- [ ] 日记合并完成
|
||
- [ ] 无内容丢失
|
||
|
||
#### 3.4.2 Templates/ 冲突处理
|
||
|
||
**任务**:检查模板文件冲突
|
||
|
||
**步骤**:
|
||
1. 对比两个仓库的模板文件列表
|
||
2. 识别同名文件(如 `Concept Template.md`)
|
||
3. 决策:保留目标仓库模板,或融合两个模板
|
||
|
||
**检查点**:
|
||
- [ ] 冲突识别完成
|
||
- [ ] 融合方案确定
|
||
|
||
#### 3.4.3 工具文档同步
|
||
|
||
**任务**:同步 `04-Tools/` + `scripts/` → `tools/`
|
||
|
||
**步骤**:
|
||
1. 读取 `D:\TC_UP\home-wiki\04-Tools\*.md` + `scripts/`
|
||
2. 写入 `tools/scripts/`
|
||
3. 更新 `wiki/index.md` 工具章节
|
||
|
||
**检查点**:
|
||
- [ ] 工具文档全部同步
|
||
- [ ] 索引更新完成
|
||
|
||
### 3.5 第五阶段:验证与优化(Week 5)
|
||
|
||
#### 3.5.1 Lint 检查
|
||
|
||
**任务**:运行 Wiki Lint 检查
|
||
|
||
**检查项**:
|
||
- [ ] Frontmatter 一致性
|
||
- [ ] Wikilink 连通性
|
||
- [ ] 标签格式
|
||
- [ ] 日期格式
|
||
- [ ] 溯源格式
|
||
|
||
**修复**:
|
||
- 运行 `tools/scripts/wiki-lint-orphan.ps1`
|
||
- 运行 `tools/scripts/wiki-lint-broken-v2.ps1`
|
||
- 运行 `tools/scripts/wiki-lint-fix-type.ps1`
|
||
|
||
#### 3.5.2 交叉引用检查
|
||
|
||
**任务**:检查新 Wiki 页面与现有页面的交叉引用
|
||
|
||
**步骤**:
|
||
1. 扫描新 Wiki 页面的所有 Wikilinks
|
||
2. 检查目标页面是否存在
|
||
3. 如不存在,创建占位页面或删除链接
|
||
4. 更新相关页面的反向链接
|
||
|
||
**检查点**:
|
||
- [ ] 断链修复完成
|
||
- [ ] 反向链接添加完成
|
||
|
||
#### 3.5.3 日志更新
|
||
|
||
**任务**:更新 `wiki/log.md`
|
||
|
||
**步骤**:
|
||
1. 记录同步操作(日期、操作类型、涉及页面)
|
||
2. 记录转换规则(frontmatter、claims、标签)
|
||
3. 记录冲突处理(文件、解决方案)
|
||
|
||
**输出**:
|
||
- `wiki/log.md` 追加同步日志条目
|
||
|
||
---
|
||
|
||
## 四、定期同步机制
|
||
|
||
### 4.1 同步频率
|
||
|
||
| 频率 | 内容 | 负担 |
|
||
|------|------|------|
|
||
| **每日** | Daily/ 日记 | 低 |
|
||
| **每周** | concepts/, entities/, raw/ 新增内容 | 中 |
|
||
| **每月** | 全量检查、去重、Lint | 高 |
|
||
|
||
### 4.2 自动化脚本
|
||
|
||
**方案 1:PowerShell 脚本**
|
||
|
||
```powershell
|
||
# tools/sync/daily-sync.ps1
|
||
# 用途:每日同步 Daily/ 日记
|
||
|
||
$sourcePath = "D:\TC_UP\home-wiki\Daily"
|
||
$targetPath = "D:\Applications\app\kepano-obsidian-main\Daily"
|
||
|
||
Get-ChildItem $sourcePath -Filter "*.md" | ForEach-Object {
|
||
$targetFile = Join-Path $targetPath $_.Name
|
||
if (-not (Test-Path $targetFile)) {
|
||
Copy-Item $_.FullName $targetFile
|
||
Write-Host "Copied $($_.Name)"
|
||
} else {
|
||
Write-Host "Skipped $($_.Name) (exists)"
|
||
}
|
||
}
|
||
```
|
||
|
||
**方案 2:Python 脚本**
|
||
|
||
```python
|
||
# tools/sync/weekly-sync.py
|
||
# 用途:每周同步 concepts/, entities/, raw/
|
||
|
||
import os
|
||
import shutil
|
||
from pathlib import Path
|
||
|
||
MAPPINGS = {
|
||
"concepts": "wiki",
|
||
"entities": ["wiki", "References"],
|
||
"raw": "raw",
|
||
}
|
||
|
||
def sync_directory(source, target, converter=None):
|
||
"""同步目录,可选转换器"""
|
||
for file in Path(source).glob("*.md"):
|
||
target_file = Path(target) / file.name
|
||
if not target_file.exists():
|
||
if converter:
|
||
content = converter(file.read_text())
|
||
target_file.write_text(content)
|
||
else:
|
||
shutil.copy(file, target_file)
|
||
print(f"Synced {file.name}")
|
||
```
|
||
|
||
### 4.3 冲突解决策略
|
||
|
||
| 冲突类型 | 策略 | 优先级 |
|
||
|---------|------|--------|
|
||
| 文件同名 | 添加后缀 `_from_homewiki` | 目标仓库 |
|
||
| Frontmatter 格式 | 转换为目标仓库格式 | 目标仓库 |
|
||
| 标签冲突 | 保留目标仓库标签,融合源仓库标签 | 目标仓库 |
|
||
| Wikilink 断链 | 创建占位页面或删除链接 | 目标仓库 |
|
||
| claims 格式 | 转换为 `[raw:文件名:行号]` | 目标仓库 |
|
||
|
||
---
|
||
|
||
## 五、风险与对策
|
||
|
||
### 5.1 风险识别
|
||
|
||
| 风险 | 概率 | 影响 | 对策 |
|
||
|------|------|------|------|
|
||
| **格式冲突** | 高 | 中 | 提前创建转换器,自动化处理 |
|
||
| **内容重复** | 中 | 低 | 去重脚本,哈希值比对 |
|
||
| **断链风险** | 中 | 高 | Lint 检查,反向链接补充 |
|
||
| **数据丢失** | 低 | 高 | Git 备份,增量同步 |
|
||
| **同步失败** | 中 | 中 | 错误日志,回滚机制 |
|
||
|
||
### 5.2 回滚机制
|
||
|
||
```powershell
|
||
# Git 回滚命令
|
||
git log --oneline -10 # 查看最近 10 次提交
|
||
git reset --hard HEAD~1 # 回滚到上一次提交
|
||
git reflog # 查看所有提交历史
|
||
```
|
||
|
||
---
|
||
|
||
## 六、成功标准
|
||
|
||
### 6.1 定量指标
|
||
|
||
| 指标 | 目标值 | 测量方法 |
|
||
|------|--------|---------|
|
||
| 概念页同步率 | 100% (12/12) | `Get-ChildItem wiki\*_from_homewiki.md | Measure-Object` |
|
||
| 实体页同步率 | 100% (~5/~5) | 人工检查 + grep |
|
||
| raw/ 去重率 | 100% | 哈希值比对 |
|
||
| Lint 错误率 | 0% | 运行 lint 脚本 |
|
||
| Wikilink 断链数 | 0 | 运行断链检测 |
|
||
|
||
### 6.2 定性标准
|
||
|
||
- [ ] 所有同步内容符合目标仓库 Frontmatter 规范
|
||
- [ ] 所有 claims 正确转换为 `[raw:文件名:行号]` 格式
|
||
- [ ] 所有 Wikilink 可正常跳转
|
||
- [ ] 索引页面更新完成,包含新内容
|
||
- [ ] 日志记录完整,可追溯操作历史
|
||
|
||
---
|
||
|
||
## 七、时间表
|
||
|
||
| 阶段 | 任务 | 时间 | 产出 |
|
||
|------|------|------|------|
|
||
| Week 1 | 准备工作(映射表、转换器) | 5 天 | `sync-mapping.json`, `convert-frontmatter.py` |
|
||
| Week 2 | 核心内容同步(概念、实体) | 5 天 | 12 概念页 + ~5 实体页 |
|
||
| Week 3 | 原始来源同步(raw/ 去重、claims 转换) | 5 天 | 48 raw 文件,claims 转换 |
|
||
| Week 4 | 其他内容同步(Daily, Templates, Tools) | 5 天 | Daily, Templates, Tools 同步完成 |
|
||
| Week 5 | 验证与优化(Lint, 交叉引用, 日志) | 5 天 | Lint 通过,索引更新,日志追加 |
|
||
|
||
**总计**:5 周(35 个工作日)
|
||
|
||
---
|
||
|
||
## 八、后续维护
|
||
|
||
### 8.1 日常维护任务
|
||
|
||
- **每日**:运行 `tools/sync/daily-sync.ps1`(同步 Daily/)
|
||
- **每周**:运行 `tools/sync/weekly-sync.py`(同步新增内容)
|
||
- **每月**:运行 Lint 检查 + 去重 + 索引更新
|
||
|
||
### 8.2 定期审查
|
||
|
||
- **每季度**:审查同步脚本的有效性,更新映射表
|
||
- **每半年**:评估同步策略,优化自动化程度
|
||
- **每年**:评估仓库结构,调整同步方向(单向→双向)
|
||
|
||
---
|
||
|
||
## 九、总结
|
||
|
||
### 9.1 可行性结论 ✅ **高度可行**
|
||
|
||
1. **技术兼容**:两个仓库底层技术栈一致(Obsidian + Markdown + Git)
|
||
2. **内容互补**:home-wiki 专注"高等教育 AI",与目标仓库高度互补
|
||
3. **风险可控**:通过转换器、Lint 检查、回滚机制,风险可控
|
||
4. **收益明确**:统一知识库,减少维护负担,提高知识积累效率
|
||
|
||
### 9.2 关键成功因素
|
||
|
||
1. **提前规划**:映射表、转换器、冲突处理策略
|
||
2. **自动化脚本**:减少人工操作,降低错误率
|
||
3. **增量同步**:避免一次性大规模迁移,降低风险
|
||
4. **验证机制**:Lint 检查、交叉引用、日志记录
|
||
|
||
### 9.3 下一步行动
|
||
|
||
1. **立即行动**:创建 `tools/sync-mapping.json` 映射表
|
||
2. **本周任务**:开发 `convert-frontmatter.py` 转换器
|
||
3. **下周任务**:开始核心内容同步(概念页)
|
||
|
||
---
|
||
|
||
*本方案由 opencode 生成,日期:2026-06-30*
|