hacklab 0.0.2 → 0.3.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.
Files changed (166) hide show
  1. package/README.md +44 -3
  2. package/bin/ddd +19 -0
  3. package/dist/commands/brag.d.ts +3 -6
  4. package/dist/commands/brag.d.ts.map +1 -1
  5. package/dist/commands/brag.js +68 -299
  6. package/dist/commands/brag.js.map +1 -1
  7. package/dist/commands/claim.d.ts +2 -0
  8. package/dist/commands/claim.d.ts.map +1 -0
  9. package/dist/commands/claim.js +534 -0
  10. package/dist/commands/claim.js.map +1 -0
  11. package/dist/commands/config.d.ts +2 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +48 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/dojo-init.d.ts +2 -0
  16. package/dist/commands/dojo-init.d.ts.map +1 -0
  17. package/dist/commands/dojo-init.js +75 -0
  18. package/dist/commands/dojo-init.js.map +1 -0
  19. package/dist/commands/drop.d.ts +2 -0
  20. package/dist/commands/drop.d.ts.map +1 -0
  21. package/dist/commands/drop.js +29 -0
  22. package/dist/commands/drop.js.map +1 -0
  23. package/dist/commands/exam.d.ts +5 -0
  24. package/dist/commands/exam.d.ts.map +1 -0
  25. package/dist/commands/exam.js +224 -0
  26. package/dist/commands/exam.js.map +1 -0
  27. package/dist/commands/login.d.ts +1 -15
  28. package/dist/commands/login.d.ts.map +1 -1
  29. package/dist/commands/login.js +69 -133
  30. package/dist/commands/login.js.map +1 -1
  31. package/dist/commands/scan-profile.d.ts +33 -0
  32. package/dist/commands/scan-profile.d.ts.map +1 -0
  33. package/dist/commands/scan-profile.js +279 -0
  34. package/dist/commands/scan-profile.js.map +1 -0
  35. package/dist/commands/signup.d.ts +11 -0
  36. package/dist/commands/signup.d.ts.map +1 -0
  37. package/dist/commands/signup.js +242 -0
  38. package/dist/commands/signup.js.map +1 -0
  39. package/dist/commands/sync.d.ts +2 -0
  40. package/dist/commands/sync.d.ts.map +1 -0
  41. package/dist/commands/sync.js +55 -0
  42. package/dist/commands/sync.js.map +1 -0
  43. package/dist/commands/whoami.d.ts +1 -3
  44. package/dist/commands/whoami.d.ts.map +1 -1
  45. package/dist/commands/whoami.js +10 -37
  46. package/dist/commands/whoami.js.map +1 -1
  47. package/dist/config.d.ts +7 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +18 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/dd.d.ts +3 -0
  52. package/dist/dd.d.ts.map +1 -0
  53. package/dist/dd.js +28 -0
  54. package/dist/dd.js.map +1 -0
  55. package/dist/index.js +117 -112
  56. package/dist/index.js.map +1 -1
  57. package/dist/project-brag.d.ts +58 -0
  58. package/dist/project-brag.d.ts.map +1 -0
  59. package/dist/project-brag.js +270 -0
  60. package/dist/project-brag.js.map +1 -0
  61. package/dist/scanners/index.d.ts +24 -0
  62. package/dist/scanners/index.d.ts.map +1 -0
  63. package/dist/scanners/index.js +543 -0
  64. package/dist/scanners/index.js.map +1 -0
  65. package/dist/scanners/util.d.ts +83 -0
  66. package/dist/scanners/util.d.ts.map +1 -0
  67. package/dist/scanners/util.js +129 -0
  68. package/dist/scanners/util.js.map +1 -0
  69. package/dist/session.d.ts +17 -13
  70. package/dist/session.d.ts.map +1 -1
  71. package/dist/session.js +46 -155
  72. package/dist/session.js.map +1 -1
  73. package/dist/share-card.d.ts +29 -0
  74. package/dist/share-card.d.ts.map +1 -0
  75. package/dist/share-card.js +401 -0
  76. package/dist/share-card.js.map +1 -0
  77. package/dist/sync.d.ts +64 -0
  78. package/dist/sync.d.ts.map +1 -0
  79. package/dist/sync.js +805 -0
  80. package/dist/sync.js.map +1 -0
  81. package/dist/ui.d.ts +10 -0
  82. package/dist/ui.d.ts.map +1 -0
  83. package/dist/ui.js +21 -0
  84. package/dist/ui.js.map +1 -0
  85. package/dist/utils/openBrowser.js.map +1 -1
  86. package/package.json +36 -29
  87. package/dist/api/client.d.ts +0 -150
  88. package/dist/api/client.d.ts.map +0 -1
  89. package/dist/api/client.js +0 -246
  90. package/dist/api/client.js.map +0 -1
  91. package/dist/commands/admin-waitlist.d.ts +0 -12
  92. package/dist/commands/admin-waitlist.d.ts.map +0 -1
  93. package/dist/commands/admin-waitlist.js +0 -96
  94. package/dist/commands/admin-waitlist.js.map +0 -1
  95. package/dist/commands/brag.utils.d.ts +0 -12
  96. package/dist/commands/brag.utils.d.ts.map +0 -1
  97. package/dist/commands/brag.utils.js +0 -43
  98. package/dist/commands/brag.utils.js.map +0 -1
  99. package/dist/commands/essay.d.ts +0 -18
  100. package/dist/commands/essay.d.ts.map +0 -1
  101. package/dist/commands/essay.js +0 -117
  102. package/dist/commands/essay.js.map +0 -1
  103. package/dist/commands/explore.d.ts +0 -9
  104. package/dist/commands/explore.d.ts.map +0 -1
  105. package/dist/commands/explore.js +0 -32
  106. package/dist/commands/explore.js.map +0 -1
  107. package/dist/commands/init.d.ts +0 -16
  108. package/dist/commands/init.d.ts.map +0 -1
  109. package/dist/commands/init.js +0 -237
  110. package/dist/commands/init.js.map +0 -1
  111. package/dist/commands/join.d.ts +0 -10
  112. package/dist/commands/join.d.ts.map +0 -1
  113. package/dist/commands/join.js +0 -314
  114. package/dist/commands/join.js.map +0 -1
  115. package/dist/commands/link.d.ts +0 -17
  116. package/dist/commands/link.d.ts.map +0 -1
  117. package/dist/commands/link.js +0 -36
  118. package/dist/commands/link.js.map +0 -1
  119. package/dist/commands/login.utils.d.ts +0 -3
  120. package/dist/commands/login.utils.d.ts.map +0 -1
  121. package/dist/commands/login.utils.js +0 -13
  122. package/dist/commands/login.utils.js.map +0 -1
  123. package/dist/commands/new.d.ts +0 -15
  124. package/dist/commands/new.d.ts.map +0 -1
  125. package/dist/commands/new.js +0 -172
  126. package/dist/commands/new.js.map +0 -1
  127. package/dist/commands/new.utils.d.ts +0 -7
  128. package/dist/commands/new.utils.d.ts.map +0 -1
  129. package/dist/commands/new.utils.js +0 -50
  130. package/dist/commands/new.utils.js.map +0 -1
  131. package/dist/commands/onboard.d.ts +0 -10
  132. package/dist/commands/onboard.d.ts.map +0 -1
  133. package/dist/commands/onboard.js +0 -93
  134. package/dist/commands/onboard.js.map +0 -1
  135. package/dist/commands/publish.d.ts +0 -8
  136. package/dist/commands/publish.d.ts.map +0 -1
  137. package/dist/commands/publish.js +0 -47
  138. package/dist/commands/publish.js.map +0 -1
  139. package/dist/commands/tui.d.ts +0 -12
  140. package/dist/commands/tui.d.ts.map +0 -1
  141. package/dist/commands/tui.js +0 -112
  142. package/dist/commands/tui.js.map +0 -1
  143. package/dist/help-format.d.ts +0 -4
  144. package/dist/help-format.d.ts.map +0 -1
  145. package/dist/help-format.js +0 -30
  146. package/dist/help-format.js.map +0 -1
  147. package/dist/lab/config.d.ts +0 -32
  148. package/dist/lab/config.d.ts.map +0 -1
  149. package/dist/lab/config.js +0 -148
  150. package/dist/lab/config.js.map +0 -1
  151. package/dist/lab/contentStatus.d.ts +0 -6
  152. package/dist/lab/contentStatus.d.ts.map +0 -1
  153. package/dist/lab/contentStatus.js +0 -19
  154. package/dist/lab/contentStatus.js.map +0 -1
  155. package/dist/ui/banner.d.ts +0 -2
  156. package/dist/ui/banner.d.ts.map +0 -1
  157. package/dist/ui/banner.js +0 -22
  158. package/dist/ui/banner.js.map +0 -1
  159. package/dist/utils/findRepoRoot.d.ts +0 -2
  160. package/dist/utils/findRepoRoot.d.ts.map +0 -1
  161. package/dist/utils/findRepoRoot.js +0 -17
  162. package/dist/utils/findRepoRoot.js.map +0 -1
  163. package/dist/utils/pathExists.d.ts +0 -2
  164. package/dist/utils/pathExists.d.ts.map +0 -1
  165. package/dist/utils/pathExists.js +0 -11
  166. package/dist/utils/pathExists.js.map +0 -1
@@ -0,0 +1,534 @@
1
+ import { readdir, readFile, stat } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import * as clack from '@clack/prompts';
5
+ import { loadConfig } from '../config.js';
6
+ import { loadSession } from '../session.js';
7
+ import { bold, dim, error, info, success } from '../ui.js';
8
+ import { openBrowser } from '../utils/openBrowser.js';
9
+ // Collected across all scanners for the share card
10
+ const modelAccumulator = new Map();
11
+ function toDateStr(ts) {
12
+ // Handle numeric strings (e.g. Unix millis from Cursor API)
13
+ const v = typeof ts === 'string' && /^\d+$/.test(ts) ? Number(ts) : ts;
14
+ const d = new Date(v);
15
+ return d.toISOString().split('T')[0];
16
+ }
17
+ /**
18
+ * Scan Claude Code JSONL files. Extract per-line timestamps + tokens.
19
+ * Returns daily token totals.
20
+ */
21
+ async function scanClaudeCode() {
22
+ const claudeDir = join(homedir(), '.claude', 'projects');
23
+ try {
24
+ await stat(claudeDir);
25
+ }
26
+ catch {
27
+ return [];
28
+ }
29
+ const files = await findFiles(claudeDir, '.jsonl');
30
+ const dailyMap = new Map(); // "YYYY-MM-DD" -> tokens
31
+ for (const filePath of files) {
32
+ try {
33
+ const content = await readFile(filePath, 'utf8');
34
+ for (const line of content.split('\n')) {
35
+ if (!line.trim())
36
+ continue;
37
+ try {
38
+ const parsed = JSON.parse(line);
39
+ const usage = parsed.message?.usage ?? parsed.usage ?? null;
40
+ if (!usage)
41
+ continue;
42
+ const tokens = (usage.input_tokens ?? 0) +
43
+ (usage.output_tokens ?? 0) +
44
+ (usage.cache_creation_input_tokens ?? 0) +
45
+ (usage.cache_read_input_tokens ?? 0);
46
+ if (tokens <= 0)
47
+ continue;
48
+ // Extract date from timestamp, fall back to file mtime
49
+ let date;
50
+ if (parsed.timestamp) {
51
+ date = toDateStr(parsed.timestamp);
52
+ }
53
+ else {
54
+ const s = await stat(filePath);
55
+ date = toDateStr(s.mtime);
56
+ }
57
+ dailyMap.set(date, (dailyMap.get(date) ?? 0) + tokens);
58
+ // Track model usage for share card
59
+ const model = parsed.message?.model ?? 'unknown';
60
+ if (model !== 'unknown') {
61
+ modelAccumulator.set(model, (modelAccumulator.get(model) ?? 0) + tokens);
62
+ }
63
+ }
64
+ catch {
65
+ // skip malformed lines
66
+ }
67
+ }
68
+ }
69
+ catch {
70
+ // skip unreadable files
71
+ }
72
+ }
73
+ return Array.from(dailyMap.entries()).map(([date, tokens]) => ({
74
+ date,
75
+ tool: 'claude_code',
76
+ tokens,
77
+ }));
78
+ }
79
+ /**
80
+ * Scan Codex JSONL files. Date extracted from directory structure (YYYY/MM/DD/).
81
+ * Token count = max running total per file.
82
+ */
83
+ async function scanCodex() {
84
+ const codexDir = join(homedir(), '.codex', 'sessions');
85
+ try {
86
+ await stat(codexDir);
87
+ }
88
+ catch {
89
+ return [];
90
+ }
91
+ const files = await findFiles(codexDir, '.jsonl');
92
+ const dailyMap = new Map();
93
+ for (const filePath of files) {
94
+ try {
95
+ const content = await readFile(filePath, 'utf8');
96
+ // Extract date from path: .codex/sessions/YYYY/MM/DD/file.jsonl
97
+ const relPath = filePath.slice(codexDir.length + 1);
98
+ const parts = relPath.split('/');
99
+ let date;
100
+ if (parts.length >= 3) {
101
+ date = `${parts[0]}-${parts[1]?.padStart(2, '0')}-${parts[2]?.padStart(2, '0')}`;
102
+ }
103
+ else {
104
+ const s = await stat(filePath);
105
+ date = toDateStr(s.mtime);
106
+ }
107
+ // Codex uses running totals, take the max
108
+ let maxTotal = 0;
109
+ let fileModel = 'unknown';
110
+ for (const line of content.split('\n')) {
111
+ if (!line.trim())
112
+ continue;
113
+ try {
114
+ const parsed = JSON.parse(line);
115
+ // Extract model from payload.model
116
+ if (parsed.payload?.model) {
117
+ fileModel = parsed.payload.model;
118
+ }
119
+ const usage = parsed.payload?.info?.total_token_usage;
120
+ if (usage) {
121
+ const t = (usage.input_tokens ?? 0) + (usage.output_tokens ?? 0);
122
+ if (t > maxTotal)
123
+ maxTotal = t;
124
+ }
125
+ }
126
+ catch {
127
+ // skip
128
+ }
129
+ }
130
+ if (maxTotal > 0) {
131
+ dailyMap.set(date, (dailyMap.get(date) ?? 0) + maxTotal);
132
+ // Track model for share card
133
+ if (fileModel !== 'unknown') {
134
+ modelAccumulator.set(fileModel, (modelAccumulator.get(fileModel) ?? 0) + maxTotal);
135
+ }
136
+ }
137
+ }
138
+ catch {
139
+ // skip unreadable files
140
+ }
141
+ }
142
+ return Array.from(dailyMap.entries()).map(([date, tokens]) => ({
143
+ date,
144
+ tool: 'codex',
145
+ tokens,
146
+ }));
147
+ }
148
+ /**
149
+ * Scan Cursor local SQLite. One entry per commit, no timestamps available
150
+ * so we bucket everything under today.
151
+ */
152
+ async function scanCursorLocal() {
153
+ const dbPath = join(homedir(), '.cursor', 'ai-tracking', 'ai-code-tracking.db');
154
+ try {
155
+ await stat(dbPath);
156
+ }
157
+ catch {
158
+ return { entries: [], stats: null };
159
+ }
160
+ const { execSync } = await import('node:child_process');
161
+ try {
162
+ const raw = execSync(`sqlite3 "${dbPath}" "select commitHash, linesAdded, linesDeleted, composerLinesAdded, composerLinesDeleted, humanLinesAdded, humanLinesDeleted, v2AiPercentage from scored_commits;"`, { encoding: 'utf8', timeout: 10000 }).trim();
163
+ if (!raw)
164
+ return { entries: [], stats: null };
165
+ const rows = raw.split('\n');
166
+ let totalTokens = 0;
167
+ let totalAiLines = 0;
168
+ let totalHumanLines = 0;
169
+ let aiPctSum = 0;
170
+ for (const row of rows) {
171
+ const [, , , composerAdded, composerDeleted, humanAdded, , aiPct] = row.split('|');
172
+ const aiLines = (parseInt(composerAdded ?? '0', 10) || 0) +
173
+ (parseInt(composerDeleted ?? '0', 10) || 0);
174
+ totalAiLines += parseInt(composerAdded ?? '0', 10) || 0;
175
+ totalHumanLines += parseInt(humanAdded ?? '0', 10) || 0;
176
+ aiPctSum += parseFloat(aiPct ?? '0') || 0;
177
+ totalTokens += aiLines * 30;
178
+ }
179
+ let models = [];
180
+ try {
181
+ const modelRaw = execSync(`sqlite3 "${dbPath}" "select model, count(*) from ai_code_hashes where model is not null and model != '' group by model order by count(*) desc;"`, { encoding: 'utf8', timeout: 5000 }).trim();
182
+ if (modelRaw) {
183
+ models = modelRaw.split('\n').map((line) => {
184
+ const [model, count] = line.split('|');
185
+ return {
186
+ model: model ?? '',
187
+ uses: parseInt(count ?? '0', 10) || 0,
188
+ };
189
+ });
190
+ }
191
+ }
192
+ catch {
193
+ // optional
194
+ }
195
+ const entries = totalTokens > 0
196
+ ? [
197
+ {
198
+ date: toDateStr(new Date()),
199
+ tool: 'cursor',
200
+ tokens: totalTokens,
201
+ },
202
+ ]
203
+ : [];
204
+ return {
205
+ entries,
206
+ stats: {
207
+ totalCommits: rows.length,
208
+ aiLinesAdded: totalAiLines,
209
+ humanLinesAdded: totalHumanLines,
210
+ avgAiPercent: rows.length > 0 ? Math.round((aiPctSum / rows.length) * 10) / 10 : 0,
211
+ models,
212
+ },
213
+ };
214
+ }
215
+ catch {
216
+ return { entries: [], stats: null };
217
+ }
218
+ }
219
+ /**
220
+ * Scan Cursor via team Admin API. Each event has a timestamp.
221
+ */
222
+ async function scanCursorApi() {
223
+ const config = await loadConfig();
224
+ if (!config.cursorApiKey)
225
+ return [];
226
+ const email = config.cursorEmail;
227
+ const now = Date.now();
228
+ const thirtyDaysMs = 30 * 24 * 60 * 60 * 1000;
229
+ const chunks = 12;
230
+ const dailyMap = new Map();
231
+ for (let i = 0; i < chunks; i++) {
232
+ const endDate = now - i * thirtyDaysMs;
233
+ const startDate = endDate - thirtyDaysMs;
234
+ let page = 1;
235
+ let hasMore = true;
236
+ while (hasMore) {
237
+ try {
238
+ const body = {
239
+ startDate,
240
+ endDate,
241
+ page,
242
+ pageSize: 100,
243
+ };
244
+ if (email)
245
+ body.email = email;
246
+ const res = await fetch('https://api.cursor.com/teams/filtered-usage-events', {
247
+ method: 'POST',
248
+ headers: {
249
+ 'Content-Type': 'application/json',
250
+ Authorization: `Bearer ${config.cursorApiKey}`,
251
+ },
252
+ body: JSON.stringify(body),
253
+ });
254
+ if (!res.ok) {
255
+ if (res.status === 401 || res.status === 403)
256
+ return Array.from(dailyMap.entries()).map(([date, tokens]) => ({
257
+ date,
258
+ tool: 'cursor',
259
+ tokens,
260
+ }));
261
+ break;
262
+ }
263
+ const data = await res.json();
264
+ const events = data.usageEvents ?? [];
265
+ for (const event of events) {
266
+ if (!event.isTokenBasedCall)
267
+ continue;
268
+ const tu = event.tokenUsage ?? event;
269
+ const tokens = (tu.inputTokens ?? 0) +
270
+ (tu.outputTokens ?? 0) +
271
+ (tu.cacheWriteTokens ?? 0) +
272
+ (tu.cacheReadTokens ?? 0);
273
+ if (tokens > 0 && event.timestamp) {
274
+ const date = toDateStr(event.timestamp);
275
+ dailyMap.set(date, (dailyMap.get(date) ?? 0) + tokens);
276
+ // Track model for share card
277
+ const model = event.model;
278
+ if (model) {
279
+ modelAccumulator.set(model, (modelAccumulator.get(model) ?? 0) + tokens);
280
+ }
281
+ }
282
+ }
283
+ hasMore = data.pagination?.hasNextPage ?? false;
284
+ page++;
285
+ }
286
+ catch {
287
+ hasMore = false;
288
+ }
289
+ }
290
+ }
291
+ return Array.from(dailyMap.entries()).map(([date, tokens]) => ({
292
+ date,
293
+ tool: 'cursor',
294
+ tokens,
295
+ }));
296
+ }
297
+ async function findFiles(dir, ext) {
298
+ const results = [];
299
+ async function walk(current) {
300
+ try {
301
+ const entries = await readdir(current, { withFileTypes: true });
302
+ for (const entry of entries) {
303
+ const fullPath = join(current, entry.name);
304
+ if (entry.isDirectory()) {
305
+ await walk(fullPath);
306
+ }
307
+ else if (entry.name.endsWith(ext)) {
308
+ results.push(fullPath);
309
+ }
310
+ }
311
+ }
312
+ catch {
313
+ // skip
314
+ }
315
+ }
316
+ await walk(dir);
317
+ return results;
318
+ }
319
+ function formatTokens(n) {
320
+ if (n >= 1_000_000_000)
321
+ return `${(n / 1_000_000_000).toFixed(1)}B`;
322
+ if (n >= 1_000_000)
323
+ return `${(n / 1_000_000).toFixed(1)}M`;
324
+ if (n >= 1_000)
325
+ return `${(n / 1_000).toFixed(0)}K`;
326
+ return String(n);
327
+ }
328
+ export async function claim() {
329
+ const session = await loadSession();
330
+ if (!session) {
331
+ error('not logged in');
332
+ info(`run ${dim('hacklab login')} first`);
333
+ process.exit(1);
334
+ }
335
+ console.log('');
336
+ console.log(bold(' Scanning local AI tool usage...'));
337
+ console.log(dim(' This may take a minute if you have many sessions.'));
338
+ console.log('');
339
+ const [claudeEntries, codexEntries, cursorApiEntries, cursorLocal] = await Promise.all([
340
+ scanClaudeCode(),
341
+ scanCodex(),
342
+ scanCursorApi(),
343
+ scanCursorLocal(),
344
+ ]);
345
+ // Merge cursor sources: prefer API if available
346
+ const cursorEntries = cursorApiEntries.length > 0 ? cursorApiEntries : cursorLocal.entries;
347
+ // Aggregate totals per tool for display
348
+ const claudeTotal = claudeEntries.reduce((s, e) => s + e.tokens, 0);
349
+ const codexTotal = codexEntries.reduce((s, e) => s + e.tokens, 0);
350
+ const cursorTotal = cursorEntries.reduce((s, e) => s + e.tokens, 0);
351
+ if (claudeTotal > 0) {
352
+ info(`Claude Code: ${formatTokens(claudeTotal)} tokens (${claudeEntries.length} days)`);
353
+ }
354
+ else {
355
+ info(`Claude Code: ${dim('no data found')}`);
356
+ }
357
+ if (codexTotal > 0) {
358
+ info(`Codex: ${formatTokens(codexTotal)} tokens (${codexEntries.length} days)`);
359
+ }
360
+ else {
361
+ info(`Codex: ${dim('no data found')}`);
362
+ }
363
+ const config = await loadConfig();
364
+ if (cursorTotal > 0) {
365
+ const source = cursorApiEntries.length > 0 ? 'API' : 'local';
366
+ info(`Cursor: ${formatTokens(cursorTotal)} tokens (${cursorEntries.length} days, ${source})`);
367
+ }
368
+ else if (config.cursorApiKey) {
369
+ info(`Cursor: ${dim('no token-based usage found')}`);
370
+ }
371
+ else {
372
+ info(`Cursor: ${dim('run hacklab config cursor-api-key <key> to connect')}`);
373
+ }
374
+ if (cursorLocal.stats) {
375
+ const s = cursorLocal.stats;
376
+ info(` ${dim(`${s.totalCommits} commits, ${s.aiLinesAdded} AI lines, ${s.humanLinesAdded} human lines, ${s.avgAiPercent}% AI`)}`);
377
+ }
378
+ const allEntries = [...claudeEntries, ...codexEntries, ...cursorEntries];
379
+ const grandTotal = claudeTotal + codexTotal + cursorTotal;
380
+ if (allEntries.length === 0) {
381
+ console.log('');
382
+ error('no token data found');
383
+ info('have you used Claude Code or Codex on this machine?');
384
+ process.exit(1);
385
+ }
386
+ console.log('');
387
+ info(`Total: ${formatTokens(grandTotal)} tokens across ${allEntries.length} day-tool entries`);
388
+ console.log('');
389
+ info('syncing to hacklab...');
390
+ // Single API call with all daily data
391
+ const res = await fetch(`${session.appUrl}/api/claim/sync`, {
392
+ method: 'POST',
393
+ headers: {
394
+ 'Content-Type': 'application/json',
395
+ Authorization: `Bearer ${session.token}`,
396
+ },
397
+ body: JSON.stringify({
398
+ dailyTotals: allEntries,
399
+ toolTotals: {
400
+ claude_code: claudeTotal,
401
+ codex: codexTotal,
402
+ cursor: cursorTotal,
403
+ },
404
+ }),
405
+ });
406
+ if (!res.ok) {
407
+ const data = await res.json().catch(() => null);
408
+ error(data?.error ?? `failed (${res.status})`);
409
+ process.exit(1);
410
+ }
411
+ const result = await res.json();
412
+ console.log('');
413
+ success(`${bold(String(result.title))} lv.${result.level} (${result.beltColor} belt)`);
414
+ info(`total: ${formatTokens(Number(result.tokensTotal))} tokens`);
415
+ // "Since last claim" delta
416
+ if (result.tokensDelta > 0) {
417
+ console.log('');
418
+ info(bold('since last claim:'));
419
+ info(` +${formatTokens(result.tokensDelta)} tokens`);
420
+ if (result.deltaByTool) {
421
+ const dt = result.deltaByTool;
422
+ for (const [tool, delta] of Object.entries(dt)) {
423
+ if (delta > 0) {
424
+ const label = tool === 'claude_code'
425
+ ? 'Claude Code'
426
+ : tool === 'codex'
427
+ ? 'Codex'
428
+ : 'Cursor';
429
+ info(` ${label}: +${formatTokens(delta)}`);
430
+ }
431
+ }
432
+ }
433
+ if (result.rankDelta > 0) {
434
+ info(` rank: #${result.rankAfter} (+${result.rankDelta})`);
435
+ }
436
+ else if (result.rankAfter) {
437
+ info(` rank: #${result.rankAfter}`);
438
+ }
439
+ if (result.passedUsers && result.passedUsers.length > 0) {
440
+ info(` passed: ${result.passedUsers.map((u) => `@${u}`).join(', ')}`);
441
+ }
442
+ }
443
+ // Streak
444
+ if (result.streak > 0) {
445
+ info(` streak: ${result.streak} days (best: ${result.longestStreak})`);
446
+ }
447
+ info(` progress to next level: ${result.progressPercent}%`);
448
+ const handle = session.handle ?? 'you';
449
+ const appUrl = session.appUrl.replace(/\/$/, '');
450
+ console.log('');
451
+ info(`profile: ${bold(`${appUrl}/${handle}`)}`);
452
+ // Generate share card
453
+ let cardPath = null;
454
+ try {
455
+ const { generateShareCard, copyToClipboard, displayInTerminal } = await import('../share-card.js');
456
+ info('generating share card...');
457
+ // Build models list sorted by tokens
458
+ const models = Array.from(modelAccumulator.entries())
459
+ .map(([name, tokens]) => ({ name, tokens }))
460
+ .sort((a, b) => b.tokens - a.tokens);
461
+ // Build daily activity from all entries (aggregate by date)
462
+ const dailyAgg = new Map();
463
+ for (const entry of allEntries) {
464
+ dailyAgg.set(entry.date, (dailyAgg.get(entry.date) ?? 0) + entry.tokens);
465
+ }
466
+ const dailyActivity = Array.from(dailyAgg.entries())
467
+ .map(([date, tokens]) => ({ date, tokens }))
468
+ .sort((a, b) => a.date.localeCompare(b.date));
469
+ // Estimate cost (blended rate per M tokens, accounting for cache discount)
470
+ // Claude: ~$0.60/M blended (90% cache at $0.50 + 10% input at $5)
471
+ // Codex: ~$0.25/M blended (similar cache ratio, cheaper base)
472
+ // Cursor: ~$0.40/M blended
473
+ const estimatedCost = (claudeTotal / 1_000_000) * 0.6 +
474
+ (codexTotal / 1_000_000) * 0.25 +
475
+ (cursorTotal / 1_000_000) * 0.4;
476
+ cardPath = await generateShareCard({
477
+ handle,
478
+ level: result.level,
479
+ title: result.title,
480
+ beltColor: result.beltColor,
481
+ tokensTotal: Number(result.tokensTotal),
482
+ rank: result.rankAfter ?? 0,
483
+ streak: result.streak ?? 0,
484
+ longestStreak: result.longestStreak ?? 0,
485
+ progressPercent: result.progressPercent ?? 0,
486
+ estimatedCost,
487
+ toolBreakdown: {
488
+ claudeCode: claudeTotal,
489
+ codex: codexTotal,
490
+ cursor: cursorTotal,
491
+ },
492
+ models,
493
+ dailyActivity,
494
+ });
495
+ // Display image inline in terminal
496
+ const { readFile: rf } = await import('node:fs/promises');
497
+ const imgBuf = Buffer.from(await rf(cardPath));
498
+ const displayed = displayInTerminal(imgBuf);
499
+ if (!displayed) {
500
+ info(dim('(terminal does not support inline images)'));
501
+ }
502
+ console.log('');
503
+ const copied = await copyToClipboard(cardPath);
504
+ if (copied) {
505
+ success('image copied to clipboard!');
506
+ }
507
+ }
508
+ catch {
509
+ // Share card generation is optional
510
+ }
511
+ // Interactive share flow
512
+ console.log('');
513
+ if (cardPath) {
514
+ const saveCard = await clack.confirm({
515
+ message: `Save image to ~/hacklab-card.png?`,
516
+ });
517
+ if (saveCard && !clack.isCancel(saveCard)) {
518
+ const { copyFile } = await import('node:fs/promises');
519
+ const dest = join(homedir(), 'hacklab-card.png');
520
+ await copyFile(cardPath, dest);
521
+ success(`saved to ${dest}`);
522
+ }
523
+ }
524
+ const shareOnX = await clack.confirm({
525
+ message: `Share on X? Don't forget to attach your image!`,
526
+ });
527
+ if (shareOnX && !clack.isCancel(shareOnX)) {
528
+ const tweetText = encodeURIComponent(`I'm a lv.${result.level} ${result.title} (${result.beltColor} belt) on @hacklab_so with ${formatTokens(Number(result.tokensTotal))} tokens burned across Claude Code, Codex & Cursor.\n\nWhat's your power level?\nhacklab.so/${handle}`);
529
+ const tweetUrl = `https://x.com/intent/tweet?text=${tweetText}`;
530
+ await openBrowser(tweetUrl);
531
+ }
532
+ clack.outro('hack the planet.');
533
+ }
534
+ //# sourceMappingURL=claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function configCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,48 @@
1
+ import { loadConfig, saveConfig } from '../config.js';
2
+ import { dim, error, info, success } from '../ui.js';
3
+ export async function configCommand(args) {
4
+ const [key, ...valueParts] = args;
5
+ const value = valueParts.join(' ');
6
+ if (!key) {
7
+ const config = await loadConfig();
8
+ console.log('');
9
+ info('current config:');
10
+ if (config.cursorApiKey) {
11
+ info(` cursor-api-key: ${dim(`${config.cursorApiKey.slice(0, 8)}...`)}`);
12
+ }
13
+ if (config.cursorEmail) {
14
+ info(` cursor-email: ${config.cursorEmail}`);
15
+ }
16
+ if (!config.cursorApiKey && !config.cursorEmail) {
17
+ info(` ${dim('(empty)')}`);
18
+ }
19
+ console.log('');
20
+ info('available keys:');
21
+ info(` ${dim('cursor-api-key')} your Cursor team API key`);
22
+ info(` ${dim('cursor-email')} your Cursor account email`);
23
+ console.log('');
24
+ return;
25
+ }
26
+ if (!value) {
27
+ error(`usage: hacklab config ${key} <value>`);
28
+ process.exit(1);
29
+ }
30
+ const config = await loadConfig();
31
+ switch (key) {
32
+ case 'cursor-api-key':
33
+ config.cursorApiKey = value;
34
+ await saveConfig(config);
35
+ success(`cursor-api-key saved`);
36
+ break;
37
+ case 'cursor-email':
38
+ config.cursorEmail = value;
39
+ await saveConfig(config);
40
+ success(`cursor-email set to ${value}`);
41
+ break;
42
+ default:
43
+ error(`unknown config key: ${key}`);
44
+ info(`available: cursor-api-key, cursor-email`);
45
+ process.exit(1);
46
+ }
47
+ }
48
+ //# sourceMappingURL=config.js.map
@@ -0,0 +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"}
@@ -0,0 +1,2 @@
1
+ export declare function dojoInit(pathArg?: string): Promise<void>;
2
+ //# sourceMappingURL=dojo-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dojo-init.d.ts","sourceRoot":"","sources":["../../src/commands/dojo-init.ts"],"names":[],"mappings":"AASA,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,iBAwF9C"}