# 存储规格 ## Wiki 根目录 所有 wiki 存储在工作目录下的 `.wiki/` 目录中: ``` {项目根目录}/ └── .wiki/ ├── enterprise-annuity/ # 一个研究主题一个目录 ├── charlie-munger/ └── public-fund/ ``` **位置选择逻辑**(按优先级): 1. 如果当前目录有 `.wiki/` → 使用它 2. 如果当前目录有 `.claude/` → 在同级创建 `.wiki/` 3. 如果当前目录是 git repo 根 → 在根目录创建 `.wiki/` 4. 否则 → 在当前目录创建 `.wiki/` **与 .gitignore 的关系**:建议将 `.wiki/` 加入 `.gitignore`(wiki 是个人知识库,不应随项目代码提交)。如果用户希望版本管理 wiki,可以在 `.wiki/` 内单独 `git init`。 ### Obsidian 兼容 `.wiki/` 目录可直接作为 Obsidian vault 打开(`Open folder as vault`): - `[[slug]]` / `[[slug|display]]` → Obsidian Graph View 自动渲染拓扑 - YAML frontmatter → Obsidian Properties 面板,可按 confidence、type 等字段过滤 - `sources/`、`entities/`、`concepts/` 目录 → Obsidian 文件夹视图 **首次创建 `.wiki/` 时**,Agent 应初始化 `.obsidian/` 配置目录,启用图谱着色: ``` .wiki/.obsidian/ ├── graph.json # 图谱配色方案(按 path 和 tag 分组着色) ├── app.json # {} ├── appearance.json # {} └── core-plugins.json # 启用 graph、backlink、properties、tag-pane ``` `graph.json` 预设 5 个颜色分组: | 分组规则 | 颜色 | 说明 | |---------|------|------| | `path:sources/` | 蓝灰 | 源文件 | | `path:entities/` | 青绿 | 实体 | | `path:concepts/` | 翠绿 | 概念 | | `path:analyses/` | 紫色 | 分析 | | `[confidence:contested]` | 红色 | 有争议的节点(Obsidian Properties 语法匹配 frontmatter) | 同时设置: - `showTags: false`(不在图谱中显示 tag 节点——着色靠 `path:` 和 Properties 查询,tag 仅用于搜索过滤) - `showArrow: true`(显示关系方向) - `textFadeMultiplier: -1.5`(默认显示节点标签) - `search: "-path:index -path:log"`(排除 index 和 log 元文件) 如果需要排除 `_report.html` 等生成文件,在 Obsidian Settings → Files & Links → Excluded files 中添加 `_*`。 ### 可视化报告 运行 `python schema.py --report .wiki/{主题}/` 生成 `_report.html`,浏览器打开即可查看: - 统计面板:页面数、类型分布、contested 数 - 交互式关系图:vis-network.js 渲染,可拖拽、缩放 - 数据表:所有结构化数据点(value + unit + period + confidence) - Freshness:按更新日期排序 - Coverage Gaps:孤页、缺失页面 ## 单个 Wiki 的目录结构 ``` .wiki/{主题名}/ ├── data.db # 结构化数据(SQLite,store.py 管理) ├── meta.yaml # Wiki 元数据(本体类型、创建时间、描述) ├── index.md # 页面目录(Agent 自动维护) ├── log.md # 操作日志(append-only) ├── _report.html # 可视化报告(schema.py --report 生成) ├── sources/ # 源文件摘要页(不可变) │ ├── 2026-04-06-policy-doc.md │ └── 2026-04-03-annual-report.md ├── entities/ # 实体页(叙事分析) │ ├── alpha-corp.md │ └── regulatory-agency.md ├── concepts/ # 概念页 │ ├── fiduciary-responsibility.md │ └── portable-annuity.md └── analyses/ # 分析归档页(query 产出) └── market-comparison.md ``` ### 数据分层原则 | 层 | 载体 | 存什么 | 为什么 | |----|------|--------|--------| | **叙事层** | Markdown 页面 | 分析、上下文、wikilink | 人类阅读、Obsidian 浏览 | | **数据层** | data.db (SQLite) | 数值、时序、关系、history | 聚合查询、跨页面对比、时间线 | | **元数据层** | YAML frontmatter | title, type, created, updated, sources, confidence | 页面身份标识 | **Frontmatter 不再存储 `data` 和 `history` 字段。** 所有结构化数据写入 `data.db`。 Frontmatter 只保留:`title`, `type`, `created`, `updated`, `sources`, `confidence`。 `relations` 在 frontmatter 中保留(Obsidian wikilink 渲染需要),同时写入 `data.db`(查询需要)。 ### data.db 初始化 Wiki 创建时,Agent 运行 `python store.py init .wiki/{主题}/` 初始化数据库。 表结构见 `store.py`,包含:`pages`, `data_points`, `history`, `relations`。 ## meta.yaml 每个 wiki 的元信息,创建时写入,后续 lint 时更新统计: ```yaml name: my-research-topic ontology_type: domain # domain | cognitive | general description: 研究主题描述 seed: fibo-pensions # 可选,引用 seeds/ 下的种子文件名 created: 2026-04-06 last_ingest: 2026-04-06 stats: sources: 3 entities: 8 concepts: 5 analyses: 1 total_pages: 17 contested_count: 1 ``` | 字段 | 必填 | 说明 | |------|------|------| | name | 是 | wiki 目录名 | | ontology_type | 是 | domain / cognitive / general | | description | 是 | 一句话描述研究主题 | | seed | 否 | 种子配置名,对应 `seeds/{name}.md`。不设则无种子,wiki 自由生长 | | created | 是 | 创建日期 | | last_ingest | 是 | 最近 ingest 日期(Agent 更新) | | stats | 是 | 页面统计(Agent / lint 更新) | ## 初始化模板 ### 新建 Wiki 时创建的 index.md ```markdown # {主题名} Wiki Index > 0 pages | Created: {日期} | Type: {ontology_type} ## Sources (0) ## Entities (0) ## Concepts (0) ## Analyses (0) ``` ### 新建 Wiki 时创建的 log.md ```markdown # {主题名} Wiki Log ## {日期} — init - Created wiki: {主题名} - Ontology type: {ontology_type} - Description: {描述} ``` ## 文件大小预期 | Wiki 规模 | 源文件数 | 总页面数 | 磁盘占用 | 适用检索方式 | |-----------|---------|---------|---------|------------| | 小 | 1-10 | 5-30 | < 1 MB | grep + 读 index | | 中 | 10-50 | 30-150 | 1-10 MB | grep + 读 index | | 大 | 50-200 | 150-500 | 10-50 MB | 需要升级到索引检索(超出 Skill 范围) | **默认模式上限:~500 页。** 超过后启用 SQLite FTS5 索引(零依赖,Python 自带),支持 BM25 排序和反向链接查询。详见 `scaling.md`。 > 再往上(需要向量检索 / 多用户协作),迁移到外部平台。 ## 跨 Wiki 操作 `query` 默认在单个 wiki 内搜索。如果用户问的问题跨越多个 wiki: ``` 用户:Munger 的投资框架和企业年金领域有什么交叉? Agent: 1. 读 .wiki/ 下的目录列表,识别相关 wiki 2. 分别读 charlie-munger/index.md 和 enterprise-annuity/index.md 3. 在两个 wiki 中搜索相关页面 4. 综合回答,标注来源属于哪个 wiki ``` ## 源文件处理 不同格式的源文件,ingest 时的处理方式: | 格式 | 处理方式 | 说明 | |------|---------|------| | 文本 / Markdown | 直接读取 | 最理想的输入格式 | | PDF | 读取文本内容(Agent 能力范围内) | 复杂排版可能丢失结构 | | Excel / CSV | 读取数据,提取关键指标 | 数值数据写入实体页的"关键数据"段落 | | 用户口述 / 对话文本 | 作为文本 ingest | 标注来源为"口述",confidence 默认 medium | | URL / 网页 | 用 WebFetch 获取内容后 ingest | 标注来源 URL | **Agent 不存储源文件原件**——只存储 source 摘要页。原件由用户自行管理。