Skip to main content

**TUI 交互**:

  1. **TUI 交互**:
    
    ┌─────────────────────────────────────────────────────────┐
    │ ⚠️  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