Skip to main content

# Synapse (syn) - 需求规格说明书> Synapse - 神经突触,象征知识连接与传递

  1. # Synapse (syn) - 需求规格说明书

    > Synapse - 神经突触,象征知识连接与传递。缩写 syn 简短易记,与知识管理高度契合。

    ---

    ## 1. 引言

    ### 1.1 系统愿景

    Synapse 是一个基于 Python 3 构建的命令行/TUI 工作流管理工具,提供统一的知识与任务管理平台。

    核心理念: "快速捕获、清晰组织、经常回顾、有效执行" (CORE)

    ### 1.2 核心原则

    | 原则 | 描述 |
    |------|------|
    | 快速捕获 | 最小化录入摩擦,新内容默认进入 Inbox |
    | 清晰组织 | Johnny.Decimal 变体 + k8s 风格资源管理 |
    | 经常回顾 | GTD、周期性和智能回顾模式 |
    | 有效执行 | 任务跟踪、状态管理、自动化工作流 |

    ### 1.3 目标用户

    - **个人用户**:知识管理、任务追踪
    - **团队用户**:协作、项目管理
    - 支持个人使用,可扩展到团队协作

    ### 1.4 技术栈

    | 组件 | 选型 | 说明 |
    |------|------|------|
    | TUI | Textual | CSS 布局,鼠标支持,适合 k9s 风格 |
    | 存储 | Markdown | 仅 .md 文件,禁止二进制 |
    | 索引 | SQLite + FTS5 | Sidecar Index,加速查询 |
    | 搜索 | Ripgrep | 全文搜索,高性能 |
    | 文件监听 | watchdog | 实时检测外部修改 |
    | 版本控制 | Git | 本地 + 远程 |
    | 图谱 | Nebula Graph | GraphRAG 就绪(优先级低) |
    | 自动化 | 本地 Hook + GitHub Actions | 本地优先,远程通知 |

    ---

    ## 2. 资源管理

    ### 2.1 资源标识

    **文件路径**(双层分桶:Area → Category):
    
    {namespace}/{Area}/{Category}/{Area.Category.ID}-{resource-type}-{title}.md
    


    **示例**:
    
    personal/10/001/10.001.0001-task-完成报告.md
    personal/10/002/10.002.0001-note-学习笔记.md
    work-project/20/001/20.001.0001-meeting-需求评审.md
    _inbox/00/000/00.000.0001-unprocessed-快速记录.md
    


    | 组件 | 说明 |
    |------|------|
    | namespace | 用户自定义(个人/项目名称),对应目录 |
    | Area | JD 顶级分类(00-99),对应子目录 |
    | Category | Area 内分类(000-999),对应子目录 |
    | ID | Category 内序号(0001-9999) |
    | resource-type | 资源类型(task, note, meeting 等) |
    | title | 资源标题(可包含中文) |

    ### 2.2 资源操作规范

    任何资源被操作时(CRUD):
    - 自动触发 Git 提交
    - 更新 modified 时间戳
    - commit message 遵循 [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
    - 可选使用 LiteLLM 自动生成 commit message

    **commit 类型**:`feat` | fix | docs | refactor | chore | archive

    ### 2.3 Namespace 管理

    Namespace 作为项目/领域的管理容器:
    - 对应目录:`{workspace}/{namespace}/`
    - 可包含配置文件 .synapse.yaml
    - 支持自定义资源类型和 SOP

    ### 2.4 预设资源类型

    #### 2.4.1 类型与字段定义

    | 类型 | 必填字段 | 可选字段 |
    |------|----------|----------|
    | task | title | status, priority, due, start_date, assignee, blocked_by |
    | note | title | status, tags, links |
    | meeting | title, datetime | status, duration, location, attendees, action_items |
    | email | subject | status, from_addr, to_addr, cc, body |
    | contact | name | organization, email, phone, custom_fields |
    | unprocessed | (无) | status*, title, content |

    > \* unprocessedstatus 字段为系统固定值,不可由用户修改(见 §2.4.2)。

    **contact 支持自定义字段**:IP、MAC、微信号等任意键值对。

    #### 2.4.2 状态定义

    | 类型 | 状态字段 | 可选值 | 默认值 |
    |------|----------|--------|--------|
    | task | status | todo, in-progress, done, archived | todo |
    | meeting | status | scheduled, completed, cancelled | scheduled |
    | email | status | unread, read, replied, archived | unread |
    | note | status | active, archived | active |
    | contact | (无状态) | - | - |
    | unprocessed | (固定) | unprocessed | unprocessed |

    > **说明**:`unprocessed` 类型状态不可变,归档时自动转换为 note 类型(见 §5.2)。

    #### 2.4.3 优先级定义(仅 task)

    | 优先级 | 含义 | TUI 颜色 |
    |--------|------|----------|
    | high | 紧急重要 | 🔴 红色 |
    | medium | 一般 | 🟡 黄色 |
    | low | 可延后 | 🟢 绿色 |

    #### 2.4.4 类型颜色标识

    | 类型 | TUI 颜色 | 说明 |
    |------|----------|------|
    | task | 蓝色 | 待办任务 |
    | note | 灰色 | 笔记 |
    | meeting | 紫色 | 会议 |
    | email | 青色 | 邮件 |
    | contact | 橙色 | 联系人 |
    | unprocessed | 白色/默认 | 未处理 |

    ---

    ## 3. Johnny.Decimal 组织结构

    ### 3.1 编号规则

    采用标准 JD 三级结构,便于分桶管理:

    
    Area.Category.ID
     │      │     │
     │      │     └─ 4位数字 (0001-9999)
     │      └─ 3位数字 (000-999)
     └─ 2位数字 (00-99)
    


    **示例**:`10.001.0015` = Area 10 > Category 001 > 第 15 项

    #### 3.1.1 ID 分配器与并发控制

    **问题**:快速连续创建文件(如脚本批量导入)时,获取"下一个可用 ID"存在竞态条件。

    
    # 并发场景示例
    $ for i in {1..100}; do syn new task --title "Task $i" & done
    # 如果无锁机制,多个进程可能拿到相同的 ID
    


    解决方案:SQLite IMMEDIATE 事务 + UNIQUE 约束

    ⚠️ 为什么 `FOR UPDATE` 在空 Category 不起作用?
    - FOR UPDATE 只能锁定 SELECT 返回的行
    - 空 Category 的 MAX() 查询返回零行,无行可锁
    - 多个进程可能同时得到 max_id = 0`,都尝试分配 `0001

    正确方案:BEGIN IMMEDIATE + UNIQUE 约束双重保障