hacklab 0.7.4 → 0.7.5
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 +16 -1
- package/dist/api-client.d.ts +18 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +40 -0
- package/dist/api-client.js.map +1 -0
- package/dist/commands/drop.d.ts +1 -1
- package/dist/commands/drop.js +1 -1
- package/dist/commands/hacker.d.ts.map +1 -1
- package/dist/commands/hacker.js +13 -28
- package/dist/commands/hacker.js.map +1 -1
- package/dist/commands/profile.d.ts +60 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +478 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/project.d.ts +5 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +387 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/project-infer.d.ts +50 -0
- package/dist/project-infer.d.ts.map +1 -0
- package/dist/project-infer.js +211 -0
- package/dist/project-infer.js.map +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +13 -6
- package/dist/registry.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/brag.d.ts +0 -5
- package/dist/commands/brag.d.ts.map +0 -1
- package/dist/commands/brag.js +0 -92
- package/dist/commands/brag.js.map +0 -1
- package/dist/project-brag.d.ts +0 -58
- package/dist/project-brag.d.ts.map +0 -1
- package/dist/project-brag.js +0 -270
- package/dist/project-brag.js.map +0 -1
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import * as clack from '@clack/prompts';
|
|
3
|
+
import { parse as parseYaml } from 'yaml';
|
|
4
|
+
import { emitJsonError, readApiError, requireSession } from '../api-client.js';
|
|
5
|
+
import { captureEvent } from '../posthog.js';
|
|
6
|
+
import { resolveCommand } from '../resolve-command.js';
|
|
7
|
+
import { resolveAppUrl } from '../session.js';
|
|
8
|
+
import { fetchApi } from '../sync.js';
|
|
9
|
+
import { bold, dim, error, info, success } from '../ui.js';
|
|
10
|
+
// `hacklab profile` — view and edit your own profile. Thin wrapper over
|
|
11
|
+
// GET/PATCH /api/hackers/me: the server owns validation (lengths, URL rules);
|
|
12
|
+
// this side only shapes input, so agents get one-shot writes (`set`, `apply
|
|
13
|
+
// profile.yaml`) and humans get an org-style autosave editor (`edit`).
|
|
14
|
+
const SUBCOMMANDS = ['view', 'set', 'edit', 'apply'];
|
|
15
|
+
const ME_PATH = '/api/hackers/me?src=cli';
|
|
16
|
+
// Mirrors the server's parseProfilePatch surface (apps/web/lib/profile-fields.ts)
|
|
17
|
+
// — the real validation boundary; this side just shapes input.
|
|
18
|
+
export const PROFILE_FIELDS = [
|
|
19
|
+
{ key: 'displayName', name: 'name', kind: 'text', hint: 'display name' },
|
|
20
|
+
{ key: 'bio', name: 'bio', kind: 'text', hint: 'short bio' },
|
|
21
|
+
{ key: 'websiteUrl', name: 'website', kind: 'url', hint: 'your-site.com' },
|
|
22
|
+
{ key: 'blogUrl', name: 'blog', kind: 'url', hint: 'your-blog.com' },
|
|
23
|
+
{
|
|
24
|
+
key: 'xUrl',
|
|
25
|
+
name: 'x',
|
|
26
|
+
kind: 'handle',
|
|
27
|
+
base: 'https://x.com/',
|
|
28
|
+
strip: /^(?:https?:\/\/)?(?:www\.)?(?:x|twitter)\.com\//i,
|
|
29
|
+
hint: 'handle or x.com url',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
key: 'youtubeUrl',
|
|
33
|
+
name: 'youtube',
|
|
34
|
+
kind: 'url',
|
|
35
|
+
hint: 'youtube.com/@channel',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
key: 'instagramUrl',
|
|
39
|
+
name: 'instagram',
|
|
40
|
+
kind: 'handle',
|
|
41
|
+
base: 'https://instagram.com/',
|
|
42
|
+
strip: /^(?:https?:\/\/)?(?:www\.)?instagram\.com\//i,
|
|
43
|
+
hint: 'handle or instagram.com url',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
key: 'rssFeedUrl',
|
|
47
|
+
name: 'rss',
|
|
48
|
+
kind: 'url',
|
|
49
|
+
hint: 'your-site.com/rss.xml',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
key: 'openToWork',
|
|
53
|
+
name: 'open-to-work',
|
|
54
|
+
kind: 'boolean',
|
|
55
|
+
hint: 'yes / no',
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
const FIELD_NAMES = PROFILE_FIELDS.map((f) => f.name);
|
|
59
|
+
const TRUE_WORDS = new Set(['true', 'yes', 'y', '1', 'on']);
|
|
60
|
+
const FALSE_WORDS = new Set(['false', 'no', 'n', '0', 'off']);
|
|
61
|
+
/** Strip repeatedly until stable, so a pasted double prefix can't survive. */
|
|
62
|
+
function stripAll(pattern, value) {
|
|
63
|
+
let out = value;
|
|
64
|
+
let prev;
|
|
65
|
+
do {
|
|
66
|
+
prev = out;
|
|
67
|
+
out = out.replace(pattern, '');
|
|
68
|
+
} while (out !== prev);
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Shape one raw CLI string into the value the API expects. Empty clears the
|
|
73
|
+
* field. URLs get https:// prepended when the scheme is missing; handle fields
|
|
74
|
+
* additionally accept a bare handle (`@mattbratos`, `mattbratos`) or a pasted
|
|
75
|
+
* profile URL and rebuild the canonical link. Real validation stays server-side.
|
|
76
|
+
*/
|
|
77
|
+
export function normalizeFieldValue(field, raw) {
|
|
78
|
+
const trimmed = raw.trim();
|
|
79
|
+
if (!trimmed)
|
|
80
|
+
return { ok: true, value: null };
|
|
81
|
+
if (field.kind === 'boolean') {
|
|
82
|
+
const word = trimmed.toLowerCase();
|
|
83
|
+
if (TRUE_WORDS.has(word))
|
|
84
|
+
return { ok: true, value: true };
|
|
85
|
+
if (FALSE_WORDS.has(word))
|
|
86
|
+
return { ok: true, value: false };
|
|
87
|
+
return { ok: false, error: `${field.name} must be yes or no` };
|
|
88
|
+
}
|
|
89
|
+
if (field.kind === 'text')
|
|
90
|
+
return { ok: true, value: trimmed };
|
|
91
|
+
if (field.kind === 'handle' && field.base && field.strip) {
|
|
92
|
+
const cleaned = stripAll(field.strip, trimmed).replace(/^@/, '');
|
|
93
|
+
if (!cleaned)
|
|
94
|
+
return { ok: true, value: null };
|
|
95
|
+
// Anything still URL-shaped passes through as a URL; a bare handle gets
|
|
96
|
+
// the canonical base. Dots alone don't make it a URL — instagram handles
|
|
97
|
+
// can contain them.
|
|
98
|
+
if (/^https?:\/\//i.test(cleaned) || cleaned.includes('/')) {
|
|
99
|
+
return { ok: true, value: ensureScheme(cleaned) };
|
|
100
|
+
}
|
|
101
|
+
return { ok: true, value: field.base + cleaned };
|
|
102
|
+
}
|
|
103
|
+
return { ok: true, value: ensureScheme(trimmed) };
|
|
104
|
+
}
|
|
105
|
+
function ensureScheme(value) {
|
|
106
|
+
return /^https?:\/\//i.test(value) ? value : `https://${value}`;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Map a parsed yaml/json document to API fields. Keys may be CLI names
|
|
110
|
+
* (`website`, `open-to-work`) or API keys (`websiteUrl`, `openToWork`);
|
|
111
|
+
* unknown keys fail loudly so a typo can't silently drop a field.
|
|
112
|
+
*/
|
|
113
|
+
export function parseProfileDocument(doc) {
|
|
114
|
+
if (typeof doc !== 'object' || doc === null || Array.isArray(doc)) {
|
|
115
|
+
return { ok: false, error: 'expected a mapping of fields to values' };
|
|
116
|
+
}
|
|
117
|
+
const fields = {};
|
|
118
|
+
for (const [rawKey, rawValue] of Object.entries(doc)) {
|
|
119
|
+
const field = PROFILE_FIELDS.find((f) => f.name === rawKey || f.key === rawKey);
|
|
120
|
+
if (!field) {
|
|
121
|
+
return {
|
|
122
|
+
ok: false,
|
|
123
|
+
error: `unknown field "${rawKey}" (fields: ${FIELD_NAMES.join(', ')})`,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
if (rawValue === null) {
|
|
127
|
+
fields[field.key] = null;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (typeof rawValue === 'boolean' && field.kind === 'boolean') {
|
|
131
|
+
fields[field.key] = rawValue;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (typeof rawValue !== 'string' && typeof rawValue !== 'number') {
|
|
135
|
+
return { ok: false, error: `${field.name}: expected a string value` };
|
|
136
|
+
}
|
|
137
|
+
const normalized = normalizeFieldValue(field, String(rawValue));
|
|
138
|
+
if (!normalized.ok)
|
|
139
|
+
return normalized;
|
|
140
|
+
fields[field.key] = normalized.value;
|
|
141
|
+
}
|
|
142
|
+
if (Object.keys(fields).length === 0) {
|
|
143
|
+
return { ok: false, error: 'no fields to apply' };
|
|
144
|
+
}
|
|
145
|
+
return { ok: true, fields };
|
|
146
|
+
}
|
|
147
|
+
/** Value column for human output. */
|
|
148
|
+
export function displayValue(field, value) {
|
|
149
|
+
if (field.kind === 'boolean')
|
|
150
|
+
return value ? 'yes' : 'no';
|
|
151
|
+
if (value == null || value === '')
|
|
152
|
+
return '';
|
|
153
|
+
return String(value);
|
|
154
|
+
}
|
|
155
|
+
export function renderProfile(profile, appUrl) {
|
|
156
|
+
const lines = [];
|
|
157
|
+
const title = profile.displayName
|
|
158
|
+
? `${bold(profile.displayName)} ${dim(`@${profile.handle}`)}`
|
|
159
|
+
: bold(`@${profile.handle}`);
|
|
160
|
+
lines.push(` ${title}`);
|
|
161
|
+
lines.push('');
|
|
162
|
+
const rows = PROFILE_FIELDS.filter((f) => f.name !== 'name').map((f) => ({
|
|
163
|
+
label: f.name,
|
|
164
|
+
value: displayValue(f, profile[f.key]),
|
|
165
|
+
}));
|
|
166
|
+
rows.push({
|
|
167
|
+
label: 'github',
|
|
168
|
+
value: profile.githubUsername
|
|
169
|
+
? `https://github.com/${profile.githubUsername}`
|
|
170
|
+
: '',
|
|
171
|
+
note: 'from github login',
|
|
172
|
+
});
|
|
173
|
+
const width = Math.max(...rows.map((r) => r.label.length));
|
|
174
|
+
for (const row of rows) {
|
|
175
|
+
const label = dim(row.label.padEnd(width));
|
|
176
|
+
const value = row.value || dim('(not set)');
|
|
177
|
+
const note = row.note ? ` ${dim(`(${row.note})`)}` : '';
|
|
178
|
+
lines.push(` ${label} ${value}${note}`);
|
|
179
|
+
}
|
|
180
|
+
lines.push('');
|
|
181
|
+
lines.push(` ${dim(`${appUrl}/${profile.handle}`)}`);
|
|
182
|
+
return lines;
|
|
183
|
+
}
|
|
184
|
+
function printJson(data) {
|
|
185
|
+
console.log(JSON.stringify(data, null, 2));
|
|
186
|
+
}
|
|
187
|
+
function usage() {
|
|
188
|
+
error('usage: hacklab profile [view|set|edit|apply]');
|
|
189
|
+
info(` hacklab profile ${dim('view [--json]')} show your profile`);
|
|
190
|
+
info(` hacklab profile ${dim('set <field> <value>')} set one field (--clear to unset, --json for agents)`);
|
|
191
|
+
info(` hacklab profile ${dim('edit')} interactive editor`);
|
|
192
|
+
info(` hacklab profile ${dim('apply <file> [--json]')} apply fields from a yaml/json file`);
|
|
193
|
+
info(` fields: ${dim(FIELD_NAMES.join(', '))}`);
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
async function fetchProfile(session) {
|
|
197
|
+
const res = await fetchApi(session, ME_PATH, {
|
|
198
|
+
headers: { Authorization: `Bearer ${session.token}` },
|
|
199
|
+
});
|
|
200
|
+
if (!res.ok)
|
|
201
|
+
throw new Error(await readApiError(res, session));
|
|
202
|
+
const data = (await res.json().catch(() => null));
|
|
203
|
+
if (!data?.profile)
|
|
204
|
+
throw new Error('got a malformed response from hacklab');
|
|
205
|
+
return data.profile;
|
|
206
|
+
}
|
|
207
|
+
async function patchProfile(session, fields) {
|
|
208
|
+
const res = await fetchApi(session, ME_PATH, {
|
|
209
|
+
method: 'PATCH',
|
|
210
|
+
headers: {
|
|
211
|
+
'Content-Type': 'application/json',
|
|
212
|
+
Authorization: `Bearer ${session.token}`,
|
|
213
|
+
},
|
|
214
|
+
body: JSON.stringify(fields),
|
|
215
|
+
});
|
|
216
|
+
if (!res.ok)
|
|
217
|
+
throw new Error(await readApiError(res, session));
|
|
218
|
+
const data = (await res.json().catch(() => null));
|
|
219
|
+
if (!data?.profile)
|
|
220
|
+
throw new Error('got a malformed response from hacklab');
|
|
221
|
+
return data;
|
|
222
|
+
}
|
|
223
|
+
async function profileView(args) {
|
|
224
|
+
const json = args.includes('--json');
|
|
225
|
+
const session = await requireSession(json);
|
|
226
|
+
let profile;
|
|
227
|
+
try {
|
|
228
|
+
profile = await fetchProfile(session);
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
232
|
+
if (json)
|
|
233
|
+
emitJsonError('error', message);
|
|
234
|
+
error(message);
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
if (json) {
|
|
238
|
+
printJson({ schemaVersion: 1, profile });
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
console.log(renderProfile(profile, resolveAppUrl(session)).join('\n'));
|
|
242
|
+
}
|
|
243
|
+
async function profileSet(args) {
|
|
244
|
+
const json = args.includes('--json');
|
|
245
|
+
const clear = args.includes('--clear');
|
|
246
|
+
const rest = args.filter((a) => a !== '--json' && a !== '--clear');
|
|
247
|
+
const [fieldToken, ...valueParts] = rest;
|
|
248
|
+
if (!fieldToken)
|
|
249
|
+
usage();
|
|
250
|
+
const resolved = resolveCommand(fieldToken, FIELD_NAMES);
|
|
251
|
+
if (resolved.kind === 'ambiguous') {
|
|
252
|
+
if (json)
|
|
253
|
+
emitJsonError('invalid_fields', `ambiguous field: ${resolved.matches.join(', ')}`);
|
|
254
|
+
error(`ambiguous field: ${fieldToken} (${resolved.matches.join(', ')})`);
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
if (resolved.kind === 'unknown') {
|
|
258
|
+
if (json)
|
|
259
|
+
emitJsonError('invalid_fields', `unknown field "${fieldToken}" (fields: ${FIELD_NAMES.join(', ')})`);
|
|
260
|
+
error(`unknown field: ${fieldToken}`);
|
|
261
|
+
info(`fields: ${dim(FIELD_NAMES.join(', '))}`);
|
|
262
|
+
process.exit(1);
|
|
263
|
+
}
|
|
264
|
+
const field = PROFILE_FIELDS.find((f) => f.name === resolved.name);
|
|
265
|
+
if (!field)
|
|
266
|
+
usage();
|
|
267
|
+
const rawValue = valueParts.join(' ');
|
|
268
|
+
if (!clear && !rawValue.trim()) {
|
|
269
|
+
if (json)
|
|
270
|
+
emitJsonError('invalid_fields', 'pass a value, or --clear');
|
|
271
|
+
error(`pass a value, or ${dim('--clear')} to unset`);
|
|
272
|
+
info(`usage: hacklab profile set ${field.name} <${field.hint}>`);
|
|
273
|
+
process.exit(1);
|
|
274
|
+
}
|
|
275
|
+
const normalized = clear
|
|
276
|
+
? { ok: true, value: null }
|
|
277
|
+
: normalizeFieldValue(field, rawValue);
|
|
278
|
+
if (!normalized.ok) {
|
|
279
|
+
if (json)
|
|
280
|
+
emitJsonError('invalid_fields', normalized.error);
|
|
281
|
+
error(normalized.error);
|
|
282
|
+
process.exit(1);
|
|
283
|
+
}
|
|
284
|
+
const session = await requireSession(json);
|
|
285
|
+
let result;
|
|
286
|
+
try {
|
|
287
|
+
result = await patchProfile(session, { [field.key]: normalized.value });
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
291
|
+
if (json)
|
|
292
|
+
emitJsonError('error', message);
|
|
293
|
+
error(message);
|
|
294
|
+
process.exit(1);
|
|
295
|
+
}
|
|
296
|
+
await captureEvent(session.handle, 'cli_profile_updated', {
|
|
297
|
+
via: 'set',
|
|
298
|
+
fields: [field.key],
|
|
299
|
+
});
|
|
300
|
+
if (json) {
|
|
301
|
+
printJson({ schemaVersion: 1, ...result });
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const saved = displayValue(field, result.profile[field.key]);
|
|
305
|
+
success(`saved ${field.name}${saved ? `: ${saved}` : ' (cleared)'}`);
|
|
306
|
+
info(dim(`${resolveAppUrl(session)}/${result.profile.handle}`));
|
|
307
|
+
}
|
|
308
|
+
async function profileApply(args) {
|
|
309
|
+
const json = args.includes('--json');
|
|
310
|
+
const path = args.find((a) => !a.startsWith('-'));
|
|
311
|
+
if (!path)
|
|
312
|
+
usage();
|
|
313
|
+
let content;
|
|
314
|
+
try {
|
|
315
|
+
content = await readFile(path, 'utf8');
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
const code = err.code;
|
|
319
|
+
const message = code === 'ENOENT' ? `file not found: ${path}` : `could not read ${path}`;
|
|
320
|
+
if (json)
|
|
321
|
+
emitJsonError('read_failed', message);
|
|
322
|
+
error(message);
|
|
323
|
+
process.exit(1);
|
|
324
|
+
}
|
|
325
|
+
let doc;
|
|
326
|
+
try {
|
|
327
|
+
// YAML is a superset of JSON, so one parser covers both file shapes.
|
|
328
|
+
doc = parseYaml(content);
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
const message = `could not parse ${path}: ${err instanceof Error ? err.message : String(err)}`;
|
|
332
|
+
if (json)
|
|
333
|
+
emitJsonError('parse_failed', message);
|
|
334
|
+
error(message);
|
|
335
|
+
process.exit(1);
|
|
336
|
+
}
|
|
337
|
+
const parsed = parseProfileDocument(doc);
|
|
338
|
+
if (!parsed.ok) {
|
|
339
|
+
if (json)
|
|
340
|
+
emitJsonError('invalid_fields', parsed.error);
|
|
341
|
+
error(parsed.error);
|
|
342
|
+
process.exit(1);
|
|
343
|
+
}
|
|
344
|
+
const session = await requireSession(json);
|
|
345
|
+
let result;
|
|
346
|
+
try {
|
|
347
|
+
result = await patchProfile(session, parsed.fields);
|
|
348
|
+
}
|
|
349
|
+
catch (err) {
|
|
350
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
351
|
+
if (json)
|
|
352
|
+
emitJsonError('error', message);
|
|
353
|
+
error(message);
|
|
354
|
+
process.exit(1);
|
|
355
|
+
}
|
|
356
|
+
await captureEvent(session.handle, 'cli_profile_updated', {
|
|
357
|
+
via: 'apply',
|
|
358
|
+
fields: result.updated,
|
|
359
|
+
});
|
|
360
|
+
if (json) {
|
|
361
|
+
printJson({ schemaVersion: 1, ...result });
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
const names = result.updated
|
|
365
|
+
.map((key) => PROFILE_FIELDS.find((f) => f.key === key)?.name ?? key)
|
|
366
|
+
.join(', ');
|
|
367
|
+
success(`saved ${result.updated.length} field${result.updated.length === 1 ? '' : 's'}: ${names}`);
|
|
368
|
+
console.log(renderProfile(result.profile, resolveAppUrl(session)).join('\n'));
|
|
369
|
+
}
|
|
370
|
+
// Autosave editor over your own profile, mirroring `hacklab org`: pick a
|
|
371
|
+
// field, set its value, it saves immediately — leaving loses nothing.
|
|
372
|
+
async function profileEdit() {
|
|
373
|
+
const session = await requireSession(false);
|
|
374
|
+
clack.intro(bold('hacklab profile'));
|
|
375
|
+
let profile;
|
|
376
|
+
try {
|
|
377
|
+
profile = await fetchProfile(session);
|
|
378
|
+
}
|
|
379
|
+
catch (err) {
|
|
380
|
+
clack.cancel(err instanceof Error ? err.message : String(err));
|
|
381
|
+
process.exit(1);
|
|
382
|
+
}
|
|
383
|
+
const DONE = '__done__';
|
|
384
|
+
let savedCount = 0;
|
|
385
|
+
const savedKeys = new Set();
|
|
386
|
+
while (true) {
|
|
387
|
+
const choice = await clack.select({
|
|
388
|
+
message: `editing ${bold(`@${profile.handle}`)} ${dim('(saves as you go)')}`,
|
|
389
|
+
options: [
|
|
390
|
+
...PROFILE_FIELDS.map((f) => ({
|
|
391
|
+
value: f.name,
|
|
392
|
+
label: f.name,
|
|
393
|
+
hint: displayValue(f, profile[f.key]) || '(empty)',
|
|
394
|
+
})),
|
|
395
|
+
{ value: DONE, label: '← done' },
|
|
396
|
+
],
|
|
397
|
+
});
|
|
398
|
+
if (clack.isCancel(choice) || choice === DONE)
|
|
399
|
+
break;
|
|
400
|
+
const field = PROFILE_FIELDS.find((f) => f.name === choice);
|
|
401
|
+
if (!field)
|
|
402
|
+
continue;
|
|
403
|
+
let next;
|
|
404
|
+
if (field.kind === 'boolean') {
|
|
405
|
+
const value = await clack.confirm({
|
|
406
|
+
message: field.name,
|
|
407
|
+
initialValue: Boolean(profile[field.key]),
|
|
408
|
+
});
|
|
409
|
+
if (clack.isCancel(value))
|
|
410
|
+
continue;
|
|
411
|
+
next = value;
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
const current = profile[field.key];
|
|
415
|
+
const value = await clack.text({
|
|
416
|
+
message: `${field.name} ${dim(`(${field.hint}, blank to clear)`)}`,
|
|
417
|
+
initialValue: current == null ? '' : String(current),
|
|
418
|
+
});
|
|
419
|
+
if (clack.isCancel(value))
|
|
420
|
+
continue;
|
|
421
|
+
const normalized = normalizeFieldValue(field, value);
|
|
422
|
+
if (!normalized.ok) {
|
|
423
|
+
error(normalized.error);
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
426
|
+
next = normalized.value;
|
|
427
|
+
}
|
|
428
|
+
const spin = clack.spinner();
|
|
429
|
+
spin.start(`saving ${field.name}`);
|
|
430
|
+
try {
|
|
431
|
+
const result = await patchProfile(session, { [field.key]: next });
|
|
432
|
+
profile = result.profile;
|
|
433
|
+
savedCount++;
|
|
434
|
+
savedKeys.add(field.key);
|
|
435
|
+
spin.stop(`saved ${field.name}`);
|
|
436
|
+
}
|
|
437
|
+
catch (err) {
|
|
438
|
+
spin.stop(`could not save ${field.name}`);
|
|
439
|
+
error(err instanceof Error ? err.message : String(err));
|
|
440
|
+
// Stay in the loop so they can retry or edit something else.
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
if (savedCount > 0) {
|
|
444
|
+
await captureEvent(session.handle, 'cli_profile_updated', {
|
|
445
|
+
via: 'edit',
|
|
446
|
+
fields: [...savedKeys],
|
|
447
|
+
});
|
|
448
|
+
success(`saved ${savedCount} change${savedCount === 1 ? '' : 's'}`);
|
|
449
|
+
info(`${resolveAppUrl(session)}/${profile.handle}`);
|
|
450
|
+
}
|
|
451
|
+
clack.outro(dim('done.'));
|
|
452
|
+
}
|
|
453
|
+
export async function profile(args) {
|
|
454
|
+
const [subToken, ...rest] = args;
|
|
455
|
+
// Bare `hacklab profile` shows the profile — the safe default; editing is
|
|
456
|
+
// an explicit `edit` away.
|
|
457
|
+
if (!subToken || subToken.startsWith('-')) {
|
|
458
|
+
return profileView(args);
|
|
459
|
+
}
|
|
460
|
+
const resolved = resolveCommand(subToken, SUBCOMMANDS);
|
|
461
|
+
if (resolved.kind === 'ambiguous') {
|
|
462
|
+
error(`ambiguous: profile ${subToken} (${resolved.matches.join(', ')})`);
|
|
463
|
+
process.exit(1);
|
|
464
|
+
}
|
|
465
|
+
if (resolved.kind === 'unknown') {
|
|
466
|
+
error(`unknown subcommand: profile ${subToken}`);
|
|
467
|
+
usage();
|
|
468
|
+
}
|
|
469
|
+
if (resolved.name === 'view')
|
|
470
|
+
return profileView(rest);
|
|
471
|
+
if (resolved.name === 'set')
|
|
472
|
+
return profileSet(rest);
|
|
473
|
+
if (resolved.name === 'edit')
|
|
474
|
+
return profileEdit();
|
|
475
|
+
if (resolved.name === 'apply')
|
|
476
|
+
return profileApply(rest);
|
|
477
|
+
}
|
|
478
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Split a `--tags a,b,c` value into clean tag names. */
|
|
2
|
+
export declare function parseTags(value: string): string[];
|
|
3
|
+
export declare function extractOgImage(html: string, baseUrl: string): string | null;
|
|
4
|
+
export declare function project(args: string[]): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AA+GA,yDAAyD;AACzD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAMjD;AASD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY3E;AA2SD,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB3D"}
|