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.
- package/dist/commands/applications.d.ts +2 -0
- package/dist/commands/applications.js +198 -0
- package/dist/commands/applications.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +315 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/claims.d.ts +2 -0
- package/dist/commands/claims.js +355 -0
- package/dist/commands/claims.js.map +1 -0
- package/dist/commands/jobs.d.ts +2 -0
- package/dist/commands/jobs.js +240 -0
- package/dist/commands/jobs.js.map +1 -0
- package/dist/commands/profile.d.ts +2 -0
- package/dist/commands/profile.js +116 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/question.d.ts +2 -0
- package/dist/commands/question.js +54 -0
- package/dist/commands/question.js.map +1 -0
- package/dist/commands/resume.d.ts +2 -0
- package/dist/commands/resume.js +209 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +192 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/ssh-key.d.ts +2 -0
- package/dist/commands/ssh-key.js +151 -0
- package/dist/commands/ssh-key.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +16 -0
- package/dist/lib/api-client.js +59 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/config.d.ts +19 -0
- package/dist/lib/config.js +56 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +11 -0
- package/dist/lib/errors.js +23 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/oauth.d.ts +41 -0
- package/dist/lib/oauth.js +210 -0
- package/dist/lib/oauth.js.map +1 -0
- package/dist/lib/output.d.ts +20 -0
- package/dist/lib/output.js +109 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/ssh.d.ts +25 -0
- package/dist/lib/ssh.js +103 -0
- package/dist/lib/ssh.js.map +1 -0
- package/package.json +52 -0
|
@@ -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":"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"}
|
|
@@ -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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"}
|