inbox-to-md 0.1.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.
package/dist/tui.js ADDED
@@ -0,0 +1,371 @@
1
+ // Dependency-free terminal UI primitives, in the style of a promise-based
2
+ // prompt flow: raw-mode stdin is parsed into a queue of discrete key events,
3
+ // and each screen is an async function that awaits keys and redraws itself.
4
+ //
5
+ // Two primitives carry the whole UI:
6
+ // - pickFromMenu — vertical option list, arrow / numeric / enter.
7
+ // - runForm — multi-field form with up/down nav, esc-to-go-back, and an
8
+ // optional verify callback (red inline error on failure).
9
+ import { bold, dim, red } from './ansi.js';
10
+ const ESC = '\x1b[';
11
+ const CLEAR_SCREEN = `${ESC}2J${ESC}H`;
12
+ const HIDE_CURSOR = `${ESC}?25l`;
13
+ const SHOW_CURSOR = `${ESC}?25h`;
14
+ const keyQueue = [];
15
+ let keyWaiter = null;
16
+ let stdinHandler = null;
17
+ function parseKeys(s) {
18
+ const out = [];
19
+ let i = 0;
20
+ while (i < s.length) {
21
+ const c = s[i];
22
+ if (c === '\x1b' && s[i + 1] === '[' && i + 2 < s.length) {
23
+ // CSI sequence: \x1b[ <params> <final>. Consume parameter bytes so keys
24
+ // like Delete (\x1b[3~) or PageUp (\x1b[5~) don't leak their trailing
25
+ // bytes into the input as literal characters.
26
+ let j = i + 2;
27
+ while (j < s.length && /[0-9;]/.test(s[j]))
28
+ j++;
29
+ const final = s[j];
30
+ if (final === 'A')
31
+ out.push({ name: 'up' });
32
+ else if (final === 'B')
33
+ out.push({ name: 'down' });
34
+ else if (final === 'C')
35
+ out.push({ name: 'right' });
36
+ else if (final === 'D')
37
+ out.push({ name: 'left' });
38
+ i = j + 1;
39
+ continue;
40
+ }
41
+ if (c === '\x1b' && s[i + 1] === 'O' && i + 2 < s.length) {
42
+ // SS3 arrows (\x1bOA…) — sent instead of CSI by terminals in
43
+ // "application cursor keys" mode; both forms must be handled.
44
+ const code = s[i + 2];
45
+ if (code === 'A')
46
+ out.push({ name: 'up' });
47
+ else if (code === 'B')
48
+ out.push({ name: 'down' });
49
+ else if (code === 'C')
50
+ out.push({ name: 'right' });
51
+ else if (code === 'D')
52
+ out.push({ name: 'left' });
53
+ i += 3;
54
+ continue;
55
+ }
56
+ if (c === '\x1b') {
57
+ out.push({ name: 'escape' });
58
+ i++;
59
+ continue;
60
+ }
61
+ if (c === '\r' || c === '\n') {
62
+ out.push({ name: 'enter' });
63
+ i++;
64
+ continue;
65
+ }
66
+ if (c === '\x7f' || c === '\x08') {
67
+ out.push({ name: 'backspace' });
68
+ i++;
69
+ continue;
70
+ }
71
+ if (c === '\x03') {
72
+ out.push({ name: 'ctrl-c' });
73
+ i++;
74
+ continue;
75
+ }
76
+ if (c === '\x18') {
77
+ out.push({ name: 'ctrl-x' });
78
+ i++;
79
+ continue;
80
+ }
81
+ const code = c.charCodeAt(0);
82
+ if (code >= 0x20 && code !== 0x7f) {
83
+ out.push({ name: 'char', ch: c });
84
+ i++;
85
+ continue;
86
+ }
87
+ i++;
88
+ }
89
+ return out;
90
+ }
91
+ function pumpData(chunk) {
92
+ const s = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
93
+ for (const k of parseKeys(s))
94
+ keyQueue.push(k);
95
+ while (keyWaiter && keyQueue.length > 0) {
96
+ const w = keyWaiter;
97
+ keyWaiter = null;
98
+ w(keyQueue.shift());
99
+ }
100
+ }
101
+ export function readKey() {
102
+ return new Promise((resolve) => {
103
+ if (keyQueue.length > 0)
104
+ return resolve(keyQueue.shift());
105
+ keyWaiter = resolve;
106
+ });
107
+ }
108
+ // ── Terminal lifecycle ────────────────────────────────────────────────────
109
+ //
110
+ // Raw mode must be undone no matter how the process ends — a crash that
111
+ // leaves the terminal raw and cursorless makes the user's shell unusable.
112
+ // restoreTerminal is idempotent and registered on exit/SIGINT/SIGTERM.
113
+ let tuiActive = false;
114
+ function restoreTerminal() {
115
+ if (!tuiActive)
116
+ return;
117
+ tuiActive = false;
118
+ if (process.stdin.isTTY)
119
+ process.stdin.setRawMode(false);
120
+ process.stdout.write(SHOW_CURSOR);
121
+ }
122
+ export function enterTui() {
123
+ if (tuiActive)
124
+ return;
125
+ tuiActive = true;
126
+ process.stdin.setRawMode(true);
127
+ process.stdin.resume();
128
+ stdinHandler = pumpData;
129
+ process.stdin.on('data', stdinHandler);
130
+ process.stdout.write(HIDE_CURSOR);
131
+ process.on('exit', restoreTerminal);
132
+ // In raw mode Ctrl+C arrives as \x03 (handled in the key loop), but an
133
+ // external kill still delivers these signals — restore before dying.
134
+ process.on('SIGINT', () => { restoreTerminal(); process.exit(130); });
135
+ process.on('SIGTERM', () => { restoreTerminal(); process.exit(143); });
136
+ }
137
+ export function exitTui() {
138
+ restoreTerminal();
139
+ if (stdinHandler) {
140
+ process.stdin.removeListener('data', stdinHandler);
141
+ stdinHandler = null;
142
+ }
143
+ process.stdin.pause();
144
+ process.stdout.write(CLEAR_SCREEN);
145
+ }
146
+ function exitOnCtrlC() {
147
+ restoreTerminal();
148
+ process.stdout.write('\n');
149
+ process.exit(130);
150
+ }
151
+ // ── Header ────────────────────────────────────────────────────────────────
152
+ function renderHeader() {
153
+ return `${bold('inbox-to-md')}\n${dim('Sync IMAP inboxes to markdown files.')}\n\n`;
154
+ }
155
+ function renderMenu(title, options, selected, footer) {
156
+ let out = CLEAR_SCREEN;
157
+ out += renderHeader();
158
+ out += `${title}\n`;
159
+ for (let i = 0; i < options.length; i++) {
160
+ const cursor = i === selected ? '>' : ' ';
161
+ const label = `${cursor} [${i + 1}] ${options[i].label}`;
162
+ out += (i === selected ? bold(label) : label) + '\n';
163
+ }
164
+ if (footer)
165
+ out += '\n' + dim(footer) + '\n';
166
+ return out;
167
+ }
168
+ export async function pickFromMenu(title, options, footer = null, opts = {}) {
169
+ let selected = 0;
170
+ process.stdout.write(renderMenu(title, options, selected, footer));
171
+ while (true) {
172
+ const key = await readKey();
173
+ if (key.name === 'ctrl-c')
174
+ exitOnCtrlC();
175
+ if (key.name === 'escape')
176
+ return { kind: 'escape' };
177
+ if (key.name === 'up') {
178
+ selected = (selected - 1 + options.length) % options.length;
179
+ }
180
+ else if (key.name === 'down') {
181
+ selected = (selected + 1) % options.length;
182
+ }
183
+ else if (key.name === 'char' && /^[1-9]$/.test(key.ch)) {
184
+ const idx = parseInt(key.ch, 10) - 1;
185
+ if (idx >= 0 && idx < options.length)
186
+ return { kind: 'pick', value: options[idx].value };
187
+ continue;
188
+ }
189
+ else if (key.name === 'enter') {
190
+ return { kind: 'pick', value: options[selected].value };
191
+ }
192
+ else if (key.name === 'ctrl-x' && opts.enableCtrlX) {
193
+ return { kind: 'ctrl-x', value: options[selected].value };
194
+ }
195
+ else {
196
+ continue;
197
+ }
198
+ process.stdout.write(renderMenu(title, options, selected, footer));
199
+ }
200
+ }
201
+ const CURSOR_BLOCK = '█';
202
+ // The block marker is one terminal cell, so it can be appended to display
203
+ // strings without re-running width math. Only added on the focused field so
204
+ // the user can see exactly where the next keystroke will land.
205
+ function fieldValueDisplay(f, focused) {
206
+ if (f.kind === 'secret')
207
+ return '*'.repeat(f.value.length) + (focused ? CURSOR_BLOCK : '');
208
+ if (f.kind === 'select') {
209
+ const opts = f.options || [];
210
+ const current = f.value || opts[0] || '';
211
+ return focused ? `< ${current} >` : current;
212
+ }
213
+ return f.value + (focused ? CURSOR_BLOCK : '');
214
+ }
215
+ function renderForm(spec, focused, errorLine, status) {
216
+ let out = CLEAR_SCREEN;
217
+ out += renderHeader();
218
+ out += `${spec.title}\n`;
219
+ out += '\n';
220
+ // Align all value columns to the widest label so the form reads like a
221
+ // table. Width is computed on the raw text (no ANSI) — bold codes are
222
+ // applied after padding so they don't throw off the math.
223
+ const labelWidth = spec.fields.reduce((w, f) => Math.max(w, ` ${f.label}:`.length), 0);
224
+ for (let i = 0; i < spec.fields.length; i++) {
225
+ const f = spec.fields[i];
226
+ const isFocus = i === focused;
227
+ const cursor = isFocus ? '>' : ' ';
228
+ const labelStr = `${cursor} ${f.label}:`;
229
+ const labelOut = isFocus ? bold(labelStr) : labelStr;
230
+ const padding = ' '.repeat(Math.max(0, labelWidth - labelStr.length));
231
+ out += labelOut + padding + ' ' + fieldValueDisplay(f, isFocus) + '\n';
232
+ if (f.hint)
233
+ out += ' '.repeat(labelWidth + 2) + dim(f.hint) + '\n';
234
+ }
235
+ if (spec.submitLabel !== '') {
236
+ out += '\n';
237
+ const isFocus = focused === spec.fields.length;
238
+ const cursor = isFocus ? '>' : ' ';
239
+ const labelStr = `${cursor} [ ${spec.submitLabel || 'Save'} ]`;
240
+ out += (isFocus ? bold(labelStr) : labelStr) + '\n';
241
+ }
242
+ if (spec.hint)
243
+ out += '\n' + dim(spec.hint) + '\n';
244
+ if (status)
245
+ out += '\n' + status + '\n';
246
+ if (errorLine)
247
+ out += '\n' + red(errorLine) + '\n';
248
+ return out;
249
+ }
250
+ // Multi-field form runner. Up/Down moves between fields (and the Save row
251
+ // when present). Enter on a field advances to the next, or submits when the
252
+ // form is Save-less or every field is already filled. Left/Right cycles
253
+ // select options. Esc returns 'back' without saving.
254
+ export async function runForm(spec) {
255
+ // Init select fields with their first option if the caller left value blank.
256
+ for (const f of spec.fields) {
257
+ if (f.kind === 'select' && !f.value && f.options && f.options.length > 0) {
258
+ f.value = f.options[0];
259
+ }
260
+ }
261
+ const rowCount = spec.fields.length + (spec.submitLabel === '' ? 0 : 1);
262
+ const saveRow = spec.fields.length; // index of Save row, even if hidden
263
+ let focused = 0;
264
+ let errorLine = null;
265
+ let status = null;
266
+ const draw = () => {
267
+ process.stdout.write(renderForm(spec, focused, errorLine, status));
268
+ };
269
+ draw();
270
+ const collect = () => {
271
+ const out = {};
272
+ for (const f of spec.fields)
273
+ out[f.key] = f.value;
274
+ return out;
275
+ };
276
+ const trySubmit = async () => {
277
+ if (!spec.verify)
278
+ return collect();
279
+ status = dim('Verifying…');
280
+ errorLine = null;
281
+ draw();
282
+ const err = await spec.verify(collect());
283
+ status = null;
284
+ if (err === null)
285
+ return collect();
286
+ errorLine = err;
287
+ // Clear secret fields so they don't show an old, wrong asterisk count.
288
+ for (const f of spec.fields)
289
+ if (f.kind === 'secret')
290
+ f.value = '';
291
+ draw();
292
+ return null;
293
+ };
294
+ const allFieldsFilled = () => spec.fields.every((f) => (f.kind === 'select' ? !!f.value : f.value.trim() !== ''));
295
+ while (true) {
296
+ const key = await readKey();
297
+ if (key.name === 'ctrl-c')
298
+ exitOnCtrlC();
299
+ if (key.name === 'escape')
300
+ return 'back';
301
+ const onSave = focused === saveRow && spec.submitLabel !== '';
302
+ const field = focused < spec.fields.length ? spec.fields[focused] : null;
303
+ if (key.name === 'up') {
304
+ focused = (focused - 1 + rowCount) % rowCount;
305
+ draw();
306
+ continue;
307
+ }
308
+ if (key.name === 'down') {
309
+ focused = (focused + 1) % rowCount;
310
+ draw();
311
+ continue;
312
+ }
313
+ if (onSave) {
314
+ if (key.name === 'enter') {
315
+ const submitted = await trySubmit();
316
+ if (submitted)
317
+ return submitted;
318
+ }
319
+ continue;
320
+ }
321
+ if (!field)
322
+ continue;
323
+ if (key.name === 'enter') {
324
+ if (spec.submitLabel === '' || allFieldsFilled()) {
325
+ // Save-less form: Enter saves from any field (move with ↑/↓). With a
326
+ // Save row, Enter still submits once every field has a value so the
327
+ // user doesn't have to navigate down past every input.
328
+ const submitted = await trySubmit();
329
+ if (submitted)
330
+ return submitted;
331
+ }
332
+ else if (focused < spec.fields.length - 1) {
333
+ focused += 1;
334
+ draw();
335
+ }
336
+ else {
337
+ focused = saveRow;
338
+ draw();
339
+ }
340
+ continue;
341
+ }
342
+ if (key.name === 'left' || key.name === 'right') {
343
+ if (field.kind === 'select' && field.options && field.options.length > 0) {
344
+ const idx = field.options.indexOf(field.value);
345
+ const step = key.name === 'right' ? 1 : -1;
346
+ const next = (idx + step + field.options.length) % field.options.length;
347
+ field.value = field.options[next];
348
+ draw();
349
+ }
350
+ continue;
351
+ }
352
+ if (key.name === 'backspace') {
353
+ if (field.kind === 'select')
354
+ continue;
355
+ if (field.value.length > 0)
356
+ field.value = field.value.slice(0, -1);
357
+ draw();
358
+ continue;
359
+ }
360
+ if (key.name === 'char') {
361
+ if (field.kind === 'select')
362
+ continue;
363
+ if (field.kind === 'number' && !/[0-9]/.test(key.ch))
364
+ continue;
365
+ field.value += key.ch;
366
+ draw();
367
+ continue;
368
+ }
369
+ }
370
+ }
371
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "inbox-to-md",
3
+ "version": "0.1.0",
4
+ "description": "Sync IMAP inboxes to Markdown files — one file per email, with YAML frontmatter",
5
+ "type": "module",
6
+ "bin": {
7
+ "inbox-to-md": "dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "engines": {
13
+ "node": ">=20"
14
+ },
15
+ "keywords": [
16
+ "imap",
17
+ "email",
18
+ "markdown",
19
+ "inbox",
20
+ "sync",
21
+ "cli"
22
+ ],
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/chaidhat/inbox-to-md.git"
26
+ },
27
+ "homepage": "https://github.com/chaidhat/inbox-to-md#readme",
28
+ "bugs": {
29
+ "url": "https://github.com/chaidhat/inbox-to-md/issues"
30
+ },
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "prepublishOnly": "npm run build",
34
+ "auth": "tsx src/auth.ts",
35
+ "dev": "tsx src/index.ts",
36
+ "start": "tsx src/index.ts",
37
+ "archive": "tsx src/archive.ts",
38
+ "compact": "tsx src/compact.ts"
39
+ },
40
+ "license": "MIT",
41
+ "devDependencies": {
42
+ "@types/node": "^26.1.1",
43
+ "@types/turndown": "^5.0.6",
44
+ "tsx": "^4.19.0",
45
+ "typescript": "^5.5.0"
46
+ },
47
+ "dependencies": {
48
+ "@anthropic-ai/claude-agent-sdk": "^0.3.211",
49
+ "imapflow": "^1.4.7",
50
+ "turndown": "^7.2.4"
51
+ }
52
+ }