hacklab 0.4.3 → 0.5.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/README.md +3 -0
- package/dist/commands/chat.d.ts +5 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +359 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/company.d.ts +2 -0
- package/dist/commands/company.d.ts.map +1 -0
- package/dist/commands/company.js +214 -0
- package/dist/commands/company.js.map +1 -0
- package/dist/commands/org.d.ts +2 -0
- package/dist/commands/org.d.ts.map +1 -0
- package/dist/commands/org.js +214 -0
- package/dist/commands/org.js.map +1 -0
- package/dist/index.js +30 -10
- package/dist/index.js.map +1 -1
- package/dist/resolve-command.d.ts +21 -0
- package/dist/resolve-command.d.ts.map +1 -0
- package/dist/resolve-command.js +36 -0
- package/dist/resolve-command.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -48,6 +48,9 @@ scan local AI usage → see your rank → pick a username → sign in with GitHu
|
|
|
48
48
|
- `hacklab scan` — build your full profile (skills, repos, blog).
|
|
49
49
|
- `hacklab config <key> <value>` — set config (`cursor-api-key`, `cursor-email`).
|
|
50
50
|
- `hacklab brag [path]` — sync a `.hacklab/project.yaml` to your profile.
|
|
51
|
+
- `hacklab org` — edit the profile of an organization you've claimed. Pick a
|
|
52
|
+
field, type the new value, and it saves as you go. Only organizations you've
|
|
53
|
+
claimed are editable.
|
|
51
54
|
- `hacklab --version` / `hacklab --help`.
|
|
52
55
|
|
|
53
56
|
## Choosing a backend
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Session } from '../session.js';
|
|
2
|
+
export declare function baseUrl(session?: Session | null): string;
|
|
3
|
+
export declare function stripControl(s: string): string;
|
|
4
|
+
export declare function chat(args: string[]): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,OAAO,EAAE,MAAM,eAAe,CAAA;AAyCpE,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAGxD;AAyCD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9C;AAiUD,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,iBAyBxC"}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import readline from 'node:readline';
|
|
2
|
+
import { getAppUrl, loadSession } from '../session.js';
|
|
3
|
+
import { bold, dim, error, green, info, red, success } from '../ui.js';
|
|
4
|
+
// The chat command is CLI-first: every subcommand takes --json so an AI agent
|
|
5
|
+
// can drive the channel and DMs programmatically, while the default output is a
|
|
6
|
+
// human-readable terminal view. Thin wrappers over the /api/chat/* routes.
|
|
7
|
+
const CHANNEL_BASE = '/api/chat/channel/main';
|
|
8
|
+
function printJson(data) {
|
|
9
|
+
console.log(JSON.stringify(data, null, 2));
|
|
10
|
+
}
|
|
11
|
+
// Backend precedence: an explicit override (HACKLAB_APP_URL, set by --env) wins
|
|
12
|
+
// so `--env staging` actually switches backends; otherwise fall back to the
|
|
13
|
+
// backend you logged into (session.appUrl), then the production default. Note
|
|
14
|
+
// the session token is per-backend, so pointing --env at an env you haven't
|
|
15
|
+
// logged into will 401 until you `hacklab login --env <that>`.
|
|
16
|
+
export function baseUrl(session) {
|
|
17
|
+
const override = process.env.HACKLAB_APP_URL?.replace(/\/$/, '');
|
|
18
|
+
return override ?? session?.appUrl ?? getAppUrl();
|
|
19
|
+
}
|
|
20
|
+
async function requireSession() {
|
|
21
|
+
const session = await loadSession();
|
|
22
|
+
if (!session) {
|
|
23
|
+
error('not logged in');
|
|
24
|
+
info(`run ${dim('hacklab login')} first`);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
return session;
|
|
28
|
+
}
|
|
29
|
+
async function readError(res) {
|
|
30
|
+
const data = (await res.json().catch(() => null));
|
|
31
|
+
return data?.error ?? `request failed (${res.status})`;
|
|
32
|
+
}
|
|
33
|
+
function flagValue(args, name) {
|
|
34
|
+
const i = args.indexOf(name);
|
|
35
|
+
if (i !== -1 && args[i + 1])
|
|
36
|
+
return args[i + 1];
|
|
37
|
+
const eq = args.find((a) => a.startsWith(`${name}=`));
|
|
38
|
+
return eq ? eq.slice(name.length + 1) : undefined;
|
|
39
|
+
}
|
|
40
|
+
function clock(iso) {
|
|
41
|
+
const d = new Date(iso);
|
|
42
|
+
const hh = String(d.getHours()).padStart(2, '0');
|
|
43
|
+
const mm = String(d.getMinutes()).padStart(2, '0');
|
|
44
|
+
return `${hh}:${mm}`;
|
|
45
|
+
}
|
|
46
|
+
// Strip C0 control characters + DEL from untrusted message content before
|
|
47
|
+
// printing it to the terminal. Without this, a hacker could embed ANSI escape
|
|
48
|
+
// sequences in a message to clear/garble or hijack any viewer's terminal.
|
|
49
|
+
export function stripControl(s) {
|
|
50
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: intentionally matching control chars to remove them
|
|
51
|
+
return s.replace(/[\x00-\x1f\x7f]/g, '');
|
|
52
|
+
}
|
|
53
|
+
function formatLine(m) {
|
|
54
|
+
const lvl = m.senderLevel != null ? dim(` lv${m.senderLevel}`) : '';
|
|
55
|
+
return `${dim(clock(m.createdAt))} ${bold(m.senderHandle)}${lvl}: ${stripControl(m.content)}`;
|
|
56
|
+
}
|
|
57
|
+
// API returns newest-first; print oldest-first like a chat log.
|
|
58
|
+
function renderMessages(messages) {
|
|
59
|
+
if (messages.length === 0) {
|
|
60
|
+
console.log(dim('(no messages yet)'));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
for (const m of [...messages].reverse()) {
|
|
64
|
+
console.log(formatLine(m));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function chatTail(json) {
|
|
68
|
+
// Public endpoint — no auth required (the whole point of the cached tail), but
|
|
69
|
+
// still resolve the backend the same way so --env and your logged-in env work.
|
|
70
|
+
const session = await loadSession();
|
|
71
|
+
const res = await fetch(`${baseUrl(session)}${CHANNEL_BASE}/tail`);
|
|
72
|
+
if (!res.ok) {
|
|
73
|
+
error(await readError(res));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
const data = (await res.json());
|
|
77
|
+
if (json) {
|
|
78
|
+
printJson(data);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
renderMessages(data.messages);
|
|
82
|
+
}
|
|
83
|
+
async function chatPost(words, json) {
|
|
84
|
+
const content = words.join(' ').trim();
|
|
85
|
+
if (!content) {
|
|
86
|
+
error('usage: hacklab chat post <message>');
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
const session = await requireSession();
|
|
90
|
+
const res = await fetch(`${baseUrl(session)}${CHANNEL_BASE}`, {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers: {
|
|
93
|
+
'Content-Type': 'application/json',
|
|
94
|
+
Authorization: `Bearer ${session.token}`,
|
|
95
|
+
},
|
|
96
|
+
body: JSON.stringify({ content }),
|
|
97
|
+
});
|
|
98
|
+
if (!res.ok) {
|
|
99
|
+
error(await readError(res));
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
const data = await res.json();
|
|
103
|
+
if (json) {
|
|
104
|
+
printJson(data);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
success('posted.');
|
|
108
|
+
}
|
|
109
|
+
async function chatHistory(args, json) {
|
|
110
|
+
const before = flagValue(args, '--before');
|
|
111
|
+
const session = await requireSession();
|
|
112
|
+
const url = new URL(`${baseUrl(session)}${CHANNEL_BASE}/history`);
|
|
113
|
+
if (before)
|
|
114
|
+
url.searchParams.set('before', before);
|
|
115
|
+
const res = await fetch(url, {
|
|
116
|
+
headers: { Authorization: `Bearer ${session.token}` },
|
|
117
|
+
});
|
|
118
|
+
if (!res.ok) {
|
|
119
|
+
error(await readError(res));
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
const data = (await res.json());
|
|
123
|
+
if (json) {
|
|
124
|
+
printJson(data);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
renderMessages(data.messages);
|
|
128
|
+
if (data.nextCursor) {
|
|
129
|
+
console.log(dim(`\nolder → hacklab chat history --before ${data.nextCursor}`));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async function chatDms(json) {
|
|
133
|
+
const session = await requireSession();
|
|
134
|
+
const res = await fetch(`${baseUrl(session)}/api/chat/dms`, {
|
|
135
|
+
headers: { Authorization: `Bearer ${session.token}` },
|
|
136
|
+
});
|
|
137
|
+
if (!res.ok) {
|
|
138
|
+
error(await readError(res));
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
const data = (await res.json());
|
|
142
|
+
if (json) {
|
|
143
|
+
printJson(data);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (data.conversations.length === 0) {
|
|
147
|
+
console.log(dim('(no conversations yet)'));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
for (const c of data.conversations) {
|
|
151
|
+
const unread = c.unread_count > 0 ? ` ${green(`(${c.unread_count} new)`)}` : '';
|
|
152
|
+
const preview = c.last_message_content
|
|
153
|
+
? dim(` — ${c.last_message_content}`)
|
|
154
|
+
: '';
|
|
155
|
+
console.log(`${bold(`@${c.partner_handle}`)}${unread}${preview}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async function chatDm(args, json) {
|
|
159
|
+
const handle = args[0];
|
|
160
|
+
if (!handle) {
|
|
161
|
+
error('usage: hacklab chat dm <handle> [message]');
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
const message = args.slice(1).join(' ').trim();
|
|
165
|
+
const session = await requireSession();
|
|
166
|
+
const base = `${baseUrl(session)}/api/chat/dm/${encodeURIComponent(handle)}`;
|
|
167
|
+
if (message) {
|
|
168
|
+
const res = await fetch(base, {
|
|
169
|
+
method: 'POST',
|
|
170
|
+
headers: {
|
|
171
|
+
'Content-Type': 'application/json',
|
|
172
|
+
Authorization: `Bearer ${session.token}`,
|
|
173
|
+
},
|
|
174
|
+
body: JSON.stringify({ content: message }),
|
|
175
|
+
});
|
|
176
|
+
if (!res.ok) {
|
|
177
|
+
error(await readError(res));
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
const data = await res.json();
|
|
181
|
+
if (json) {
|
|
182
|
+
printJson(data);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
success(`sent to @${handle}.`);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const res = await fetch(base, {
|
|
189
|
+
headers: { Authorization: `Bearer ${session.token}` },
|
|
190
|
+
});
|
|
191
|
+
if (!res.ok) {
|
|
192
|
+
error(await readError(res));
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
const data = (await res.json());
|
|
196
|
+
if (json) {
|
|
197
|
+
printJson(data);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
renderMessages(data.messages);
|
|
201
|
+
}
|
|
202
|
+
async function chatFlag(args, json) {
|
|
203
|
+
const targetId = args[0];
|
|
204
|
+
const reason = args[1];
|
|
205
|
+
if (!targetId || !reason) {
|
|
206
|
+
error('usage: hacklab chat flag <messageId> <off_topic|personal_attack|spam|other>');
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
const session = await requireSession();
|
|
210
|
+
const res = await fetch(`${baseUrl(session)}/api/chat/flag`, {
|
|
211
|
+
method: 'POST',
|
|
212
|
+
headers: {
|
|
213
|
+
'Content-Type': 'application/json',
|
|
214
|
+
Authorization: `Bearer ${session.token}`,
|
|
215
|
+
},
|
|
216
|
+
body: JSON.stringify({ targetId, reason }),
|
|
217
|
+
});
|
|
218
|
+
if (!res.ok) {
|
|
219
|
+
error(await readError(res));
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
const data = await res.json();
|
|
223
|
+
if (json) {
|
|
224
|
+
printJson(data);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
success('flagged for review.');
|
|
228
|
+
}
|
|
229
|
+
// Interactive live channel: short-poll the public tail and print new messages
|
|
230
|
+
// above a readline prompt; press enter to post. CLI-first design means this is a
|
|
231
|
+
// thin loop over the same endpoints the agent subcommands use.
|
|
232
|
+
async function chatLive() {
|
|
233
|
+
const session = await requireSession();
|
|
234
|
+
const base = baseUrl(session);
|
|
235
|
+
const seen = new Set();
|
|
236
|
+
let started = false;
|
|
237
|
+
const rl = readline.createInterface({
|
|
238
|
+
input: process.stdin,
|
|
239
|
+
output: process.stdout,
|
|
240
|
+
prompt: dim('> '),
|
|
241
|
+
});
|
|
242
|
+
// Print a line above the prompt without clobbering whatever the user is
|
|
243
|
+
// mid-typing: clear the current line, write the message, then redraw the
|
|
244
|
+
// prompt + the in-progress input buffer.
|
|
245
|
+
function printAbove(text) {
|
|
246
|
+
const pending = rl.line;
|
|
247
|
+
readline.cursorTo(process.stdout, 0);
|
|
248
|
+
readline.clearLine(process.stdout, 0);
|
|
249
|
+
process.stdout.write(`${text}\n`);
|
|
250
|
+
process.stdout.write(rl.getPrompt() + pending);
|
|
251
|
+
}
|
|
252
|
+
async function poll() {
|
|
253
|
+
try {
|
|
254
|
+
const res = await fetch(`${base}${CHANNEL_BASE}/tail`);
|
|
255
|
+
if (!res.ok)
|
|
256
|
+
return;
|
|
257
|
+
const data = (await res.json());
|
|
258
|
+
const ordered = [...data.messages].reverse();
|
|
259
|
+
if (!started) {
|
|
260
|
+
for (const m of ordered) {
|
|
261
|
+
seen.add(m.id);
|
|
262
|
+
console.log(formatLine(m));
|
|
263
|
+
}
|
|
264
|
+
started = true;
|
|
265
|
+
rl.prompt();
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
for (const m of ordered) {
|
|
269
|
+
if (seen.has(m.id))
|
|
270
|
+
continue;
|
|
271
|
+
seen.add(m.id);
|
|
272
|
+
printAbove(formatLine(m));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// Transient network error — keep polling silently.
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
console.log(dim('hacklab channel — live. type a message + enter to post, ctrl-c to quit.'));
|
|
280
|
+
await poll();
|
|
281
|
+
const timer = setInterval(poll, 1500);
|
|
282
|
+
rl.on('line', async (input) => {
|
|
283
|
+
const content = input.trim();
|
|
284
|
+
if (!content) {
|
|
285
|
+
rl.prompt();
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
try {
|
|
289
|
+
const res = await fetch(`${base}${CHANNEL_BASE}`, {
|
|
290
|
+
method: 'POST',
|
|
291
|
+
headers: {
|
|
292
|
+
'Content-Type': 'application/json',
|
|
293
|
+
Authorization: `Bearer ${session.token}`,
|
|
294
|
+
},
|
|
295
|
+
body: JSON.stringify({ content }),
|
|
296
|
+
});
|
|
297
|
+
if (!res.ok) {
|
|
298
|
+
printAbove(red(`✗ ${await readError(res)}`));
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
const data = (await res.json());
|
|
302
|
+
if (data.message?.id) {
|
|
303
|
+
seen.add(data.message.id);
|
|
304
|
+
printAbove(formatLine(data.message));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
printAbove(red('✗ send failed (network error)'));
|
|
310
|
+
}
|
|
311
|
+
rl.prompt();
|
|
312
|
+
});
|
|
313
|
+
rl.on('SIGINT', () => {
|
|
314
|
+
clearInterval(timer);
|
|
315
|
+
rl.close();
|
|
316
|
+
process.stdout.write('\n');
|
|
317
|
+
process.exit(0);
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
function printChatHelp() {
|
|
321
|
+
console.log(bold('hacklab chat'));
|
|
322
|
+
console.log('');
|
|
323
|
+
console.log(` ${dim('live')} interactive channel (type to post)`);
|
|
324
|
+
console.log(` ${dim('tail')} read the latest channel messages`);
|
|
325
|
+
console.log(` ${dim('post <message>')} post to the channel`);
|
|
326
|
+
console.log(` ${dim('history [--before C]')} older channel messages`);
|
|
327
|
+
console.log(` ${dim('dms')} list your direct-message threads`);
|
|
328
|
+
console.log(` ${dim('dm <handle> [msg]')} read a DM thread, or send if msg given`);
|
|
329
|
+
console.log(` ${dim('flag <id> <reason>')} report a message to moderation`);
|
|
330
|
+
console.log('');
|
|
331
|
+
console.log(` ${dim('--json')} machine-readable output (any subcommand)`);
|
|
332
|
+
}
|
|
333
|
+
export async function chat(args) {
|
|
334
|
+
const json = args.includes('--json');
|
|
335
|
+
const rest = args.filter((a) => a !== '--json');
|
|
336
|
+
const sub = rest[0];
|
|
337
|
+
const subArgs = rest.slice(1);
|
|
338
|
+
switch (sub) {
|
|
339
|
+
case 'live':
|
|
340
|
+
return chatLive();
|
|
341
|
+
case 'tail':
|
|
342
|
+
return chatTail(json);
|
|
343
|
+
case 'post':
|
|
344
|
+
return chatPost(subArgs, json);
|
|
345
|
+
case 'history':
|
|
346
|
+
return chatHistory(subArgs, json);
|
|
347
|
+
case 'dms':
|
|
348
|
+
return chatDms(json);
|
|
349
|
+
case 'dm':
|
|
350
|
+
return chatDm(subArgs, json);
|
|
351
|
+
case 'flag':
|
|
352
|
+
return chatFlag(subArgs, json);
|
|
353
|
+
default:
|
|
354
|
+
printChatHelp();
|
|
355
|
+
if (sub)
|
|
356
|
+
process.exit(1);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"company.d.ts","sourceRoot":"","sources":["../../src/commands/company.ts"],"names":[],"mappings":"AAkJA,wBAAsB,OAAO,kBAgG5B"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import * as clack from '@clack/prompts';
|
|
2
|
+
import { loadSession } from '../session.js';
|
|
3
|
+
import { bold, dim, error, info, success } from '../ui.js';
|
|
4
|
+
const FIELDS = [
|
|
5
|
+
{ key: 'name', label: 'Name', type: 'text' },
|
|
6
|
+
{ key: 'slug', label: 'Slug (URL handle)', type: 'text' },
|
|
7
|
+
{ key: 'logoUrl', label: 'Logo URL', type: 'url' },
|
|
8
|
+
{ key: 'website', label: 'Website', type: 'url' },
|
|
9
|
+
{ key: 'description', label: 'Short description', type: 'text' },
|
|
10
|
+
{ key: 'longDescription', label: 'Long description', type: 'text' },
|
|
11
|
+
{ key: 'ycBatch', label: 'YC batch', type: 'text' },
|
|
12
|
+
{ key: 'ycSlug', label: 'YC slug', type: 'text' },
|
|
13
|
+
{ key: 'ycUrl', label: 'YC URL', type: 'url' },
|
|
14
|
+
{ key: 'waasUrl', label: 'WaaS URL', type: 'url' },
|
|
15
|
+
{ key: 'teamSize', label: 'Team size', type: 'number' },
|
|
16
|
+
{ key: 'status', label: 'Status', type: 'text' },
|
|
17
|
+
{ key: 'stage', label: 'Stage', type: 'text' },
|
|
18
|
+
{ key: 'isHiring', label: 'Hiring?', type: 'boolean' },
|
|
19
|
+
{ key: 'industries', label: 'Industries', type: 'list' },
|
|
20
|
+
{ key: 'tags', label: 'Tags', type: 'list' },
|
|
21
|
+
{ key: 'locations', label: 'Locations', type: 'list' },
|
|
22
|
+
];
|
|
23
|
+
// Short, human label for the current value (shown as a select-menu hint).
|
|
24
|
+
function displayValue(spec, value) {
|
|
25
|
+
if (value == null || value === '')
|
|
26
|
+
return '(empty)';
|
|
27
|
+
if (spec.type === 'boolean')
|
|
28
|
+
return value ? 'yes' : 'no';
|
|
29
|
+
if (spec.type === 'list') {
|
|
30
|
+
return Array.isArray(value) ? value.join(', ') || '(empty)' : String(value);
|
|
31
|
+
}
|
|
32
|
+
const s = String(value);
|
|
33
|
+
return s.length > 48 ? `${s.slice(0, 47)}…` : s;
|
|
34
|
+
}
|
|
35
|
+
async function fetchCompanies(session) {
|
|
36
|
+
const res = await fetch(`${session.appUrl}/api/cli/company`, {
|
|
37
|
+
headers: { Authorization: `Bearer ${session.token}` },
|
|
38
|
+
});
|
|
39
|
+
const data = await res.json().catch(() => null);
|
|
40
|
+
if (!res.ok) {
|
|
41
|
+
throw new Error(data?.error ?? `failed to load companies (${res.status})`);
|
|
42
|
+
}
|
|
43
|
+
return (data?.companies ?? []);
|
|
44
|
+
}
|
|
45
|
+
async function patchCompany(session, orgId, fields) {
|
|
46
|
+
const res = await fetch(`${session.appUrl}/api/cli/company`, {
|
|
47
|
+
method: 'PATCH',
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
Authorization: `Bearer ${session.token}`,
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify({ orgId, fields }),
|
|
53
|
+
});
|
|
54
|
+
const data = await res.json().catch(() => null);
|
|
55
|
+
if (!res.ok) {
|
|
56
|
+
throw new Error(data?.error ?? `update failed (${res.status})`);
|
|
57
|
+
}
|
|
58
|
+
return data;
|
|
59
|
+
}
|
|
60
|
+
// Prompt for one field, prefilled with the current value. Returns the new
|
|
61
|
+
// value to send, or a clack cancel symbol.
|
|
62
|
+
async function promptField(spec, current) {
|
|
63
|
+
if (spec.type === 'boolean') {
|
|
64
|
+
return clack.confirm({
|
|
65
|
+
message: spec.label,
|
|
66
|
+
initialValue: Boolean(current),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (spec.type === 'list') {
|
|
70
|
+
const initial = Array.isArray(current) ? current.join(', ') : '';
|
|
71
|
+
const value = await clack.text({
|
|
72
|
+
message: `${spec.label} ${dim('(comma-separated, blank to clear)')}`,
|
|
73
|
+
initialValue: initial,
|
|
74
|
+
});
|
|
75
|
+
if (clack.isCancel(value))
|
|
76
|
+
return value;
|
|
77
|
+
const items = value
|
|
78
|
+
.split(',')
|
|
79
|
+
.map((s) => s.trim())
|
|
80
|
+
.filter(Boolean);
|
|
81
|
+
return items.length ? items : null;
|
|
82
|
+
}
|
|
83
|
+
if (spec.type === 'number') {
|
|
84
|
+
const value = await clack.text({
|
|
85
|
+
message: `${spec.label} ${dim('(blank to clear)')}`,
|
|
86
|
+
initialValue: current == null ? '' : String(current),
|
|
87
|
+
validate: (v) => {
|
|
88
|
+
const t = (v ?? '').trim();
|
|
89
|
+
return !t || /^\d+$/.test(t) ? undefined : 'must be a whole number';
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
if (clack.isCancel(value))
|
|
93
|
+
return value;
|
|
94
|
+
return value.trim() ? Number(value.trim()) : null;
|
|
95
|
+
}
|
|
96
|
+
const value = await clack.text({
|
|
97
|
+
message: spec.type === 'url'
|
|
98
|
+
? `${spec.label} ${dim('(blank to clear)')}`
|
|
99
|
+
: spec.label,
|
|
100
|
+
initialValue: current == null ? '' : String(current),
|
|
101
|
+
validate: spec.type === 'url'
|
|
102
|
+
? (v) => {
|
|
103
|
+
const t = (v ?? '').trim();
|
|
104
|
+
if (!t)
|
|
105
|
+
return undefined;
|
|
106
|
+
try {
|
|
107
|
+
new URL(t);
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return 'must be a valid URL (include https://)';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
: undefined,
|
|
115
|
+
});
|
|
116
|
+
if (clack.isCancel(value))
|
|
117
|
+
return value;
|
|
118
|
+
const trimmed = value.trim();
|
|
119
|
+
// name/slug are required (notNull): a blank keeps the current value.
|
|
120
|
+
if ((spec.key === 'name' || spec.key === 'slug') && !trimmed)
|
|
121
|
+
return current;
|
|
122
|
+
return trimmed ? trimmed : null;
|
|
123
|
+
}
|
|
124
|
+
export async function company() {
|
|
125
|
+
const session = await loadSession();
|
|
126
|
+
if (!session) {
|
|
127
|
+
error('not logged in');
|
|
128
|
+
info(`run ${dim('hacklab login')} first`);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
clack.intro(bold('hacklab company'));
|
|
132
|
+
let companies;
|
|
133
|
+
try {
|
|
134
|
+
companies = await fetchCompanies(session);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
clack.cancel(err instanceof Error ? err.message : String(err));
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
if (companies.length === 0) {
|
|
141
|
+
clack.cancel(`you don't manage a company yet — claim one at ${session.appUrl} first.`);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
let target = companies[0];
|
|
145
|
+
if (companies.length > 1) {
|
|
146
|
+
const picked = await clack.select({
|
|
147
|
+
message: 'which company?',
|
|
148
|
+
options: companies.map((c) => ({
|
|
149
|
+
value: c.id,
|
|
150
|
+
label: `${c.name} ${dim(`/c/${c.slug}`)}`,
|
|
151
|
+
})),
|
|
152
|
+
});
|
|
153
|
+
if (clack.isCancel(picked)) {
|
|
154
|
+
clack.outro(dim('cancelled.'));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
target = companies.find((c) => c.id === picked) ?? target;
|
|
158
|
+
}
|
|
159
|
+
// Autosave: editing a field writes it immediately (mirrors the web settings'
|
|
160
|
+
// "saves instantly, no Save button"). Pick a field, set its value, it saves,
|
|
161
|
+
// and the menu shows the saved value. Leave any time with "done" or Esc —
|
|
162
|
+
// nothing is pending, so nothing is lost.
|
|
163
|
+
const DONE = '__done__';
|
|
164
|
+
let savedCount = 0;
|
|
165
|
+
while (true) {
|
|
166
|
+
const choice = await clack.select({
|
|
167
|
+
message: `editing ${bold(target.name)} ${dim('(saves as you go)')}`,
|
|
168
|
+
options: [
|
|
169
|
+
...FIELDS.map((f) => ({
|
|
170
|
+
value: f.key,
|
|
171
|
+
label: f.label,
|
|
172
|
+
hint: displayValue(f, target[f.key]),
|
|
173
|
+
})),
|
|
174
|
+
{ value: DONE, label: '← done' },
|
|
175
|
+
],
|
|
176
|
+
});
|
|
177
|
+
// Esc / Ctrl+C at the menu, or "done": leave. Every edit is already saved.
|
|
178
|
+
if (clack.isCancel(choice) || choice === DONE)
|
|
179
|
+
break;
|
|
180
|
+
const spec = FIELDS.find((f) => f.key === choice);
|
|
181
|
+
if (!spec)
|
|
182
|
+
continue;
|
|
183
|
+
const next = await promptField(spec, target[spec.key]);
|
|
184
|
+
// Cancelling a single field drops just that edit and returns to the menu.
|
|
185
|
+
if (clack.isCancel(next))
|
|
186
|
+
continue;
|
|
187
|
+
const label = spec.label.toLowerCase();
|
|
188
|
+
const prevSlug = target.slug;
|
|
189
|
+
const spin = clack.spinner();
|
|
190
|
+
spin.start(`saving ${label}`);
|
|
191
|
+
try {
|
|
192
|
+
const updated = await patchCompany(session, target.id, {
|
|
193
|
+
[spec.key]: next,
|
|
194
|
+
});
|
|
195
|
+
target = { ...target, ...updated };
|
|
196
|
+
savedCount++;
|
|
197
|
+
spin.stop(`saved ${label}`);
|
|
198
|
+
if (spec.key === 'slug' && target.slug !== prevSlug) {
|
|
199
|
+
clack.log.warn(`old links to /c/${prevSlug} will no longer resolve`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
spin.stop(`could not save ${label}`);
|
|
204
|
+
error(err instanceof Error ? err.message : String(err));
|
|
205
|
+
// Stay in the loop so they can retry or edit something else.
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (savedCount > 0) {
|
|
209
|
+
success(`saved ${savedCount} change${savedCount === 1 ? '' : 's'} to ${bold(target.name)}`);
|
|
210
|
+
info(`${session.appUrl}/c/${target.slug}`);
|
|
211
|
+
}
|
|
212
|
+
clack.outro(dim('done.'));
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=company.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"company.js","sourceRoot":"","sources":["../../src/commands/company.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org.d.ts","sourceRoot":"","sources":["../../src/commands/org.ts"],"names":[],"mappings":"AAoJA,wBAAsB,GAAG,kBAgGxB"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import * as clack from '@clack/prompts';
|
|
2
|
+
import { loadSession } from '../session.js';
|
|
3
|
+
import { bold, dim, error, info, success } from '../ui.js';
|
|
4
|
+
const FIELDS = [
|
|
5
|
+
{ key: 'name', label: 'Name', type: 'text' },
|
|
6
|
+
{ key: 'slug', label: 'Slug (URL handle)', type: 'text' },
|
|
7
|
+
{ key: 'logoUrl', label: 'Logo URL', type: 'url' },
|
|
8
|
+
{ key: 'website', label: 'Website', type: 'url' },
|
|
9
|
+
{ key: 'description', label: 'Short description', type: 'text' },
|
|
10
|
+
{ key: 'longDescription', label: 'Long description', type: 'text' },
|
|
11
|
+
{ key: 'ycBatch', label: 'YC batch', type: 'text' },
|
|
12
|
+
{ key: 'ycSlug', label: 'YC slug', type: 'text' },
|
|
13
|
+
{ key: 'ycUrl', label: 'YC URL', type: 'url' },
|
|
14
|
+
{ key: 'waasUrl', label: 'WaaS URL', type: 'url' },
|
|
15
|
+
{ key: 'teamSize', label: 'Team size', type: 'number' },
|
|
16
|
+
{ key: 'status', label: 'Status', type: 'text' },
|
|
17
|
+
{ key: 'stage', label: 'Stage', type: 'text' },
|
|
18
|
+
{ key: 'isHiring', label: 'Hiring?', type: 'boolean' },
|
|
19
|
+
{ key: 'industries', label: 'Industries', type: 'list' },
|
|
20
|
+
{ key: 'tags', label: 'Tags', type: 'list' },
|
|
21
|
+
{ key: 'locations', label: 'Locations', type: 'list' },
|
|
22
|
+
];
|
|
23
|
+
// Short, human label for the current value (shown as a select-menu hint).
|
|
24
|
+
function displayValue(spec, value) {
|
|
25
|
+
if (value == null || value === '')
|
|
26
|
+
return '(empty)';
|
|
27
|
+
if (spec.type === 'boolean')
|
|
28
|
+
return value ? 'yes' : 'no';
|
|
29
|
+
if (spec.type === 'list') {
|
|
30
|
+
return Array.isArray(value) ? value.join(', ') || '(empty)' : String(value);
|
|
31
|
+
}
|
|
32
|
+
const s = String(value);
|
|
33
|
+
return s.length > 48 ? `${s.slice(0, 47)}…` : s;
|
|
34
|
+
}
|
|
35
|
+
async function fetchOrgs(session) {
|
|
36
|
+
const res = await fetch(`${session.appUrl}/api/cli/org`, {
|
|
37
|
+
headers: { Authorization: `Bearer ${session.token}` },
|
|
38
|
+
});
|
|
39
|
+
const data = await res.json().catch(() => null);
|
|
40
|
+
if (!res.ok) {
|
|
41
|
+
throw new Error(data?.error ?? `failed to load organizations (${res.status})`);
|
|
42
|
+
}
|
|
43
|
+
return (data?.organizations ?? []);
|
|
44
|
+
}
|
|
45
|
+
async function patchOrg(session, orgId, fields) {
|
|
46
|
+
const res = await fetch(`${session.appUrl}/api/cli/org`, {
|
|
47
|
+
method: 'PATCH',
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
Authorization: `Bearer ${session.token}`,
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify({ orgId, fields }),
|
|
53
|
+
});
|
|
54
|
+
const data = await res.json().catch(() => null);
|
|
55
|
+
if (!res.ok) {
|
|
56
|
+
throw new Error(data?.error ?? `update failed (${res.status})`);
|
|
57
|
+
}
|
|
58
|
+
return data;
|
|
59
|
+
}
|
|
60
|
+
// Prompt for one field, prefilled with the current value. Returns the new
|
|
61
|
+
// value to send, or a clack cancel symbol.
|
|
62
|
+
async function promptField(spec, current) {
|
|
63
|
+
if (spec.type === 'boolean') {
|
|
64
|
+
return clack.confirm({
|
|
65
|
+
message: spec.label,
|
|
66
|
+
initialValue: Boolean(current),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (spec.type === 'list') {
|
|
70
|
+
const initial = Array.isArray(current) ? current.join(', ') : '';
|
|
71
|
+
const value = await clack.text({
|
|
72
|
+
message: `${spec.label} ${dim('(comma-separated, blank to clear)')}`,
|
|
73
|
+
initialValue: initial,
|
|
74
|
+
});
|
|
75
|
+
if (clack.isCancel(value))
|
|
76
|
+
return value;
|
|
77
|
+
const items = value
|
|
78
|
+
.split(',')
|
|
79
|
+
.map((s) => s.trim())
|
|
80
|
+
.filter(Boolean);
|
|
81
|
+
return items.length ? items : null;
|
|
82
|
+
}
|
|
83
|
+
if (spec.type === 'number') {
|
|
84
|
+
const value = await clack.text({
|
|
85
|
+
message: `${spec.label} ${dim('(blank to clear)')}`,
|
|
86
|
+
initialValue: current == null ? '' : String(current),
|
|
87
|
+
validate: (v) => {
|
|
88
|
+
const t = (v ?? '').trim();
|
|
89
|
+
return !t || /^\d+$/.test(t) ? undefined : 'must be a whole number';
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
if (clack.isCancel(value))
|
|
93
|
+
return value;
|
|
94
|
+
return value.trim() ? Number(value.trim()) : null;
|
|
95
|
+
}
|
|
96
|
+
const value = await clack.text({
|
|
97
|
+
message: spec.type === 'url'
|
|
98
|
+
? `${spec.label} ${dim('(blank to clear)')}`
|
|
99
|
+
: spec.label,
|
|
100
|
+
initialValue: current == null ? '' : String(current),
|
|
101
|
+
validate: spec.type === 'url'
|
|
102
|
+
? (v) => {
|
|
103
|
+
const t = (v ?? '').trim();
|
|
104
|
+
if (!t)
|
|
105
|
+
return undefined;
|
|
106
|
+
try {
|
|
107
|
+
new URL(t);
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return 'must be a valid URL (include https://)';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
: undefined,
|
|
115
|
+
});
|
|
116
|
+
if (clack.isCancel(value))
|
|
117
|
+
return value;
|
|
118
|
+
const trimmed = value.trim();
|
|
119
|
+
// name/slug are required (notNull): a blank keeps the current value.
|
|
120
|
+
if ((spec.key === 'name' || spec.key === 'slug') && !trimmed)
|
|
121
|
+
return current;
|
|
122
|
+
return trimmed ? trimmed : null;
|
|
123
|
+
}
|
|
124
|
+
export async function org() {
|
|
125
|
+
const session = await loadSession();
|
|
126
|
+
if (!session) {
|
|
127
|
+
error('not logged in');
|
|
128
|
+
info(`run ${dim('hacklab login')} first`);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
clack.intro(bold('hacklab org'));
|
|
132
|
+
let orgs;
|
|
133
|
+
try {
|
|
134
|
+
orgs = await fetchOrgs(session);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
clack.cancel(err instanceof Error ? err.message : String(err));
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
if (orgs.length === 0) {
|
|
141
|
+
clack.cancel(`you don't manage an organization yet — claim one at ${session.appUrl} first.`);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
let target = orgs[0];
|
|
145
|
+
if (orgs.length > 1) {
|
|
146
|
+
const picked = await clack.select({
|
|
147
|
+
message: 'which organization?',
|
|
148
|
+
options: orgs.map((o) => ({
|
|
149
|
+
value: o.id,
|
|
150
|
+
label: `${o.name} ${dim(`/o/${o.slug}`)}`,
|
|
151
|
+
})),
|
|
152
|
+
});
|
|
153
|
+
if (clack.isCancel(picked)) {
|
|
154
|
+
clack.outro(dim('cancelled.'));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
target = orgs.find((o) => o.id === picked) ?? target;
|
|
158
|
+
}
|
|
159
|
+
// Autosave: editing a field writes it immediately (mirrors the web settings'
|
|
160
|
+
// "saves instantly, no Save button"). Pick a field, set its value, it saves,
|
|
161
|
+
// and the menu shows the saved value. Leave any time with "done" or Esc —
|
|
162
|
+
// nothing is pending, so nothing is lost.
|
|
163
|
+
const DONE = '__done__';
|
|
164
|
+
let savedCount = 0;
|
|
165
|
+
while (true) {
|
|
166
|
+
const choice = await clack.select({
|
|
167
|
+
message: `editing ${bold(target.name)} ${dim('(saves as you go)')}`,
|
|
168
|
+
options: [
|
|
169
|
+
...FIELDS.map((f) => ({
|
|
170
|
+
value: f.key,
|
|
171
|
+
label: f.label,
|
|
172
|
+
hint: displayValue(f, target[f.key]),
|
|
173
|
+
})),
|
|
174
|
+
{ value: DONE, label: '← done' },
|
|
175
|
+
],
|
|
176
|
+
});
|
|
177
|
+
// Esc / Ctrl+C at the menu, or "done": leave. Every edit is already saved.
|
|
178
|
+
if (clack.isCancel(choice) || choice === DONE)
|
|
179
|
+
break;
|
|
180
|
+
const spec = FIELDS.find((f) => f.key === choice);
|
|
181
|
+
if (!spec)
|
|
182
|
+
continue;
|
|
183
|
+
const next = await promptField(spec, target[spec.key]);
|
|
184
|
+
// Cancelling a single field drops just that edit and returns to the menu.
|
|
185
|
+
if (clack.isCancel(next))
|
|
186
|
+
continue;
|
|
187
|
+
const label = spec.label.toLowerCase();
|
|
188
|
+
const prevSlug = target.slug;
|
|
189
|
+
const spin = clack.spinner();
|
|
190
|
+
spin.start(`saving ${label}`);
|
|
191
|
+
try {
|
|
192
|
+
const updated = await patchOrg(session, target.id, {
|
|
193
|
+
[spec.key]: next,
|
|
194
|
+
});
|
|
195
|
+
target = { ...target, ...updated };
|
|
196
|
+
savedCount++;
|
|
197
|
+
spin.stop(`saved ${label}`);
|
|
198
|
+
if (spec.key === 'slug' && target.slug !== prevSlug) {
|
|
199
|
+
clack.log.warn(`old links to /o/${prevSlug} will no longer resolve`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
spin.stop(`could not save ${label}`);
|
|
204
|
+
error(err instanceof Error ? err.message : String(err));
|
|
205
|
+
// Stay in the loop so they can retry or edit something else.
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (savedCount > 0) {
|
|
209
|
+
success(`saved ${savedCount} change${savedCount === 1 ? '' : 's'} to ${bold(target.name)}`);
|
|
210
|
+
info(`${session.appUrl}/o/${target.slug}`);
|
|
211
|
+
}
|
|
212
|
+
clack.outro(dim('done.'));
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=org.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org.js","sourceRoot":"","sources":["../../src/commands/org.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,WAAW,EAAgB,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAS1D,MAAM,MAAM,GAAgB;IAC1B,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IAC5C,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE;IACzD,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;IAClD,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE;IACjD,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE;IAChE,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE;IACnE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE;IACnD,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;IACjD,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;IAC9C,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;IAClD,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE;IACvD,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;IAChD,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;IAC9C,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IACtD,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE;IACxD,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IAC5C,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE;CACvD,CAAA;AAQD,0EAA0E;AAC1E,SAAS,YAAY,CAAC,IAAe,EAAE,KAAc;IACnD,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACnD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IACxD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC7E,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACvB,OAAO,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAgB;IACvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,cAAc,EAAE;QACvD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE,EAAE;KACtD,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,IAAI,EAAE,KAAK,IAAI,iCAAiC,GAAG,CAAC,MAAM,GAAG,CAC9D,CAAA;IACH,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE,CAAU,CAAA;AAC7C,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,OAAgB,EAChB,KAAa,EACb,MAA+B;IAE/B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,cAAc,EAAE;QACvD,MAAM,EAAE,OAAO;QACf,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;SACzC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;KACxC,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,kBAAkB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;IACjE,CAAC;IACD,OAAO,IAAW,CAAA;AACpB,CAAC;AAED,0EAA0E;AAC1E,2CAA2C;AAC3C,KAAK,UAAU,WAAW,CACxB,IAAe,EACf,OAAgB;IAEhB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,OAAO,CAAC;YACnB,OAAO,EAAE,IAAI,CAAC,KAAK;YACnB,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC;SAC/B,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAChE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;YAC7B,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,mCAAmC,CAAC,EAAE;YACpE,YAAY,EAAE,OAAO;SACtB,CAAC,CAAA;QACF,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QACvC,MAAM,KAAK,GAAG,KAAK;aAChB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAA;QAClB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IACpC,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;YAC7B,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,kBAAkB,CAAC,EAAE;YACnD,YAAY,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACpD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;gBAC1B,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAA;YACrE,CAAC;SACF,CAAC,CAAA;QACF,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QACvC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACnD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;QAC7B,OAAO,EACL,IAAI,CAAC,IAAI,KAAK,KAAK;YACjB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,kBAAkB,CAAC,EAAE;YAC5C,CAAC,CAAC,IAAI,CAAC,KAAK;QAChB,YAAY,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACpD,QAAQ,EACN,IAAI,CAAC,IAAI,KAAK,KAAK;YACjB,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;gBACJ,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;gBAC1B,IAAI,CAAC,CAAC;oBAAE,OAAO,SAAS,CAAA;gBACxB,IAAI,CAAC;oBACH,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;oBACV,OAAO,SAAS,CAAA;gBAClB,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,wCAAwC,CAAA;gBACjD,CAAC;YACH,CAAC;YACH,CAAC,CAAC,SAAS;KAChB,CAAC,CAAA;IACF,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,qEAAqE;IACrE,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAA;IAC5E,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAA;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,KAAK,CAAC,eAAe,CAAC,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;IAEhC,IAAI,IAAW,CAAA;IACf,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,MAAM,CACV,uDAAuD,OAAO,CAAC,MAAM,SAAS,CAC/E,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,MAAM,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;IACrB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;YAChC,OAAO,EAAE,qBAAqB;YAC9B,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxB,KAAK,EAAE,CAAC,CAAC,EAAE;gBACX,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE;aAC1C,CAAC,CAAC;SACJ,CAAC,CAAA;QACF,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAA;YAC9B,OAAM;QACR,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAA;IACtD,CAAC;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,0CAA0C;IAC1C,MAAM,IAAI,GAAG,UAAU,CAAA;IACvB,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;YAChC,OAAO,EAAE,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,mBAAmB,CAAC,EAAE;YACnE,OAAO,EAAE;gBACP,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpB,KAAK,EAAE,CAAC,CAAC,GAAG;oBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;iBACrC,CAAC,CAAC;gBACH,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;aACjC;SACF,CAAC,CAAA;QACF,2EAA2E;QAC3E,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,IAAI;YAAE,MAAK;QAEpD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAA;QACjD,IAAI,CAAC,IAAI;YAAE,SAAQ;QACnB,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QACtD,0EAA0E;QAC1E,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAQ;QAElC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAA;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;QAC5B,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,EAAE,CAAC,CAAA;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE;gBACjD,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI;aACjB,CAAC,CAAA;YACF,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAA;YAClC,UAAU,EAAE,CAAA;YACZ,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAA;YAC3B,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,QAAQ,yBAAyB,CAAC,CAAA;YACtE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAA;YACpC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;YACvD,6DAA6D;QAC/D,CAAC;IACH,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CACL,SAAS,UAAU,UAAU,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CACnF,CAAA;QACD,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;AAC3B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { brag, parseBragArgs } from './commands/brag.js';
|
|
3
|
+
import { chat } from './commands/chat.js';
|
|
3
4
|
import { configCommand } from './commands/config.js';
|
|
4
5
|
import { drop } from './commands/drop.js';
|
|
5
6
|
import { exam } from './commands/exam.js';
|
|
6
7
|
import { join } from './commands/join.js';
|
|
7
8
|
import { login } from './commands/login.js';
|
|
9
|
+
import { org } from './commands/org.js';
|
|
8
10
|
import { scanProfile } from './commands/scan-profile.js';
|
|
9
11
|
import { sync } from './commands/sync.js';
|
|
10
12
|
import { whoami } from './commands/whoami.js';
|
|
13
|
+
import { resolveCommand } from './resolve-command.js';
|
|
11
14
|
import { HACKLAB_ENVIRONMENTS, isHacklabEnv, loadSession } from './session.js';
|
|
12
15
|
import { banner, bold, dim } from './ui.js';
|
|
13
16
|
/**
|
|
@@ -54,6 +57,8 @@ function printHelp() {
|
|
|
54
57
|
console.log(` hacklab ${dim('scan')} build your full profile (skills, repos, blog)`);
|
|
55
58
|
console.log(` hacklab ${dim('config')} ${dim('<key> <val>')} set config (cursor-api-key, cursor-email)`);
|
|
56
59
|
console.log(` hacklab ${dim('brag')} ${dim('[path]')} sync .hacklab/project.yaml`);
|
|
60
|
+
console.log(` hacklab ${dim('org')} edit your organization`);
|
|
61
|
+
console.log(` hacklab ${dim('chat')} ${dim('<sub>')} channel + DMs (tail/post/dm/...); --json for agents`);
|
|
57
62
|
console.log('');
|
|
58
63
|
console.log(` ${dim('--env')} ${dim('<production|staging|development>')} pick the backend (default: production)`);
|
|
59
64
|
console.log('');
|
|
@@ -78,7 +83,7 @@ async function main() {
|
|
|
78
83
|
process.exit(0);
|
|
79
84
|
}
|
|
80
85
|
if (cmd === '--version' || cmd === '-v') {
|
|
81
|
-
console.log('0.
|
|
86
|
+
console.log('0.5.0');
|
|
82
87
|
process.exit(0);
|
|
83
88
|
}
|
|
84
89
|
// Bare invocation (e.g. `npx hacklab@latest`): join for newcomers, sync for
|
|
@@ -93,37 +98,52 @@ async function main() {
|
|
|
93
98
|
}
|
|
94
99
|
return;
|
|
95
100
|
}
|
|
96
|
-
|
|
101
|
+
// Resolve a possibly-abbreviated command to its full name (e.g. `sy` -> sync,
|
|
102
|
+
// `or` -> org). Exact matches always win; an ambiguous prefix is
|
|
103
|
+
// rejected with the candidates so the user can disambiguate.
|
|
104
|
+
const resolution = resolveCommand(cmd);
|
|
105
|
+
if (resolution.kind === 'ambiguous') {
|
|
106
|
+
console.error(`ambiguous command "${cmd}": ${resolution.matches.join(' or ')}?`);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
const command = resolution.kind === 'match' ? resolution.name : cmd;
|
|
110
|
+
if (command === 'join') {
|
|
97
111
|
await join();
|
|
98
112
|
}
|
|
99
|
-
else if (
|
|
113
|
+
else if (command === 'login') {
|
|
100
114
|
await login();
|
|
101
115
|
}
|
|
102
|
-
else if (
|
|
116
|
+
else if (command === 'whoami') {
|
|
103
117
|
await whoami();
|
|
104
118
|
}
|
|
105
|
-
else if (
|
|
119
|
+
else if (command === 'sync') {
|
|
106
120
|
await sync();
|
|
107
121
|
}
|
|
108
|
-
else if (
|
|
122
|
+
else if (command === 'drop') {
|
|
109
123
|
const content = parseDropArgs(args);
|
|
110
124
|
await drop(content.text, content.url);
|
|
111
125
|
}
|
|
112
|
-
else if (
|
|
126
|
+
else if (command === 'exam') {
|
|
113
127
|
const pyro = args.includes('--pyro');
|
|
114
128
|
const hacker = args.includes('--hacker');
|
|
115
129
|
await exam({ pyro, hacker });
|
|
116
130
|
}
|
|
117
|
-
else if (
|
|
131
|
+
else if (command === 'scan') {
|
|
118
132
|
await scanProfile();
|
|
119
133
|
}
|
|
120
|
-
else if (
|
|
134
|
+
else if (command === 'config') {
|
|
121
135
|
await configCommand(args);
|
|
122
136
|
}
|
|
123
|
-
else if (
|
|
137
|
+
else if (command === 'brag') {
|
|
124
138
|
const options = parseBragArgs(args);
|
|
125
139
|
await brag(options.manifestPath);
|
|
126
140
|
}
|
|
141
|
+
else if (command === 'org') {
|
|
142
|
+
await org();
|
|
143
|
+
}
|
|
144
|
+
else if (command === 'chat') {
|
|
145
|
+
await chat(args);
|
|
146
|
+
}
|
|
127
147
|
else {
|
|
128
148
|
console.error(`unknown command: ${cmd}`);
|
|
129
149
|
console.error('run hacklab --help for usage');
|
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,21 @@
|
|
|
1
|
+
export declare const COMMANDS: readonly ["join", "login", "whoami", "sync", "drop", "exam", "scan", "config", "brag", "org", "chat"];
|
|
2
|
+
export type ResolvedCommand = {
|
|
3
|
+
kind: 'match';
|
|
4
|
+
name: string;
|
|
5
|
+
} | {
|
|
6
|
+
kind: 'ambiguous';
|
|
7
|
+
matches: string[];
|
|
8
|
+
} | {
|
|
9
|
+
kind: 'unknown';
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Resolve a (possibly abbreviated) command token to a full command name by
|
|
13
|
+
* shortest unambiguous prefix:
|
|
14
|
+
* - an exact match always wins, so a full command is never shadowed by a longer
|
|
15
|
+
* one (e.g. if `scan` and `scanner` both existed, `scan` resolves to `scan`);
|
|
16
|
+
* - a prefix that matches exactly one command resolves to it (`sy` -> sync);
|
|
17
|
+
* - a prefix matching several is ambiguous (`s` -> sync | scan);
|
|
18
|
+
* - a token matching none is unknown (a typo like `ogr` does not resolve).
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveCommand(token: string, commands?: readonly string[]): ResolvedCommand;
|
|
21
|
+
//# sourceMappingURL=resolve-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-command.d.ts","sourceRoot":"","sources":["../src/resolve-command.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,uGAYX,CAAA;AAEV,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAA;AAEvB;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,SAAS,MAAM,EAAa,GACrC,eAAe,CAOjB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// All top-level hacklab subcommands. Used both to dispatch and to resolve a
|
|
2
|
+
// typed prefix to its full name (e.g. `sy` -> sync). Keep in sync with the
|
|
3
|
+
// dispatch chain in index.ts.
|
|
4
|
+
export const COMMANDS = [
|
|
5
|
+
'join',
|
|
6
|
+
'login',
|
|
7
|
+
'whoami',
|
|
8
|
+
'sync',
|
|
9
|
+
'drop',
|
|
10
|
+
'exam',
|
|
11
|
+
'scan',
|
|
12
|
+
'config',
|
|
13
|
+
'brag',
|
|
14
|
+
'org',
|
|
15
|
+
'chat',
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a (possibly abbreviated) command token to a full command name by
|
|
19
|
+
* shortest unambiguous prefix:
|
|
20
|
+
* - an exact match always wins, so a full command is never shadowed by a longer
|
|
21
|
+
* one (e.g. if `scan` and `scanner` both existed, `scan` resolves to `scan`);
|
|
22
|
+
* - a prefix that matches exactly one command resolves to it (`sy` -> sync);
|
|
23
|
+
* - a prefix matching several is ambiguous (`s` -> sync | scan);
|
|
24
|
+
* - a token matching none is unknown (a typo like `ogr` does not resolve).
|
|
25
|
+
*/
|
|
26
|
+
export function resolveCommand(token, commands = COMMANDS) {
|
|
27
|
+
if (commands.includes(token))
|
|
28
|
+
return { kind: 'match', name: token };
|
|
29
|
+
const matches = commands.filter((c) => c.startsWith(token));
|
|
30
|
+
if (matches.length === 1)
|
|
31
|
+
return { kind: 'match', name: matches[0] };
|
|
32
|
+
if (matches.length > 1)
|
|
33
|
+
return { kind: 'ambiguous', matches };
|
|
34
|
+
return { kind: 'unknown' };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=resolve-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-command.js","sourceRoot":"","sources":["../src/resolve-command.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2EAA2E;AAC3E,8BAA8B;AAC9B,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,KAAK;IACL,MAAM;CACE,CAAA;AAOV;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,WAA8B,QAAQ;IAEtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IAEnE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAE,EAAE,CAAA;IACrE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAA;IAC7D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;AAC5B,CAAC"}
|