@profullstack/agenticjobs 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/LICENSE +21 -0
- package/README.md +219 -0
- package/bin/agenticjobs-mcp.mjs +2 -0
- package/bin/agenticjobs.mjs +2 -0
- package/dist/cli/args.d.ts +17 -0
- package/dist/cli/args.js +103 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/format.d.ts +15 -0
- package/dist/cli/format.js +24 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.js +620 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/jobfile.d.ts +15 -0
- package/dist/cli/jobfile.js +94 -0
- package/dist/cli/jobfile.js.map +1 -0
- package/dist/client/client.d.ts +105 -0
- package/dist/client/client.js +182 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/config.d.ts +33 -0
- package/dist/client/config.js +92 -0
- package/dist/client/config.js.map +1 -0
- package/dist/client/fanout.d.ts +35 -0
- package/dist/client/fanout.js +77 -0
- package/dist/client/fanout.js.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/login.d.ts +23 -0
- package/dist/client/login.js +45 -0
- package/dist/client/login.js.map +1 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/core/applications.d.ts +67 -0
- package/dist/core/applications.js +187 -0
- package/dist/core/applications.js.map +1 -0
- package/dist/core/auth.d.ts +120 -0
- package/dist/core/auth.js +246 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/import.d.ts +52 -0
- package/dist/core/import.js +311 -0
- package/dist/core/import.js.map +1 -0
- package/dist/core/jobs.d.ts +91 -0
- package/dist/core/jobs.js +381 -0
- package/dist/core/jobs.js.map +1 -0
- package/dist/core/orgs.d.ts +21 -0
- package/dist/core/orgs.js +111 -0
- package/dist/core/orgs.js.map +1 -0
- package/dist/core/resumes.d.ts +51 -0
- package/dist/core/resumes.js +144 -0
- package/dist/core/resumes.js.map +1 -0
- package/dist/core/zip.d.ts +17 -0
- package/dist/core/zip.js +77 -0
- package/dist/core/zip.js.map +1 -0
- package/dist/db/index.d.ts +3 -0
- package/dist/db/index.js +3 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +15 -0
- package/dist/db/migrate.js +67 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/pool.d.ts +13 -0
- package/dist/db/pool.js +68 -0
- package/dist/db/pool.js.map +1 -0
- package/dist/db/seed.d.ts +9 -0
- package/dist/db/seed.js +120 -0
- package/dist/db/seed.js.map +1 -0
- package/dist/directory/announce.d.ts +32 -0
- package/dist/directory/announce.js +59 -0
- package/dist/directory/announce.js.map +1 -0
- package/dist/directory/federate.d.ts +59 -0
- package/dist/directory/federate.js +126 -0
- package/dist/directory/federate.js.map +1 -0
- package/dist/directory/fetch.d.ts +35 -0
- package/dist/directory/fetch.js +138 -0
- package/dist/directory/fetch.js.map +1 -0
- package/dist/directory/index.d.ts +4 -0
- package/dist/directory/index.js +5 -0
- package/dist/directory/index.js.map +1 -0
- package/dist/directory/registry.d.ts +55 -0
- package/dist/directory/registry.js +155 -0
- package/dist/directory/registry.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/markup/escape.d.ts +20 -0
- package/dist/markup/escape.js +56 -0
- package/dist/markup/escape.js.map +1 -0
- package/dist/markup/markdown.d.ts +35 -0
- package/dist/markup/markdown.js +279 -0
- package/dist/markup/markdown.js.map +1 -0
- package/dist/markup/resume.d.ts +72 -0
- package/dist/markup/resume.js +260 -0
- package/dist/markup/resume.js.map +1 -0
- package/dist/mcp/protocol.d.ts +56 -0
- package/dist/mcp/protocol.js +48 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/server.d.ts +21 -0
- package/dist/mcp/server.js +73 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/stdio.d.ts +13 -0
- package/dist/mcp/stdio.js +85 -0
- package/dist/mcp/stdio.js.map +1 -0
- package/dist/mcp/tools.d.ts +26 -0
- package/dist/mcp/tools.js +351 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/instance.d.ts +85 -0
- package/dist/schema/instance.js +147 -0
- package/dist/schema/instance.js.map +1 -0
- package/dist/schema/job.d.ts +151 -0
- package/dist/schema/job.js +73 -0
- package/dist/schema/job.js.map +1 -0
- package/dist/schema/jsonld.d.ts +18 -0
- package/dist/schema/jsonld.js +120 -0
- package/dist/schema/jsonld.js.map +1 -0
- package/dist/schema/query.d.ts +47 -0
- package/dist/schema/query.js +103 -0
- package/dist/schema/query.js.map +1 -0
- package/dist/schema/text.d.ts +27 -0
- package/dist/schema/text.js +117 -0
- package/dist/schema/text.js.map +1 -0
- package/dist/server/app.d.ts +13 -0
- package/dist/server/app.js +57 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/deps.d.ts +20 -0
- package/dist/server/deps.js +2 -0
- package/dist/server/deps.js.map +1 -0
- package/dist/server/middleware.d.ts +39 -0
- package/dist/server/middleware.js +100 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/routes/api.d.ts +20 -0
- package/dist/server/routes/api.js +584 -0
- package/dist/server/routes/api.js.map +1 -0
- package/dist/server/routes/descriptor.d.ts +11 -0
- package/dist/server/routes/descriptor.js +31 -0
- package/dist/server/routes/descriptor.js.map +1 -0
- package/dist/server/routes/discovery.d.ts +12 -0
- package/dist/server/routes/discovery.js +305 -0
- package/dist/server/routes/discovery.js.map +1 -0
- package/dist/server/routes/mcp.d.ts +19 -0
- package/dist/server/routes/mcp.js +85 -0
- package/dist/server/routes/mcp.js.map +1 -0
- package/dist/server/routes/openapi.d.ts +11 -0
- package/dist/server/routes/openapi.js +297 -0
- package/dist/server/routes/openapi.js.map +1 -0
- package/dist/server/routes/pages.d.ts +11 -0
- package/dist/server/routes/pages.js +445 -0
- package/dist/server/routes/pages.js.map +1 -0
- package/dist/server/routes/passkey.d.ts +20 -0
- package/dist/server/routes/passkey.js +198 -0
- package/dist/server/routes/passkey.js.map +1 -0
- package/dist/server/routes/specs.d.ts +10 -0
- package/dist/server/routes/specs.js +42 -0
- package/dist/server/routes/specs.js.map +1 -0
- package/dist/server/serve.d.ts +11 -0
- package/dist/server/serve.js +79 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/tui/index.d.ts +13 -0
- package/dist/tui/index.js +266 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/state.d.ts +63 -0
- package/dist/tui/state.js +136 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/types.d.ts +2 -0
- package/dist/tui/types.js +2 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/tui/views.d.ts +11 -0
- package/dist/tui/views.js +197 -0
- package/dist/tui/views.js.map +1 -0
- package/dist/views/auth.d.ts +21 -0
- package/dist/views/auth.js +5 -0
- package/dist/views/auth.js.map +1 -0
- package/dist/views/docs.d.ts +17 -0
- package/dist/views/docs.js +40 -0
- package/dist/views/docs.js.map +1 -0
- package/dist/views/jobs.d.ts +49 -0
- package/dist/views/jobs.js +44 -0
- package/dist/views/jobs.js.map +1 -0
- package/dist/views/layout.d.ts +58 -0
- package/dist/views/layout.js +36 -0
- package/dist/views/layout.js.map +1 -0
- package/dist/views/me.d.ts +27 -0
- package/dist/views/me.js +6 -0
- package/dist/views/me.js.map +1 -0
- package/dist/views/network.d.ts +21 -0
- package/dist/views/network.js +17 -0
- package/dist/views/network.js.map +1 -0
- package/dist/views/post.d.ts +22 -0
- package/dist/views/post.js +20 -0
- package/dist/views/post.js.map +1 -0
- package/docs/openjob.md +200 -0
- package/docs/openresume.md +143 -0
- package/migrations/0001_init.sql +109 -0
- package/migrations/0002_auth.sql +82 -0
- package/migrations/0003_directory.sql +27 -0
- package/migrations/0004_resumes.sql +63 -0
- package/migrations/0005_application_drafts.sql +20 -0
- package/package.json +92 -0
- package/web/public/app.css +731 -0
- package/web/public/app.js +173 -0
- package/web/public/icon.svg +5 -0
- package/web/public/sw.js +64 -0
- package/web/public/tokens.css +153 -0
|
@@ -0,0 +1,620 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The terminal.
|
|
3
|
+
*
|
|
4
|
+
* The whole board is here, both halves of it: a candidate searches, prepares
|
|
5
|
+
* and releases applications; an employer posts, publishes and reads what came
|
|
6
|
+
* in. One account does both, because the person running an agency and the
|
|
7
|
+
* person looking for work are frequently the same person on a different
|
|
8
|
+
* afternoon.
|
|
9
|
+
*
|
|
10
|
+
* Every command goes through BoardClient, so the terminal and the browser are
|
|
11
|
+
* looking at the same board through the same API.
|
|
12
|
+
*/
|
|
13
|
+
import { readFile } from 'node:fs/promises';
|
|
14
|
+
import process from 'node:process';
|
|
15
|
+
import { flagBool, flagList, flagNumber, flagString, parseArgs } from "./args.js";
|
|
16
|
+
import { bold, dim } from "./format.js";
|
|
17
|
+
import { ApiError, BoardClient, configuredBoards, currentBoard, DEFAULT_SERVER, forgetBoard, loadConfig, login, LoginError, normaliseServer, rememberBoard, saveConfig, searchEverywhere, } from "../client/index.js";
|
|
18
|
+
import { VERSION } from "../config.js";
|
|
19
|
+
import { ago, formatSalary } from "../schema/text.js";
|
|
20
|
+
const USAGE = `agenticjobs ${VERSION} - an agent-friendly job board you can self-host
|
|
21
|
+
|
|
22
|
+
Boards
|
|
23
|
+
login [server] sign in to a board (device flow)
|
|
24
|
+
logout [server] forget a board
|
|
25
|
+
boards every board you are signed in to
|
|
26
|
+
use <server> make one of them the default
|
|
27
|
+
whoami who you are on the current board
|
|
28
|
+
|
|
29
|
+
Finding work
|
|
30
|
+
search <words> search the current board
|
|
31
|
+
--all ...or every board you are signed in to
|
|
32
|
+
--network ...or every board in the directory
|
|
33
|
+
--remote --agents filter: remote only, agents welcome
|
|
34
|
+
--min <n> --limit <n> --tag <t>
|
|
35
|
+
show <slug> one listing
|
|
36
|
+
schema <slug> the application form, as data
|
|
37
|
+
|
|
38
|
+
Applying
|
|
39
|
+
apply <slug> apply, or prepare an application
|
|
40
|
+
--resume <file|slug> Markdown resume, or one you have saved
|
|
41
|
+
--draft hold it for you to read and release
|
|
42
|
+
--answer name=value repeatable, one per field
|
|
43
|
+
--agent <name> disclose which agent wrote it
|
|
44
|
+
drafts applications prepared but not sent
|
|
45
|
+
submit <id> send one
|
|
46
|
+
|
|
47
|
+
Resumes
|
|
48
|
+
resume list
|
|
49
|
+
resume show <slug>
|
|
50
|
+
resume save <file> [--slug s] [--title t]
|
|
51
|
+
resume import <file> pdf, docx, txt or md, converted to Markdown
|
|
52
|
+
|
|
53
|
+
Hiring
|
|
54
|
+
post <file.md> post a job; stays a draft until you publish
|
|
55
|
+
publish <slug> take a draft live
|
|
56
|
+
close <slug> close a listing
|
|
57
|
+
applications <slug> what came in
|
|
58
|
+
|
|
59
|
+
Running one
|
|
60
|
+
serve start the board
|
|
61
|
+
migrate apply migrations and exit
|
|
62
|
+
seed add example data (never on a board with jobs)
|
|
63
|
+
announce tell a directory this board exists
|
|
64
|
+
instances boards a directory knows about
|
|
65
|
+
tui the full-screen client
|
|
66
|
+
mcp stdio MCP server for the current board
|
|
67
|
+
|
|
68
|
+
--server <url> act on a board other than the default
|
|
69
|
+
--json machine-readable output, on every command
|
|
70
|
+
`;
|
|
71
|
+
async function main() {
|
|
72
|
+
const args = parseArgs(process.argv.slice(2));
|
|
73
|
+
if (args.command === '' || flagBool(args, 'help', 'h')) {
|
|
74
|
+
process.stdout.write(USAGE);
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
if (flagBool(args, 'version', 'v') || args.command === 'version') {
|
|
78
|
+
process.stdout.write(`${VERSION}\n`);
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
return await run(args);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error instanceof ApiError || error instanceof LoginError) {
|
|
86
|
+
process.stderr.write(`${error.message}\n`);
|
|
87
|
+
if (error instanceof ApiError) {
|
|
88
|
+
for (const problem of error.fields) {
|
|
89
|
+
process.stderr.write(` ${problem.field}: ${problem.message}\n`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return 1;
|
|
93
|
+
}
|
|
94
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
95
|
+
return 1;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function run(args) {
|
|
99
|
+
switch (args.command) {
|
|
100
|
+
// Running a board. Imported lazily so `agenticjobs search` on a laptop
|
|
101
|
+
// needs neither a database nor the server half of the code.
|
|
102
|
+
case 'serve': {
|
|
103
|
+
const { startServer } = await import("../server/serve.js");
|
|
104
|
+
await startServer();
|
|
105
|
+
return new Promise(() => undefined);
|
|
106
|
+
}
|
|
107
|
+
case 'migrate': {
|
|
108
|
+
const { closePool, getPool } = await import("../db/pool.js");
|
|
109
|
+
const { migrate } = await import("../db/migrate.js");
|
|
110
|
+
const { loadConfig: serverConfig } = await import("../config.js");
|
|
111
|
+
const result = await migrate(getPool(serverConfig().databaseUrl));
|
|
112
|
+
process.stdout.write(result.applied.length === 0
|
|
113
|
+
? `Nothing to apply; ${result.alreadyApplied} already there.\n`
|
|
114
|
+
: `Applied: ${result.applied.join(', ')}\n`);
|
|
115
|
+
await closePool();
|
|
116
|
+
return 0;
|
|
117
|
+
}
|
|
118
|
+
case 'seed': {
|
|
119
|
+
const { closePool, getPool } = await import("../db/pool.js");
|
|
120
|
+
const { seed } = await import("../db/seed.js");
|
|
121
|
+
const { loadConfig: serverConfig } = await import("../config.js");
|
|
122
|
+
const added = await seed(getPool(serverConfig().databaseUrl));
|
|
123
|
+
process.stdout.write(added === 0
|
|
124
|
+
? 'This board already has jobs, so nothing was added.\n'
|
|
125
|
+
: `Added ${added} example listings.\n`);
|
|
126
|
+
await closePool();
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
129
|
+
case 'tui': {
|
|
130
|
+
const { startTui } = await import("../tui/index.js");
|
|
131
|
+
await startTui(clientFor(args));
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
case 'mcp': {
|
|
135
|
+
const { startStdio } = await import("../mcp/stdio.js");
|
|
136
|
+
await startStdio(clientFor(args));
|
|
137
|
+
return new Promise(() => undefined);
|
|
138
|
+
}
|
|
139
|
+
case 'login':
|
|
140
|
+
return commandLogin(args);
|
|
141
|
+
case 'logout':
|
|
142
|
+
return commandLogout(args);
|
|
143
|
+
case 'boards':
|
|
144
|
+
return commandBoards(args);
|
|
145
|
+
case 'use':
|
|
146
|
+
return commandUse(args);
|
|
147
|
+
case 'whoami':
|
|
148
|
+
return commandWhoami(args);
|
|
149
|
+
case 'search':
|
|
150
|
+
return commandSearch(args);
|
|
151
|
+
case 'show':
|
|
152
|
+
return commandShow(args);
|
|
153
|
+
case 'schema':
|
|
154
|
+
return commandSchema(args);
|
|
155
|
+
case 'apply':
|
|
156
|
+
return commandApply(args);
|
|
157
|
+
case 'drafts':
|
|
158
|
+
return commandDrafts(args);
|
|
159
|
+
case 'submit':
|
|
160
|
+
return commandSubmit(args);
|
|
161
|
+
case 'resume':
|
|
162
|
+
return commandResume(args);
|
|
163
|
+
case 'post':
|
|
164
|
+
return commandPost(args);
|
|
165
|
+
case 'publish':
|
|
166
|
+
case 'close':
|
|
167
|
+
return commandPublish(args);
|
|
168
|
+
case 'applications':
|
|
169
|
+
return commandApplications(args);
|
|
170
|
+
case 'announce':
|
|
171
|
+
return commandAnnounce(args);
|
|
172
|
+
case 'instances':
|
|
173
|
+
return commandInstances(args);
|
|
174
|
+
default:
|
|
175
|
+
process.stderr.write(`No command called "${args.command}".\n\n${USAGE}`);
|
|
176
|
+
return 1;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// --- helpers --------------------------------------------------------------
|
|
180
|
+
function clientFor(args) {
|
|
181
|
+
const explicit = flagString(args, 'server', 's');
|
|
182
|
+
if (explicit !== undefined) {
|
|
183
|
+
const server = normaliseServer(explicit);
|
|
184
|
+
const known = loadConfig().boards[server];
|
|
185
|
+
return new BoardClient(server, { token: known?.token ?? null, userAgent: userAgent() });
|
|
186
|
+
}
|
|
187
|
+
const board = currentBoard();
|
|
188
|
+
if (board === null) {
|
|
189
|
+
throw new Error(`No board configured yet. Run:\n\n agenticjobs login ${DEFAULT_SERVER}\n\nor pass --server <url>.`);
|
|
190
|
+
}
|
|
191
|
+
return new BoardClient(board.server, { token: board.token, userAgent: userAgent() });
|
|
192
|
+
}
|
|
193
|
+
function userAgent() {
|
|
194
|
+
return `agenticjobs-cli/${VERSION}`;
|
|
195
|
+
}
|
|
196
|
+
function out(args, human, machine) {
|
|
197
|
+
if (flagBool(args, 'json')) {
|
|
198
|
+
process.stdout.write(`${JSON.stringify(machine, null, 2)}\n`);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
process.stdout.write(human.endsWith('\n') ? human : `${human}\n`);
|
|
202
|
+
}
|
|
203
|
+
return 0;
|
|
204
|
+
}
|
|
205
|
+
function queryFrom(args) {
|
|
206
|
+
const query = {};
|
|
207
|
+
const words = args.positional.join(' ').trim();
|
|
208
|
+
if (words !== '')
|
|
209
|
+
query.q = words;
|
|
210
|
+
if (flagBool(args, 'remote'))
|
|
211
|
+
query.workplace = 'remote';
|
|
212
|
+
if (flagBool(args, 'agents'))
|
|
213
|
+
query.agentPolicy = 'welcome';
|
|
214
|
+
const workplace = flagString(args, 'workplace');
|
|
215
|
+
if (workplace === 'remote' || workplace === 'hybrid' || workplace === 'onsite') {
|
|
216
|
+
query.workplace = workplace;
|
|
217
|
+
}
|
|
218
|
+
const policy = flagString(args, 'agent-policy');
|
|
219
|
+
if (policy === 'welcome' || policy === 'disclose' || policy === 'human-only') {
|
|
220
|
+
query.agentPolicy = policy;
|
|
221
|
+
}
|
|
222
|
+
const tags = flagList(args, 'tag');
|
|
223
|
+
if (tags.length > 0) {
|
|
224
|
+
query.tags = tags.flatMap((tag) => tag.split(',')).map((tag) => tag.trim());
|
|
225
|
+
}
|
|
226
|
+
const min = flagNumber(args, 'min', 'salary-min');
|
|
227
|
+
if (min !== undefined)
|
|
228
|
+
query.salaryMin = min;
|
|
229
|
+
const limit = flagNumber(args, 'limit', 'n');
|
|
230
|
+
if (limit !== undefined)
|
|
231
|
+
query.limit = limit;
|
|
232
|
+
return query;
|
|
233
|
+
}
|
|
234
|
+
function jobLine(job, where) {
|
|
235
|
+
const salary = formatSalary(job.salary);
|
|
236
|
+
const bits = [job.workplace, job.seniority, job.location, salary, `agents: ${job.agentPolicy}`]
|
|
237
|
+
.filter((bit) => typeof bit === 'string' && bit !== '');
|
|
238
|
+
return [
|
|
239
|
+
`${job.title} ${dim(`- ${job.org.name}`)}`,
|
|
240
|
+
` ${dim(bits.join(' | '))}`,
|
|
241
|
+
` ${dim(`${job.slug} ${ago(job.publishedAt)}${where === undefined ? '' : ` ${where}`}`)}`,
|
|
242
|
+
].join('\n');
|
|
243
|
+
}
|
|
244
|
+
// --- boards ---------------------------------------------------------------
|
|
245
|
+
async function commandLogin(args) {
|
|
246
|
+
const target = args.positional[0] ?? flagString(args, 'server') ?? DEFAULT_SERVER;
|
|
247
|
+
const server = normaliseServer(target);
|
|
248
|
+
const client = new BoardClient(server, { userAgent: userAgent() });
|
|
249
|
+
// Confirms it is a board before asking anyone to type a code into a browser.
|
|
250
|
+
let name = server;
|
|
251
|
+
try {
|
|
252
|
+
const descriptor = await client.describe();
|
|
253
|
+
name = descriptor.name;
|
|
254
|
+
process.stdout.write(`${bold(descriptor.name)} - ${descriptor.tagline}\n`);
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
process.stdout.write(`${server} did not serve an instance descriptor. Trying anyway.\n`);
|
|
258
|
+
}
|
|
259
|
+
const token = await login(client, {
|
|
260
|
+
label: `${process.env['USER'] ?? 'terminal'}@${process.env['HOSTNAME'] ?? 'machine'}`,
|
|
261
|
+
onPrompt: (grant) => {
|
|
262
|
+
process.stdout.write(`\nOpen ${bold(grant.verifyUrl)} and enter this code:\n\n ${bold(grant.userCode)}\n\nWaiting...\n`);
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
let email = null;
|
|
266
|
+
try {
|
|
267
|
+
email = (await client.me()).user.email;
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// A token good enough for the poll but not for /me is odd, not fatal.
|
|
271
|
+
}
|
|
272
|
+
rememberBoard({ server, token, email, name });
|
|
273
|
+
process.stdout.write(`\nSigned in to ${name}${email === null ? '' : ` as ${email}`}.\n`);
|
|
274
|
+
return 0;
|
|
275
|
+
}
|
|
276
|
+
function commandLogout(args) {
|
|
277
|
+
const target = args.positional[0] ?? currentBoard()?.server;
|
|
278
|
+
if (target === undefined) {
|
|
279
|
+
process.stderr.write('No board to forget.\n');
|
|
280
|
+
return 1;
|
|
281
|
+
}
|
|
282
|
+
const removed = forgetBoard(target);
|
|
283
|
+
process.stdout.write(removed ? `Forgot ${normaliseServer(target)}.\n` : `Not signed in to ${target}.\n`);
|
|
284
|
+
return removed ? 0 : 1;
|
|
285
|
+
}
|
|
286
|
+
function commandBoards(args) {
|
|
287
|
+
const config = loadConfig();
|
|
288
|
+
const boards = Object.values(config.boards);
|
|
289
|
+
if (boards.length === 0) {
|
|
290
|
+
return out(args, `No boards yet. Try:\n\n agenticjobs login ${DEFAULT_SERVER}`, { boards: [] });
|
|
291
|
+
}
|
|
292
|
+
const lines = boards.map((board) => {
|
|
293
|
+
const marker = board.server === config.current ? '*' : ' ';
|
|
294
|
+
const who = board.email === null || board.email === undefined ? '' : dim(` ${board.email}`);
|
|
295
|
+
return `${marker} ${board.name ?? board.server}\n ${dim(board.server)}${who}`;
|
|
296
|
+
});
|
|
297
|
+
return out(args, lines.join('\n'), { current: config.current, boards });
|
|
298
|
+
}
|
|
299
|
+
function commandUse(args) {
|
|
300
|
+
const target = args.positional[0];
|
|
301
|
+
if (target === undefined) {
|
|
302
|
+
process.stderr.write('Which board? agenticjobs use <url>\n');
|
|
303
|
+
return 1;
|
|
304
|
+
}
|
|
305
|
+
const config = loadConfig();
|
|
306
|
+
const server = normaliseServer(target);
|
|
307
|
+
if (config.boards[server] === undefined) {
|
|
308
|
+
process.stderr.write(`Not signed in to ${server}. Run: agenticjobs login ${server}\n`);
|
|
309
|
+
return 1;
|
|
310
|
+
}
|
|
311
|
+
config.current = server;
|
|
312
|
+
saveConfig(config);
|
|
313
|
+
process.stdout.write(`Now using ${server}.\n`);
|
|
314
|
+
return 0;
|
|
315
|
+
}
|
|
316
|
+
async function commandWhoami(args) {
|
|
317
|
+
const client = clientFor(args);
|
|
318
|
+
const me = await client.me();
|
|
319
|
+
const lines = [
|
|
320
|
+
`${me.user.email} on ${client.server}`,
|
|
321
|
+
me.orgs.length === 0
|
|
322
|
+
? dim(' no employers - you cannot post yet')
|
|
323
|
+
: ` employers: ${me.orgs.map((org) => org.slug).join(', ')}`,
|
|
324
|
+
me.resumes.length === 0
|
|
325
|
+
? dim(' no resumes')
|
|
326
|
+
: ` resumes: ${me.resumes.map((resume) => resume.slug).join(', ')}`,
|
|
327
|
+
];
|
|
328
|
+
return out(args, lines.join('\n'), me);
|
|
329
|
+
}
|
|
330
|
+
// --- finding work ---------------------------------------------------------
|
|
331
|
+
async function commandSearch(args) {
|
|
332
|
+
const query = queryFrom(args);
|
|
333
|
+
if (flagBool(args, 'all')) {
|
|
334
|
+
const boards = configuredBoards();
|
|
335
|
+
if (boards.length === 0) {
|
|
336
|
+
process.stderr.write('No boards configured. Run: agenticjobs login <url>\n');
|
|
337
|
+
return 1;
|
|
338
|
+
}
|
|
339
|
+
const result = await searchEverywhere(boards, query);
|
|
340
|
+
const failed = result.sources.filter((source) => !source.ok);
|
|
341
|
+
const body = result.jobs.map((hit) => jobLine(hit.job, hit.boardName)).join('\n\n');
|
|
342
|
+
const note = failed.length === 0
|
|
343
|
+
? ''
|
|
344
|
+
: `\n\n${dim(`${failed.length} board(s) did not answer: ${failed.map((source) => `${source.name} (${source.error ?? 'no reason given'})`).join(', ')}`)}`;
|
|
345
|
+
return out(args, `${result.jobs.length} of ${result.total} across ${result.sources.length} boards\n\n${body}${note}`, result);
|
|
346
|
+
}
|
|
347
|
+
if (flagBool(args, 'network')) {
|
|
348
|
+
const result = (await clientFor(args).searchNetwork(query));
|
|
349
|
+
const body = result.jobs.map((hit) => jobLine(hit.job, hit.instanceName)).join('\n\n');
|
|
350
|
+
return out(args, body === '' ? 'Nothing matched on any listed board.' : body, result);
|
|
351
|
+
}
|
|
352
|
+
const client = clientFor(args);
|
|
353
|
+
const page = await client.search(query);
|
|
354
|
+
if (page.items.length === 0) {
|
|
355
|
+
return out(args, `Nothing on ${client.server} matches that.\n${dim('This board only holds listings posted to it, so that means nobody posted one - not that a crawler missed it.')}`, page);
|
|
356
|
+
}
|
|
357
|
+
const body = page.items.map((job) => jobLine(job)).join('\n\n');
|
|
358
|
+
return out(args, `${page.total} match, showing ${page.items.length}\n\n${body}`, page);
|
|
359
|
+
}
|
|
360
|
+
async function commandShow(args) {
|
|
361
|
+
const slug = args.positional[0];
|
|
362
|
+
if (slug === undefined) {
|
|
363
|
+
process.stderr.write('Which job? agenticjobs show <slug>\n');
|
|
364
|
+
return 1;
|
|
365
|
+
}
|
|
366
|
+
const found = await clientFor(args).job(slug);
|
|
367
|
+
const job = found.job;
|
|
368
|
+
const how = job.apply.via === 'board'
|
|
369
|
+
? `agenticjobs apply ${job.slug}`
|
|
370
|
+
: job.apply.via === 'url'
|
|
371
|
+
? job.apply.url
|
|
372
|
+
: job.apply.email;
|
|
373
|
+
const lines = [
|
|
374
|
+
bold(job.title),
|
|
375
|
+
`${job.org.name}${job.location === null ? '' : ` - ${job.location}`}`,
|
|
376
|
+
dim([job.workplace, job.employmentType, job.seniority, formatSalary(job.salary), `agents: ${job.agentPolicy}`]
|
|
377
|
+
.filter((bit) => typeof bit === 'string' && bit !== '')
|
|
378
|
+
.join(' | ')),
|
|
379
|
+
'',
|
|
380
|
+
job.description,
|
|
381
|
+
'',
|
|
382
|
+
dim(`Apply: ${how}`),
|
|
383
|
+
];
|
|
384
|
+
return out(args, lines.join('\n'), found);
|
|
385
|
+
}
|
|
386
|
+
async function commandSchema(args) {
|
|
387
|
+
const slug = args.positional[0];
|
|
388
|
+
if (slug === undefined) {
|
|
389
|
+
process.stderr.write('Which job? agenticjobs schema <slug>\n');
|
|
390
|
+
return 1;
|
|
391
|
+
}
|
|
392
|
+
process.stdout.write(`${JSON.stringify(await clientFor(args).applySchema(slug), null, 2)}\n`);
|
|
393
|
+
return 0;
|
|
394
|
+
}
|
|
395
|
+
// --- applying -------------------------------------------------------------
|
|
396
|
+
async function commandApply(args) {
|
|
397
|
+
const slug = args.positional[0];
|
|
398
|
+
if (slug === undefined) {
|
|
399
|
+
process.stderr.write('Which job? agenticjobs apply <slug>\n');
|
|
400
|
+
return 1;
|
|
401
|
+
}
|
|
402
|
+
const client = clientFor(args);
|
|
403
|
+
const body = {};
|
|
404
|
+
for (const pair of flagList(args, 'answer', 'a')) {
|
|
405
|
+
const equals = pair.indexOf('=');
|
|
406
|
+
if (equals < 0) {
|
|
407
|
+
process.stderr.write(`--answer wants name=value, got "${pair}".\n`);
|
|
408
|
+
return 1;
|
|
409
|
+
}
|
|
410
|
+
body[pair.slice(0, equals)] = pair.slice(equals + 1);
|
|
411
|
+
}
|
|
412
|
+
const resume = flagString(args, 'resume', 'r');
|
|
413
|
+
if (resume !== undefined) {
|
|
414
|
+
// A path if it reads as one, otherwise the slug of a saved resume. Decided
|
|
415
|
+
// by trying to read it rather than by guessing from the shape of the name.
|
|
416
|
+
try {
|
|
417
|
+
body['resume'] = await readFile(resume, 'utf8');
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
body['resumeSlug'] = resume;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
const agentName = flagString(args, 'agent');
|
|
424
|
+
if (agentName !== undefined) {
|
|
425
|
+
body['agent'] = { name: agentName, supervised: !flagBool(args, 'unsupervised') };
|
|
426
|
+
}
|
|
427
|
+
const draft = flagBool(args, 'draft');
|
|
428
|
+
if (draft)
|
|
429
|
+
body['submit'] = false;
|
|
430
|
+
const response = (await client.apply(slug, body));
|
|
431
|
+
if (draft) {
|
|
432
|
+
return out(args, [
|
|
433
|
+
'Prepared, not sent. Nobody at the employer can see it yet.',
|
|
434
|
+
'',
|
|
435
|
+
' read it: agenticjobs drafts',
|
|
436
|
+
` send it: agenticjobs submit ${response.applicationId}`,
|
|
437
|
+
].join('\n'), response);
|
|
438
|
+
}
|
|
439
|
+
return out(args, `Sent to ${slug}.`, response);
|
|
440
|
+
}
|
|
441
|
+
async function commandDrafts(args) {
|
|
442
|
+
const result = await clientFor(args).request('GET', '/api/v1/applications/drafts');
|
|
443
|
+
if (result.items.length === 0)
|
|
444
|
+
return out(args, 'No applications waiting for you.', result);
|
|
445
|
+
const lines = result.items.map((draft) => [
|
|
446
|
+
bold(draft.jobTitle),
|
|
447
|
+
` ${dim(`prepared ${ago(draft.createdAt)}`)}`,
|
|
448
|
+
` ${dim(`send: agenticjobs submit ${draft.id}`)}`,
|
|
449
|
+
].join('\n'));
|
|
450
|
+
return out(args, `${result.items.length} waiting for you to read and send\n\n${lines.join('\n\n')}`, result);
|
|
451
|
+
}
|
|
452
|
+
async function commandSubmit(args) {
|
|
453
|
+
const id = args.positional[0];
|
|
454
|
+
if (id === undefined) {
|
|
455
|
+
process.stderr.write('Which one? agenticjobs submit <id>\n');
|
|
456
|
+
return 1;
|
|
457
|
+
}
|
|
458
|
+
await clientFor(args).request('POST', `/api/v1/applications/${encodeURIComponent(id)}/submit`);
|
|
459
|
+
return out(args, 'Sent.', { ok: true });
|
|
460
|
+
}
|
|
461
|
+
// --- resumes --------------------------------------------------------------
|
|
462
|
+
async function commandResume(args) {
|
|
463
|
+
const action = args.positional[0] ?? 'list';
|
|
464
|
+
const client = clientFor(args);
|
|
465
|
+
if (action === 'list') {
|
|
466
|
+
const result = await client.resumes();
|
|
467
|
+
if (result.items.length === 0)
|
|
468
|
+
return out(args, 'No resumes yet.', result);
|
|
469
|
+
return out(args, result.items.map((resume) => `${resume.slug} ${dim(resume.title)}`).join('\n'), result);
|
|
470
|
+
}
|
|
471
|
+
if (action === 'show') {
|
|
472
|
+
const slug = args.positional[1];
|
|
473
|
+
if (slug === undefined) {
|
|
474
|
+
process.stderr.write('Which one? agenticjobs resume show <slug>\n');
|
|
475
|
+
return 1;
|
|
476
|
+
}
|
|
477
|
+
const result = await client.request('GET', `/api/v1/resumes/${encodeURIComponent(slug)}`);
|
|
478
|
+
process.stdout.write(`${result.resume.markdown}\n`);
|
|
479
|
+
return 0;
|
|
480
|
+
}
|
|
481
|
+
if (action === 'save') {
|
|
482
|
+
const path = args.positional[1];
|
|
483
|
+
if (path === undefined) {
|
|
484
|
+
process.stderr.write('Which file? agenticjobs resume save <file.md>\n');
|
|
485
|
+
return 1;
|
|
486
|
+
}
|
|
487
|
+
const slug = flagString(args, 'slug');
|
|
488
|
+
const title = flagString(args, 'title');
|
|
489
|
+
const saved = await client.saveResume(await readFile(path, 'utf8'), {
|
|
490
|
+
...(slug === undefined ? {} : { slug }),
|
|
491
|
+
...(title === undefined ? {} : { title }),
|
|
492
|
+
});
|
|
493
|
+
return out(args, 'Saved.', saved);
|
|
494
|
+
}
|
|
495
|
+
if (action === 'import') {
|
|
496
|
+
const path = args.positional[1];
|
|
497
|
+
if (path === undefined) {
|
|
498
|
+
process.stderr.write('Which file? agenticjobs resume import <file>\n');
|
|
499
|
+
return 1;
|
|
500
|
+
}
|
|
501
|
+
const { importDocument } = await import("../core/import.js");
|
|
502
|
+
const imported = await importDocument(path, await readFile(path));
|
|
503
|
+
const title = flagString(args, 'title');
|
|
504
|
+
// Converted on this machine, so the original file never leaves it.
|
|
505
|
+
const saved = await client.saveResume(imported.markdown, {
|
|
506
|
+
...(title === undefined ? {} : { title }),
|
|
507
|
+
});
|
|
508
|
+
for (const warning of imported.warnings)
|
|
509
|
+
process.stderr.write(`note: ${warning}\n`);
|
|
510
|
+
return out(args, `Converted from ${imported.via} and saved.`, saved);
|
|
511
|
+
}
|
|
512
|
+
process.stderr.write(`No resume command called "${action}".\n`);
|
|
513
|
+
return 1;
|
|
514
|
+
}
|
|
515
|
+
// --- hiring ---------------------------------------------------------------
|
|
516
|
+
async function commandPost(args) {
|
|
517
|
+
const client = clientFor(args);
|
|
518
|
+
const path = args.positional[0];
|
|
519
|
+
let input = {};
|
|
520
|
+
if (path !== undefined) {
|
|
521
|
+
const { parseJobDocument } = await import("./jobfile.js");
|
|
522
|
+
input = parseJobDocument(await readFile(path, 'utf8'));
|
|
523
|
+
}
|
|
524
|
+
for (const key of [
|
|
525
|
+
'org',
|
|
526
|
+
'title',
|
|
527
|
+
'employmentType',
|
|
528
|
+
'workplace',
|
|
529
|
+
'seniority',
|
|
530
|
+
'location',
|
|
531
|
+
'salaryMin',
|
|
532
|
+
'salaryMax',
|
|
533
|
+
'salaryCurrency',
|
|
534
|
+
'salaryPeriod',
|
|
535
|
+
'tags',
|
|
536
|
+
'stack',
|
|
537
|
+
'agentPolicy',
|
|
538
|
+
'applyVia',
|
|
539
|
+
'applyUrl',
|
|
540
|
+
'applyEmail',
|
|
541
|
+
]) {
|
|
542
|
+
const value = flagString(args, key);
|
|
543
|
+
if (value !== undefined)
|
|
544
|
+
input[key] = value;
|
|
545
|
+
}
|
|
546
|
+
if (input['org'] === undefined) {
|
|
547
|
+
process.stderr.write('Which employer? Pass --org <slug>, or put "org:" in the front matter.\n');
|
|
548
|
+
return 1;
|
|
549
|
+
}
|
|
550
|
+
if (flagBool(args, 'publish'))
|
|
551
|
+
input['publish'] = true;
|
|
552
|
+
const created = await client.postJob(input);
|
|
553
|
+
const live = created.job.status === 'published';
|
|
554
|
+
return out(args, `Created ${live ? 'and published' : 'as a draft'}: ${created.job.slug}\n${live ? '' : dim(` publish it: agenticjobs publish ${created.job.slug}`)}`, created);
|
|
555
|
+
}
|
|
556
|
+
async function commandPublish(args) {
|
|
557
|
+
const slug = args.positional[0];
|
|
558
|
+
if (slug === undefined) {
|
|
559
|
+
process.stderr.write(`Which job? agenticjobs ${args.command} <slug>\n`);
|
|
560
|
+
return 1;
|
|
561
|
+
}
|
|
562
|
+
const action = args.command === 'close' ? 'close' : 'publish';
|
|
563
|
+
const result = await clientFor(args).request('POST', `/api/v1/jobs/${encodeURIComponent(slug)}/${action}`);
|
|
564
|
+
return out(args, `${slug} is now ${result.job.status}.`, result);
|
|
565
|
+
}
|
|
566
|
+
async function commandApplications(args) {
|
|
567
|
+
const slug = args.positional[0];
|
|
568
|
+
if (slug === undefined) {
|
|
569
|
+
process.stderr.write('Which job? agenticjobs applications <slug>\n');
|
|
570
|
+
return 1;
|
|
571
|
+
}
|
|
572
|
+
const result = await clientFor(args).request('GET', `/api/v1/jobs/${encodeURIComponent(slug)}/applications`);
|
|
573
|
+
if (result.items.length === 0)
|
|
574
|
+
return out(args, 'Nobody yet.', result);
|
|
575
|
+
const lines = result.items.map((application) => {
|
|
576
|
+
const disclosure = application.agent === null
|
|
577
|
+
? ''
|
|
578
|
+
: dim(` agent: ${application.agent.name}${application.agent.supervised ? ' (supervised)' : ''}`);
|
|
579
|
+
const cover = application.answers['cover'];
|
|
580
|
+
return [
|
|
581
|
+
`${bold(application.answers['name'] ?? 'Someone')} ${dim(application.answers['email'] ?? '')}`,
|
|
582
|
+
` ${dim(`${application.status} - ${ago(application.createdAt)}`)}`,
|
|
583
|
+
disclosure,
|
|
584
|
+
cover === undefined ? '' : ` ${cover.slice(0, 300)}`,
|
|
585
|
+
]
|
|
586
|
+
.filter((line) => line !== '')
|
|
587
|
+
.join('\n');
|
|
588
|
+
});
|
|
589
|
+
return out(args, `${result.items.length} applications\n\n${lines.join('\n\n')}`, result);
|
|
590
|
+
}
|
|
591
|
+
// --- federation -----------------------------------------------------------
|
|
592
|
+
async function commandAnnounce(args) {
|
|
593
|
+
const { announceOnce } = await import("../directory/announce.js");
|
|
594
|
+
const { loadConfig: serverConfig } = await import("../config.js");
|
|
595
|
+
const config = serverConfig();
|
|
596
|
+
const directory = flagString(args, 'directory') ?? config.directoryUrl;
|
|
597
|
+
const self = flagString(args, 'url') ?? config.publicUrl;
|
|
598
|
+
if (directory === null || directory === undefined) {
|
|
599
|
+
process.stderr.write('No directory. Pass --directory <url> or set DIRECTORY_URL.\n');
|
|
600
|
+
return 1;
|
|
601
|
+
}
|
|
602
|
+
await announceOnce(directory, self);
|
|
603
|
+
process.stdout.write(`Announced ${self} to ${directory}.\n`);
|
|
604
|
+
return 0;
|
|
605
|
+
}
|
|
606
|
+
async function commandInstances(args) {
|
|
607
|
+
const result = await clientFor(args).instances();
|
|
608
|
+
if (result.items.length === 0)
|
|
609
|
+
return out(args, 'That directory lists no boards.', result);
|
|
610
|
+
const lines = result.items.map((instance) => [
|
|
611
|
+
`${instance.online ? '*' : ' '} ${bold(instance.descriptor.name)}`,
|
|
612
|
+
` ${dim(instance.url)}`,
|
|
613
|
+
` ${dim(`${instance.descriptor.jobs.open} open - ${instance.descriptor.topics.join(', ')}`)}`,
|
|
614
|
+
].join('\n'));
|
|
615
|
+
return out(args, lines.join('\n\n'), result);
|
|
616
|
+
}
|
|
617
|
+
const code = await main();
|
|
618
|
+
if (code !== 0)
|
|
619
|
+
process.exitCode = code;
|
|
620
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|