#!/usr/bin/env python3 import os import re from pathlib import Path WIKI_DIR = Path(r"D:\Applications\app\kepano-obsidian-main\wiki") OUTPUT_DIR = Path(r"D:\Applications\app\kepano-obsidian-main\raw\教育AI研究\outputs") ORPHAN_FILES = { "LLM Wiki.md": [ "## 核心概念\n\n| 页面 | 简介 |\n|------|------|\n| [[LLM Wiki]] | LLM增量构建持久化知识库的核心模式 |" ], "CMU LearnLab.md": [ "## 核心概念\n\nCMU LearnLab是40年ITS研究先驱,详见 [[CMU LearnLab]]" ], "MIT RAISE.md": [ "## 核心概念\n\nMIT RAISE框架强调终身学习和开源共享,详见 [[MIT RAISE]]" ], "RAG vs 持久化知识库.md": [ "## 核心概念\n\n| 页面 | 简介 |\n|------|------|\n| [[RAG vs 持久化知识库]] | RAG检索模式与Wiki持久化模式的对比分析 |" ], "Contamination Mitigation.md": [ "## 核心概念\n\n| 页面 | 简介 |\n|------|------|\n| [[Contamination Mitigation]] | Steph Ango的Agent工作区隔离概念 |" ], "Idea File 模板.md": [ "## 核心概念\n\n| 页面 | 简介 |\n|------|------|\n| [[Idea File 模板]] | Agent时代的思路分享范式 |" ], "知识库维护自动化.md": [ "## 核心概念\n\n| 页面 | 简介 |\n|------|------|\n| [[知识库维护自动化]] | LLM如何解决知识库维护负担的核心问题 |" ], "CLI工具.md": ["## 相关工具\n\n- [[CLI工具]] - 命令行工具在知识管理中的应用"], "Obsidian使用实践.md": [ "## 工具推荐\n\n- [[Obsidian使用实践]] - Obsidian使用经验分享" ], "Obsidian双链使用经验.md": [ "## 工具推荐\n\n- [[Obsidian双链使用经验]] - Obsidian双链使用技巧" ], "Obsidian哲学.md": ["## 工具推荐\n\n- [[Obsidian哲学]] - Obsidian设计理念"], "Obsidian-skills.md": ["## 工具推荐\n\n- [[Obsidian-skills]] - Obsidian技能市场"], "Obsidian Web Clipper.md": [ "## 工具推荐\n\n- [[Obsidian Web Clipper]] - 网页剪裁工具" ], "Obsidian Marp 插件.md": ["## 工具推荐\n\n- [[Obsidian Marp 插件]] - Marp集成插件"], "Marp 主题与样式.md": ["## 相关页面\n\n详见 [[Marp 主题与样式]]"], "Marp 主题推荐.md": ["## 相关页面\n\n详见 [[Marp 主题推荐]]"], "Marp 优化-快速上手指南.md": ["## 相关页面\n\n详见 [[Marp 优化-快速上手指南]]"], "Marp 导出.md": ["## 相关页面\n\n详见 [[Marp 导出]]"], "Marp 指令语法.md": ["## 相关页面\n\n详见 [[Marp 指令语法]]"], "Marp 模板库.md": ["## 相关页面\n\n详见 [[Marp 模板库]]"], "Andrej Karpathy.md": [ "## 关键人物\n\n| 页面 | 身份 | 来源 |\n|------|------|------|\n| [[Andrej Karpathy]] | AI研究者、LLM Wiki模式提出者 | [[llm-wiki]] |" ], "Emma Brunskill.md": [ "## 关键人物\n\n详见 [[Emma Brunskill]] - 斯坦福AI教育研究领军学者" ], "Steph Ango.md": ["## 关键人物\n\n详见 [[Steph Ango]] - Obsidian创始人"], "Vannevar Bush.md": ["## 关键人物\n\n详见 [[Vannevar Bush]] - Memex概念提出者"], "Victor Lee.md": ["## 关键人物\n\n详见 [[Victor Lee]] - 以人为本AI教育观提出者"], "何伟.md": ["## 相关人物\n\n详见 [[何伟]] - 实地研究中国西部的美国记者"], "临汾城.md": ["## 相关地点\n\n- [[临汾城]] - 山西历史文化名城"], "壶口瀑布.md": ["## 相关地点\n\n- [[壶口瀑布]] - 黄河著名瀑布"], "常家庄园.md": ["## 相关地点\n\n- [[常家庄园]] - 晋商大院"], "榆次老城.md": ["## 相关地点\n\n- [[榆次老城]] - 山西古城"], "海南省.md": ["## 相关地点\n\n- [[海南省]] - 中国最南端省份"], "陶寺遗址.md": ["## 相关地点\n\n- [[陶寺遗址]] - 尧帝都城遗址"], "九边防御.md": ["## 相关历史\n\n- [[九边防御]] - 明代边防体系"], "白登之围.md": ["## 相关历史\n\n- [[白登之围]] - 汉初著名战役"], "大移民洪洞大槐树.md": ["## 相关历史\n\n- [[大移民洪洞大槐树]] - 明代大移民事件"], "长泛区.md": ["## 相关历史\n\n- [[长泛区]] - 抗战时期根据地"], "钓鱼城之战.md": ["## 相关历史\n\n- [[钓鱼城之战]] - 宋元重要战役"], "Stanford Accelerator.md": [ "## 机构档案\n\n详见 [[Stanford Accelerator]] - 斯坦福AI教师赋能项目" ], "牛津CCAI.md": ["## 机构档案\n\n详见 [[牛津CCAI]] - 牛津AI能力中心"], "柯庆施.md": ["## 相关人物\n\n详见 [[柯庆施]] - 中共早期领导人"], "武则天.md": ["## 相关人物\n\n详见 [[武则天]] - 唐朝女皇"], "熊召政.md": ["## 相关人物\n\n详见 [[熊召政]] - 湖北作家"], "贾樟柯.md": ["## 相关人物\n\n详见 [[贾樟柯]] - 山西导演"], "贾跃亭.md": ["## 相关人物\n\n详见 [[贾跃亭]] - 企业家"], "郭兰英.md": ["## 相关人物\n\n详见 [[郭兰英]] - 歌唱家"], "郭凤莲.md": ["## 相关人物\n\n详见 [[郭凤莲]] - 农村代表"], "阎锡山.md": ["## 相关人物\n\n详见 [[阎锡山]] - 山西军阀"], "陈永贵.md": ["## 相关人物\n\n详见 [[陈永贵]] - 大寨代表"], "人物Wiki文件生成规范.md": ["## 规范文档\n\n详见 [[人物Wiki文件生成规范]]"], "地点Wiki文件生成规范.md": ["## 规范文档\n\n详见 [[地点Wiki文件生成规范]]"], "地点笔记文件生成流程总结.md": ["## 规范文档\n\n详见 [[地点笔记文件生成流程总结]]"], "大国大民第二章-一碗老汤话陕西.md": [ "## 大国大民系列\n\n详见 [[大国大民第二章-一碗老汤话陕西]]" ], "大国大民第十一章-阴阳巴蜀.md": [ "## 大国大民系列\n\n详见 [[大国大民第十一章-阴阳巴蜀]]" ], "北魏孝文帝改革.md": ["## 相关历史\n\n详见 [[北魏孝文帝改革]]"], "国土整治.md": ["## 相关概念\n\n详见 [[国土整治]]"], "斯坦福 Accelerator.md": ["## 机构档案\n\n详见 [[斯坦福 Accelerator]]"], } def add_reference_to_file(orphan_file, reference_text): file_path = WIKI_DIR / orphan_file if not file_path.exists(): print(f"NOT FOUND: {orphan_file}") return False try: content = file_path.read_text(encoding="utf-8") ref_text = reference_text[0] if ref_text.strip("-| ") in content: print(f"SKIP: {orphan_file}") return True lines = content.split("\n") insert_pos = len(lines) for i in range(len(lines) - 1, -1, -1): if lines[i].strip().startswith("#"): insert_pos = i + 1 break ref_text = reference_text[0] lines.insert(insert_pos, "") lines.insert(insert_pos + 1, "---") lines.insert(insert_pos + 2, ref_text) new_content = "\n".join(lines) file_path.write_text(new_content, encoding="utf-8") print(f"FIXED: {orphan_file}") return True except Exception as e: print(f"ERROR {orphan_file}: {e}") return False def main(): print(f"START: {len(ORPHAN_FILES)} files") print(f"TARGET: {WIKI_DIR}") print("-" * 50) success_count = 0 for orphan_file, reference_text in ORPHAN_FILES.items(): if add_reference_to_file(orphan_file, reference_text): success_count += 1 print("-" * 50) print(f"DONE: {success_count}/{len(ORPHAN_FILES)} files") report = f"""# 孤立文件修复报告 ## 修复概要 | 指标 | 值 | |------|-----| | 待修复文件 | {len(ORPHAN_FILES)} | | 成功修复 | {success_count} | | 修复率 | {success_count / len(ORPHAN_FILES) * 100:.1f}% | | 修复时间 | {__import__("datetime").datetime.now().strftime("%Y-%m-%d %H:%M:%S")} | ## 修复的文件 {chr(10).join([f"- [[{f}]]" for f in ORPHAN_FILES.keys()])} """ report_path = OUTPUT_DIR / "orphan_files_fix_report.md" report_path.write_text(report, encoding="utf-8") print(f"REPORT: {report_path}") if __name__ == "__main__": main()