hacklab 0.6.6 → 0.7.2

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 CHANGED
@@ -39,15 +39,21 @@ scan local AI usage → see your rank → pick a username → sign in with GitHu
39
39
 
40
40
  1. **Scan** — reads your local AI token usage from Claude Code, Codex, Cursor,
41
41
  OpenClaw, Hermes, and OpenCode. Nothing leaves your machine yet.
42
- 2. **Rank** — shows the rank that usage would hold (`you'd be #15 of N`), with no
42
+ 2. **Cursor key** (Cursor users only) — if the scan finds Cursor on your machine
43
+ and no key is configured, you're offered the chance to paste one. Cursor's
44
+ local data only supports a rough estimate; a key buys exact per-event counts
45
+ and real daily history. Skip it and the estimate stands — you can add a key
46
+ later with `hacklab config cursor-api-key <key>`. Nobody without Cursor is
47
+ asked.
48
+ 3. **Rank** — shows the rank that usage would hold (`you'd be #15 of N`), with no
43
49
  account required.
44
- 3. **Username** — pick your Hacklab handle (checked for availability live).
45
- 4. **GitHub** — sign in to authenticate and link your profile + repos.
46
- 5. **Claim** — your profile goes live at `hacklab.so/<username>`. Your usage
50
+ 4. **Username** — pick your Hacklab handle (checked for availability live).
51
+ 5. **GitHub** — sign in to authenticate and link your profile + repos.
52
+ 6. **Claim** — your profile goes live at `hacklab.so/<username>`. Your usage
47
53
  uploads in the background while you get a shareable stats card.
48
- 6. **Share** — a stats thumbnail (belt, level, rank, token breakdown) is rendered
54
+ 7. **Share** — a stats thumbnail (belt, level, rank, token breakdown) is rendered
49
55
  locally, copied to your clipboard, and you can post it to X in one keystroke.
50
- 7. **Chat** — finally, you're offered the live channel (default yes). Decline and
56
+ 8. **Chat** — finally, you're offered the live channel (default yes). Decline and
51
57
  you can jump in anytime with `hacklab chat`.
52
58
 
53
59
  ## Commands
@@ -67,6 +73,7 @@ scan local AI usage → see your rank → pick a username → sign in with GitHu
67
73
  - `hacklab login` — re-authenticate with GitHub.
68
74
  - `hacklab logout` — clear your saved session on this machine.
69
75
  - `hacklab config <key> <value>` — set config (`cursor-api-key`, `cursor-email`).
76
+ Bare `hacklab config` prints the effective values and where each came from.
70
77
  - `hacklab brag [path]` — sync a `.hacklab/project.yaml` to your profile.
71
78
  - `hacklab org` — hub for company management. If you already own a company, pick
72
79
  a field, type the new value, and it saves as you go. If you don't own one yet,
@@ -75,6 +82,29 @@ scan local AI usage → see your rank → pick a username → sign in with GitHu
75
82
  email) and `hacklab org create` (register a brand-new company from the CLI).
76
83
  - `hacklab --version` / `hacklab --help`.
77
84
 
85
+ ## Cursor usage
86
+
87
+ Cursor is the one tool whose local data can't give exact numbers. Without a key
88
+ the scanner estimates from Cursor's commit-tracking database (AI lines written
89
+ × 30, all attributed to today, so no real daily history). With a key it reads
90
+ exact per-event token counts and real dates from Cursor's API.
91
+
92
+ Supply a key three ways, highest priority first:
93
+
94
+ ```sh
95
+ hacklab --cursor-api-key <key> sync # flag: one run
96
+ CURSOR_API_KEY=<key> hacklab sync # env var: one shell / CI
97
+ hacklab config cursor-api-key <key> # config file: persists
98
+ ```
99
+
100
+ `--cursor-email <email>` / `CURSOR_EMAIL` / `hacklab config cursor-email` set the
101
+ account email, which resolves independently of the key. **If your key is a team
102
+ key, set the email.** Cursor's usage endpoint returns every team member's events
103
+ otherwise, and all of it would land on your profile as your own.
104
+
105
+ If a key is set but Cursor rejects it, the scan says so and falls back to the
106
+ local estimate — it won't quietly hand you an estimate you think is exact.
107
+
78
108
  ## Choosing a backend
79
109
 
80
110
  Every command resolves which backend to talk to by the same precedence:
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,iBAgDjD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAiBA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,iBA0DjD"}
@@ -1,25 +1,37 @@
1
- import { loadConfig, saveConfig } from '../config.js';
1
+ import { loadConfig, resolveCursorAuth, saveConfig, } from '../config.js';
2
2
  import { dim, error, info, success } from '../ui.js';
3
+ /**
4
+ * Note where a value came from. Printing the *effective* value rather than the
5
+ * file's is the point: with an env var or flag set, the file's value is dead
6
+ * weight, and showing it would explain nothing about the numbers the user sees.
7
+ */
8
+ function sourceNote(source, envName) {
9
+ return source === 'env' ? dim(` (from ${envName} — overrides this file)`) : '';
10
+ }
3
11
  export async function configCommand(args) {
4
12
  const [key, ...valueParts] = args;
5
13
  const value = valueParts.join(' ');
6
14
  if (!key) {
7
- const config = await loadConfig();
15
+ const auth = await resolveCursorAuth();
8
16
  console.log('');
9
17
  info('current config:');
10
- if (config.cursorApiKey) {
11
- info(` cursor-api-key: ${dim(`${config.cursorApiKey.slice(0, 8)}...`)}`);
18
+ if (auth.apiKey) {
19
+ info(` cursor-api-key: ${dim(`${auth.apiKey.slice(0, 8)}...`)}${sourceNote(auth.apiKeySource, 'CURSOR_API_KEY')}`);
12
20
  }
13
- if (config.cursorEmail) {
14
- info(` cursor-email: ${config.cursorEmail}`);
21
+ if (auth.email) {
22
+ info(` cursor-email: ${auth.email}${sourceNote(auth.emailSource, 'CURSOR_EMAIL')}`);
15
23
  }
16
- if (!config.cursorApiKey && !config.cursorEmail) {
24
+ if (!auth.apiKey && !auth.email) {
17
25
  info(` ${dim('(empty)')}`);
18
26
  }
19
27
  console.log('');
20
28
  info('available keys:');
21
- info(` ${dim('cursor-api-key')} your Cursor team API key`);
22
- info(` ${dim('cursor-email')} your Cursor account email`);
29
+ info(` ${dim('cursor-api-key')} your Cursor API key — exact token counts`);
30
+ info(` ${dim('cursor-email')} your Cursor account email — scopes a team key to you`);
31
+ console.log('');
32
+ info(dim('per-run overrides (both beat this file):'));
33
+ info(dim(' hacklab --cursor-api-key <key> sync'));
34
+ info(dim(' CURSOR_API_KEY=<key> hacklab sync'));
23
35
  console.log('');
24
36
  return;
25
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAEpD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,IAAI,CAAA;IACjC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAElC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;QACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,IAAI,CAAC,iBAAiB,CAAC,CAAA;QACvB,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,qBAAqB,GAAG,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC3E,CAAC;QACD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,IAAI,CAAC,qBAAqB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;QACjD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAChD,IAAI,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QAC7B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,IAAI,CAAC,iBAAiB,CAAC,CAAA;QACvB,IAAI,CAAC,KAAK,GAAG,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CAAA;QAC5D,IAAI,CAAC,KAAK,GAAG,CAAC,cAAc,CAAC,+BAA+B,CAAC,CAAA;QAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAM;IACR,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,CAAC,yBAAyB,GAAG,UAAU,CAAC,CAAA;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IAEjC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,gBAAgB;YACnB,MAAM,CAAC,YAAY,GAAG,KAAK,CAAA;YAC3B,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;YACxB,OAAO,CAAC,sBAAsB,CAAC,CAAA;YAC/B,MAAK;QACP,KAAK,cAAc;YACjB,MAAM,CAAC,WAAW,GAAG,KAAK,CAAA;YAC1B,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;YACxB,OAAO,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAA;YACvC,MAAK;QACP;YACE,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;YACnC,IAAI,CAAC,yCAAyC,CAAC,CAAA;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type Session } from '../session.js';
2
+ export declare function readError(res: Response, session?: Session | null): Promise<string>;
3
+ export declare function formatEssayDate(iso: string): string;
4
+ /**
5
+ * The `essay list` target grammar, decided by argument count so a user
6
+ * literally named "org" still works as the bare one-arg form:
7
+ * (none) → your essays
8
+ * <handle> → that user's essays
9
+ * org <slug> → that org's essays
10
+ * org/<slug> → same, mirroring the web URL /org/<slug>
11
+ */
12
+ export declare function parseListTarget(positionals: string[]): {
13
+ kind: 'self';
14
+ } | {
15
+ kind: 'user';
16
+ handle: string;
17
+ } | {
18
+ kind: 'org';
19
+ slug: string;
20
+ } | {
21
+ kind: 'invalid';
22
+ };
23
+ export declare function essay(args: string[]): Promise<void>;
24
+ //# sourceMappingURL=essay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"essay.d.ts","sourceRoot":"","sources":["../../src/commands/essay.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,OAAO,EAEb,MAAM,eAAe,CAAA;AA+DtB,wBAAsB,SAAS,CAC7B,GAAG,EAAE,QAAQ,EACb,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,GACvB,OAAO,CAAC,MAAM,CAAC,CAIjB;AA4CD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAInD;AAqPD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EAAE,GAEnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CActB;AA8GD,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,iBA4BzC"}
@@ -0,0 +1,421 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import * as clack from '@clack/prompts';
3
+ import { loadSession, resolveAppUrl, unauthorizedHint, } from '../session.js';
4
+ import { bold, dim, error, info, linkBlue, success } from '../ui.js';
5
+ import { openBrowser } from '../utils/openBrowser.js';
6
+ // `hacklab essay` — post and manage the essays on your profile. Thin wrappers
7
+ // over the /api/essays routes: the markdown file is read locally but all real
8
+ // validation (title, size, rendering, sanitization) happens on the backend.
9
+ // Every subcommand takes --json so agents can drive it programmatically.
10
+ const ESSAYS_BASE = '/api/essays';
11
+ function printJson(data) {
12
+ console.log(JSON.stringify(data, null, 2));
13
+ }
14
+ async function requireSession() {
15
+ const session = await loadSession();
16
+ if (!session) {
17
+ error('not logged in');
18
+ info(`run ${dim('hacklab login')} first`);
19
+ process.exit(1);
20
+ }
21
+ return session;
22
+ }
23
+ // A 401 here is nearly always a per-backend token mismatch rather than a real
24
+ // auth failure, and the server's bare "Unauthorized" can't say so — only the
25
+ // client knows which backend the session was minted against. Swap in the hint
26
+ // that names the fix. Public reads pass no session and keep the server's text.
27
+ export async function readError(res, session) {
28
+ if (res.status === 401 && session)
29
+ return unauthorizedHint(session);
30
+ const data = (await res.json().catch(() => null));
31
+ return data?.error ?? `request failed (${res.status})`;
32
+ }
33
+ function flagValue(args, ...names) {
34
+ for (const name of names) {
35
+ const i = args.indexOf(name);
36
+ if (i !== -1 && args[i + 1])
37
+ return args[i + 1];
38
+ const eq = args.find((a) => a.startsWith(`${name}=`));
39
+ if (eq)
40
+ return eq.slice(name.length + 1);
41
+ }
42
+ return undefined;
43
+ }
44
+ /** Drop a flag and (when it isn't `--flag=value`) its value from args. */
45
+ function stripFlag(args, withValue, ...names) {
46
+ const out = [];
47
+ for (let i = 0; i < args.length; i++) {
48
+ const arg = args[i];
49
+ if (names.includes(arg)) {
50
+ if (withValue)
51
+ i++;
52
+ continue;
53
+ }
54
+ if (names.some((name) => arg.startsWith(`${name}=`)))
55
+ continue;
56
+ out.push(arg);
57
+ }
58
+ return out;
59
+ }
60
+ const MONTHS = [
61
+ 'jan',
62
+ 'feb',
63
+ 'mar',
64
+ 'apr',
65
+ 'may',
66
+ 'jun',
67
+ 'jul',
68
+ 'aug',
69
+ 'sep',
70
+ 'oct',
71
+ 'nov',
72
+ 'dec',
73
+ ];
74
+ // Essays get absolute dates ("jul 12 2026"), not chat's relative prefixes —
75
+ // a list of long-lived posts reads like an archive, not a conversation.
76
+ export function formatEssayDate(iso) {
77
+ const d = new Date(iso);
78
+ if (Number.isNaN(d.getTime()))
79
+ return iso;
80
+ return `${MONTHS[d.getMonth()]} ${d.getDate()} ${d.getFullYear()}`;
81
+ }
82
+ /** The short id shown in human output. Full ids stay in --json. */
83
+ function shortId(id) {
84
+ return id.slice(0, 8);
85
+ }
86
+ async function readMarkdownFile(path) {
87
+ if (!/\.(md|markdown)$/i.test(path)) {
88
+ error(`expected a markdown file (.md), got: ${path}`);
89
+ process.exit(1);
90
+ }
91
+ try {
92
+ return await readFile(path, 'utf8');
93
+ }
94
+ catch (err) {
95
+ const code = err.code;
96
+ error(code === 'ENOENT' ? `file not found: ${path}` : `could not read ${path}`);
97
+ process.exit(1);
98
+ }
99
+ }
100
+ /** Meta line under a list entry: id · date · reading time (· synced) (· by author). */
101
+ function metaLine(item, withAuthor) {
102
+ const parts = [];
103
+ if (withAuthor && item.authorHandle)
104
+ parts.push(`by ${item.authorHandle}`);
105
+ parts.push(shortId(item.id));
106
+ parts.push(formatEssayDate(item.publishedAt));
107
+ if (item.readingTimeMinutes)
108
+ parts.push(`${item.readingTimeMinutes} min`);
109
+ if (item.source === 'sync')
110
+ parts.push('synced');
111
+ return dim(` ${parts.join(' · ')}`);
112
+ }
113
+ // ── post / update ───────────────────────────────────────────────────────────
114
+ async function essayPost(args, json) {
115
+ const title = flagValue(args, '--title', '-t');
116
+ const positionals = stripFlag(args, true, '--title', '-t').filter((a) => !a.startsWith('-'));
117
+ const file = positionals[0];
118
+ if (!file || positionals.length > 1) {
119
+ error('usage: hacklab essay post <file.md> [--title "..."]');
120
+ process.exit(1);
121
+ }
122
+ const session = await requireSession();
123
+ const markdown = await readMarkdownFile(file);
124
+ const res = await fetch(`${resolveAppUrl(session)}${ESSAYS_BASE}`, {
125
+ method: 'POST',
126
+ headers: {
127
+ 'Content-Type': 'application/json',
128
+ Authorization: `Bearer ${session.token}`,
129
+ },
130
+ body: JSON.stringify({ markdown, ...(title ? { title } : {}) }),
131
+ });
132
+ if (!res.ok) {
133
+ error(await readError(res, session));
134
+ process.exit(1);
135
+ }
136
+ const data = (await res.json());
137
+ const url = `${resolveAppUrl(session)}${data.path}`;
138
+ if (json) {
139
+ printJson({ ...data, url });
140
+ return;
141
+ }
142
+ success(`published ${bold(`"${data.title}"`)}`);
143
+ info(`id ${bold(shortId(data.id))}`);
144
+ info(linkBlue(url));
145
+ console.log(dim(`\n update it later: hacklab essay update ${shortId(data.id)} <file.md>`));
146
+ }
147
+ async function essayUpdate(args, json) {
148
+ const title = flagValue(args, '--title', '-t');
149
+ const positionals = stripFlag(args, true, '--title', '-t').filter((a) => !a.startsWith('-'));
150
+ const [id, file] = positionals;
151
+ if (!id || !file || positionals.length > 2) {
152
+ error('usage: hacklab essay update <id> <file.md> [--title "..."]');
153
+ process.exit(1);
154
+ }
155
+ const session = await requireSession();
156
+ const markdown = await readMarkdownFile(file);
157
+ const res = await fetch(`${resolveAppUrl(session)}${ESSAYS_BASE}/${encodeURIComponent(id)}`, {
158
+ method: 'PATCH',
159
+ headers: {
160
+ 'Content-Type': 'application/json',
161
+ Authorization: `Bearer ${session.token}`,
162
+ },
163
+ body: JSON.stringify({ markdown, ...(title ? { title } : {}) }),
164
+ });
165
+ if (!res.ok) {
166
+ error(await readError(res, session));
167
+ process.exit(1);
168
+ }
169
+ const data = (await res.json());
170
+ const url = `${resolveAppUrl(session)}${data.path}`;
171
+ if (json) {
172
+ printJson({ ...data, url });
173
+ return;
174
+ }
175
+ success(`updated ${bold(`"${data.title}"`)}`);
176
+ info(linkBlue(url));
177
+ }
178
+ // ── delete ──────────────────────────────────────────────────────────────────
179
+ async function essayDelete(args, json) {
180
+ const yes = args.includes('--yes') || args.includes('-y');
181
+ const positionals = stripFlag(args, false, '--yes', '-y').filter((a) => !a.startsWith('-'));
182
+ const id = positionals[0];
183
+ if (!id || positionals.length > 1) {
184
+ error('usage: hacklab essay delete <id> [--yes]');
185
+ process.exit(1);
186
+ }
187
+ const session = await requireSession();
188
+ const base = resolveAppUrl(session);
189
+ // Fetch first so the confirmation names the essay, not just an id.
190
+ const viewRes = await fetch(`${base}${ESSAYS_BASE}/${encodeURIComponent(id)}`);
191
+ if (!viewRes.ok) {
192
+ error(await readError(viewRes));
193
+ process.exit(1);
194
+ }
195
+ const { essay } = (await viewRes.json());
196
+ if (!yes) {
197
+ if (!process.stdin.isTTY) {
198
+ error('refusing to delete without confirmation — pass --yes');
199
+ process.exit(1);
200
+ }
201
+ const confirmed = await clack.confirm({
202
+ message: `delete "${essay.title}"? this cannot be undone.`,
203
+ initialValue: false,
204
+ });
205
+ if (clack.isCancel(confirmed) || !confirmed) {
206
+ info('kept.');
207
+ return;
208
+ }
209
+ }
210
+ const res = await fetch(`${base}${ESSAYS_BASE}/${encodeURIComponent(id)}`, {
211
+ method: 'DELETE',
212
+ headers: { Authorization: `Bearer ${session.token}` },
213
+ });
214
+ if (!res.ok) {
215
+ error(await readError(res, session));
216
+ process.exit(1);
217
+ }
218
+ const data = (await res.json());
219
+ if (json) {
220
+ printJson(data);
221
+ return;
222
+ }
223
+ success(`deleted ${bold(`"${data.title}"`)}`);
224
+ }
225
+ // ── view ────────────────────────────────────────────────────────────────────
226
+ async function essayView(args, json) {
227
+ const web = args.includes('--web') || args.includes('-w');
228
+ const positionals = stripFlag(args, false, '--web', '-w').filter((a) => !a.startsWith('-'));
229
+ const id = positionals[0];
230
+ if (!id || positionals.length > 1) {
231
+ error('usage: hacklab essay view <id> [--web]');
232
+ process.exit(1);
233
+ }
234
+ // Viewing is public — a session only improves the base URL resolution.
235
+ const session = await loadSession();
236
+ const base = resolveAppUrl(session);
237
+ const res = await fetch(`${base}${ESSAYS_BASE}/${encodeURIComponent(id)}`);
238
+ if (!res.ok) {
239
+ error(await readError(res));
240
+ process.exit(1);
241
+ }
242
+ const { essay } = (await res.json());
243
+ const url = `${base}${essay.path}`;
244
+ if (json) {
245
+ printJson({ essay: { ...essay, url } });
246
+ return;
247
+ }
248
+ if (web) {
249
+ const opened = await openBrowser(url);
250
+ if (opened) {
251
+ info(`opened ${linkBlue(url)}`);
252
+ return;
253
+ }
254
+ info(`could not open a browser — ${linkBlue(url)}`);
255
+ return;
256
+ }
257
+ const byline = [
258
+ essay.authorDisplayName ?? essay.authorHandle,
259
+ formatEssayDate(essay.publishedAt),
260
+ essay.readingTimeMinutes ? `${essay.readingTimeMinutes} min` : null,
261
+ ].filter(Boolean);
262
+ console.log('');
263
+ console.log(` ${bold(essay.title)}`);
264
+ console.log(dim(` ${byline.join(' · ')}`));
265
+ console.log('');
266
+ if (essay.contentText) {
267
+ for (const line of essay.contentText.split('\n')) {
268
+ console.log(` ${line}`);
269
+ }
270
+ console.log('');
271
+ }
272
+ console.log(` ${linkBlue(url)}`);
273
+ }
274
+ // ── list ────────────────────────────────────────────────────────────────────
275
+ /**
276
+ * The `essay list` target grammar, decided by argument count so a user
277
+ * literally named "org" still works as the bare one-arg form:
278
+ * (none) → your essays
279
+ * <handle> → that user's essays
280
+ * org <slug> → that org's essays
281
+ * org/<slug> → same, mirroring the web URL /org/<slug>
282
+ */
283
+ export function parseListTarget(positionals) {
284
+ if (positionals.length === 0)
285
+ return { kind: 'self' };
286
+ if (positionals.length === 1) {
287
+ const arg = positionals[0];
288
+ if (arg.startsWith('org/')) {
289
+ const slug = arg.slice('org/'.length);
290
+ return slug ? { kind: 'org', slug } : { kind: 'invalid' };
291
+ }
292
+ return { kind: 'user', handle: arg };
293
+ }
294
+ if (positionals.length === 2 && positionals[0] === 'org') {
295
+ return { kind: 'org', slug: positionals[1] };
296
+ }
297
+ return { kind: 'invalid' };
298
+ }
299
+ async function essayList(args, json) {
300
+ const rawPage = flagValue(args, '--page', '-p');
301
+ const page = rawPage ? Number.parseInt(rawPage, 10) : 1;
302
+ if (!Number.isInteger(page) || page < 1) {
303
+ error(`--page must be a positive integer, got: ${rawPage}`);
304
+ process.exit(1);
305
+ }
306
+ const positionals = stripFlag(args, true, '--page', '-p').filter((a) => !a.startsWith('-'));
307
+ const target = parseListTarget(positionals);
308
+ if (target.kind === 'invalid') {
309
+ error('usage: hacklab essay list [<handle> | org <slug>] [--page N]');
310
+ process.exit(1);
311
+ }
312
+ let query;
313
+ let subject;
314
+ if (target.kind === 'self') {
315
+ const session = await requireSession();
316
+ if (!session.handle) {
317
+ error('no username on this session');
318
+ info(`run ${dim('hacklab login')} (or pass a username explicitly)`);
319
+ process.exit(1);
320
+ }
321
+ query = { user: session.handle };
322
+ subject = session.handle;
323
+ }
324
+ else if (target.kind === 'user') {
325
+ query = { user: target.handle };
326
+ subject = target.handle;
327
+ }
328
+ else {
329
+ query = { org: target.slug };
330
+ subject = target.slug;
331
+ }
332
+ const session = await loadSession();
333
+ const url = new URL(`${resolveAppUrl(session)}${ESSAYS_BASE}`);
334
+ if ('user' in query)
335
+ url.searchParams.set('user', query.user);
336
+ else
337
+ url.searchParams.set('org', query.org);
338
+ if (page > 1)
339
+ url.searchParams.set('page', String(page));
340
+ const res = await fetch(url);
341
+ if (!res.ok) {
342
+ error(await readError(res));
343
+ process.exit(1);
344
+ }
345
+ const data = (await res.json());
346
+ if (json) {
347
+ printJson(data);
348
+ return;
349
+ }
350
+ const isOrg = data.kind === 'org';
351
+ const heading = isOrg
352
+ ? `essays from ${bold(data.org.name)} (${data.total})`
353
+ : `essays by ${bold(data.author.handle)} (${data.total})`;
354
+ const pageSuffix = data.totalPages > 1 ? dim(` — page ${data.page}/${data.totalPages}`) : '';
355
+ console.log('');
356
+ console.log(` ${heading}${pageSuffix}`);
357
+ if (data.items.length === 0) {
358
+ console.log('');
359
+ info('no essays yet.');
360
+ if (!isOrg && session?.handle === data.author?.handle) {
361
+ info(`post one: ${dim('hacklab essay post <file.md>')}`);
362
+ }
363
+ return;
364
+ }
365
+ for (const item of data.items) {
366
+ console.log('');
367
+ console.log(` ${bold(item.title)}`);
368
+ console.log(metaLine(item, isOrg));
369
+ }
370
+ if (data.page < data.totalPages) {
371
+ const target = isOrg ? `org ${subject}` : subject;
372
+ console.log('');
373
+ console.log(dim(` next → hacklab essay list ${target} --page ${data.page + 1}`));
374
+ }
375
+ console.log('');
376
+ }
377
+ // ── dispatch ────────────────────────────────────────────────────────────────
378
+ function printEssayHelp() {
379
+ console.log(`
380
+ ${bold('hacklab essay')} — essays on your profile
381
+
382
+ ${bold('post')} <file.md> [--title "..."] publish a markdown file as an essay
383
+ ${bold('update')} <id> <file.md> replace an essay's content (URL stays stable)
384
+ ${bold('delete')} <id> [--yes] delete your essay
385
+ ${bold('view')} <id> [--web] read an essay (--web opens the browser)
386
+ ${bold('list')} [<handle> | org <slug>] your essays, a user's, or an org's
387
+ [--page N] 12 per page
388
+
389
+ all subcommands take ${bold('--json')} for machine-readable output.
390
+ ids are shown by post/list — any unique prefix works (e.g. 3f9c).
391
+ `);
392
+ }
393
+ export async function essay(args) {
394
+ const json = args.includes('--json');
395
+ const rest = args.filter((a) => a !== '--json');
396
+ const sub = rest[0];
397
+ const subArgs = rest.slice(1);
398
+ switch (sub) {
399
+ case 'post':
400
+ return essayPost(subArgs, json);
401
+ case 'update':
402
+ return essayUpdate(subArgs, json);
403
+ case 'delete':
404
+ return essayDelete(subArgs, json);
405
+ case 'view':
406
+ return essayView(subArgs, json);
407
+ case 'list':
408
+ return essayList(subArgs, json);
409
+ case undefined:
410
+ case 'help':
411
+ case '--help':
412
+ case '-h':
413
+ printEssayHelp();
414
+ return;
415
+ default:
416
+ error(`unknown subcommand: ${sub}`);
417
+ printEssayHelp();
418
+ process.exit(1);
419
+ }
420
+ }
421
+ //# sourceMappingURL=essay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"essay.js","sourceRoot":"","sources":["../../src/commands/essay.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../src/commands/join.ts"],"names":[],"mappings":"AAqCA;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,iBAgU1D"}
1
+ {"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../src/commands/join.ts"],"names":[],"mappings":"AA0CA;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,iBAiX1D"}