trykora 1.3.0 → 1.4.0

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.
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function exportCommand(program: Command): void;
3
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/cli/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,QAsF7C"}
@@ -0,0 +1,81 @@
1
+ import chalk from 'chalk';
2
+ import dayjs from 'dayjs';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import { showHeader, successBox, errorBox } from '../ui.js';
6
+ import { readConfig } from '../config.js';
7
+ import { getDb } from '../storage/sqlite.js';
8
+ export function exportCommand(program) {
9
+ program
10
+ .command('export')
11
+ .description('Export your saved learnings to a Markdown file')
12
+ .option('-t, --tag <tag>', 'Filter by tag (win, mistake, lesson, shipit)')
13
+ .option('-d, --days <number>', 'Filter learnings from the last N days')
14
+ .option('-o, --output <filename>', 'Specify the output file name')
15
+ .action(async (opts) => {
16
+ showHeader('export');
17
+ const config = readConfig();
18
+ if (!config.key) {
19
+ errorBox('Not logged in. Run `kora login` first.');
20
+ return;
21
+ }
22
+ const db = getDb();
23
+ let query = 'SELECT * FROM learnings WHERE 1=1';
24
+ const params = [];
25
+ if (opts.tag) {
26
+ query += ' AND tags LIKE ?';
27
+ params.push(`%${opts.tag}%`);
28
+ }
29
+ if (opts.days) {
30
+ const days = parseInt(opts.days);
31
+ if (isNaN(days) || days <= 0) {
32
+ errorBox('Please provide a valid number of days.');
33
+ return;
34
+ }
35
+ const sinceDate = new Date(Date.now() - days * 86400000).toISOString();
36
+ query += ' AND created_at >= ?';
37
+ params.push(sinceDate);
38
+ }
39
+ query += ' ORDER BY created_at DESC';
40
+ const rows = db.prepare(query).all(...params);
41
+ if (rows.length === 0) {
42
+ console.log(chalk.dim('\n No learnings found matching your filters.\n'));
43
+ return;
44
+ }
45
+ const defaultFilename = `kora-export-${dayjs().format('YYYY-MM-DD')}.md`;
46
+ const filename = opts.output || defaultFilename;
47
+ const outputPath = path.resolve(process.cwd(), filename);
48
+ let markdown = `# Kora Learnings Export\n\n`;
49
+ markdown += `*Generated on ${dayjs().format('MMMM D, YYYY')}*\n\n`;
50
+ let filtersApplied = [];
51
+ if (opts.tag)
52
+ filtersApplied.push(`Tag: \`${opts.tag}\``);
53
+ if (opts.days)
54
+ filtersApplied.push(`Last ${opts.days} days`);
55
+ if (filtersApplied.length > 0) {
56
+ markdown += `Filters: ${filtersApplied.join(' | ')}\n\n`;
57
+ }
58
+ markdown += `---\n\n`;
59
+ rows.forEach((r) => {
60
+ const tags = JSON.parse(r.tags || '[]');
61
+ const formattedDate = dayjs(r.created_at).format('MMM D, YYYY h:mm A');
62
+ markdown += `### ${formattedDate}\n`;
63
+ if (tags.length > 0) {
64
+ markdown += `**Tags:** ${tags.map((t) => `\`#${t}\``).join(' ')}\n\n`;
65
+ }
66
+ markdown += `${r.raw}\n\n`;
67
+ markdown += `---\n\n`;
68
+ });
69
+ try {
70
+ fs.writeFileSync(outputPath, markdown);
71
+ successBox('Export Successful!', [
72
+ `Exported ${chalk.cyan(rows.length)} learning(s).`,
73
+ `Saved to: ${chalk.green(outputPath)}`
74
+ ].join('\n'));
75
+ }
76
+ catch (err) {
77
+ errorBox(`Failed to write file: ${err.message}`);
78
+ }
79
+ });
80
+ }
81
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/cli/export.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,QAWhD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,QAYhD"}
@@ -7,6 +7,7 @@ import { backupCommand } from './backup.js';
7
7
  import { notionCommand } from './notion.js';
8
8
  import { resetKeyCommand } from './reset-key.js';
9
9
  import { syncCommand } from './sync.js';
10
+ import { exportCommand } from './export.js';
10
11
  export function registerCommands(program) {
11
12
  showBanner();
12
13
  loginCommand(program);
@@ -17,5 +18,6 @@ export function registerCommands(program) {
17
18
  notionCommand(program);
18
19
  resetKeyCommand(program);
19
20
  syncCommand(program);
21
+ exportCommand(program);
20
22
  }
21
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,UAAU,EAAE,CAAC;IAEb,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,WAAW,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,UAAU,EAAE,CAAC;IAEb,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,aAAa,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trykora",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Grow your audience while you build — capture insights and turn them into X, Reddit, LinkedIn, and HN posts inside any AI tool",
5
5
  "type": "module",
6
6
  "bin": {