@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.
- package/dist/cli/feedback-commands.d.ts.map +1 -0
- package/dist/cli/feedback-commands.js +274 -0
- package/dist/cli/feedback-commands.js.map +1 -0
- package/dist/cli/init-commands.d.ts.map +1 -0
- package/dist/cli/init-commands.js +148 -0
- package/dist/cli/init-commands.js.map +1 -0
- package/dist/cli/issue-commands.d.ts.map +1 -0
- package/dist/cli/issue-commands.js +310 -0
- package/dist/cli/issue-commands.js.map +1 -0
- package/dist/cli/query-commands.d.ts.map +1 -0
- package/dist/cli/query-commands.js +61 -0
- package/dist/cli/query-commands.js.map +1 -0
- package/dist/cli/reference-commands.d.ts.map +1 -0
- package/dist/cli/reference-commands.js +136 -0
- package/dist/cli/reference-commands.js.map +1 -0
- package/dist/cli/relationship-commands.d.ts.map +1 -0
- package/dist/cli/relationship-commands.js +76 -0
- package/dist/cli/relationship-commands.js.map +1 -0
- package/dist/cli/server-commands.d.ts.map +1 -0
- package/dist/cli/server-commands.js +99 -0
- package/dist/cli/server-commands.js.map +1 -0
- package/dist/cli/spec-commands.d.ts.map +1 -0
- package/dist/cli/spec-commands.js +321 -0
- package/dist/cli/spec-commands.js.map +1 -0
- package/dist/cli/status-commands.d.ts.map +1 -0
- package/dist/cli/status-commands.js +131 -0
- package/dist/cli/status-commands.js.map +1 -0
- package/dist/cli/sync-commands.d.ts.map +1 -0
- package/dist/cli/sync-commands.js +416 -0
- package/dist/cli/sync-commands.js.map +1 -0
- package/dist/cli/update-commands.d.ts.map +1 -0
- package/dist/cli/update-commands.js +78 -0
- package/dist/cli/update-commands.js.map +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +425 -195
- package/dist/cli.js.map +1 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +54 -0
- package/dist/db.js.map +1 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +195 -0
- package/dist/export.js.map +1 -0
- package/dist/filename-generator.d.ts.map +1 -0
- package/dist/filename-generator.js +93 -0
- package/dist/filename-generator.js.map +1 -0
- package/dist/id-generator.d.ts.map +1 -0
- package/dist/id-generator.js +123 -0
- package/dist/id-generator.js.map +1 -0
- package/dist/import.d.ts.map +1 -0
- package/dist/import.js +608 -0
- package/dist/import.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -189
- package/dist/index.js.map +1 -0
- package/dist/jsonl.d.ts.map +1 -0
- package/dist/jsonl.js +333 -0
- package/dist/jsonl.js.map +1 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +357 -0
- package/dist/markdown.js.map +1 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +57 -0
- package/dist/migrations.js.map +1 -0
- package/dist/operations/events.d.ts.map +1 -0
- package/dist/operations/events.js +108 -0
- package/dist/operations/events.js.map +1 -0
- package/dist/operations/feedback-anchors.d.ts.map +1 -0
- package/dist/operations/feedback-anchors.js +444 -0
- package/dist/operations/feedback-anchors.js.map +1 -0
- package/dist/operations/feedback.d.ts.map +1 -0
- package/dist/operations/feedback.js +234 -0
- package/dist/operations/feedback.js.map +1 -0
- package/dist/operations/index.d.ts.map +1 -0
- package/dist/operations/index.js +10 -0
- package/dist/operations/index.js.map +1 -0
- package/dist/operations/issues.d.ts.map +1 -0
- package/dist/operations/issues.js +411 -0
- package/dist/operations/issues.js.map +1 -0
- package/dist/operations/references.d.ts.map +1 -0
- package/dist/operations/references.js +117 -0
- package/dist/operations/references.js.map +1 -0
- package/dist/operations/relationships.d.ts.map +1 -0
- package/dist/operations/relationships.js +236 -0
- package/dist/operations/relationships.js.map +1 -0
- package/dist/operations/specs.d.ts.map +1 -0
- package/dist/operations/specs.js +290 -0
- package/dist/operations/specs.js.map +1 -0
- package/dist/operations/tags.d.ts.map +1 -0
- package/dist/operations/tags.js +127 -0
- package/dist/operations/tags.js.map +1 -0
- package/dist/operations/transactions.d.ts.map +1 -0
- package/dist/operations/transactions.js +111 -0
- package/dist/operations/transactions.js.map +1 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +442 -0
- package/dist/sync.js.map +1 -0
- package/dist/test-schema.d.ts.map +1 -0
- package/dist/test-schema.js +46 -0
- package/dist/test-schema.js.map +1 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/update-checker.d.ts.map +1 -0
- package/dist/update-checker.js +151 -0
- package/dist/update-checker.js.map +1 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +23 -0
- package/dist/version.js.map +1 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +438 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +4 -7
package/dist/sync.js
ADDED
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bidirectional sync between Markdown files and JSONL/SQLite
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from "fs";
|
|
5
|
+
import * as path from "path";
|
|
6
|
+
import { parseMarkdownFile, updateFrontmatterFile, writeMarkdownFile, } from "./markdown.js";
|
|
7
|
+
import { getSpec, getSpecByFilePath, createSpec, updateSpec, } from "./operations/specs.js";
|
|
8
|
+
import { getIssue, createIssue, updateIssue } from "./operations/issues.js";
|
|
9
|
+
import { addRelationship } from "./operations/relationships.js";
|
|
10
|
+
import { getTags, setTags } from "./operations/tags.js";
|
|
11
|
+
import { listFeedback, updateFeedback } from "./operations/feedback.js";
|
|
12
|
+
import { relocateFeedbackAnchor } from "./operations/feedback-anchors.js";
|
|
13
|
+
import { exportToJSONL } from "./export.js";
|
|
14
|
+
import { generateSpecId, generateIssueId } from "./id-generator.js";
|
|
15
|
+
/**
|
|
16
|
+
* Remove internal fields that shouldn't be in markdown frontmatter
|
|
17
|
+
* These fields are only for database tracking, not for the markdown files
|
|
18
|
+
*/
|
|
19
|
+
function cleanFrontmatterForMarkdown(data) {
|
|
20
|
+
const { file_path, entity_type, ...clean } = data;
|
|
21
|
+
return clean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Initialize missing frontmatter fields
|
|
25
|
+
*/
|
|
26
|
+
function initializeFrontmatter(db, data, entityType, mdPath, outputDir, user) {
|
|
27
|
+
const now = new Date().toISOString();
|
|
28
|
+
const initialized = { ...data };
|
|
29
|
+
// Generate ID if missing
|
|
30
|
+
if (!initialized.id) {
|
|
31
|
+
initialized.id =
|
|
32
|
+
entityType === "spec"
|
|
33
|
+
? generateSpecId(db, outputDir)
|
|
34
|
+
: generateIssueId(db, outputDir);
|
|
35
|
+
}
|
|
36
|
+
// Extract title from content if missing
|
|
37
|
+
if (!initialized.title) {
|
|
38
|
+
const content = fs.readFileSync(mdPath, "utf8");
|
|
39
|
+
const titleMatch = content.match(/^#\s+(.+)$/m);
|
|
40
|
+
initialized.title = titleMatch
|
|
41
|
+
? titleMatch[1]
|
|
42
|
+
: path.basename(mdPath, ".md");
|
|
43
|
+
}
|
|
44
|
+
// Set timestamps
|
|
45
|
+
if (!initialized.created_at) {
|
|
46
|
+
initialized.created_at = now;
|
|
47
|
+
}
|
|
48
|
+
if (!initialized.updated_at) {
|
|
49
|
+
initialized.updated_at = now;
|
|
50
|
+
}
|
|
51
|
+
// Set type-specific defaults
|
|
52
|
+
if (entityType === "spec") {
|
|
53
|
+
if (!initialized.priority && initialized.priority !== 0)
|
|
54
|
+
initialized.priority = 2;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// issue
|
|
58
|
+
if (!initialized.status)
|
|
59
|
+
initialized.status = "open";
|
|
60
|
+
if (!initialized.priority && initialized.priority !== 0)
|
|
61
|
+
initialized.priority = 2;
|
|
62
|
+
}
|
|
63
|
+
return initialized;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Sync a markdown file to JSONL and SQLite
|
|
67
|
+
* Parses markdown, updates database, optionally exports to JSONL
|
|
68
|
+
*/
|
|
69
|
+
export async function syncMarkdownToJSONL(db, mdPath, options = {}) {
|
|
70
|
+
const { outputDir = ".sudocode", autoExport = true, user = "system", autoInitialize = true, writeBackFrontmatter = true, } = options;
|
|
71
|
+
try {
|
|
72
|
+
// Parse markdown file with database validation for cross-references
|
|
73
|
+
const parsed = parseMarkdownFile(mdPath, db, outputDir);
|
|
74
|
+
let { data, content, references } = parsed;
|
|
75
|
+
// Determine entity type from frontmatter or file path
|
|
76
|
+
const entityType = determineEntityType(data, mdPath);
|
|
77
|
+
let entityId = data.id;
|
|
78
|
+
const frontmatterId = entityId; // Keep track of ID from frontmatter for validation
|
|
79
|
+
// Calculate relative file path from outputDir
|
|
80
|
+
const relPath = path.relative(outputDir, mdPath);
|
|
81
|
+
const filePath = relPath.startsWith("..")
|
|
82
|
+
? path.relative(process.cwd(), mdPath)
|
|
83
|
+
: relPath;
|
|
84
|
+
// For specs, determine which spec this file corresponds to
|
|
85
|
+
// Support two scenarios: rename (ID stays, path changes) and path-based lookup (no ID)
|
|
86
|
+
let existingByPath = null;
|
|
87
|
+
let existingById = null;
|
|
88
|
+
if (entityType === "spec") {
|
|
89
|
+
// Always set the calculated file path in data (for create/update)
|
|
90
|
+
data.file_path = filePath;
|
|
91
|
+
// Check if a spec exists with this ID (from frontmatter)
|
|
92
|
+
if (frontmatterId) {
|
|
93
|
+
existingById = getSpec(db, frontmatterId);
|
|
94
|
+
}
|
|
95
|
+
// Check if a spec exists at this file path
|
|
96
|
+
existingByPath = getSpecByFilePath(db, filePath);
|
|
97
|
+
// Scenario 1: Spec exists with this ID
|
|
98
|
+
if (existingById) {
|
|
99
|
+
entityId = existingById.id;
|
|
100
|
+
// Check if file was renamed (ID exists but different path)
|
|
101
|
+
if (existingById.file_path !== filePath) {
|
|
102
|
+
console.log(`[sync] File renamed: ${existingById.file_path} → ${filePath}`);
|
|
103
|
+
// Check if another spec already exists at new path (conflict)
|
|
104
|
+
if (existingByPath && existingByPath.id !== existingById.id) {
|
|
105
|
+
console.warn(`[sync] Warning: File path conflict! Spec ${existingByPath.id} already exists at ${filePath}. Keeping ${existingById.id} and updating path.`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Scenario 2: No ID in frontmatter, but spec exists at this path
|
|
110
|
+
else if (existingByPath) {
|
|
111
|
+
entityId = existingByPath.id;
|
|
112
|
+
data.id = entityId;
|
|
113
|
+
}
|
|
114
|
+
// Scenario 3: ID in frontmatter differs from spec at this path (user changed ID)
|
|
115
|
+
else if (frontmatterId && existingByPath) {
|
|
116
|
+
// This shouldn't happen due to earlier checks, but handle it
|
|
117
|
+
const correctId = existingByPath.id;
|
|
118
|
+
console.warn(`[sync] Warning: ID in frontmatter (${frontmatterId}) differs from existing spec ID (${correctId}) for ${filePath}. Using existing ID.`);
|
|
119
|
+
entityId = correctId;
|
|
120
|
+
data.id = entityId;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Handle missing frontmatter
|
|
124
|
+
if (!entityId) {
|
|
125
|
+
if (autoInitialize) {
|
|
126
|
+
// Auto-initialize missing fields
|
|
127
|
+
data = initializeFrontmatter(db, data, entityType, mdPath, outputDir, user);
|
|
128
|
+
entityId = data.id;
|
|
129
|
+
// Write back frontmatter if requested
|
|
130
|
+
if (writeBackFrontmatter) {
|
|
131
|
+
// Filter out internal fields that shouldn't be in markdown frontmatter
|
|
132
|
+
const cleanData = cleanFrontmatterForMarkdown(data);
|
|
133
|
+
updateFrontmatterFile(mdPath, cleanData);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
return {
|
|
138
|
+
success: false,
|
|
139
|
+
action: "no-change",
|
|
140
|
+
entityId: "",
|
|
141
|
+
entityType,
|
|
142
|
+
error: "Missing id in frontmatter (auto-initialization disabled)",
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Check if entity exists by ID
|
|
147
|
+
const existing = entityType === "spec" ? getSpec(db, entityId) : getIssue(db, entityId);
|
|
148
|
+
const isNew = !existing;
|
|
149
|
+
// Get file modification time to use as updated_at timestamp
|
|
150
|
+
// This ensures database timestamp matches when the file was actually modified
|
|
151
|
+
const fileStat = fs.statSync(mdPath);
|
|
152
|
+
const fileModTime = new Date(fileStat.mtimeMs).toISOString();
|
|
153
|
+
if (entityType === "spec") {
|
|
154
|
+
await syncSpec(db, entityId, data, content, references, isNew, user, fileModTime);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
await syncIssue(db, entityId, data, content, references, isNew, user, fileModTime);
|
|
158
|
+
}
|
|
159
|
+
// Auto-export to JSONL if enabled
|
|
160
|
+
if (autoExport) {
|
|
161
|
+
await exportToJSONL(db, {
|
|
162
|
+
outputDir,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
success: true,
|
|
167
|
+
action: isNew ? "created" : "updated",
|
|
168
|
+
entityId,
|
|
169
|
+
entityType,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
return {
|
|
174
|
+
success: false,
|
|
175
|
+
action: "no-change",
|
|
176
|
+
entityId: "",
|
|
177
|
+
entityType: "spec",
|
|
178
|
+
error: error instanceof Error ? error.message : String(error),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Sync from JSONL/SQLite to markdown file
|
|
184
|
+
* Updates markdown frontmatter while preserving content
|
|
185
|
+
*/
|
|
186
|
+
export async function syncJSONLToMarkdown(db, entityId, entityType, mdPath) {
|
|
187
|
+
try {
|
|
188
|
+
// Get entity from database
|
|
189
|
+
const entity = entityType === "spec" ? getSpec(db, entityId) : getIssue(db, entityId);
|
|
190
|
+
if (!entity) {
|
|
191
|
+
return {
|
|
192
|
+
success: false,
|
|
193
|
+
action: "no-change",
|
|
194
|
+
entityId,
|
|
195
|
+
entityType,
|
|
196
|
+
error: `${entityType} not found: ${entityId}`,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// Get relationships and tags
|
|
200
|
+
const { getOutgoingRelationships } = await import("./operations/relationships.js");
|
|
201
|
+
const relationships = getOutgoingRelationships(db, entityId, entityType);
|
|
202
|
+
const tags = getTags(db, entityId, entityType);
|
|
203
|
+
// Build frontmatter
|
|
204
|
+
const frontmatter = entityToFrontmatter(entity, entityType, relationships, tags);
|
|
205
|
+
// Check if file exists
|
|
206
|
+
const fileExists = fs.existsSync(mdPath);
|
|
207
|
+
if (fileExists) {
|
|
208
|
+
// Update existing file's frontmatter only
|
|
209
|
+
updateFrontmatterFile(mdPath, frontmatter);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
// Create new file with content from database
|
|
213
|
+
const content = entity.content || "";
|
|
214
|
+
writeMarkdownFile(mdPath, frontmatter, content);
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
success: true,
|
|
218
|
+
action: fileExists ? "updated" : "created",
|
|
219
|
+
entityId,
|
|
220
|
+
entityType,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
return {
|
|
225
|
+
success: false,
|
|
226
|
+
action: "no-change",
|
|
227
|
+
entityId,
|
|
228
|
+
entityType,
|
|
229
|
+
error: error instanceof Error ? error.message : String(error),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Determine entity type from frontmatter or file path
|
|
235
|
+
*/
|
|
236
|
+
function determineEntityType(frontmatter, filePath) {
|
|
237
|
+
// Check frontmatter type field
|
|
238
|
+
if (frontmatter.entity_type === "issue") {
|
|
239
|
+
return "issue";
|
|
240
|
+
}
|
|
241
|
+
if (frontmatter.entity_type === "spec") {
|
|
242
|
+
return "spec";
|
|
243
|
+
}
|
|
244
|
+
// Check file path
|
|
245
|
+
if (filePath.includes("/issues/") || filePath.includes("/issue-")) {
|
|
246
|
+
return "issue";
|
|
247
|
+
}
|
|
248
|
+
if (filePath.includes("/specs/") || filePath.includes("/spec-")) {
|
|
249
|
+
return "spec";
|
|
250
|
+
}
|
|
251
|
+
// Default to spec
|
|
252
|
+
return "spec";
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Sync spec data to database
|
|
256
|
+
*/
|
|
257
|
+
async function syncSpec(db, id, frontmatter, content, references, isNew, user, fileModTime) {
|
|
258
|
+
// Get old content before updating (for anchor relocation)
|
|
259
|
+
const oldSpec = isNew ? null : getSpec(db, id);
|
|
260
|
+
const oldContent = oldSpec?.content || "";
|
|
261
|
+
const specData = {
|
|
262
|
+
id,
|
|
263
|
+
title: frontmatter.title || "Untitled",
|
|
264
|
+
file_path: frontmatter.file_path || "",
|
|
265
|
+
content,
|
|
266
|
+
priority: frontmatter.priority ?? 2,
|
|
267
|
+
parent_id: frontmatter.parent_id || undefined,
|
|
268
|
+
};
|
|
269
|
+
if (isNew) {
|
|
270
|
+
createSpec(db, {
|
|
271
|
+
...specData,
|
|
272
|
+
updated_at: fileModTime,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
// Check if content has actually changed
|
|
277
|
+
const contentChanged = oldSpec?.title !== specData.title ||
|
|
278
|
+
oldSpec?.content !== specData.content ||
|
|
279
|
+
oldSpec?.priority !== specData.priority ||
|
|
280
|
+
oldSpec?.parent_id !== specData.parent_id ||
|
|
281
|
+
oldSpec?.file_path !== specData.file_path;
|
|
282
|
+
// Only update timestamp if content actually changed
|
|
283
|
+
updateSpec(db, id, {
|
|
284
|
+
...specData,
|
|
285
|
+
...(contentChanged && fileModTime ? { updated_at: fileModTime } : {}),
|
|
286
|
+
});
|
|
287
|
+
// Relocate feedback anchors if content changed
|
|
288
|
+
if (oldContent !== content) {
|
|
289
|
+
const feedbackList = listFeedback(db, { spec_id: id });
|
|
290
|
+
if (feedbackList.length > 0) {
|
|
291
|
+
// Relocate each feedback anchor
|
|
292
|
+
for (const feedback of feedbackList) {
|
|
293
|
+
const oldAnchor = typeof feedback.anchor === "string"
|
|
294
|
+
? JSON.parse(feedback.anchor)
|
|
295
|
+
: feedback.anchor;
|
|
296
|
+
// Relocate the anchor
|
|
297
|
+
const newAnchor = relocateFeedbackAnchor(oldContent, content, oldAnchor);
|
|
298
|
+
// Update feedback with new anchor
|
|
299
|
+
updateFeedback(db, feedback.id, {
|
|
300
|
+
anchor: newAnchor,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// Sync tags
|
|
307
|
+
if (frontmatter.tags && Array.isArray(frontmatter.tags)) {
|
|
308
|
+
setTags(db, id, "spec", frontmatter.tags);
|
|
309
|
+
}
|
|
310
|
+
// Sync relationships from cross-references
|
|
311
|
+
await syncRelationships(db, id, "spec", references, frontmatter.relationships, user);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Sync issue data to database
|
|
315
|
+
*/
|
|
316
|
+
async function syncIssue(db, id, frontmatter, content, references, isNew, user, fileModTime) {
|
|
317
|
+
const oldIssue = isNew ? null : getIssue(db, id);
|
|
318
|
+
const issueData = {
|
|
319
|
+
id,
|
|
320
|
+
title: frontmatter.title || "Untitled",
|
|
321
|
+
content,
|
|
322
|
+
status: frontmatter.status || "open",
|
|
323
|
+
priority: frontmatter.priority ?? 2,
|
|
324
|
+
assignee: frontmatter.assignee || undefined,
|
|
325
|
+
parent_id: frontmatter.parent_id || undefined,
|
|
326
|
+
};
|
|
327
|
+
if (isNew) {
|
|
328
|
+
createIssue(db, {
|
|
329
|
+
...issueData,
|
|
330
|
+
updated_at: fileModTime,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
// Check if content has actually changed
|
|
335
|
+
const contentChanged = oldIssue?.title !== issueData.title ||
|
|
336
|
+
oldIssue?.content !== issueData.content ||
|
|
337
|
+
oldIssue?.status !== issueData.status ||
|
|
338
|
+
oldIssue?.priority !== issueData.priority ||
|
|
339
|
+
oldIssue?.assignee !== issueData.assignee ||
|
|
340
|
+
oldIssue?.parent_id !== issueData.parent_id;
|
|
341
|
+
// Only update timestamp if content actually changed
|
|
342
|
+
updateIssue(db, id, {
|
|
343
|
+
...issueData,
|
|
344
|
+
...(contentChanged && fileModTime ? { updated_at: fileModTime } : {}),
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
// Sync tags
|
|
348
|
+
if (frontmatter.tags && Array.isArray(frontmatter.tags)) {
|
|
349
|
+
setTags(db, id, "issue", frontmatter.tags);
|
|
350
|
+
}
|
|
351
|
+
// Sync relationships from cross-references
|
|
352
|
+
await syncRelationships(db, id, "issue", references, frontmatter.relationships, user);
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Sync relationships from cross-references and frontmatter
|
|
356
|
+
* Preserves existing relationships not in frontmatter
|
|
357
|
+
*/
|
|
358
|
+
async function syncRelationships(db, entityId, entityType, references, frontmatterRels, user = "system") {
|
|
359
|
+
// Get existing relationships (all outgoing)
|
|
360
|
+
const { getOutgoingRelationships } = await import("./operations/relationships.js");
|
|
361
|
+
const existing = getOutgoingRelationships(db, entityId, entityType);
|
|
362
|
+
const existingSet = new Set(existing.map((r) => `${r.relationship_type}:${r.to_type}:${r.to_id}`));
|
|
363
|
+
// Add relationships from cross-references (defaults to 'references' type)
|
|
364
|
+
for (const ref of references) {
|
|
365
|
+
const relType = ref.relationshipType || "references";
|
|
366
|
+
const key = `${relType}:${ref.type}:${ref.id}`;
|
|
367
|
+
if (!existingSet.has(key)) {
|
|
368
|
+
try {
|
|
369
|
+
addRelationship(db, {
|
|
370
|
+
from_id: entityId,
|
|
371
|
+
from_type: entityType,
|
|
372
|
+
to_id: ref.id,
|
|
373
|
+
to_type: ref.type,
|
|
374
|
+
relationship_type: relType,
|
|
375
|
+
metadata: ref.anchor
|
|
376
|
+
? JSON.stringify({ anchor: ref.anchor })
|
|
377
|
+
: undefined,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
// Ignore errors (e.g., target not found, duplicate)
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// Add relationships from frontmatter
|
|
386
|
+
if (frontmatterRels && Array.isArray(frontmatterRels)) {
|
|
387
|
+
for (const rel of frontmatterRels) {
|
|
388
|
+
const key = `${rel.relationship_type}:${rel.target_type}:${rel.target_id}`;
|
|
389
|
+
if (!existingSet.has(key)) {
|
|
390
|
+
try {
|
|
391
|
+
addRelationship(db, {
|
|
392
|
+
from_id: entityId,
|
|
393
|
+
from_type: entityType,
|
|
394
|
+
to_id: rel.target_id,
|
|
395
|
+
to_type: rel.target_type,
|
|
396
|
+
relationship_type: rel.relationship_type,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
// Ignore errors
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
// Note: We preserve existing relationships not in frontmatter
|
|
406
|
+
// This allows relationships added via CLI/UI to persist
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Convert entity to frontmatter object
|
|
410
|
+
*/
|
|
411
|
+
function entityToFrontmatter(entity, entityType, relationships, tags) {
|
|
412
|
+
const base = {
|
|
413
|
+
id: entity.id,
|
|
414
|
+
title: entity.title,
|
|
415
|
+
priority: entity.priority,
|
|
416
|
+
created_at: entity.created_at,
|
|
417
|
+
};
|
|
418
|
+
// Only add optional fields if they have values
|
|
419
|
+
if (entity.parent_id)
|
|
420
|
+
base.parent_id = entity.parent_id;
|
|
421
|
+
if (tags.length > 0)
|
|
422
|
+
base.tags = tags;
|
|
423
|
+
if (relationships.length > 0)
|
|
424
|
+
base.relationships = relationships;
|
|
425
|
+
if (entityType === "spec") {
|
|
426
|
+
return base;
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
const issue = entity;
|
|
430
|
+
const result = {
|
|
431
|
+
...base,
|
|
432
|
+
status: issue.status,
|
|
433
|
+
};
|
|
434
|
+
// Only add optional issue fields if they have values
|
|
435
|
+
if (issue.assignee)
|
|
436
|
+
result.assignee = issue.assignee;
|
|
437
|
+
if (issue.closed_at)
|
|
438
|
+
result.closed_at = issue.closed_at;
|
|
439
|
+
return result;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=sync.js.map
|
package/dist/sync.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-schema.d.ts","sourceRoot":"","sources":["../src/test-schema.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple test to verify schema initialization
|
|
3
|
+
*/
|
|
4
|
+
import { initDatabase } from './db.js';
|
|
5
|
+
async function testSchema() {
|
|
6
|
+
console.log('Testing database schema initialization...');
|
|
7
|
+
// Create an in-memory database for testing
|
|
8
|
+
const db = initDatabase({ path: ':memory:', verbose: true });
|
|
9
|
+
// Test that tables exist
|
|
10
|
+
const tables = db
|
|
11
|
+
.prepare(`SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`)
|
|
12
|
+
.all();
|
|
13
|
+
console.log('\n✓ Tables created:');
|
|
14
|
+
tables.forEach((table) => {
|
|
15
|
+
console.log(` - ${table.name}`);
|
|
16
|
+
});
|
|
17
|
+
// Test that indexes exist
|
|
18
|
+
const indexes = db
|
|
19
|
+
.prepare(`SELECT name FROM sqlite_master WHERE type='index' ORDER BY name`)
|
|
20
|
+
.all();
|
|
21
|
+
console.log('\n✓ Indexes created:');
|
|
22
|
+
indexes.forEach((index) => {
|
|
23
|
+
console.log(` - ${index.name}`);
|
|
24
|
+
});
|
|
25
|
+
// Test that views exist
|
|
26
|
+
const views = db
|
|
27
|
+
.prepare(`SELECT name FROM sqlite_master WHERE type='view' ORDER BY name`)
|
|
28
|
+
.all();
|
|
29
|
+
console.log('\n✓ Views created:');
|
|
30
|
+
views.forEach((view) => {
|
|
31
|
+
console.log(` - ${view.name}`);
|
|
32
|
+
});
|
|
33
|
+
// Test database configuration
|
|
34
|
+
const walMode = db.pragma('journal_mode', { simple: true });
|
|
35
|
+
const foreignKeys = db.pragma('foreign_keys', { simple: true });
|
|
36
|
+
console.log('\n✓ Database configuration:');
|
|
37
|
+
console.log(` - WAL mode: ${walMode}`);
|
|
38
|
+
console.log(` - Foreign keys: ${foreignKeys ? 'enabled' : 'disabled'}`);
|
|
39
|
+
db.close();
|
|
40
|
+
console.log('\n✓ Schema test completed successfully!');
|
|
41
|
+
}
|
|
42
|
+
testSchema().catch((error) => {
|
|
43
|
+
console.error('Schema test failed:', error);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=test-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-schema.js","sourceRoot":"","sources":["../src/test-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,KAAK,UAAU,UAAU;IACvB,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAEzD,2CAA2C;IAC3C,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,yBAAyB;IACzB,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CACN,iEAAiE,CAClE;SACA,GAAG,EAAE,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,EAAE;QAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,MAAM,OAAO,GAAG,EAAE;SACf,OAAO,CACN,iEAAiE,CAClE;SACA,GAAG,EAAE,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,KAAK,GAAG,EAAE;SACb,OAAO,CACN,gEAAgE,CACjE;SACA,GAAG,EAAE,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,qBAAqB,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IAEzE,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;AACzD,CAAC;AAED,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,GAAG,EACH,KAAK,EACL,SAAS,EACT,aAAa,EACb,cAAc,EACd,cAAc,EACd,YAAY,EACZ,SAAS,EACT,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,MAAM,GACP,MAAM,oBAAoB,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../src/update-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;CAC1B;AA0ED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAyBlE;AAqBD;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAQvC"}
|