# Mode Info: 项目碎片信息追踪

## 概述

Obsidian Bot 新增 `mode info`，用于在日常工作中按项目持续收集碎片信息（文字、URL、文件），每条自动生成点评和标签，按周归档到 Obsidian vault。支持对已有条目追加更新、项目进展汇总、关键词搜索。

## 文件结构

```
vault/info/
  butler/
    2026-W12.md
    2026-W11.md
  my-saas/
    2026-W12.md
```

- 项目名 = 子目录名，用户通过 `project <name>` 创建/切换
- 周文件命名：`YYYY-Www.md`（ISO 周编号），不存在时自动创建

## 条目格式

```markdown
### 2026-03-17 14:30 | #ci #性能

> SRE 团队抱怨 CI 流水线每天挂 30 分钟，都卡在 Docker 拉镜像

**点评**: CI 瓶颈在镜像拉取，考虑内网 registry 或 cache 层优化。

---
```

update 追加在 `---` 之前：

```markdown
**更新 2026-03-17**: 已部署内网 registry，等待效果观察。

---
```

## 命令

| 命令 | 作用 |
|------|------|
| `project <name>` | 切换/创建当前活动项目 |
| `（直接发文字/URL/文件）` | 新增一条信息 |
| `update` | 列出最近条目，进入更新模式 |
| `summary` | 汇总当前项目 |
| `summary + <vault路径>` | 汇总 + 融合外部笔记 |
| `list` | 列出所有项目名 |
| `search <关键词>` | 在当前项目搜索 |

## 状态持久化

复用 ObsidianContextStorage，state 字段：

```json
{
  "mode": "info",
  "active_project": "butler",
  "pending_update_entry_index": null
}
```

## 信息处理管线

### 新增

1. 类型检测（URL / Slack 文件 / 纯文本）
2. URL → 复用 NoteIngester 的抓取逻辑；文件 → 下载内容/存路径；纯文本 → 直接用
3. LLM 单次调用生成点评 + 1-3 个标签
4. 格式化为 Markdown 条目，追加到本周文件末尾
5. Slack 回复确认

### Update

1. 读取最近 2 个周文件，解析条目
2. 显示最近 5 条编号列表
3. 用户选序号 → 存入 pending_update_entry_index
4. 用户发补充内容 → LLM 生成更新点评
5. 插入到对应条目 `---` 之前
6. 清除 pending 状态

### Summary

1. 读取当前项目所有周文件（按时间排序）
2. 如有外部笔记路径，读取并拼接
3. LLM 汇总：项目进展时间线 + 待解决问题 + 关键决策

## 代码架构

### 新增文件

`slack_bot/obsidian/info_manager.py`（~300 行）

- `InfoEntry(BaseModel)`: timestamp, tags, raw_content, comment, updates
- `InfoManager`: add_entry, list_recent, update_entry, summarize, search, list_projects
- 内部工具：_get_week_file, _parse_entries, _format_entry, _fetch_url_content, _generate_comment_and_tags

### 修改文件

`slack_bot/obsidian/dispatcher.py`: 注册 MODE_INFO，dispatch() 新增专属分支（与 MODE_NOTE 同级）

## 不做的事

- 不入向量库（碎片信息太短，grep 够用）
- 不跨项目自动关联（V1 只做显式多项目 summary）
- 图片/PDF 只存路径不做 OCR
