@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,416 @@
1
+ /**
2
+ * CLI handlers for sync commands
3
+ */
4
+ import chalk from "chalk";
5
+ import * as fs from "fs";
6
+ import * as path from "path";
7
+ import { exportToJSONL } from "../export.js";
8
+ import { importFromJSONL } from "../import.js";
9
+ import { startWatcher, setupGracefulShutdown } from "../watcher.js";
10
+ import { syncMarkdownToJSONL, syncJSONLToMarkdown } from "../sync.js";
11
+ import { listSpecs } from "../operations/specs.js";
12
+ import { listIssues } from "../operations/issues.js";
13
+ import { generateUniqueFilename, findExistingSpecFile, } from "../filename-generator.js";
14
+ import { isInitialized, performInitialization } from "./init-commands.js";
15
+ export async function handleSync(ctx, options) {
16
+ // Check if sudocode is initialized, auto-initialize if not
17
+ if (!isInitialized(ctx.outputDir)) {
18
+ console.log(chalk.blue("Initializing sudocode..."));
19
+ console.log();
20
+ try {
21
+ await performInitialization({
22
+ specPrefix: "SPEC",
23
+ issuePrefix: "ISSUE",
24
+ dir: ctx.outputDir,
25
+ jsonOutput: ctx.jsonOutput,
26
+ });
27
+ }
28
+ catch (error) {
29
+ console.error(chalk.red("✗ Auto-initialization failed"));
30
+ console.error(error instanceof Error ? error.message : String(error));
31
+ process.exit(1);
32
+ }
33
+ console.log();
34
+ }
35
+ if (options.watch) {
36
+ // Start file watcher
37
+ console.log(chalk.blue("Starting file watcher..."));
38
+ console.log(chalk.gray(` Watching: ${ctx.outputDir}`));
39
+ console.log(chalk.gray(" Press Ctrl+C to stop"));
40
+ const control = startWatcher({
41
+ db: ctx.db,
42
+ baseDir: ctx.outputDir,
43
+ debounceDelay: 2000,
44
+ syncJSONLToMarkdown: true,
45
+ onLog: (message) => {
46
+ if (!ctx.jsonOutput) {
47
+ console.log(chalk.gray(message));
48
+ }
49
+ },
50
+ onError: (error) => {
51
+ console.error(chalk.red(`[watch] Error: ${error.message}`));
52
+ },
53
+ });
54
+ // Setup graceful shutdown
55
+ setupGracefulShutdown(control);
56
+ // Keep process alive
57
+ await new Promise(() => {
58
+ // This promise never resolves - the process will exit via SIGINT/SIGTERM
59
+ });
60
+ }
61
+ else if (options.fromMarkdown) {
62
+ // Manual sync from markdown to database
63
+ await handleSyncFromMarkdown(ctx);
64
+ }
65
+ else if (options.toMarkdown) {
66
+ // Manual sync from database to markdown
67
+ await handleSyncToMarkdown(ctx);
68
+ }
69
+ else {
70
+ // Auto-detect sync direction based on file modification times
71
+ // TODO: Independently handle sync direction from specs and issues.
72
+ const { direction, reason } = determineSyncDirection(ctx);
73
+ console.log(chalk.blue("Detecting sync direction..."));
74
+ console.log(chalk.gray(` ${reason}`));
75
+ console.log();
76
+ if (direction === "no-sync") {
77
+ console.log(chalk.green("✓ Everything is in sync"));
78
+ console.log(chalk.gray(" Use --from-markdown or --to-markdown to force a specific direction"));
79
+ }
80
+ else if (direction === "from-markdown") {
81
+ console.log(chalk.blue("→ Syncing FROM markdown TO database (markdown is newer)"));
82
+ console.log();
83
+ await handleSyncFromMarkdown(ctx);
84
+ }
85
+ else if (direction === "to-markdown") {
86
+ console.log(chalk.blue("→ Syncing FROM database TO markdown (database is newer)"));
87
+ console.log();
88
+ await handleSyncToMarkdown(ctx);
89
+ }
90
+ }
91
+ }
92
+ export async function handleExport(ctx, options) {
93
+ try {
94
+ await exportToJSONL(ctx.db, { outputDir: options.output });
95
+ if (ctx.jsonOutput) {
96
+ console.log(JSON.stringify({ success: true, outputDir: options.output }, null, 2));
97
+ }
98
+ else {
99
+ console.log(chalk.green("✓ Exported to JSONL"));
100
+ console.log(chalk.gray(` Output: ${options.output}`));
101
+ }
102
+ }
103
+ catch (error) {
104
+ console.error(chalk.red("✗ Failed to export"));
105
+ console.error(error instanceof Error ? error.message : String(error));
106
+ process.exit(1);
107
+ }
108
+ }
109
+ export async function handleImport(ctx, options) {
110
+ try {
111
+ await importFromJSONL(ctx.db, { inputDir: options.input });
112
+ if (ctx.jsonOutput) {
113
+ console.log(JSON.stringify({ success: true, inputDir: options.input }, null, 2));
114
+ }
115
+ else {
116
+ console.log(chalk.green("✓ Imported from JSONL"));
117
+ console.log(chalk.gray(` Input: ${options.input}`));
118
+ }
119
+ }
120
+ catch (error) {
121
+ console.error(chalk.red("✗ Failed to import"));
122
+ console.error(error instanceof Error ? error.message : String(error));
123
+ process.exit(1);
124
+ }
125
+ }
126
+ /**
127
+ * Sync from markdown files to database
128
+ */
129
+ async function handleSyncFromMarkdown(ctx) {
130
+ console.log(chalk.blue("Syncing from markdown to database..."));
131
+ const specsDir = path.join(ctx.outputDir, "specs");
132
+ const issuesDir = path.join(ctx.outputDir, "issues");
133
+ let syncedCount = 0;
134
+ let errorCount = 0;
135
+ const syncOptions = {
136
+ outputDir: ctx.outputDir,
137
+ autoExport: false,
138
+ autoInitialize: true,
139
+ writeBackFrontmatter: true,
140
+ };
141
+ // Sync specs
142
+ if (fs.existsSync(specsDir)) {
143
+ const specFiles = findMarkdownFiles(specsDir);
144
+ console.log(chalk.gray(` Found ${specFiles.length} spec files`));
145
+ for (const file of specFiles) {
146
+ const result = await syncMarkdownToJSONL(ctx.db, file, syncOptions);
147
+ if (result.success) {
148
+ syncedCount++;
149
+ console.log(chalk.gray(` ✓ ${result.action} ${result.entityType} ${result.entityId}`));
150
+ }
151
+ else {
152
+ errorCount++;
153
+ console.log(chalk.red(` ✗ Failed to sync ${path.basename(file)}: ${result.error}`));
154
+ }
155
+ }
156
+ }
157
+ // Sync issues
158
+ if (fs.existsSync(issuesDir)) {
159
+ const issueFiles = findMarkdownFiles(issuesDir);
160
+ console.log(chalk.gray(` Found ${issueFiles.length} issue files`));
161
+ for (const file of issueFiles) {
162
+ const result = await syncMarkdownToJSONL(ctx.db, file, syncOptions);
163
+ if (result.success) {
164
+ syncedCount++;
165
+ console.log(chalk.gray(` ✓ ${result.action} ${result.entityType} ${result.entityId}`));
166
+ }
167
+ else {
168
+ errorCount++;
169
+ console.log(chalk.red(` ✗ Failed to sync ${path.basename(file)}: ${result.error}`));
170
+ }
171
+ }
172
+ }
173
+ // Export to JSONL
174
+ if (syncedCount > 0) {
175
+ await exportToJSONL(ctx.db, { outputDir: ctx.outputDir });
176
+ }
177
+ console.log();
178
+ console.log(chalk.green(`✓ Synced ${syncedCount} files to database`));
179
+ if (errorCount > 0) {
180
+ console.log(chalk.yellow(` ${errorCount} errors`));
181
+ }
182
+ }
183
+ /**
184
+ * Sync from database to markdown files
185
+ */
186
+ async function handleSyncToMarkdown(ctx) {
187
+ console.log(chalk.blue("Syncing from database to markdown..."));
188
+ const specsDir = path.join(ctx.outputDir, "specs");
189
+ const issuesDir = path.join(ctx.outputDir, "issues");
190
+ // Ensure directories exist
191
+ fs.mkdirSync(specsDir, { recursive: true });
192
+ fs.mkdirSync(issuesDir, { recursive: true });
193
+ let syncedCount = 0;
194
+ let errorCount = 0;
195
+ // Sync all specs
196
+ const specs = listSpecs(ctx.db, {});
197
+ console.log(chalk.gray(` Found ${specs.length} specs in database`));
198
+ for (const spec of specs) {
199
+ let filePath = path.join(ctx.outputDir, spec.file_path);
200
+ if (!fs.existsSync(filePath)) {
201
+ const foundFile = findExistingSpecFile(spec.id, specsDir, spec.title);
202
+ if (foundFile) {
203
+ filePath = foundFile;
204
+ }
205
+ else {
206
+ const fileName = generateUniqueFilename(spec.title, spec.id, specsDir);
207
+ filePath = path.join(specsDir, fileName);
208
+ }
209
+ }
210
+ const result = await syncJSONLToMarkdown(ctx.db, spec.id, "spec", filePath);
211
+ if (result.success) {
212
+ syncedCount++;
213
+ console.log(chalk.gray(` ✓ ${result.action} spec ${spec.id} → ${path.basename(filePath)}`));
214
+ }
215
+ else {
216
+ errorCount++;
217
+ console.log(chalk.red(` ✗ Failed to sync spec ${spec.id}: ${result.error}`));
218
+ }
219
+ }
220
+ // Sync all issues
221
+ const issues = listIssues(ctx.db, {});
222
+ console.log(chalk.gray(` Found ${issues.length} issues in database`));
223
+ for (const issue of issues) {
224
+ const fileName = `${issue.id}.md`;
225
+ const filePath = path.join(issuesDir, fileName);
226
+ const result = await syncJSONLToMarkdown(ctx.db, issue.id, "issue", filePath);
227
+ if (result.success) {
228
+ syncedCount++;
229
+ console.log(chalk.gray(` ✓ ${result.action} issue ${issue.id}`));
230
+ }
231
+ else {
232
+ errorCount++;
233
+ console.log(chalk.red(` ✗ Failed to sync issue ${issue.id}: ${result.error}`));
234
+ }
235
+ }
236
+ console.log();
237
+ console.log(chalk.green(`✓ Synced ${syncedCount} entities to markdown`));
238
+ if (errorCount > 0) {
239
+ console.log(chalk.yellow(` ${errorCount} errors`));
240
+ }
241
+ }
242
+ /**
243
+ * Helper: Find all markdown files in a directory recursively
244
+ */
245
+ function findMarkdownFiles(dir) {
246
+ const results = [];
247
+ function scan(currentDir) {
248
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
249
+ for (const entry of entries) {
250
+ const fullPath = path.join(currentDir, entry.name);
251
+ if (entry.isDirectory()) {
252
+ scan(fullPath);
253
+ }
254
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
255
+ results.push(fullPath);
256
+ }
257
+ }
258
+ }
259
+ scan(dir);
260
+ return results;
261
+ }
262
+ /**
263
+ * Get the most recent modification time from a list of files
264
+ * Returns null if no files exist
265
+ */
266
+ function getMostRecentModTime(files) {
267
+ if (files.length === 0)
268
+ return null;
269
+ let mostRecent = null;
270
+ for (const file of files) {
271
+ try {
272
+ const stats = fs.statSync(file);
273
+ const mtime = stats.mtime;
274
+ if (!mostRecent || mtime > mostRecent) {
275
+ mostRecent = mtime;
276
+ }
277
+ }
278
+ catch (error) {
279
+ // Ignore files that don't exist or can't be accessed
280
+ continue;
281
+ }
282
+ }
283
+ return mostRecent;
284
+ }
285
+ /**
286
+ * Get modification time of a file
287
+ * Returns null if file doesn't exist
288
+ */
289
+ function getFileModTime(filePath) {
290
+ try {
291
+ const stats = fs.statSync(filePath);
292
+ return stats.mtime;
293
+ }
294
+ catch (error) {
295
+ return null;
296
+ }
297
+ }
298
+ /**
299
+ * Determine sync direction based on file modification times
300
+ */
301
+ function determineSyncDirection(ctx) {
302
+ const specsDir = path.join(ctx.outputDir, "specs");
303
+ const issuesDir = path.join(ctx.outputDir, "issues");
304
+ const specsJsonl = path.join(ctx.outputDir, "specs.jsonl");
305
+ const issuesJsonl = path.join(ctx.outputDir, "issues.jsonl");
306
+ // Get JSONL modification times
307
+ const specsJsonlTime = getFileModTime(specsJsonl);
308
+ const issuesJsonlTime = getFileModTime(issuesJsonl);
309
+ // Get markdown file times
310
+ let specMarkdownFiles = [];
311
+ let issueMarkdownFiles = [];
312
+ if (fs.existsSync(specsDir)) {
313
+ specMarkdownFiles = findMarkdownFiles(specsDir);
314
+ }
315
+ if (fs.existsSync(issuesDir)) {
316
+ issueMarkdownFiles = findMarkdownFiles(issuesDir);
317
+ }
318
+ const specsMarkdownTime = getMostRecentModTime(specMarkdownFiles);
319
+ const issuesMarkdownTime = getMostRecentModTime(issueMarkdownFiles);
320
+ // Determine sync direction
321
+ let syncToMarkdown = false;
322
+ let syncFromMarkdown = false;
323
+ const reasons = [];
324
+ // Check specs
325
+ if (!specsJsonlTime && !specsMarkdownTime) {
326
+ // Neither exists - no sync needed
327
+ reasons.push("No spec files or JSONL found");
328
+ }
329
+ else if (!specsJsonlTime && specsMarkdownTime) {
330
+ // Only markdown exists - sync from markdown
331
+ syncFromMarkdown = true;
332
+ reasons.push("Specs JSONL missing, markdown exists");
333
+ }
334
+ else if (specsJsonlTime && !specsMarkdownTime) {
335
+ // Only JSONL exists - sync to markdown
336
+ syncToMarkdown = true;
337
+ reasons.push("Spec markdown files missing, JSONL exists");
338
+ }
339
+ else if (specsJsonlTime && specsMarkdownTime) {
340
+ // Both exist - compare times
341
+ if (specsMarkdownTime > specsJsonlTime) {
342
+ syncFromMarkdown = true;
343
+ reasons.push(`Spec markdown files are newer (${formatTime(specsMarkdownTime)} > ${formatTime(specsJsonlTime)})`);
344
+ }
345
+ else if (specsJsonlTime > specsMarkdownTime) {
346
+ syncToMarkdown = true;
347
+ reasons.push(`Specs JSONL is newer (${formatTime(specsJsonlTime)} > ${formatTime(specsMarkdownTime)})`);
348
+ }
349
+ else {
350
+ reasons.push("Specs are in sync");
351
+ }
352
+ }
353
+ // Check issues
354
+ if (!issuesJsonlTime && !issuesMarkdownTime) {
355
+ // Neither exists - no sync needed
356
+ reasons.push("No issue files or JSONL found");
357
+ }
358
+ else if (!issuesJsonlTime && issuesMarkdownTime) {
359
+ // Only markdown exists - sync from markdown
360
+ syncFromMarkdown = true;
361
+ reasons.push("Issues JSONL missing, markdown exists");
362
+ }
363
+ else if (issuesJsonlTime && !issuesMarkdownTime) {
364
+ // Only JSONL exists - sync to markdown
365
+ syncToMarkdown = true;
366
+ reasons.push("Issue markdown files missing, JSONL exists");
367
+ }
368
+ else if (issuesJsonlTime && issuesMarkdownTime) {
369
+ // Both exist - compare times
370
+ if (issuesMarkdownTime > issuesJsonlTime) {
371
+ syncFromMarkdown = true;
372
+ reasons.push(`Issue markdown files are newer (${formatTime(issuesMarkdownTime)} > ${formatTime(issuesJsonlTime)})`);
373
+ }
374
+ else if (issuesJsonlTime > issuesMarkdownTime) {
375
+ syncToMarkdown = true;
376
+ reasons.push(`Issues JSONL is newer (${formatTime(issuesJsonlTime)} > ${formatTime(issuesMarkdownTime)})`);
377
+ }
378
+ else {
379
+ reasons.push("Issues are in sync");
380
+ }
381
+ }
382
+ // Decide direction (prefer from-markdown if there's a conflict)
383
+ if (syncFromMarkdown && syncToMarkdown) {
384
+ // Mixed state - some files newer in markdown, some in JSONL
385
+ // Prefer syncing from markdown to preserve user edits
386
+ return {
387
+ direction: "from-markdown",
388
+ reason: reasons.join("; ") + " (choosing markdown as source)",
389
+ };
390
+ }
391
+ else if (syncFromMarkdown) {
392
+ return {
393
+ direction: "from-markdown",
394
+ reason: reasons.join("; "),
395
+ };
396
+ }
397
+ else if (syncToMarkdown) {
398
+ return {
399
+ direction: "to-markdown",
400
+ reason: reasons.join("; "),
401
+ };
402
+ }
403
+ else {
404
+ return {
405
+ direction: "no-sync",
406
+ reason: reasons.join("; "),
407
+ };
408
+ }
409
+ }
410
+ /**
411
+ * Format timestamp for display
412
+ */
413
+ function formatTime(date) {
414
+ return date.toISOString().replace("T", " ").substring(0, 19);
415
+ }
416
+ //# sourceMappingURL=sync-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-commands.js","sourceRoot":"","sources":["../../src/cli/sync-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-commands.d.ts","sourceRoot":"","sources":["../../src/cli/update-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BvD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA2ClD"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Update command handlers
3
+ */
4
+ import chalk from "chalk";
5
+ import { execSync } from "child_process";
6
+ import { checkForUpdates } from "../update-checker.js";
7
+ const PACKAGE_NAME = "@sudocode-ai/cli";
8
+ /**
9
+ * Handle update check command
10
+ */
11
+ export async function handleUpdateCheck() {
12
+ console.log(chalk.cyan("Checking for updates..."));
13
+ const info = await checkForUpdates();
14
+ if (!info) {
15
+ console.log(chalk.yellow("Unable to check for updates"));
16
+ console.log("Please try again later or check manually:");
17
+ console.log(` npm view ${PACKAGE_NAME} version`);
18
+ return;
19
+ }
20
+ console.log(`Current version: ${chalk.cyan(info.current)}`);
21
+ console.log(`Latest version: ${chalk.cyan(info.latest)}`);
22
+ if (info.updateAvailable) {
23
+ console.log();
24
+ console.log(chalk.green("✓ Update available!"));
25
+ console.log();
26
+ console.log("To update, run:");
27
+ console.log(chalk.yellow(` npm install -g ${PACKAGE_NAME}`));
28
+ console.log(chalk.yellow(` sudocode update`));
29
+ }
30
+ else {
31
+ console.log();
32
+ console.log(chalk.green("✓ You are using the latest version"));
33
+ }
34
+ }
35
+ /**
36
+ * Handle update install command
37
+ */
38
+ export async function handleUpdate() {
39
+ console.log(chalk.cyan("Checking for updates..."));
40
+ const info = await checkForUpdates();
41
+ if (!info) {
42
+ console.log(chalk.yellow("Unable to check for updates"));
43
+ console.log("Attempting to update anyway...");
44
+ }
45
+ else if (!info.updateAvailable) {
46
+ console.log(chalk.green("✓ Already on latest version:"), info.current);
47
+ return;
48
+ }
49
+ else {
50
+ console.log(`Updating from ${info.current} to ${info.latest}...`);
51
+ }
52
+ try {
53
+ console.log();
54
+ console.log(chalk.cyan("Running: npm install -g " + PACKAGE_NAME));
55
+ console.log();
56
+ execSync(`npm install -g ${PACKAGE_NAME}`, {
57
+ stdio: "inherit",
58
+ });
59
+ console.log();
60
+ console.log(chalk.green("✓ Update completed successfully!"));
61
+ console.log();
62
+ console.log("Run 'sudocode --version' to verify the new version");
63
+ }
64
+ catch (error) {
65
+ console.log();
66
+ console.error(chalk.red("✗ Update failed"));
67
+ console.log();
68
+ console.log("Please try updating manually:");
69
+ console.log(chalk.yellow(` npm install -g ${PACKAGE_NAME}`));
70
+ console.log();
71
+ if (error instanceof Error) {
72
+ console.log("Error details:");
73
+ console.log(chalk.dim(error.message));
74
+ }
75
+ process.exit(1);
76
+ }
77
+ }
78
+ //# sourceMappingURL=update-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-commands.js","sourceRoot":"","sources":["../../src/cli/update-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG"}