@workjournal/cli 0.1.0 → 0.3.1

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 (51) hide show
  1. package/dist/api-client.d.ts +28 -0
  2. package/dist/api-client.d.ts.map +1 -0
  3. package/dist/api-client.js +114 -0
  4. package/dist/api-client.js.map +1 -0
  5. package/dist/auth.d.ts +1 -1
  6. package/dist/auth.d.ts.map +1 -1
  7. package/dist/auth.js +6 -3
  8. package/dist/auth.js.map +1 -1
  9. package/dist/commands/entries.d.ts +7 -0
  10. package/dist/commands/entries.d.ts.map +1 -0
  11. package/dist/commands/entries.js +102 -0
  12. package/dist/commands/entries.js.map +1 -0
  13. package/dist/commands/export.d.ts +2 -0
  14. package/dist/commands/export.d.ts.map +1 -0
  15. package/dist/commands/export.js +22 -0
  16. package/dist/commands/export.js.map +1 -0
  17. package/dist/commands/invites.d.ts +4 -0
  18. package/dist/commands/invites.d.ts.map +1 -0
  19. package/dist/commands/invites.js +45 -0
  20. package/dist/commands/invites.js.map +1 -0
  21. package/dist/commands/journals.d.ts +6 -0
  22. package/dist/commands/journals.d.ts.map +1 -0
  23. package/dist/commands/journals.js +70 -0
  24. package/dist/commands/journals.js.map +1 -0
  25. package/dist/commands/shares.d.ts +3 -0
  26. package/dist/commands/shares.d.ts.map +1 -0
  27. package/dist/commands/shares.js +34 -0
  28. package/dist/commands/shares.js.map +1 -0
  29. package/dist/config.d.ts +6 -0
  30. package/dist/config.d.ts.map +1 -0
  31. package/dist/config.js +22 -0
  32. package/dist/config.js.map +1 -0
  33. package/dist/credentials.d.ts +1 -28
  34. package/dist/credentials.d.ts.map +1 -1
  35. package/dist/credentials.js +1 -124
  36. package/dist/credentials.js.map +1 -1
  37. package/dist/formatting.d.ts +9 -0
  38. package/dist/formatting.d.ts.map +1 -0
  39. package/dist/formatting.js +37 -0
  40. package/dist/formatting.js.map +1 -0
  41. package/dist/index.js +395 -51
  42. package/dist/index.js.map +1 -1
  43. package/dist/project-config.d.ts +18 -0
  44. package/dist/project-config.d.ts.map +1 -0
  45. package/dist/project-config.js +55 -0
  46. package/dist/project-config.js.map +1 -0
  47. package/dist/wsl.d.ts +5 -0
  48. package/dist/wsl.d.ts.map +1 -0
  49. package/dist/wsl.js +33 -0
  50. package/dist/wsl.js.map +1 -0
  51. package/package.json +4 -2
package/dist/index.js CHANGED
@@ -1,72 +1,416 @@
1
1
  #!/usr/bin/env node
2
2
  import { loginFinish, loginInteractive, loginStart } from './auth.js';
3
- import { clearCredentials, clearLoginState, readCredentials } from './credentials.js';
4
- const command = process.argv[2];
5
- switch (command) {
6
- case 'login': {
7
- const sub = process.argv[3];
8
- if (sub === 'start') {
9
- loginStart();
10
- }
11
- else if (sub === 'finish') {
12
- const code = process.argv[4];
13
- if (!code) {
14
- process.stderr.write('Usage: workjournal login finish <CODE>\n');
3
+ import { createEntry, deleteEntry, getEntry, lastEntries, listEntries, searchEntries, } from './commands/entries.js';
4
+ import { exportJournal } from './commands/export.js';
5
+ import { deleteInvite, listInvites, newInvite } from './commands/invites.js';
6
+ import { createJournal, deleteJournal, getJournal, listJournals, selectJournal, } from './commands/journals.js';
7
+ import { deleteShare, listShares } from './commands/shares.js';
8
+ import { readConfig } from './config.js';
9
+ import { CONFIG_DIR, clearCredentials, clearLoginState, readCredentials } from './credentials.js';
10
+ import { findProjectConfig, getProjectConfigPath } from './project-config.js';
11
+ // ── Arg parsing ─────────────────────────────────────────────────────────────
12
+ const rawArgs = process.argv.slice(2);
13
+ const jsonOutput = rawArgs.includes('--json');
14
+ const args = rawArgs.filter((a) => a !== '--json');
15
+ /** Parse args into flags (single-dash short or double-dash long) and positional args. */
16
+ function parseFlags(argv) {
17
+ const flags = {};
18
+ const positional = [];
19
+ let i = 0;
20
+ while (i < argv.length) {
21
+ const arg = argv[i];
22
+ if ((arg.startsWith('--') || (arg.startsWith('-') && arg.length === 2)) &&
23
+ i + 1 < argv.length) {
24
+ flags[arg] = argv[i + 1];
25
+ i += 2;
26
+ }
27
+ else {
28
+ positional.push(arg);
29
+ i++;
30
+ }
31
+ }
32
+ return { flags, positional };
33
+ }
34
+ // ── Journal ID resolution ───────────────────────────────────────────────────
35
+ function resolveJournalId() {
36
+ const projectConfig = findProjectConfig();
37
+ if (projectConfig)
38
+ return projectConfig.journal_id;
39
+ const config = readConfig();
40
+ if (config.journal)
41
+ return config.journal;
42
+ process.stderr.write(`No journal selected. To select one:
43
+ workjournal journals list List available journals
44
+ workjournal journals select <id> Set active journal
45
+ `);
46
+ process.exit(1);
47
+ }
48
+ // ── Routing ─────────────────────────────────────────────────────────────────
49
+ async function routeAuth(argv) {
50
+ const sub = argv[0];
51
+ switch (sub) {
52
+ case 'login': {
53
+ const loginSub = argv[1];
54
+ if (loginSub === 'start') {
55
+ await loginStart();
56
+ }
57
+ else if (loginSub === 'finish') {
58
+ const code = argv[2];
59
+ if (!code) {
60
+ process.stderr.write('Usage: workjournal auth login finish <CODE>\n');
61
+ process.exit(1);
62
+ }
63
+ await loginFinish(code);
64
+ }
65
+ else if (loginSub === undefined) {
66
+ await loginInteractive();
67
+ }
68
+ else {
69
+ process.stderr.write(`Unknown auth login subcommand: ${loginSub}\n`);
15
70
  process.exit(1);
16
71
  }
17
- await loginFinish(code);
72
+ break;
18
73
  }
19
- else if (sub === undefined) {
20
- await loginInteractive();
74
+ case 'logout':
75
+ clearCredentials();
76
+ clearLoginState();
77
+ process.stdout.write('Logged out. Credentials removed.\n');
78
+ break;
79
+ case 'whoami': {
80
+ const creds = readCredentials();
81
+ if (!creds) {
82
+ process.stderr.write('Not logged in. Run `workjournal auth login` to authenticate.\n');
83
+ process.exit(1);
84
+ }
85
+ process.stdout.write(`Authenticated. Credentials stored at ${CONFIG_DIR}/credentials.json\n`);
86
+ break;
21
87
  }
22
- else {
23
- process.stderr.write(`Unknown login subcommand: ${sub}\n`);
24
- process.stderr.write('Usage: workjournal login [start | finish <CODE>]\n');
88
+ case 'status': {
89
+ const creds = readCredentials();
90
+ if (!creds) {
91
+ process.stdout.write('Status: not authenticated\n');
92
+ process.stdout.write('Run `workjournal auth login` to authenticate.\n');
93
+ }
94
+ else {
95
+ const expiresAt = new Date(creds.expires_at);
96
+ const isExpired = expiresAt < new Date();
97
+ process.stdout.write('Status: authenticated\n');
98
+ process.stdout.write(`Token expires: ${expiresAt.toISOString()}${isExpired ? ' (expired, will auto-refresh)' : ''}\n`);
99
+ }
100
+ break;
101
+ }
102
+ default:
103
+ process.stderr.write(`Unknown auth subcommand: ${sub ?? '(none)'}\n` +
104
+ 'Usage: workjournal auth <login|logout|whoami|status>\n');
105
+ process.exit(1);
106
+ }
107
+ }
108
+ async function routeEntries(journalId, argv) {
109
+ const sub = argv[0];
110
+ switch (sub) {
111
+ case undefined:
112
+ case 'list':
113
+ await listEntries(journalId, jsonOutput);
114
+ break;
115
+ case 'write': {
116
+ const { flags } = parseFlags(argv.slice(1));
117
+ const summary = flags['-s'] ?? flags['--summary'];
118
+ const body = flags['-b'] ?? flags['--body'];
119
+ if (!summary || !body) {
120
+ process.stderr.write('Usage: workjournal journals <id> entries write -s <summary> -b <body>\n');
121
+ process.exit(1);
122
+ }
123
+ await createEntry(journalId, summary, body, jsonOutput);
124
+ break;
125
+ }
126
+ case 'last': {
127
+ const count = Number.parseInt(argv[1] ?? '1', 10);
128
+ if (Number.isNaN(count) || count < 1) {
129
+ process.stderr.write('Usage: workjournal journals <id> entries last [count]\n');
130
+ process.exit(1);
131
+ }
132
+ await lastEntries(journalId, count, jsonOutput);
133
+ break;
134
+ }
135
+ case 'get': {
136
+ const index = argv[1];
137
+ if (!index) {
138
+ process.stderr.write('Usage: workjournal journals <id> entries get <index>\n');
139
+ process.exit(1);
140
+ }
141
+ await getEntry(journalId, index, jsonOutput);
142
+ break;
143
+ }
144
+ case 'delete': {
145
+ const index = argv[1];
146
+ if (!index) {
147
+ process.stderr.write('Usage: workjournal journals <id> entries delete <index>\n');
148
+ process.exit(1);
149
+ }
150
+ await deleteEntry(journalId, index, jsonOutput);
151
+ break;
152
+ }
153
+ case 'search': {
154
+ const query = argv[1];
155
+ if (!query) {
156
+ process.stderr.write('Usage: workjournal journals <id> entries search <query>\n');
157
+ process.exit(1);
158
+ }
159
+ await searchEntries(journalId, query, jsonOutput);
160
+ break;
161
+ }
162
+ default:
163
+ process.stderr.write(`Unknown entries subcommand: ${sub}\n`);
164
+ process.exit(1);
165
+ }
166
+ }
167
+ async function routeShares(journalId, argv) {
168
+ const sub = argv[0];
169
+ switch (sub) {
170
+ case undefined:
171
+ case 'list':
172
+ await listShares(journalId, jsonOutput);
173
+ break;
174
+ case 'delete': {
175
+ const email = argv[1];
176
+ if (!email) {
177
+ process.stderr.write('Usage: workjournal journals <id> shares delete <email>\n');
178
+ process.exit(1);
179
+ }
180
+ await deleteShare(journalId, email, jsonOutput);
181
+ break;
182
+ }
183
+ default:
184
+ process.stderr.write(`Unknown shares subcommand: ${sub}\n`);
185
+ process.exit(1);
186
+ }
187
+ }
188
+ async function routeInvites(journalId, argv) {
189
+ const sub = argv[0];
190
+ switch (sub) {
191
+ case undefined:
192
+ case 'list':
193
+ await listInvites(journalId, jsonOutput);
194
+ break;
195
+ case 'new': {
196
+ const email = argv[1];
197
+ if (!email) {
198
+ process.stderr.write('Usage: workjournal journals <id> invites new <email>\n');
199
+ process.exit(1);
200
+ }
201
+ await newInvite(journalId, email, jsonOutput);
202
+ break;
203
+ }
204
+ case 'delete': {
205
+ const invitationId = argv[1];
206
+ if (!invitationId) {
207
+ process.stderr.write('Usage: workjournal journals <id> invites delete <invitation_id>\n');
208
+ process.exit(1);
209
+ }
210
+ await deleteInvite(journalId, invitationId, jsonOutput);
211
+ break;
212
+ }
213
+ default:
214
+ process.stderr.write(`Unknown invites subcommand: ${sub}\n`);
25
215
  process.exit(1);
216
+ }
217
+ }
218
+ async function routeJournalResource(journalId, argv) {
219
+ const sub = argv[0];
220
+ switch (sub) {
221
+ case undefined:
222
+ await getJournal(journalId, jsonOutput);
223
+ break;
224
+ case 'entries':
225
+ await routeEntries(journalId, argv.slice(1));
226
+ break;
227
+ case 'shares':
228
+ await routeShares(journalId, argv.slice(1));
229
+ break;
230
+ case 'invites':
231
+ await routeInvites(journalId, argv.slice(1));
232
+ break;
233
+ case 'export': {
234
+ const { flags } = parseFlags(argv.slice(1));
235
+ const format = flags['-f'] ?? flags['--format'] ?? 'json';
236
+ if (!['json', 'md', 'csv'].includes(format)) {
237
+ process.stderr.write('Invalid format. Use: -f json|md|csv\n');
238
+ process.exit(1);
239
+ }
240
+ const outputPath = flags['-p'] ?? flags['--path'];
241
+ await exportJournal(journalId, format, outputPath);
242
+ break;
26
243
  }
27
- break;
244
+ default:
245
+ process.stderr.write(`Unknown subcommand: ${sub}\n`);
246
+ process.exit(1);
28
247
  }
29
- case 'logout':
30
- clearCredentials();
31
- clearLoginState();
32
- process.stdout.write('Logged out. Credentials removed.\n');
33
- break;
34
- case 'whoami': {
35
- const creds = readCredentials();
36
- if (!creds) {
37
- process.stderr.write('Not logged in. Run `workjournal login` to authenticate.\n');
248
+ }
249
+ async function routeJournals(argv) {
250
+ const sub = argv[0];
251
+ if (sub === undefined) {
252
+ // Shortcut: workjournal journals → show selected journal details
253
+ const journalId = resolveJournalId();
254
+ await getJournal(journalId, jsonOutput);
255
+ return;
256
+ }
257
+ if (sub === 'list') {
258
+ await listJournals(jsonOutput);
259
+ return;
260
+ }
261
+ if (sub === 'new') {
262
+ const name = argv[1];
263
+ if (!name) {
264
+ process.stderr.write('Usage: workjournal journals new <name>\n');
265
+ process.exit(1);
266
+ }
267
+ await createJournal(name, jsonOutput);
268
+ return;
269
+ }
270
+ if (sub === 'delete') {
271
+ const id = argv[1];
272
+ if (!id) {
273
+ process.stderr.write('Usage: workjournal journals delete <journal_id>\n');
38
274
  process.exit(1);
39
275
  }
40
- process.stdout.write('Authenticated. Credentials stored at ~/.workjournal/credentials.json\n');
41
- break;
276
+ await deleteJournal(id, jsonOutput);
277
+ return;
42
278
  }
43
- case 'status': {
44
- const creds = readCredentials();
45
- if (!creds) {
46
- process.stdout.write('Status: not authenticated\n');
47
- process.stdout.write('Run `workjournal login` to authenticate.\n');
279
+ if (sub === 'select') {
280
+ const id = argv[1];
281
+ if (!id) {
282
+ process.stderr.write('Usage: workjournal journals select <journal_id>\n');
283
+ process.exit(1);
284
+ }
285
+ await selectJournal(id);
286
+ return;
287
+ }
288
+ // Not a known subcommand — treat as a journal ID
289
+ const journalId = sub;
290
+ await routeJournalResource(journalId, argv.slice(1));
291
+ }
292
+ async function routeConfig(argv) {
293
+ const sub = argv[0];
294
+ if (sub === 'show') {
295
+ const projectPath = getProjectConfigPath();
296
+ const projectCfg = findProjectConfig();
297
+ const globalCfg = readConfig();
298
+ process.stdout.write('Project config:\n');
299
+ if (projectPath && projectCfg) {
300
+ process.stdout.write(` Path: ${projectPath}\n`);
301
+ process.stdout.write(` journal_id: ${projectCfg.journal_id}\n`);
48
302
  }
49
303
  else {
50
- const expiresAt = new Date(creds.expires_at);
51
- const isExpired = expiresAt < new Date();
52
- process.stdout.write('Status: authenticated\n');
53
- process.stdout.write(`Token expires: ${expiresAt.toISOString()}${isExpired ? ' (expired, will auto-refresh)' : ''}\n`);
304
+ process.stdout.write(' (none)\n');
305
+ }
306
+ process.stdout.write('Global config:\n');
307
+ if (globalCfg.journal) {
308
+ process.stdout.write(` journal: ${globalCfg.journal}\n`);
309
+ }
310
+ else {
311
+ process.stdout.write(' (none)\n');
54
312
  }
55
- break;
56
313
  }
57
- default:
58
- process.stdout.write(`workjournal CLI for Workjournal (https://workjournal.pro)
314
+ else {
315
+ process.stderr.write('Usage: workjournal config show\n');
316
+ process.exit(1);
317
+ }
318
+ }
319
+ // ── Help ────────────────────────────────────────────────────────────────────
320
+ function printHelp() {
321
+ process.stdout.write(`workjournal — CLI for Workjournal (https://workjournal.pro)
59
322
 
60
323
  Usage:
61
- workjournal login Interactive login (terminal only)
62
- workjournal login start Print authorize URL and store PKCE state
63
- workjournal login finish <CODE> Exchange the pasted code for credentials
64
- workjournal logout Remove stored credentials
65
- workjournal whoami Show current auth status
66
- workjournal status Show detailed auth status\n`);
67
- if (command && command !== 'help' && command !== '--help') {
68
- process.stderr.write(`Unknown command: ${command}\n`);
69
- process.exit(1);
324
+ workjournal List entries in selected journal
325
+
326
+ Selected journal (workjournal journal ...):
327
+ workjournal journal Show selected journal details
328
+ workjournal journal entries List entries
329
+ workjournal journal entries write -s <summary> -b <body>
330
+ Create a new entry
331
+ workjournal journal entries last [count] Show most recent entries (full body)
332
+ workjournal journal entries get <index> Show a single entry by index
333
+ workjournal journal entries delete <index> Delete an entry by index
334
+ workjournal journal entries search <query> Search entries
335
+ workjournal journal shares List members
336
+ workjournal journal shares delete <email> Remove a member
337
+ workjournal journal invites List invitations
338
+ workjournal journal invites new <email> Invite a collaborator
339
+ workjournal journal invites delete <id> Revoke an invitation
340
+ workjournal journal export [-f json|md|csv] [-p <path>]
341
+ Export journal data
342
+
343
+ Manage journals (workjournal journals ...):
344
+ workjournal journals list List your journals
345
+ workjournal journals new <name> Create a new journal
346
+ workjournal journals delete <id> Delete a journal
347
+ workjournal journals select <id> Set active journal
348
+ workjournal journals <id> Show journal details
349
+ workjournal journals <id> entries|shares|invites|export
350
+ Access resources by journal ID
351
+
352
+ Auth:
353
+ workjournal auth login Interactive login
354
+ workjournal auth login start Print authorize URL (headless)
355
+ workjournal auth login finish <CODE> Exchange code for credentials
356
+ workjournal auth logout Remove stored credentials
357
+ workjournal auth whoami Show current auth status
358
+ workjournal auth status Show detailed auth status
359
+
360
+ Config:
361
+ workjournal config show Show resolved config
362
+
363
+ Flags:
364
+ --json Output raw JSON instead of tables
365
+ `);
366
+ }
367
+ // ── Main ────────────────────────────────────────────────────────────────────
368
+ async function run() {
369
+ try {
370
+ const command = args[0];
371
+ if (command === 'help' || command === '--help') {
372
+ printHelp();
373
+ return;
374
+ }
375
+ if (command === undefined) {
376
+ // Shortcut: workjournal → list entries in selected journal
377
+ const journalId = resolveJournalId();
378
+ await listEntries(journalId, jsonOutput);
379
+ return;
380
+ }
381
+ switch (command) {
382
+ case 'auth':
383
+ await routeAuth(args.slice(1));
384
+ break;
385
+ case 'journal': {
386
+ const journalId = resolveJournalId();
387
+ await routeJournalResource(journalId, args.slice(1));
388
+ break;
389
+ }
390
+ case 'journals':
391
+ await routeJournals(args.slice(1));
392
+ break;
393
+ case 'config':
394
+ await routeConfig(args.slice(1));
395
+ break;
396
+ default:
397
+ printHelp();
398
+ process.stderr.write(`\nUnknown command: ${command}\n`);
399
+ process.exit(1);
70
400
  }
401
+ }
402
+ catch (err) {
403
+ const message = err instanceof Error ? err.message : String(err);
404
+ if (message.includes('fetch') ||
405
+ message.includes('ECONNREFUSED') ||
406
+ message.includes('ENOTFOUND')) {
407
+ process.stderr.write(`Network error: ${message}. Check your connection.\n`);
408
+ }
409
+ else {
410
+ process.stderr.write(`Error: ${message}\n`);
411
+ }
412
+ process.exit(1);
413
+ }
71
414
  }
415
+ await run();
72
416
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface ProjectConfig {
2
+ journal_id: string;
3
+ }
4
+ /**
5
+ * Walk from `startDir` (default `process.cwd()`) upward, looking for a `.workjournal` JSON file.
6
+ * Returns the parsed config or `null` if not found or malformed.
7
+ */
8
+ export declare function findProjectConfig(startDir?: string): ProjectConfig | null;
9
+ /**
10
+ * Return the path to the `.workjournal` file found by walking upward from `startDir`,
11
+ * or `null` if none exists.
12
+ */
13
+ export declare function getProjectConfigPath(startDir?: string): string | null;
14
+ /**
15
+ * Write a `.workjournal` config file to the given directory using atomic tmp+rename.
16
+ */
17
+ export declare function writeProjectConfig(dir: string, journalId: string): void;
18
+ //# sourceMappingURL=project-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../src/project-config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC7B,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAezE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAOvE"}
@@ -0,0 +1,55 @@
1
+ import { existsSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ const PROJECT_CONFIG_FILENAME = '.workjournal';
4
+ /**
5
+ * Walk from `startDir` (default `process.cwd()`) upward, looking for a `.workjournal` JSON file.
6
+ * Returns the parsed config or `null` if not found or malformed.
7
+ */
8
+ export function findProjectConfig(startDir) {
9
+ const configPath = getProjectConfigPath(startDir);
10
+ if (!configPath)
11
+ return null;
12
+ try {
13
+ const raw = readFileSync(configPath, 'utf-8');
14
+ const parsed = JSON.parse(raw);
15
+ if (parsed && typeof parsed === 'object' && typeof parsed.journal_id === 'string') {
16
+ const journalId = parsed.journal_id.trim();
17
+ if (journalId.length > 0)
18
+ return { journal_id: journalId };
19
+ }
20
+ return null;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ /**
27
+ * Return the path to the `.workjournal` file found by walking upward from `startDir`,
28
+ * or `null` if none exists.
29
+ */
30
+ export function getProjectConfigPath(startDir) {
31
+ let dir = startDir ?? process.cwd();
32
+ for (;;) {
33
+ const candidate = join(dir, PROJECT_CONFIG_FILENAME);
34
+ if (existsSync(candidate)) {
35
+ return candidate;
36
+ }
37
+ const parent = dirname(dir);
38
+ if (parent === dir) {
39
+ return null;
40
+ }
41
+ dir = parent;
42
+ }
43
+ }
44
+ /**
45
+ * Write a `.workjournal` config file to the given directory using atomic tmp+rename.
46
+ */
47
+ export function writeProjectConfig(dir, journalId) {
48
+ const configPath = join(dir, PROJECT_CONFIG_FILENAME);
49
+ const tmpPath = `${configPath}.tmp`;
50
+ writeFileSync(tmpPath, `${JSON.stringify({ journal_id: journalId }, null, '\t')}\n`, {
51
+ mode: 0o600,
52
+ });
53
+ renameSync(tmpPath, configPath);
54
+ }
55
+ //# sourceMappingURL=project-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.js","sourceRoot":"","sources":["../src/project-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,uBAAuB,GAAG,cAAc,CAAC;AAM/C;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAiB;IAClD,MAAM,UAAU,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAC;QACzD,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnF,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAiB;IACrD,IAAI,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEpC,SAAS,CAAC;QACT,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;QACrD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACd,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,SAAiB;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,GAAG,UAAU,MAAM,CAAC;IACpC,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QACpF,IAAI,EAAE,KAAK;KACX,CAAC,CAAC;IACH,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACjC,CAAC"}
package/dist/wsl.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare function isWindowsNodeOnWsl(): boolean;
2
+ export declare function warnIfWsl(options: {
3
+ interactive: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=wsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsl.d.ts","sourceRoot":"","sources":["../src/wsl.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,WAAW,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhF"}
package/dist/wsl.js ADDED
@@ -0,0 +1,33 @@
1
+ import { createInterface } from 'node:readline/promises';
2
+ import { CONFIG_DIR } from './credentials.js';
3
+ export function isWindowsNodeOnWsl() {
4
+ return process.platform === 'win32' && !!process.env['WSL_DISTRO_NAME'];
5
+ }
6
+ export async function warnIfWsl(options) {
7
+ if (!isWindowsNodeOnWsl())
8
+ return;
9
+ if (process.env['WORKJOURNAL_CONFIG_DIR'])
10
+ return;
11
+ const distro = process.env['WSL_DISTRO_NAME'];
12
+ process.stderr.write(`\nWarning: Node.js is running as a Windows binary inside WSL (distro: ${distro}).\n` +
13
+ `Credentials will be saved to: ${CONFIG_DIR}/credentials.json\n` +
14
+ `This path is on the Windows filesystem and may not be accessible from Linux tools in WSL.\n\n` +
15
+ `Recommended fix: install Node.js natively inside WSL:\n` +
16
+ ` curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash\n` +
17
+ ` nvm install 22\n\n` +
18
+ `To override the credential location, set WORKJOURNAL_CONFIG_DIR.\n\n`);
19
+ if (options.interactive && process.stdin.isTTY) {
20
+ const rl = createInterface({ input: process.stdin, output: process.stderr });
21
+ try {
22
+ const answer = await rl.question('Continue? [y/N] ');
23
+ if (answer.trim().toLowerCase() !== 'y') {
24
+ process.stderr.write('Aborted.\n');
25
+ process.exit(1);
26
+ }
27
+ }
28
+ finally {
29
+ rl.close();
30
+ }
31
+ }
32
+ }
33
+ //# sourceMappingURL=wsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsl.js","sourceRoot":"","sources":["../src/wsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,UAAU,kBAAkB;IACjC,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAiC;IAChE,IAAI,CAAC,kBAAkB,EAAE;QAAE,OAAO;IAClC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;QAAE,OAAO;IAElD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,yEAAyE,MAAM,MAAM;QACpF,iCAAiC,UAAU,qBAAqB;QAChE,+FAA+F;QAC/F,yDAAyD;QACzD,qFAAqF;QACrF,sBAAsB;QACtB,sEAAsE,CACvE,CAAC;IAEF,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YACrD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;gBACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,EAAE,CAAC,KAAK,EAAE,CAAC;QACZ,CAAC;IACF,CAAC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workjournal/cli",
3
- "version": "0.1.0",
3
+ "version": "0.3.1",
4
4
  "description": "Command-line tool for authenticating with Workjournal — the journaling service for AI agents and developers.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -37,7 +37,9 @@
37
37
  "ai-agents",
38
38
  "journaling"
39
39
  ],
40
- "dependencies": {},
40
+ "dependencies": {
41
+ "@workjournal/shared": "0.1.0"
42
+ },
41
43
  "devDependencies": {
42
44
  "@types/node": "22.15.29",
43
45
  "typescript": "5.8.3",