**TUI 交互**:
**行为**:
- Refile 前**必须检查**工作区状态
- 脏工作区时拒绝操作,提示用户先提交/暂存
- TUI 提供快捷操作:一键 Commit WIP 或 Stash
- 绝不丢失用户的其他修改
**更新的引用类型**:
| 引用形式 | 示例 | 搜索方式 | 更新方式 |
|----------|------|----------|----------|
| Wiki-style 链接 |
| Frontmatter related |
设计原则:精确引用更新,避免误改
⚠️ **不进行盲目的全文替换**:只更新明确的引用语法,不替换正文中的裸 ID 字符串。
为什么不替换裸 ID?
- 裸 ID 可能出现在非引用上下文:`"历史记录显示 10.001.0001 已于 2023 年完成"`
- 格式说明文本:`"ID 格式为 10.001.0001,其中 10 表示 Area..."`
- 盲目替换会导致语义错误和数据损坏
- 用户若需更新裸 ID,可通过
为什么 related 字段仍需 SQLite?
**SQLite 方案确保**:
- 查询精确定位到
- 解析 JSON 数组后,只替换匹配的元素
- 重新序列化,保证 YAML 格式正确
**Refile 预览模式**:
为避免意外修改,支持
> **注意**:预览中的 "Skipped" 部分提示用户哪些裸 ID 不会被自动更新,用户可根据需要手动处理。
---
## 6. 工作流与回顾
### 6.1 回顾类型
| 类型 | 触发 | 内容 |
|------|------|------|
| 每日 |
| 每周 |
| Inbox |
### 6.2 智能提醒
- 任务接近截止日期时高亮显示
- 资源长期未访问时在回顾中提示
- 阻塞任务链识别和提示
---
## 7. 存储与版本控制
### 7.1 Markdown 格式
**文件命名**:`{Area}.{Category}-{resource-type}-{title}.md`
**Frontmatter 示例**:
### 7.2 文件约束
- 仅允许
- 禁止 图片、视频、音频等二进制文件
- 必须 使用外部链接引用媒体资源
-
### 7.3 Git 集成
- 自动提交:所有 CRUD 操作
- commit 格式:Conventional Commits
- 支持多远程仓库
- 支持 SSH/HTTPS 认证
### 7.4 Git 同步策略
| 时机 | 动作 |
|------|------|
|
| CRUD 操作 |
|
### 7.5 智能冲突合并
**问题**:多端同步时,`modified` 时间戳经常冲突。
**方案**:自定义 Git merge driver + 细粒度字段策略
┌─────────────────────────────────────────────────────────┐
│ ⚠️ Refile 需要干净的工作区 │
├─────────────────────────────────────────────────────────┤
│ 检测到以下未提交的修改: │
│ M 10/001/10.001.0005-note-学习笔记.md │
│ M 20/001/20.001.0003-task-开发任务.md │
│ │
│ 请先提交或暂存这些修改: │
│ [C] 快速提交 (commit -m 'WIP') │
│ [S] 暂存 (git stash) │
│ [Q] 取消 Refile │
└─────────────────────────────────────────────────────────┘
**行为**:
- Refile 前**必须检查**工作区状态
- 脏工作区时拒绝操作,提示用户先提交/暂存
- TUI 提供快捷操作:一键 Commit WIP 或 Stash
- 绝不丢失用户的其他修改
**更新的引用类型**:
| 引用形式 | 示例 | 搜索方式 | 更新方式 |
|----------|------|----------|----------|
| Wiki-style 链接 |
[[10.001.0001]] | Ripgrep | 字符串替换 || Frontmatter related |
related: ["10.001.0001"] | SQLite 索引 | 解析 YAML,更新数组 |设计原则:精确引用更新,避免误改
⚠️ **不进行盲目的全文替换**:只更新明确的引用语法,不替换正文中的裸 ID 字符串。
---
related: ["10.001.0001"] # ← YAML 数组,精确更新 ✓
---
# 设计说明
参考 [[10.001.0001]] 的架构思路... # ← Wiki-style 链接,更新 ✓
任务 10.001.0001 定义了核心接口... # ← 裸 ID,不更新 ✗(可能是历史描述)
为什么不替换裸 ID?
- 裸 ID 可能出现在非引用上下文:`"历史记录显示 10.001.0001 已于 2023 年完成"`
- 格式说明文本:`"ID 格式为 10.001.0001,其中 10 表示 Area..."`
- 盲目替换会导致语义错误和数据损坏
- 用户若需更新裸 ID,可通过
--dry-run 预览后手动处理为什么 related 字段仍需 SQLite?
related 是 YAML 数组格式,直接全文替换可能破坏 YAML 结构:
# 原始
related: ["10.001.0001", "10.002.0003"]
# Ripgrep 替换后可能出现的问题(如果替换逻辑不够精确)
related: ["20.001.0005", "10.002.0003"] # ✓ 正确
related: ["20.001.0005", "20.001.0005"] # ✗ 如果 10.002.0003 也被误改
**SQLite 方案确保**:
- 查询精确定位到
related 字段- 解析 JSON 数组后,只替换匹配的元素
- 重新序列化,保证 YAML 格式正确
**Refile 预览模式**:
为避免意外修改,支持
--dry-run 预览变更:
syn inbox move 00.000.0001 --to work-project --dry-run
# 输出预览:
Will refile: 00.000.0001 → 20.001.0003
Source file:
R inbox/00.000.0001-unprocessed-xxx.md → work-project/20/001/20.001.0003-task-xxx.md
- Frontmatter: jd_number: "00.000.0001" → "20.001.0003"
References to update (2 files):
M personal/10/001/10.001.0005-note-设计笔记.md
- Line 5: related: ["00.000.0001"] → ["20.001.0003"]
- Line 12: [[00.000.0001]] → [[20.001.0003]]
M personal/10/002/10.002.0001-task-开发任务.md
- Line 15: [[00.000.0001]] → [[20.001.0003]]
Skipped (bare IDs not updated):
- personal/10/003/10.003.0001-note-历史记录.md
- Line 8: "任务 00.000.0001 已于 2023 年完成"(裸 ID,需手动处理)
Proceed? [y/N]
> **注意**:预览中的 "Skipped" 部分提示用户哪些裸 ID 不会被自动更新,用户可根据需要手动处理。
---
## 6. 工作流与回顾
### 6.1 回顾类型
| 类型 | 触发 | 内容 |
|------|------|------|
| 每日 |
syn review daily | 今日到期、今日会议、昨日未完成 || 每周 |
syn review weekly | 本周完成、下周计划、项目进度 || Inbox |
syn inbox process | 处理未分类项目 |### 6.2 智能提醒
- 任务接近截止日期时高亮显示
- 资源长期未访问时在回顾中提示
- 阻塞任务链识别和提示
---
## 7. 存储与版本控制
### 7.1 Markdown 格式
**文件命名**:`{Area}.{Category}-{resource-type}-{title}.md`
**Frontmatter 示例**:
---
jd_number: "10.001.0015"
type: task
namespace: work-project
title: "完成项目设计"
status: in-progress
priority: high
due: 2024-01-15
created: 2024-01-01T10:00:00Z
modified: 2024-01-05T14:30:00Z
tags: [design, urgent]
related: ["10.001.0012", "10.002.0003"]
---
### 7.2 文件约束
- 仅允许
.md 文件- 禁止 图片、视频、音频等二进制文件
- 必须 使用外部链接引用媒体资源
-
.gitignore 配置忽略常见二进制格式### 7.3 Git 集成
- 自动提交:所有 CRUD 操作
- commit 格式:Conventional Commits
- 支持多远程仓库
- 支持 SSH/HTTPS 认证
### 7.4 Git 同步策略
| 时机 | 动作 |
|------|------|
|
syn 启动 | git pull --rebase || CRUD 操作 |
git add + git commit ||
syn 退出 / syn sync | git push |### 7.5 智能冲突合并
**问题**:多端同步时,`modified` 时间戳经常冲突。
**方案**:自定义 Git merge driver + 细粒度字段策略
# .gitattributes
*.md merge=synapse-frontmatter
# .git/config 或全局配置
[merge "synapse-frontmatter"]
name = Synapse Frontmatter Merge
driver = syn merge-driver %O %A %B %P