新增: 知识图谱Phase1数据层(父②) + 修复 idea list_by_query 占位符(父⑤⑤.1)
父② 数据层(V29): - migrate_v29: tasks +queue/parent_id/content_json + task_links 表+双索引(幂等对标 v14/v24) - TaskRecord 加 3 字段(15→18 列,INSERT/SELECT×6/from_row/struct 同步)+ 8 构造点补默认 - TaskLinkRepo(新文件,CRUD + 循环依赖 BFS depends_on 链检测,14 测) - task_repo list_by_query queue/parent_id 筛选 + get_children + 聚合计数(10 测) - queue DEFAULT 'todo' 向后兼容;task_links 软删保留(无 ON DELETE) idea_repo list_by_query 占位符修复(父⑤⑤.1 引入的潜伏 bug): - 加 deleted_at IS NULL 恒带后 where_clauses.len()+1 偏移 → 非空 status/keyword 查询 rusqlite 错误 - 改 params_vec.len()+1(对标 task_repo ②.2 同款修复,父② agent 发现) df-storage 96 lib + 11 集成测试全过。
This commit is contained in:
@@ -98,10 +98,54 @@ pub struct TaskRecord {
|
||||
/// 老任务无 idea_id → None。#[serde(default)] 兼容旧前端 JSON(无该字段时为 None)。
|
||||
#[serde(default)]
|
||||
pub idea_id: Option<String>,
|
||||
/// 管理维度池标记(知识图谱 Phase 1,V29 列)。与 status(执行维度)正交。
|
||||
/// 取值 backlog(需求池)/todo(待办池)/decision(待决策池)/active(执行中)/done(已完成)。
|
||||
/// DEFAULT 'todo' 保证老任务迁移后取值确定(非 NULL),TaskRecord 字段为 String(非 Option)。
|
||||
/// #[serde(default = "default_queue")] 兼容旧前端 JSON(无该字段时为 "todo")。
|
||||
#[serde(default = "default_queue")]
|
||||
pub queue: String,
|
||||
/// 父任务 ID(知识图谱 Phase 1,V29 列,父任务纵向关联)。
|
||||
/// NULL = 叶子任务(走状态机 advance_task);非空 = 子任务(限制 1 级嵌套,无孙任务,
|
||||
/// 由 IPC 层校验不进 DB 约束)。父任务=容器模型,status 由子任务聚合计算(不走状态机)。
|
||||
/// TEXT NULL 向后兼容,TaskRecord 字段为 Option<String>(老任务无 parent → None)。
|
||||
/// #[serde(default)] 兼容旧前端 JSON(无该字段时为 None)。
|
||||
#[serde(default)]
|
||||
pub parent_id: Option<String>,
|
||||
/// 结构化需求规格 JSON 字符串(知识图谱 Phase 1,V29 列)。
|
||||
/// 结构 { background, acceptance_criteria[], scope[], technical_design, custom_fields }。
|
||||
/// AI 从对话提取填充,执行中用 acceptance_criteria 自检。NULL = 无结构化规格(纯文本 description)。
|
||||
/// TEXT NULL 向后兼容,TaskRecord 字段为 Option<String>。
|
||||
/// #[serde(default, skip_serializing_if = "Option::is_none")] 兼容旧 JSON + 无值不序列化。
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub content_json: Option<String>,
|
||||
pub created_at: String,
|
||||
pub updated_at: String,
|
||||
}
|
||||
|
||||
/// 任务横向关联记录(task_links 表,知识图谱 Phase 1 V29,对标设计 §2.2)。
|
||||
///
|
||||
/// 表达任务间依赖/阻塞/弱关联关系,AI 拓扑排序编排调度的基础。独立表方案替代 JSON 列
|
||||
/// (Idea related_ids 的缺陷:无类型区分/单向/无法高效反向查询)。
|
||||
///
|
||||
/// - `source_id` / `target_id`:关联两端任务 id(FK tasks.id)。软删除语义:Task 软删不
|
||||
/// 级联删 link(对标设计 §2.2 边界「软删除保留」——恢复后关系还在),故无 ON DELETE。
|
||||
/// - `link_type`:关联类型白名单(应用层校验,非 DB 约束):
|
||||
/// - `depends_on`:source 依赖 target(target 完成后 source 才能开始)→ 拓扑排序调度
|
||||
/// - `blocks`:source 阻塞 target(source 不完成则 target 无法推进)→ 依赖的反向声明
|
||||
/// - `relates_to`:弱关联,无执行约束 → 上下文提示
|
||||
/// - `remark`:可选备注。
|
||||
/// - 循环依赖(A→B→A)在 `TaskLinkRepo::create_link` 应用层 BFS 检测拒绝(非 DB 约束,
|
||||
/// 对标设计 D8:task_links 数据量小,检测成本低)。跨项目依赖允许。
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct TaskLinkRecord {
|
||||
pub id: String,
|
||||
pub source_id: String,
|
||||
pub target_id: String,
|
||||
pub link_type: String,
|
||||
pub remark: Option<String>,
|
||||
pub created_at: String,
|
||||
}
|
||||
|
||||
/// 分支记录
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct BranchRecord {
|
||||
@@ -205,6 +249,12 @@ fn default_weight() -> u32 {
|
||||
50
|
||||
}
|
||||
|
||||
/// TaskRecord.queue 的 serde 默认("todo",知识图谱 Phase 1 V29)。老库/缺字段 JSON → "todo"。
|
||||
/// 对齐 DB 列 DEFAULT 'todo' 语义,保证字段始终非空 String。
|
||||
fn default_queue() -> String {
|
||||
"todo".to_string()
|
||||
}
|
||||
|
||||
/// AI 对话记录
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct AiConversationRecord {
|
||||
|
||||
Reference in New Issue
Block a user