@@ -34,24 +34,22 @@ CREATE TABLE team_members (
3434);
3535
3636CREATE TABLE tags (
37- project_id INTEGER NOT NULL,
38- graph TEXT NOT NULL,
39- entity_id INTEGER NOT NULL,
40- tag TEXT NOT NULL,
41- PRIMARY KEY (project_id, graph, entity_id, tag)
37+ id INTEGER PRIMARY KEY AUTOINCREMENT,
38+ project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
39+ name TEXT NOT NULL,
40+ UNIQUE(project_id, name)
4241);
43- CREATE INDEX idx_tags_tag ON tags(tag);
44- CREATE INDEX idx_tags_entity ON tags(graph, entity_id);
42+ CREATE INDEX idx_tags_project ON tags(project_id);
4543
4644CREATE TABLE attachments (
4745 id INTEGER PRIMARY KEY AUTOINCREMENT,
48- project_id INTEGER NOT NULL,
46+ project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE ,
4947 graph TEXT NOT NULL,
5048 entity_id INTEGER NOT NULL,
5149 filename TEXT NOT NULL,
5250 mime_type TEXT NOT NULL,
5351 size INTEGER NOT NULL,
54- data BLOB NOT NULL ,
52+ url TEXT ,
5553 added_at INTEGER NOT NULL DEFAULT (unixepoch('now','subsec') * 1000),
5654 UNIQUE(project_id, graph, entity_id, filename)
5755);
@@ -107,6 +105,14 @@ END;
107105
108106CREATE VIRTUAL TABLE knowledge_vec USING vec0(embedding float[${ EMBEDDING_DIM } ]);
109107
108+ CREATE TRIGGER knowledge_cleanup AFTER DELETE ON knowledge BEGIN
109+ DELETE FROM edges WHERE
110+ (from_graph = 'knowledge' AND from_id = old.id AND project_id = old.project_id) OR
111+ (to_graph = 'knowledge' AND to_id = old.id AND project_id = old.project_id);
112+ DELETE FROM attachments WHERE graph = 'knowledge' AND entity_id = old.id AND project_id = old.project_id;
113+ DELETE FROM knowledge_vec WHERE rowid = old.id;
114+ END;
115+
110116-- =============================================
111117-- Tasks
112118-- =============================================
@@ -150,6 +156,14 @@ END;
150156
151157CREATE VIRTUAL TABLE tasks_vec USING vec0(embedding float[${ EMBEDDING_DIM } ]);
152158
159+ CREATE TRIGGER tasks_cleanup AFTER DELETE ON tasks BEGIN
160+ DELETE FROM edges WHERE
161+ (from_graph = 'tasks' AND from_id = old.id AND project_id = old.project_id) OR
162+ (to_graph = 'tasks' AND to_id = old.id AND project_id = old.project_id);
163+ DELETE FROM attachments WHERE graph = 'tasks' AND entity_id = old.id AND project_id = old.project_id;
164+ DELETE FROM tasks_vec WHERE rowid = old.id;
165+ END;
166+
153167-- =============================================
154168-- Epics
155169-- =============================================
@@ -188,6 +202,14 @@ END;
188202
189203CREATE VIRTUAL TABLE epics_vec USING vec0(embedding float[${ EMBEDDING_DIM } ]);
190204
205+ CREATE TRIGGER epics_cleanup AFTER DELETE ON epics BEGIN
206+ DELETE FROM edges WHERE
207+ (from_graph = 'epics' AND from_id = old.id AND project_id = old.project_id) OR
208+ (to_graph = 'epics' AND to_id = old.id AND project_id = old.project_id);
209+ DELETE FROM attachments WHERE graph = 'epics' AND entity_id = old.id AND project_id = old.project_id;
210+ DELETE FROM epics_vec WHERE rowid = old.id;
211+ END;
212+
191213-- =============================================
192214-- Skills
193215-- =============================================
@@ -231,6 +253,14 @@ END;
231253
232254CREATE VIRTUAL TABLE skills_vec USING vec0(embedding float[${ EMBEDDING_DIM } ]);
233255
256+ CREATE TRIGGER skills_cleanup AFTER DELETE ON skills BEGIN
257+ DELETE FROM edges WHERE
258+ (from_graph = 'skills' AND from_id = old.id AND project_id = old.project_id) OR
259+ (to_graph = 'skills' AND to_id = old.id AND project_id = old.project_id);
260+ DELETE FROM attachments WHERE graph = 'skills' AND entity_id = old.id AND project_id = old.project_id;
261+ DELETE FROM skills_vec WHERE rowid = old.id;
262+ END;
263+
234264-- =============================================
235265-- Code (one table — file nodes + symbol nodes, linked via edges)
236266-- =============================================
@@ -275,6 +305,13 @@ END;
275305
276306CREATE VIRTUAL TABLE code_vec USING vec0(embedding float[${ EMBEDDING_DIM } ]);
277307
308+ CREATE TRIGGER code_cleanup AFTER DELETE ON code BEGIN
309+ DELETE FROM edges WHERE
310+ (from_graph = 'code' AND from_id = old.id AND project_id = old.project_id) OR
311+ (to_graph = 'code' AND to_id = old.id AND project_id = old.project_id);
312+ DELETE FROM code_vec WHERE rowid = old.id;
313+ END;
314+
278315-- =============================================
279316-- Docs (one table — file nodes + chunk nodes, linked via edges)
280317-- =============================================
@@ -311,6 +348,13 @@ END;
311348
312349CREATE VIRTUAL TABLE docs_vec USING vec0(embedding float[${ EMBEDDING_DIM } ]);
313350
351+ CREATE TRIGGER docs_cleanup AFTER DELETE ON docs BEGIN
352+ DELETE FROM edges WHERE
353+ (from_graph = 'docs' AND from_id = old.id AND project_id = old.project_id) OR
354+ (to_graph = 'docs' AND to_id = old.id AND project_id = old.project_id);
355+ DELETE FROM docs_vec WHERE rowid = old.id;
356+ END;
357+
314358-- =============================================
315359-- Files (one table — file nodes + directory nodes, linked via edges)
316360-- =============================================
@@ -335,5 +379,19 @@ CREATE INDEX idx_files_dir ON files(project_id, directory);
335379CREATE INDEX idx_files_kind ON files(project_id, kind);
336380
337381CREATE VIRTUAL TABLE files_vec USING vec0(embedding float[${ EMBEDDING_DIM } ]);
382+
383+ CREATE TRIGGER files_cleanup AFTER DELETE ON files BEGIN
384+ DELETE FROM edges WHERE
385+ (from_graph = 'files' AND from_id = old.id AND project_id = old.project_id) OR
386+ (to_graph = 'files' AND to_id = old.id AND project_id = old.project_id);
387+ DELETE FROM files_vec WHERE rowid = old.id;
388+ END;
389+
390+ -- Tags cleanup: when a tag is deleted, remove its edges
391+ CREATE TRIGGER tags_cleanup AFTER DELETE ON tags BEGIN
392+ DELETE FROM edges WHERE
393+ (from_graph = 'tags' AND from_id = old.id AND project_id = old.project_id) OR
394+ (to_graph = 'tags' AND to_id = old.id AND project_id = old.project_id);
395+ END;
338396` ,
339397} ;
0 commit comments