jobseek-cli 1.0.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.
Files changed (49) hide show
  1. package/dist/commands/applications.d.ts +2 -0
  2. package/dist/commands/applications.js +198 -0
  3. package/dist/commands/applications.js.map +1 -0
  4. package/dist/commands/auth.d.ts +2 -0
  5. package/dist/commands/auth.js +315 -0
  6. package/dist/commands/auth.js.map +1 -0
  7. package/dist/commands/claims.d.ts +2 -0
  8. package/dist/commands/claims.js +355 -0
  9. package/dist/commands/claims.js.map +1 -0
  10. package/dist/commands/jobs.d.ts +2 -0
  11. package/dist/commands/jobs.js +240 -0
  12. package/dist/commands/jobs.js.map +1 -0
  13. package/dist/commands/profile.d.ts +2 -0
  14. package/dist/commands/profile.js +116 -0
  15. package/dist/commands/profile.js.map +1 -0
  16. package/dist/commands/question.d.ts +2 -0
  17. package/dist/commands/question.js +54 -0
  18. package/dist/commands/question.js.map +1 -0
  19. package/dist/commands/resume.d.ts +2 -0
  20. package/dist/commands/resume.js +209 -0
  21. package/dist/commands/resume.js.map +1 -0
  22. package/dist/commands/search.d.ts +2 -0
  23. package/dist/commands/search.js +192 -0
  24. package/dist/commands/search.js.map +1 -0
  25. package/dist/commands/ssh-key.d.ts +2 -0
  26. package/dist/commands/ssh-key.js +151 -0
  27. package/dist/commands/ssh-key.js.map +1 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.js +72 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/lib/api-client.d.ts +16 -0
  32. package/dist/lib/api-client.js +59 -0
  33. package/dist/lib/api-client.js.map +1 -0
  34. package/dist/lib/config.d.ts +19 -0
  35. package/dist/lib/config.js +56 -0
  36. package/dist/lib/config.js.map +1 -0
  37. package/dist/lib/errors.d.ts +11 -0
  38. package/dist/lib/errors.js +23 -0
  39. package/dist/lib/errors.js.map +1 -0
  40. package/dist/lib/oauth.d.ts +41 -0
  41. package/dist/lib/oauth.js +210 -0
  42. package/dist/lib/oauth.js.map +1 -0
  43. package/dist/lib/output.d.ts +20 -0
  44. package/dist/lib/output.js +109 -0
  45. package/dist/lib/output.js.map +1 -0
  46. package/dist/lib/ssh.d.ts +25 -0
  47. package/dist/lib/ssh.js +103 -0
  48. package/dist/lib/ssh.js.map +1 -0
  49. package/package.json +52 -0
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerApplicationCommands(program: Command): void;
@@ -0,0 +1,198 @@
1
+ import { select } from '@inquirer/prompts';
2
+ import { requireApiKey, resolveApiUrl } from '../lib/config.js';
3
+ import { ApiClient } from '../lib/api-client.js';
4
+ import * as out from '../lib/output.js';
5
+ const STATUSES = ['received', 'interviewing', 'rejected', 'offer', 'accepted', 'declined'];
6
+ export function registerApplicationCommands(program) {
7
+ const apps = program
8
+ .command('apps')
9
+ .description('List job applications')
10
+ .option('--status <status>', 'Filter: all, draft, applied, interview, offer, rejected', 'all')
11
+ .option('--limit <n>', 'Maximum results', '10')
12
+ .option('--min-score <n>', 'Minimum match score')
13
+ .option('--company <name>', 'Filter by company')
14
+ .option('--since <date>', 'Only after date (YYYY-MM-DD)')
15
+ .option('--sort <field>', 'Sort by: recent, matchScore, company, status', 'recent')
16
+ .option('--order <dir>', 'Sort order: asc, desc', 'desc')
17
+ .action(async (opts) => {
18
+ const parentOpts = program.opts();
19
+ const apiKey = requireApiKey(parentOpts.apiKey);
20
+ const apiUrl = resolveApiUrl(parentOpts.apiUrl);
21
+ const client = new ApiClient(apiUrl, apiKey);
22
+ const spin = out.spinner('Fetching applications...');
23
+ spin.start();
24
+ try {
25
+ const params = {
26
+ status: opts.status,
27
+ limit: Number(opts.limit),
28
+ sortBy: opts.sort,
29
+ sortOrder: opts.order,
30
+ };
31
+ if (opts.minScore)
32
+ params.minMatchScore = Number(opts.minScore);
33
+ if (opts.company)
34
+ params.company = opts.company;
35
+ if (opts.since)
36
+ params.dateFrom = opts.since;
37
+ const apps = await client.get('/api/applications', params);
38
+ spin.stop();
39
+ if (out.isJsonMode()) {
40
+ out.outputJson(apps);
41
+ return;
42
+ }
43
+ if (!apps.length) {
44
+ out.info('No applications found. Generate one with `jobseek apps generate`.');
45
+ return;
46
+ }
47
+ const table = out.createTable(['Score', 'Title', 'Company', 'Status', 'Date']);
48
+ for (const app of apps) {
49
+ table.push([
50
+ `${out.scoreIndicator(app.job.matchScore)} ${out.scoreColor(app.job.matchScore)}`,
51
+ out.truncate(app.job.title, 35),
52
+ out.truncate(app.job.company, 20),
53
+ out.statusColor(app.status),
54
+ out.formatDate(app.createdAt),
55
+ ]);
56
+ }
57
+ console.log(table.toString());
58
+ console.log();
59
+ out.keyValue('Total', String(apps.length));
60
+ }
61
+ catch (err) {
62
+ spin.stop();
63
+ out.error(err.message);
64
+ process.exit(1);
65
+ }
66
+ });
67
+ apps
68
+ .command('generate')
69
+ .description('Generate cover letter and tailored resume for a job')
70
+ .option('--job-id <id>', 'Job ID to generate for')
71
+ .option('--company <name>', 'Find job by company name')
72
+ .option('--title <title>', 'Narrow by job title (with --company)')
73
+ .action(async (opts) => {
74
+ const parentOpts = program.opts();
75
+ const apiKey = requireApiKey(parentOpts.apiKey);
76
+ const apiUrl = resolveApiUrl(parentOpts.apiUrl);
77
+ const client = new ApiClient(apiUrl, apiKey);
78
+ let body = {};
79
+ if (opts.jobId) {
80
+ body.jobId = opts.jobId;
81
+ }
82
+ else if (opts.company) {
83
+ body.company = opts.company;
84
+ if (opts.title)
85
+ body.jobTitle = opts.title;
86
+ }
87
+ else {
88
+ // Interactive: let user pick from unapplied jobs
89
+ const spin = out.spinner('Fetching unapplied jobs...');
90
+ spin.start();
91
+ try {
92
+ const jobs = await client.get('/api/jobs', { hasApplication: false, sortBy: 'matchScore', sortOrder: 'desc', limit: 20 });
93
+ spin.stop();
94
+ if (!jobs.length) {
95
+ out.info('No unapplied jobs found. Analyze a job first with `jobseek jobs evaluate`.');
96
+ return;
97
+ }
98
+ const choice = await select({
99
+ message: 'Select a job to generate application for:',
100
+ choices: jobs.map(j => ({
101
+ name: `${out.scoreColor(j.matchScore)} ${j.title} at ${j.company}`,
102
+ value: j.id,
103
+ })),
104
+ });
105
+ body.jobId = choice;
106
+ }
107
+ catch (err) {
108
+ spin.stop();
109
+ out.error(err.message);
110
+ process.exit(1);
111
+ }
112
+ }
113
+ const spin = out.spinner('Generating application materials...');
114
+ spin.start();
115
+ try {
116
+ const data = await client.post('/api/applications/generate', body);
117
+ spin.stop();
118
+ if (out.isJsonMode()) {
119
+ out.outputJson(data);
120
+ return;
121
+ }
122
+ out.success(`Application generated for ${data.job.title} at ${data.job.company}`);
123
+ out.heading('Cover Letter');
124
+ console.log(data.coverLetter);
125
+ if (data.customResume) {
126
+ const cr = data.customResume;
127
+ if (cr.summary) {
128
+ console.log();
129
+ out.heading('Tailored Summary');
130
+ console.log(' ' + cr.summary);
131
+ }
132
+ if (cr.skills?.length) {
133
+ console.log();
134
+ out.heading('Highlighted Skills');
135
+ console.log(' ' + cr.skills.join(', '));
136
+ }
137
+ if (cr.highlightedExperience?.length) {
138
+ console.log();
139
+ out.heading('Highlighted Experience');
140
+ out.bulletList(cr.highlightedExperience);
141
+ }
142
+ }
143
+ if (data.applicationUrl) {
144
+ console.log();
145
+ out.keyValue('View in dashboard', data.applicationUrl);
146
+ }
147
+ }
148
+ catch (err) {
149
+ spin.stop();
150
+ out.error(err.message);
151
+ process.exit(1);
152
+ }
153
+ });
154
+ apps
155
+ .command('update <company>')
156
+ .description('Update application status')
157
+ .option('--status <status>', 'New status: received, interviewing, rejected, offer, accepted, declined')
158
+ .option('--title <title>', 'Job title (if multiple at same company)')
159
+ .option('--date <date>', 'Date of status change (YYYY-MM-DD)')
160
+ .option('--notes <text>', 'Notes about the update')
161
+ .action(async (company, opts) => {
162
+ const parentOpts = program.opts();
163
+ const apiKey = requireApiKey(parentOpts.apiKey);
164
+ const apiUrl = resolveApiUrl(parentOpts.apiUrl);
165
+ const client = new ApiClient(apiUrl, apiKey);
166
+ let status = opts.status;
167
+ if (!status) {
168
+ status = await select({
169
+ message: 'Select new status:',
170
+ choices: STATUSES.map(s => ({ name: s, value: s })),
171
+ });
172
+ }
173
+ const body = { company, status };
174
+ if (opts.title)
175
+ body.jobTitle = opts.title;
176
+ if (opts.date)
177
+ body.date = opts.date;
178
+ if (opts.notes)
179
+ body.notes = opts.notes;
180
+ const spin = out.spinner('Updating status...');
181
+ spin.start();
182
+ try {
183
+ const data = await client.patch('/api/applications/update-status', body);
184
+ spin.stop();
185
+ if (out.isJsonMode()) {
186
+ out.outputJson(data);
187
+ return;
188
+ }
189
+ out.success(`Updated ${data.job.title} at ${data.job.company} to ${out.statusColor(status)}`);
190
+ }
191
+ catch (err) {
192
+ spin.stop();
193
+ out.error(err.message);
194
+ process.exit(1);
195
+ }
196
+ });
197
+ }
198
+ //# sourceMappingURL=applications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applications.js","sourceRoot":"","sources":["../../src/commands/applications.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAS,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAoBxC,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAEpG,MAAM,UAAU,2BAA2B,CAAC,OAAgB;IACxD,MAAM,IAAI,GAAG,OAAO;SACf,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,mBAAmB,EAAE,yDAAyD,EAAE,KAAK,CAAC;SAC7F,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE,IAAI,CAAC;SAC9C,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;SAChD,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;SACxD,MAAM,CAAC,gBAAgB,EAAE,8CAA8C,EAAE,QAAQ,CAAC;SAClF,MAAM,CAAC,eAAe,EAAE,uBAAuB,EAAE,MAAM,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACnB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,CAAC;YACD,MAAM,MAAM,GAA0D;gBAClE,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;gBACzB,MAAM,EAAE,IAAI,CAAC,IAAI;gBACjB,SAAS,EAAE,IAAI,CAAC,KAAK;aACxB,CAAC;YACF,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChE,IAAI,IAAI,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAChD,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;YAE7C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgB,mBAAmB,EAAE,MAAM,CAAC,CAAC;YAC1E,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;gBACnB,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACrB,OAAO;YACX,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACf,GAAG,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;gBAC9E,OAAO;YACX,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC;oBACP,GAAG,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;oBACjF,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;oBAC/B,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;oBACjC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;oBAC3B,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;iBAChC,CAAC,CAAC;YACP,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC,CAAC,CAAC;IAEP,IAAI;SACC,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;SACjD,MAAM,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;SACtD,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACnB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE7C,IAAI,IAAI,GAA2B,EAAE,CAAC;QAEtC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC5B,IAAI,IAAI,CAAC,KAAK;gBAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC/C,CAAC;aAAM,CAAC;YACJ,iDAAiD;YACjD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YAEb,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAMzB,WAAW,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBAChG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAEZ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACf,GAAG,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;oBACvF,OAAO;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;oBACxB,OAAO,EAAE,2CAA2C;oBACpD,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACpB,IAAI,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE;wBAClE,KAAK,EAAE,CAAC,CAAC,EAAE;qBACd,CAAC,CAAC;iBACN,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACxB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAM3B,4BAA4B,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;gBACnB,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACrB,OAAO;YACX,CAAC;YAED,GAAG,CAAC,OAAO,CAAC,6BAA6B,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAElF,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAE9B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;gBAC7B,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;oBAChC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;gBACnC,CAAC;gBACD,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;oBAClC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7C,CAAC;gBACD,IAAI,EAAE,CAAC,qBAAqB,EAAE,MAAM,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;oBACtC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC;gBAC7C,CAAC;YACL,CAAC;YAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,QAAQ,CAAC,mBAAmB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3D,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC,CAAC,CAAC;IAEP,IAAI;SACC,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,mBAAmB,EAAE,yEAAyE,CAAC;SACtG,MAAM,CAAC,iBAAiB,EAAE,yCAAyC,CAAC;SACpE,MAAM,CAAC,eAAe,EAAE,oCAAoC,CAAC;SAC7D,MAAM,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE7C,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,GAAG,MAAM,MAAM,CAAC;gBAClB,OAAO,EAAE,oBAAoB;gBAC7B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;aACtD,CAAC,CAAC;QACP,CAAC;QAED,MAAM,IAAI,GAA2B,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACzD,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3C,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAExC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAE5B,iCAAiC,EAAE,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;gBACnB,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACrB,OAAO;YACX,CAAC;YAED,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,OAAO,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClG,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAuthCommands(program: Command): void;
@@ -0,0 +1,315 @@
1
+ import { password, select } from '@inquirer/prompts';
2
+ import { readConfig, writeConfig, clearConfig, requireApiKey, resolveApiUrl } from '../lib/config.js';
3
+ import { ApiClient } from '../lib/api-client.js';
4
+ import * as out from '../lib/output.js';
5
+ export function registerAuthCommands(program) {
6
+ program
7
+ .command('login')
8
+ .description('Authenticate with JobSeek')
9
+ .option('--key <key>', 'API key (paste manually)')
10
+ .option('--browser', 'Use browser-based SSO login')
11
+ .option('--ssh', 'Use SSH key authentication')
12
+ .action(async (opts) => {
13
+ const parentOpts = program.opts();
14
+ // Direct API key login
15
+ if (opts.key) {
16
+ await loginWithApiKey(opts.key, parentOpts);
17
+ return;
18
+ }
19
+ // Explicit method flags
20
+ if (opts.browser) {
21
+ await loginWithBrowser(parentOpts);
22
+ return;
23
+ }
24
+ if (opts.ssh) {
25
+ await loginWithSsh(parentOpts);
26
+ return;
27
+ }
28
+ // Interactive method selection
29
+ const method = await select({
30
+ message: 'How would you like to authenticate?',
31
+ choices: [
32
+ {
33
+ name: 'Browser (SSO via Google/GitHub)',
34
+ value: 'browser',
35
+ description: 'Opens your browser to sign in',
36
+ },
37
+ {
38
+ name: 'API Key (paste manually)',
39
+ value: 'apikey',
40
+ description: 'Enter an API key from your dashboard',
41
+ },
42
+ {
43
+ name: 'SSH Key',
44
+ value: 'ssh',
45
+ description: 'Authenticate using an SSH key from ~/.ssh/',
46
+ },
47
+ ],
48
+ });
49
+ switch (method) {
50
+ case 'browser':
51
+ await loginWithBrowser(parentOpts);
52
+ break;
53
+ case 'apikey':
54
+ await loginWithApiKeyInteractive(parentOpts);
55
+ break;
56
+ case 'ssh':
57
+ await loginWithSsh(parentOpts);
58
+ break;
59
+ }
60
+ });
61
+ program
62
+ .command('logout')
63
+ .description('Remove stored API key')
64
+ .action(() => {
65
+ clearConfig();
66
+ out.success('Logged out. API key removed from ~/.jobseek/config.json');
67
+ });
68
+ program
69
+ .command('whoami')
70
+ .description('Show current authenticated user')
71
+ .action(async () => {
72
+ const parentOpts = program.opts();
73
+ const apiKey = requireApiKey(parentOpts.apiKey);
74
+ const apiUrl = resolveApiUrl(parentOpts.apiUrl);
75
+ const client = new ApiClient(apiUrl, apiKey);
76
+ const spin = out.spinner('Fetching profile...');
77
+ spin.start();
78
+ try {
79
+ const data = await client.get('/api/profile/mcp');
80
+ spin.stop();
81
+ const p = data.profile;
82
+ if (out.isJsonMode()) {
83
+ out.outputJson({ name: p.name, email: p.email, location: p.location });
84
+ return;
85
+ }
86
+ out.heading('Current User');
87
+ out.keyValue('Name', p.name || 'N/A');
88
+ out.keyValue('Email', p.email || 'N/A');
89
+ out.keyValue('Location', p.location || 'N/A');
90
+ }
91
+ catch (err) {
92
+ spin.stop();
93
+ out.error(err.message);
94
+ process.exit(1);
95
+ }
96
+ });
97
+ program
98
+ .command('usage')
99
+ .description('Show AI token/credit balance')
100
+ .action(async () => {
101
+ const parentOpts = program.opts();
102
+ const apiKey = requireApiKey(parentOpts.apiKey);
103
+ const apiUrl = resolveApiUrl(parentOpts.apiUrl);
104
+ const client = new ApiClient(apiUrl, apiKey);
105
+ const spin = out.spinner('Fetching usage...');
106
+ spin.start();
107
+ try {
108
+ const data = await client.get('/api/usage');
109
+ spin.stop();
110
+ if (out.isJsonMode()) {
111
+ out.outputJson(data);
112
+ return;
113
+ }
114
+ const { tokenUsage, tokenBudget, isAdmin } = data;
115
+ const remaining = tokenBudget - tokenUsage;
116
+ const percentUsed = tokenBudget > 0 ? Math.round((tokenUsage / tokenBudget) * 100) : 0;
117
+ out.heading('AI Credit Balance');
118
+ if (isAdmin) {
119
+ out.keyValue('Tokens Used', tokenUsage.toLocaleString());
120
+ out.keyValue('Budget', 'Unlimited (Admin)');
121
+ out.keyValue('Status', out.scoreColor(100).replace(/\d+%/, 'No limits'));
122
+ }
123
+ else {
124
+ out.keyValue('Tokens Used', tokenUsage.toLocaleString());
125
+ out.keyValue('Total Budget', tokenBudget.toLocaleString());
126
+ out.keyValue('Remaining', remaining.toLocaleString());
127
+ out.keyValue('Used', `${percentUsed}%`);
128
+ if (percentUsed >= 90) {
129
+ out.warn('Token balance is low. Purchase more at your dashboard.');
130
+ }
131
+ else if (percentUsed >= 70) {
132
+ out.info('Token balance is moderate.');
133
+ }
134
+ }
135
+ }
136
+ catch (err) {
137
+ spin.stop();
138
+ out.error(err.message);
139
+ process.exit(1);
140
+ }
141
+ });
142
+ }
143
+ // --- Login method implementations ---
144
+ async function loginWithApiKey(apiKey, parentOpts) {
145
+ const spin = out.spinner('Validating API key...');
146
+ spin.start();
147
+ try {
148
+ const apiUrl = resolveApiUrl(parentOpts.apiUrl);
149
+ const client = new ApiClient(apiUrl, apiKey);
150
+ const profile = await client.get('/api/profile/mcp');
151
+ spin.stop();
152
+ const config = readConfig();
153
+ config.apiKey = apiKey;
154
+ if (parentOpts.apiUrl)
155
+ config.apiUrl = parentOpts.apiUrl;
156
+ writeConfig(config);
157
+ out.success(`Logged in as ${profile.profile.name} (${profile.profile.email})`);
158
+ out.info('API key saved to ~/.jobseek/config.json');
159
+ }
160
+ catch (err) {
161
+ spin.stop();
162
+ out.error(`Login failed: ${err.message}`);
163
+ process.exit(1);
164
+ }
165
+ }
166
+ async function loginWithApiKeyInteractive(parentOpts) {
167
+ console.log('Get your API key at: https://www.getjobseek.com/dashboard/api-keys\n');
168
+ const apiKey = await password({
169
+ message: 'Enter your API key:',
170
+ mask: '*',
171
+ });
172
+ if (!apiKey) {
173
+ out.error('No API key provided.');
174
+ process.exit(1);
175
+ }
176
+ await loginWithApiKey(apiKey, parentOpts);
177
+ }
178
+ async function loginWithBrowser(parentOpts) {
179
+ const apiUrl = resolveApiUrl(parentOpts.apiUrl);
180
+ // Dynamic imports for the oauth module
181
+ const { findAvailablePort, generatePkce, generateState, registerOAuthClient, startCallbackServer, buildAuthorizeUrl, exchangeCodeForApiKey, } = await import('../lib/oauth.js');
182
+ const open = (await import('open')).default;
183
+ const spin = out.spinner('Preparing authentication...');
184
+ spin.start();
185
+ try {
186
+ // 1. Find an available port and set up the callback server
187
+ const port = await findAvailablePort();
188
+ const redirectUri = `http://localhost:${port}/callback`;
189
+ // 2. Register as an OAuth client
190
+ const { clientId } = await registerOAuthClient(apiUrl, redirectUri);
191
+ // 3. Generate PKCE challenge
192
+ const { codeVerifier, codeChallenge } = await generatePkce();
193
+ const state = generateState();
194
+ // 4. Start listening for the callback
195
+ const callbackPromise = startCallbackServer(port);
196
+ // 5. Open the browser
197
+ const authorizeUrl = buildAuthorizeUrl(apiUrl, clientId, redirectUri, codeChallenge, state);
198
+ spin.stop();
199
+ console.log();
200
+ out.info('Opening browser for authentication...');
201
+ out.info(`If the browser doesn't open, visit:\n ${authorizeUrl}`);
202
+ console.log();
203
+ await open(authorizeUrl);
204
+ // 6. Wait for the callback
205
+ const spinWait = out.spinner('Waiting for authentication...');
206
+ spinWait.start();
207
+ const { code, state: returnedState } = await callbackPromise;
208
+ // 7. Verify state
209
+ if (returnedState !== state) {
210
+ spinWait.stop();
211
+ out.error('Authentication failed: state mismatch (possible CSRF attack)');
212
+ process.exit(1);
213
+ }
214
+ // 8. Exchange code for API key
215
+ spinWait.text = 'Completing authentication...';
216
+ const apiKey = await exchangeCodeForApiKey(apiUrl, clientId, code, codeVerifier, redirectUri);
217
+ // 9. Validate and save
218
+ const client = new ApiClient(apiUrl, apiKey);
219
+ const profile = await client.get('/api/profile/mcp');
220
+ spinWait.stop();
221
+ const config = readConfig();
222
+ config.apiKey = apiKey;
223
+ if (parentOpts.apiUrl)
224
+ config.apiUrl = parentOpts.apiUrl;
225
+ writeConfig(config);
226
+ out.success(`Logged in as ${profile.profile.name} (${profile.profile.email})`);
227
+ out.info('API key saved to ~/.jobseek/config.json');
228
+ }
229
+ catch (err) {
230
+ spin.stop();
231
+ out.error(`Browser login failed: ${err.message}`);
232
+ process.exit(1);
233
+ }
234
+ }
235
+ async function loginWithSsh(parentOpts) {
236
+ const apiUrl = resolveApiUrl(parentOpts.apiUrl);
237
+ const { findSshKeys, signChallenge } = await import('../lib/ssh.js');
238
+ const { select: selectPrompt } = await import('@inquirer/prompts');
239
+ const keys = findSshKeys();
240
+ if (keys.length === 0) {
241
+ out.error('No SSH keys found in ~/.ssh/');
242
+ out.info('Generate one with: ssh-keygen -t ed25519');
243
+ process.exit(1);
244
+ }
245
+ let selectedKey;
246
+ if (keys.length === 1) {
247
+ selectedKey = keys[0];
248
+ out.info(`Using SSH key: ${selectedKey.type} ${selectedKey.fingerprint}`);
249
+ }
250
+ else {
251
+ const chosen = await selectPrompt({
252
+ message: 'Which SSH key would you like to use?',
253
+ choices: keys.map(k => ({
254
+ name: `${k.type} ${k.fingerprint} ${k.comment || k.path}`,
255
+ value: k,
256
+ })),
257
+ });
258
+ selectedKey = chosen;
259
+ }
260
+ const spin = out.spinner('Authenticating with SSH key...');
261
+ spin.start();
262
+ try {
263
+ // 1. Request a challenge
264
+ const challengeRes = await fetch(`${apiUrl}/api/auth/ssh/challenge`, {
265
+ method: 'POST',
266
+ headers: { 'Content-Type': 'application/json' },
267
+ body: JSON.stringify({ fingerprint: selectedKey.fingerprint }),
268
+ });
269
+ if (challengeRes.status === 404) {
270
+ spin.stop();
271
+ out.warn('This SSH key is not registered with JobSeek.');
272
+ out.info('Register it first with: js ssh-key add');
273
+ out.info('(Requires an existing login via browser or API key)');
274
+ process.exit(1);
275
+ }
276
+ if (!challengeRes.ok) {
277
+ const body = await challengeRes.json().catch(() => ({}));
278
+ throw new Error(body.error || `Challenge request failed (${challengeRes.status})`);
279
+ }
280
+ const { challenge } = await challengeRes.json();
281
+ // 2. Sign the challenge with the private key
282
+ spin.text = 'Signing challenge...';
283
+ const signature = signChallenge(selectedKey.path, challenge);
284
+ // 3. Send the signature for verification
285
+ spin.text = 'Verifying signature...';
286
+ const verifyRes = await fetch(`${apiUrl}/api/auth/ssh/verify`, {
287
+ method: 'POST',
288
+ headers: { 'Content-Type': 'application/json' },
289
+ body: JSON.stringify({
290
+ fingerprint: selectedKey.fingerprint,
291
+ signature,
292
+ }),
293
+ });
294
+ if (!verifyRes.ok) {
295
+ const body = await verifyRes.json().catch(() => ({}));
296
+ throw new Error(body.error || `Verification failed (${verifyRes.status})`);
297
+ }
298
+ const { apiKey, user } = await verifyRes.json();
299
+ spin.stop();
300
+ // 4. Save to config
301
+ const config = readConfig();
302
+ config.apiKey = apiKey;
303
+ if (parentOpts.apiUrl)
304
+ config.apiUrl = parentOpts.apiUrl;
305
+ writeConfig(config);
306
+ out.success(`Logged in as ${user.name} (${user.email})`);
307
+ out.info('API key saved to ~/.jobseek/config.json');
308
+ }
309
+ catch (err) {
310
+ spin.stop();
311
+ out.error(`SSH login failed: ${err.message}`);
312
+ process.exit(1);
313
+ }
314
+ }
315
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerClaimsCommands(program: Command): void;