@sudocode-ai/cli 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/cli/feedback-commands.d.ts.map +1 -0
  2. package/dist/cli/feedback-commands.js +274 -0
  3. package/dist/cli/feedback-commands.js.map +1 -0
  4. package/dist/cli/init-commands.d.ts.map +1 -0
  5. package/dist/cli/init-commands.js +148 -0
  6. package/dist/cli/init-commands.js.map +1 -0
  7. package/dist/cli/issue-commands.d.ts.map +1 -0
  8. package/dist/cli/issue-commands.js +310 -0
  9. package/dist/cli/issue-commands.js.map +1 -0
  10. package/dist/cli/query-commands.d.ts.map +1 -0
  11. package/dist/cli/query-commands.js +61 -0
  12. package/dist/cli/query-commands.js.map +1 -0
  13. package/dist/cli/reference-commands.d.ts.map +1 -0
  14. package/dist/cli/reference-commands.js +136 -0
  15. package/dist/cli/reference-commands.js.map +1 -0
  16. package/dist/cli/relationship-commands.d.ts.map +1 -0
  17. package/dist/cli/relationship-commands.js +76 -0
  18. package/dist/cli/relationship-commands.js.map +1 -0
  19. package/dist/cli/server-commands.d.ts.map +1 -0
  20. package/dist/cli/server-commands.js +99 -0
  21. package/dist/cli/server-commands.js.map +1 -0
  22. package/dist/cli/spec-commands.d.ts.map +1 -0
  23. package/dist/cli/spec-commands.js +321 -0
  24. package/dist/cli/spec-commands.js.map +1 -0
  25. package/dist/cli/status-commands.d.ts.map +1 -0
  26. package/dist/cli/status-commands.js +131 -0
  27. package/dist/cli/status-commands.js.map +1 -0
  28. package/dist/cli/sync-commands.d.ts.map +1 -0
  29. package/dist/cli/sync-commands.js +416 -0
  30. package/dist/cli/sync-commands.js.map +1 -0
  31. package/dist/cli/update-commands.d.ts.map +1 -0
  32. package/dist/cli/update-commands.js +78 -0
  33. package/dist/cli/update-commands.js.map +1 -0
  34. package/dist/cli.d.ts.map +1 -0
  35. package/dist/cli.js +425 -195
  36. package/dist/cli.js.map +1 -0
  37. package/dist/db.d.ts.map +1 -0
  38. package/dist/db.js +54 -0
  39. package/dist/db.js.map +1 -0
  40. package/dist/export.d.ts.map +1 -0
  41. package/dist/export.js +195 -0
  42. package/dist/export.js.map +1 -0
  43. package/dist/filename-generator.d.ts.map +1 -0
  44. package/dist/filename-generator.js +93 -0
  45. package/dist/filename-generator.js.map +1 -0
  46. package/dist/id-generator.d.ts.map +1 -0
  47. package/dist/id-generator.js +123 -0
  48. package/dist/id-generator.js.map +1 -0
  49. package/dist/import.d.ts.map +1 -0
  50. package/dist/import.js +608 -0
  51. package/dist/import.js.map +1 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +13 -189
  54. package/dist/index.js.map +1 -0
  55. package/dist/jsonl.d.ts.map +1 -0
  56. package/dist/jsonl.js +333 -0
  57. package/dist/jsonl.js.map +1 -0
  58. package/dist/markdown.d.ts.map +1 -0
  59. package/dist/markdown.js +357 -0
  60. package/dist/markdown.js.map +1 -0
  61. package/dist/migrations.d.ts.map +1 -0
  62. package/dist/migrations.js +57 -0
  63. package/dist/migrations.js.map +1 -0
  64. package/dist/operations/events.d.ts.map +1 -0
  65. package/dist/operations/events.js +108 -0
  66. package/dist/operations/events.js.map +1 -0
  67. package/dist/operations/feedback-anchors.d.ts.map +1 -0
  68. package/dist/operations/feedback-anchors.js +444 -0
  69. package/dist/operations/feedback-anchors.js.map +1 -0
  70. package/dist/operations/feedback.d.ts.map +1 -0
  71. package/dist/operations/feedback.js +234 -0
  72. package/dist/operations/feedback.js.map +1 -0
  73. package/dist/operations/index.d.ts.map +1 -0
  74. package/dist/operations/index.js +10 -0
  75. package/dist/operations/index.js.map +1 -0
  76. package/dist/operations/issues.d.ts.map +1 -0
  77. package/dist/operations/issues.js +411 -0
  78. package/dist/operations/issues.js.map +1 -0
  79. package/dist/operations/references.d.ts.map +1 -0
  80. package/dist/operations/references.js +117 -0
  81. package/dist/operations/references.js.map +1 -0
  82. package/dist/operations/relationships.d.ts.map +1 -0
  83. package/dist/operations/relationships.js +236 -0
  84. package/dist/operations/relationships.js.map +1 -0
  85. package/dist/operations/specs.d.ts.map +1 -0
  86. package/dist/operations/specs.js +290 -0
  87. package/dist/operations/specs.js.map +1 -0
  88. package/dist/operations/tags.d.ts.map +1 -0
  89. package/dist/operations/tags.js +127 -0
  90. package/dist/operations/tags.js.map +1 -0
  91. package/dist/operations/transactions.d.ts.map +1 -0
  92. package/dist/operations/transactions.js +111 -0
  93. package/dist/operations/transactions.js.map +1 -0
  94. package/dist/sync.d.ts.map +1 -0
  95. package/dist/sync.js +442 -0
  96. package/dist/sync.js.map +1 -0
  97. package/dist/test-schema.d.ts.map +1 -0
  98. package/dist/test-schema.js +46 -0
  99. package/dist/test-schema.js.map +1 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +7 -0
  102. package/dist/types.js.map +1 -0
  103. package/dist/update-checker.d.ts.map +1 -0
  104. package/dist/update-checker.js +151 -0
  105. package/dist/update-checker.js.map +1 -0
  106. package/dist/version.d.ts.map +1 -0
  107. package/dist/version.js +23 -0
  108. package/dist/version.js.map +1 -0
  109. package/dist/watcher.d.ts.map +1 -0
  110. package/dist/watcher.js +438 -0
  111. package/dist/watcher.js.map +1 -0
  112. package/package.json +4 -7
@@ -0,0 +1,290 @@
1
+ /**
2
+ * CRUD operations for Specs
3
+ */
4
+ import { generateUUID } from "../id-generator.js";
5
+ /**
6
+ * Create a new spec
7
+ */
8
+ export function createSpec(db, input) {
9
+ // Validate parent_id exists if provided and get parent_uuid
10
+ let parent_uuid = null;
11
+ if (input.parent_id) {
12
+ const parent = getSpec(db, input.parent_id);
13
+ if (!parent) {
14
+ throw new Error(`Parent spec not found: ${input.parent_id}`);
15
+ }
16
+ parent_uuid = parent.uuid;
17
+ }
18
+ const uuid = input.uuid || generateUUID();
19
+ // Build INSERT statement with optional timestamp fields
20
+ const columns = [
21
+ "id",
22
+ "uuid",
23
+ "title",
24
+ "file_path",
25
+ "content",
26
+ "priority",
27
+ "parent_id",
28
+ "parent_uuid",
29
+ "archived",
30
+ ];
31
+ const values = [
32
+ "@id",
33
+ "@uuid",
34
+ "@title",
35
+ "@file_path",
36
+ "@content",
37
+ "@priority",
38
+ "@parent_id",
39
+ "@parent_uuid",
40
+ "@archived",
41
+ ];
42
+ if (input.created_at) {
43
+ columns.push("created_at");
44
+ values.push("@created_at");
45
+ }
46
+ if (input.updated_at) {
47
+ columns.push("updated_at");
48
+ values.push("@updated_at");
49
+ }
50
+ if (input.archived_at !== undefined) {
51
+ columns.push("archived_at");
52
+ values.push("@archived_at");
53
+ }
54
+ const stmt = db.prepare(`
55
+ INSERT INTO specs (
56
+ ${columns.join(", ")}
57
+ ) VALUES (
58
+ ${values.join(", ")}
59
+ )
60
+ ON CONFLICT(id) DO UPDATE SET
61
+ uuid = excluded.uuid,
62
+ title = excluded.title,
63
+ file_path = excluded.file_path,
64
+ content = excluded.content,
65
+ priority = excluded.priority,
66
+ parent_id = excluded.parent_id,
67
+ parent_uuid = excluded.parent_uuid,
68
+ archived = excluded.archived,
69
+ archived_at = excluded.archived_at,
70
+ ${input.created_at ? "created_at = excluded.created_at," : ""}
71
+ ${input.updated_at ? "updated_at = excluded.updated_at" : "updated_at = CURRENT_TIMESTAMP"}
72
+ `);
73
+ try {
74
+ const params = {
75
+ id: input.id,
76
+ uuid: uuid,
77
+ title: input.title,
78
+ file_path: input.file_path,
79
+ content: input.content || "",
80
+ priority: input.priority ?? 2,
81
+ parent_id: input.parent_id ?? null,
82
+ parent_uuid: parent_uuid,
83
+ archived: input.archived ? 1 : 0,
84
+ };
85
+ // Add optional timestamp parameters
86
+ if (input.created_at) {
87
+ params.created_at = input.created_at;
88
+ }
89
+ if (input.updated_at) {
90
+ params.updated_at = input.updated_at;
91
+ }
92
+ if (input.archived_at !== undefined) {
93
+ params.archived_at = input.archived_at;
94
+ }
95
+ stmt.run(params);
96
+ const spec = getSpec(db, input.id);
97
+ if (!spec) {
98
+ throw new Error(`Failed to create spec ${input.id}`);
99
+ }
100
+ return spec;
101
+ }
102
+ catch (error) {
103
+ if (error.code && error.code.startsWith("SQLITE_CONSTRAINT")) {
104
+ throw new Error(`Constraint violation: ${error.message}`);
105
+ }
106
+ throw error;
107
+ }
108
+ }
109
+ /**
110
+ * Get a spec by ID
111
+ */
112
+ export function getSpec(db, id) {
113
+ const stmt = db.prepare(`
114
+ SELECT * FROM specs WHERE id = ?
115
+ `);
116
+ return stmt.get(id) ?? null;
117
+ }
118
+ /**
119
+ * Get a spec by file path
120
+ */
121
+ export function getSpecByFilePath(db, filePath) {
122
+ const stmt = db.prepare(`
123
+ SELECT * FROM specs WHERE file_path = ?
124
+ `);
125
+ return stmt.get(filePath) ?? null;
126
+ }
127
+ /**
128
+ * Update a spec
129
+ */
130
+ export function updateSpec(db, id, input) {
131
+ const existing = getSpec(db, id);
132
+ if (!existing) {
133
+ throw new Error(`Spec not found: ${id}`);
134
+ }
135
+ // Validate parent_id exists if provided
136
+ if (input.parent_id) {
137
+ const parent = getSpec(db, input.parent_id);
138
+ if (!parent) {
139
+ throw new Error(`Parent spec not found: ${input.parent_id}`);
140
+ }
141
+ }
142
+ const updates = [];
143
+ const params = { id };
144
+ if (input.title !== undefined && input.title !== existing.title) {
145
+ updates.push("title = @title");
146
+ params.title = input.title;
147
+ }
148
+ if (input.file_path !== undefined && input.file_path !== existing.file_path) {
149
+ updates.push("file_path = @file_path");
150
+ params.file_path = input.file_path;
151
+ }
152
+ if (input.content !== undefined && input.content !== existing.content) {
153
+ updates.push("content = @content");
154
+ params.content = input.content;
155
+ }
156
+ if (input.priority !== undefined && input.priority !== existing.priority) {
157
+ updates.push("priority = @priority");
158
+ params.priority = input.priority;
159
+ }
160
+ if (input.parent_id !== undefined && input.parent_id !== existing.parent_id) {
161
+ updates.push("parent_id = @parent_id");
162
+ params.parent_id = input.parent_id;
163
+ }
164
+ if (input.archived !== undefined && input.archived !== existing.archived) {
165
+ updates.push("archived = @archived");
166
+ params.archived = input.archived ? 1 : 0;
167
+ // Handle archived_at based on archived changes
168
+ // Use input.archived_at if provided, otherwise auto-set based on archived
169
+ if (input.archived_at !== undefined) {
170
+ // Explicit archived_at provided - use it
171
+ updates.push("archived_at = @archived_at");
172
+ params.archived_at = input.archived_at;
173
+ }
174
+ else if (input.archived && !existing.archived) {
175
+ // Archiving - set timestamp
176
+ updates.push("archived_at = CURRENT_TIMESTAMP");
177
+ }
178
+ else if (!input.archived && existing.archived) {
179
+ // Unarchiving - clear timestamp
180
+ updates.push("archived_at = NULL");
181
+ }
182
+ }
183
+ else if (input.archived_at !== undefined &&
184
+ input.archived_at !== existing.archived_at) {
185
+ // archived_at provided without archived change
186
+ updates.push("archived_at = @archived_at");
187
+ params.archived_at = input.archived_at;
188
+ }
189
+ // Handle updated_at - use provided value or set to current timestamp
190
+ if (input.updated_at !== undefined) {
191
+ updates.push("updated_at = @updated_at");
192
+ params.updated_at = input.updated_at;
193
+ }
194
+ else if (updates.length > 0) {
195
+ // Only update timestamp if there are actual changes
196
+ updates.push("updated_at = CURRENT_TIMESTAMP");
197
+ }
198
+ if (updates.length === 0) {
199
+ return existing;
200
+ }
201
+ const stmt = db.prepare(`
202
+ UPDATE specs SET ${updates.join(", ")} WHERE id = @id
203
+ `);
204
+ try {
205
+ stmt.run(params);
206
+ const updated = getSpec(db, id);
207
+ if (!updated) {
208
+ throw new Error(`Failed to update spec ${id}`);
209
+ }
210
+ return updated;
211
+ }
212
+ catch (error) {
213
+ if (error.code && error.code.startsWith("SQLITE_CONSTRAINT")) {
214
+ throw new Error(`Constraint violation: ${error.message}`);
215
+ }
216
+ throw error;
217
+ }
218
+ }
219
+ /**
220
+ * Delete a spec
221
+ */
222
+ export function deleteSpec(db, id) {
223
+ const stmt = db.prepare(`DELETE FROM specs WHERE id = ?`);
224
+ const result = stmt.run(id);
225
+ return result.changes > 0;
226
+ }
227
+ /**
228
+ * List specs with optional filters
229
+ */
230
+ export function listSpecs(db, options = {}) {
231
+ const conditions = [];
232
+ const params = {};
233
+ if (options.priority !== undefined) {
234
+ conditions.push("priority = @priority");
235
+ params.priority = options.priority;
236
+ }
237
+ if (options.parent_id !== undefined) {
238
+ conditions.push("parent_id = @parent_id");
239
+ params.parent_id = options.parent_id;
240
+ }
241
+ if (options.archived !== undefined) {
242
+ conditions.push("archived = @archived");
243
+ params.archived = options.archived ? 1 : 0;
244
+ }
245
+ let query = "SELECT * FROM specs";
246
+ if (conditions.length > 0) {
247
+ query += " WHERE " + conditions.join(" AND ");
248
+ }
249
+ query += " ORDER BY priority DESC, created_at DESC";
250
+ if (options.limit !== undefined) {
251
+ query += " LIMIT @limit";
252
+ params.limit = options.limit;
253
+ }
254
+ if (options.offset !== undefined) {
255
+ query += " OFFSET @offset";
256
+ params.offset = options.offset;
257
+ }
258
+ const stmt = db.prepare(query);
259
+ return stmt.all(params);
260
+ }
261
+ /**
262
+ * Search specs by title or content
263
+ */
264
+ export function searchSpecs(db, query, options = {}) {
265
+ const conditions = ["(title LIKE @query OR content LIKE @query)"];
266
+ const params = { query: `%${query}%` };
267
+ if (options.priority !== undefined) {
268
+ conditions.push("priority = @priority");
269
+ params.priority = options.priority;
270
+ }
271
+ if (options.parent_id !== undefined) {
272
+ conditions.push("parent_id = @parent_id");
273
+ params.parent_id = options.parent_id;
274
+ }
275
+ if (options.archived !== undefined) {
276
+ conditions.push("archived = @archived");
277
+ params.archived = options.archived ? 1 : 0;
278
+ }
279
+ let sql = `SELECT * FROM specs WHERE ${conditions.join(" AND ")} ORDER BY priority DESC, created_at DESC`;
280
+ if (options.limit !== undefined) {
281
+ sql += " LIMIT @limit";
282
+ params.limit = options.limit;
283
+ }
284
+ else {
285
+ sql += " LIMIT 50";
286
+ }
287
+ const stmt = db.prepare(sql);
288
+ return stmt.all(params);
289
+ }
290
+ //# sourceMappingURL=specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specs.js","sourceRoot":"","sources":["../../src/operations/specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/operations/tags.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,wBAAgB,MAAM,CACpB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EACvB,GAAG,EAAE,MAAM,GACV,GAAG,CA6BL;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EACvB,IAAI,EAAE,MAAM,EAAE,GACb,GAAG,EAAE,CAQP;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EACvB,GAAG,EAAE,MAAM,GACV,OAAO,CAQT;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,GACtB,MAAM,EAAE,CASV;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,UAAU,GACvB,GAAG,EAAE,CAaP;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,GACtB,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,MAAM,CACpB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EACvB,GAAG,EAAE,MAAM,GACV,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,CAAC,EAAE,UAAU,GACvB,MAAM,EAAE,CAcV;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EACvB,IAAI,EAAE,MAAM,EAAE,GACb,MAAM,EAAE,CAUV"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Operations for Tags
3
+ */
4
+ /**
5
+ * Add a tag to an entity
6
+ */
7
+ export function addTag(db, entity_id, entity_type, tag) {
8
+ // Get entity UUID
9
+ const table = entity_type === "spec" ? "specs" : "issues";
10
+ const entity = db
11
+ .prepare(`SELECT uuid FROM ${table} WHERE id = ?`)
12
+ .get(entity_id);
13
+ if (!entity) {
14
+ throw new Error(`${entity_type === "spec" ? "Spec" : "Issue"} not found: ${entity_id}`);
15
+ }
16
+ const stmt = db.prepare(`
17
+ INSERT INTO tags (entity_id, entity_uuid, entity_type, tag)
18
+ VALUES (@entity_id, @entity_uuid, @entity_type, @tag)
19
+ `);
20
+ try {
21
+ stmt.run({ entity_id, entity_uuid: entity.uuid, entity_type, tag });
22
+ return { entity_id, entity_uuid: entity.uuid, entity_type, tag };
23
+ }
24
+ catch (error) {
25
+ if (error.code && error.code.startsWith("SQLITE_CONSTRAINT")) {
26
+ // Tag already exists, return it
27
+ return { entity_id, entity_uuid: entity.uuid, entity_type, tag };
28
+ }
29
+ throw error;
30
+ }
31
+ }
32
+ /**
33
+ * Add multiple tags to an entity
34
+ */
35
+ export function addTags(db, entity_id, entity_type, tags) {
36
+ const results = [];
37
+ for (const tag of tags) {
38
+ results.push(addTag(db, entity_id, entity_type, tag));
39
+ }
40
+ return results;
41
+ }
42
+ /**
43
+ * Remove a tag from an entity
44
+ */
45
+ export function removeTag(db, entity_id, entity_type, tag) {
46
+ const stmt = db.prepare(`
47
+ DELETE FROM tags
48
+ WHERE entity_id = ? AND entity_type = ? AND tag = ?
49
+ `);
50
+ const result = stmt.run(entity_id, entity_type, tag);
51
+ return result.changes > 0;
52
+ }
53
+ /**
54
+ * Get all tags for an entity
55
+ */
56
+ export function getTags(db, entity_id, entity_type) {
57
+ const stmt = db.prepare(`
58
+ SELECT tag FROM tags
59
+ WHERE entity_id = ? AND entity_type = ?
60
+ ORDER BY tag
61
+ `);
62
+ const rows = stmt.all(entity_id, entity_type);
63
+ return rows.map((row) => row.tag);
64
+ }
65
+ /**
66
+ * Get all entities with a specific tag
67
+ */
68
+ export function getEntitiesByTag(db, tag, entity_type) {
69
+ let query = "SELECT * FROM tags WHERE tag = @tag";
70
+ const params = { tag };
71
+ if (entity_type !== undefined) {
72
+ query += " AND entity_type = @entity_type";
73
+ params.entity_type = entity_type;
74
+ }
75
+ query += " ORDER BY entity_id";
76
+ const stmt = db.prepare(query);
77
+ return stmt.all(params);
78
+ }
79
+ /**
80
+ * Remove all tags from an entity
81
+ */
82
+ export function removeAllTags(db, entity_id, entity_type) {
83
+ const stmt = db.prepare(`
84
+ DELETE FROM tags
85
+ WHERE entity_id = ? AND entity_type = ?
86
+ `);
87
+ const result = stmt.run(entity_id, entity_type);
88
+ return result.changes;
89
+ }
90
+ /**
91
+ * Check if an entity has a specific tag
92
+ */
93
+ export function hasTag(db, entity_id, entity_type, tag) {
94
+ const stmt = db.prepare(`
95
+ SELECT 1 FROM tags
96
+ WHERE entity_id = ? AND entity_type = ? AND tag = ?
97
+ `);
98
+ return stmt.get(entity_id, entity_type, tag) !== undefined;
99
+ }
100
+ /**
101
+ * Get all unique tags in the system
102
+ */
103
+ export function getAllTags(db, entity_type) {
104
+ let query = "SELECT DISTINCT tag FROM tags";
105
+ const params = {};
106
+ if (entity_type !== undefined) {
107
+ query += " WHERE entity_type = @entity_type";
108
+ params.entity_type = entity_type;
109
+ }
110
+ query += " ORDER BY tag";
111
+ const stmt = db.prepare(query);
112
+ const rows = stmt.all(params);
113
+ return rows.map((row) => row.tag);
114
+ }
115
+ /**
116
+ * Replace all tags for an entity
117
+ */
118
+ export function setTags(db, entity_id, entity_type, tags) {
119
+ // Remove existing tags
120
+ removeAllTags(db, entity_id, entity_type);
121
+ // Add new tags
122
+ if (tags.length > 0) {
123
+ addTags(db, entity_id, entity_type, tags);
124
+ }
125
+ return tags;
126
+ }
127
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/operations/tags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../src/operations/transactions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,KAAK,CAAC,CAAC;AAElE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC/B,CAAC,CAYH;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GACzB,CAAC,EAAE,CAQL;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACjC,UAAU,GAAE,MAAU,EACtB,OAAO,GAAE,MAAY,GACpB,CAAC,CA2BH;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAK7B,OAAO,CAAC,EAAE;IAJZ,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAkB;gBAGxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAC7B,IAAI,CAAC,EAAE,MAAM;IAMf;;OAEG;IACH,MAAM,IAAI,IAAI;IAQd;;OAEG;IACH,QAAQ,IAAI,IAAI;IAShB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,EACd,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,CAAC,EAAE,EAAE,oBAAoB,KAAK,CAAC,GACxC,CAAC;CAeL"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Transaction support with proper error handling
3
+ */
4
+ /**
5
+ * Execute a function within a transaction
6
+ * Automatically commits on success, rolls back on error
7
+ */
8
+ export function transaction(db, callback) {
9
+ // Check if we're already in a transaction
10
+ const inTransaction = db.inTransaction;
11
+ if (inTransaction) {
12
+ // Already in a transaction, just execute the callback
13
+ return callback(db);
14
+ }
15
+ // Start a new transaction
16
+ const txn = db.transaction(callback);
17
+ return txn(db);
18
+ }
19
+ /**
20
+ * Execute multiple operations in a transaction
21
+ * This is a convenience wrapper that handles common patterns
22
+ */
23
+ export function batchTransaction(db, operations) {
24
+ return transaction(db, () => {
25
+ const results = [];
26
+ for (const operation of operations) {
27
+ results.push(operation());
28
+ }
29
+ return results;
30
+ });
31
+ }
32
+ /**
33
+ * Execute an operation with automatic retry on busy/locked errors
34
+ */
35
+ export function withRetry(db, operation, maxRetries = 3, delayMs = 100) {
36
+ let lastError = null;
37
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
38
+ try {
39
+ return operation(db);
40
+ }
41
+ catch (error) {
42
+ lastError = error;
43
+ // Retry on SQLITE_BUSY or SQLITE_LOCKED
44
+ if ((error.code === 'SQLITE_BUSY' || error.code === 'SQLITE_LOCKED') &&
45
+ attempt < maxRetries) {
46
+ // Wait before retrying (with exponential backoff)
47
+ const delay = delayMs * Math.pow(2, attempt);
48
+ const sleep = new Promise((resolve) => setTimeout(resolve, delay));
49
+ // Block until sleep completes
50
+ sleep.then(() => { });
51
+ continue;
52
+ }
53
+ throw error;
54
+ }
55
+ }
56
+ throw lastError || new Error('Transaction failed after retries');
57
+ }
58
+ /**
59
+ * Savepoint-based nested transaction support
60
+ */
61
+ export class SavepointTransaction {
62
+ db;
63
+ savepointId;
64
+ released = false;
65
+ constructor(db, name) {
66
+ this.db = db;
67
+ this.savepointId = name || `sp_${Date.now()}_${Math.random().toString().replace('.', '')}`;
68
+ this.db.prepare(`SAVEPOINT ${this.savepointId}`).run();
69
+ }
70
+ /**
71
+ * Commit the savepoint
72
+ */
73
+ commit() {
74
+ if (this.released) {
75
+ throw new Error('Savepoint already released');
76
+ }
77
+ this.db.prepare(`RELEASE ${this.savepointId}`).run();
78
+ this.released = true;
79
+ }
80
+ /**
81
+ * Rollback the savepoint
82
+ */
83
+ rollback() {
84
+ if (this.released) {
85
+ throw new Error('Savepoint already released');
86
+ }
87
+ this.db.prepare(`ROLLBACK TO ${this.savepointId}`).run();
88
+ this.db.prepare(`RELEASE ${this.savepointId}`).run();
89
+ this.released = true;
90
+ }
91
+ /**
92
+ * Execute a callback with automatic commit/rollback
93
+ */
94
+ static execute(db, callback) {
95
+ const sp = new SavepointTransaction(db);
96
+ try {
97
+ const result = callback(sp);
98
+ if (!sp.released) {
99
+ sp.commit();
100
+ }
101
+ return result;
102
+ }
103
+ catch (error) {
104
+ if (!sp.released) {
105
+ sp.rollback();
106
+ }
107
+ throw error;
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=transactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions.js","sourceRoot":"","sources":["../../src/operations/transactions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAsB3C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAkED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAoKrB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,OAAO,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CA0DrB"}