fa472a06a7
后端: - src/sync/todo-sync.ts: todo.json 单向同步引擎(导入=首次同步,幂等,source_ref 映射, subs 复杂度修正为 easy,旧侧 done 历史事实优先 forceDone) - 依赖自动落位:ready 意图按 deps 落位 blocked,依赖全 done 自动放行, daemon 启动 reconcileDeps 对账,手动绕过会弹回 - 新 API: PATCH projects/:id(autonomy/concurrency)、POST :id/sync、GET /api/agents、 PATCH tasks/:id(title/priority/complexity 重置) - daemon 定时同步(MAESTRO_SYNC_INTERVAL 默认 300s) + project.synced 事件 - priority 语义翻转: P0 最高/P1 默认/P2 最低,取值限 0..2,排序/映射/MCP/CLI 全跟进 - 静态服务发 no-cache 头(修浏览器吃旧 CSS/JS) - schema 迁移: tasks.source_ref / projects.last_sync_at(ensureColumn 平滑升级旧库) 看板: - 全屏预览模式(94vh 读完整方案+就地裁决,Esc/遮罩/裁决自动关闭) - 产出 markdown 渲染为 HTML(零依赖渲染器,转义优先) - 任务树筛选(复杂度/状态分组/关键字)+ 顶栏徽章组(待审批/可执行/执行中,hover 展开) - 依赖可视化:详情 DEPS 区块 + 行内⛓等依赖 + 锚点跳转定位 - 按钮收敛:提交评审/编辑产出移除(CC 经 MCP 操作),界面只留用户动作 - Agent 执行面板 + 项目配置(并发/工作模式)+ 同步按钮 测试:21 个全过(新增 sync 幂等/迁移/patch/依赖落位/对账幂等) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
78 lines
3.4 KiB
SQL
78 lines
3.4 KiB
SQL
-- maestro · SQLite schema v0.1(设计见 DESIGN.md §6/§9)
|
||
PRAGMA journal_mode = WAL;
|
||
PRAGMA foreign_keys = ON;
|
||
|
||
CREATE TABLE IF NOT EXISTS projects (
|
||
id TEXT PRIMARY KEY,
|
||
name TEXT NOT NULL,
|
||
repo_path TEXT NOT NULL UNIQUE,
|
||
default_branch TEXT NOT NULL DEFAULT 'main',
|
||
verify_cmd TEXT,
|
||
autonomy TEXT NOT NULL DEFAULT 'manual', -- manual | auto-easy | auto-approved
|
||
model TEXT,
|
||
concurrency INTEGER NOT NULL DEFAULT 1,
|
||
status TEXT NOT NULL DEFAULT 'active', -- active | paused
|
||
created_at TEXT NOT NULL,
|
||
last_sync_at TEXT -- 最近一次 todo.json 同步时间
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS tasks (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||
parent_id TEXT REFERENCES tasks(id) ON DELETE CASCADE,
|
||
depth INTEGER NOT NULL DEFAULT 1, -- 1..4
|
||
title TEXT NOT NULL,
|
||
complexity TEXT NOT NULL, -- hard | medium | easy
|
||
status TEXT NOT NULL DEFAULT 'init',
|
||
priority INTEGER NOT NULL DEFAULT 1, -- P0 最高 / P1 中 / P2 最低
|
||
deps TEXT NOT NULL DEFAULT '[]', -- JSON array of task ids
|
||
plan TEXT, -- Hard:分析 + 拆解
|
||
spec TEXT, -- Medium:改动 + 理由
|
||
operations TEXT, -- Easy:将执行的操作
|
||
result TEXT, -- JSON TaskResult
|
||
assignee TEXT, -- agent | human
|
||
created_at TEXT NOT NULL,
|
||
updated_at TEXT NOT NULL,
|
||
source_ref TEXT -- 旧 todo 来源标识(todo:17 / todo:17/1A),项目内唯一
|
||
);
|
||
CREATE INDEX IF NOT EXISTS idx_tasks_project ON tasks(project_id, status);
|
||
CREATE INDEX IF NOT EXISTS idx_tasks_parent ON tasks(parent_id);
|
||
CREATE INDEX IF NOT EXISTS idx_tasks_source ON tasks(project_id, source_ref);
|
||
|
||
CREATE TABLE IF NOT EXISTS approvals (
|
||
id TEXT PRIMARY KEY,
|
||
task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
||
gate TEXT NOT NULL, -- plan | spec | exec
|
||
action TEXT NOT NULL, -- accept | reject
|
||
actor TEXT NOT NULL,
|
||
reason TEXT, -- reject 必填
|
||
at TEXT NOT NULL
|
||
);
|
||
CREATE INDEX IF NOT EXISTS idx_approvals_task ON approvals(task_id, at);
|
||
|
||
CREATE TABLE IF NOT EXISTS runs (
|
||
id TEXT PRIMARY KEY,
|
||
task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
||
kind TEXT NOT NULL, -- planner | executor
|
||
worktree TEXT,
|
||
branch TEXT,
|
||
status TEXT NOT NULL, -- started | succeeded | failed | cancelled
|
||
started_at TEXT NOT NULL,
|
||
ended_at TEXT,
|
||
transcript_ref TEXT,
|
||
claude_session_id TEXT,
|
||
error TEXT
|
||
);
|
||
CREATE INDEX IF NOT EXISTS idx_runs_task ON runs(task_id, started_at);
|
||
|
||
-- 追加型事件日志:审计 + 实时看板推送源
|
||
CREATE TABLE IF NOT EXISTS events (
|
||
id TEXT PRIMARY KEY,
|
||
project_id TEXT NOT NULL,
|
||
task_id TEXT,
|
||
type TEXT NOT NULL,
|
||
payload TEXT NOT NULL DEFAULT '{}',
|
||
at TEXT NOT NULL
|
||
);
|
||
CREATE INDEX IF NOT EXISTS idx_events_project ON events(project_id, at);
|