hacklab 0.22.3 → 26.921.1

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 (259) hide show
  1. package/README.md +23 -430
  2. package/dist/index.js +132 -23
  3. package/package.json +20 -42
  4. package/LICENSE +0 -21
  5. package/dist/agent-handoff.d.ts +0 -51
  6. package/dist/agent-handoff.d.ts.map +0 -1
  7. package/dist/agent-handoff.js +0 -91
  8. package/dist/agent-handoff.js.map +0 -1
  9. package/dist/api-client.d.ts +0 -18
  10. package/dist/api-client.d.ts.map +0 -1
  11. package/dist/api-client.js +0 -40
  12. package/dist/api-client.js.map +0 -1
  13. package/dist/belt.d.ts +0 -25
  14. package/dist/belt.d.ts.map +0 -1
  15. package/dist/belt.js +0 -113
  16. package/dist/belt.js.map +0 -1
  17. package/dist/card.d.ts +0 -66
  18. package/dist/card.d.ts.map +0 -1
  19. package/dist/card.js +0 -151
  20. package/dist/card.js.map +0 -1
  21. package/dist/cli.d.ts +0 -2
  22. package/dist/cli.d.ts.map +0 -1
  23. package/dist/cli.js +0 -238
  24. package/dist/cli.js.map +0 -1
  25. package/dist/commands/book.d.ts +0 -14
  26. package/dist/commands/book.d.ts.map +0 -1
  27. package/dist/commands/book.js +0 -90
  28. package/dist/commands/book.js.map +0 -1
  29. package/dist/commands/chat.d.ts +0 -36
  30. package/dist/commands/chat.d.ts.map +0 -1
  31. package/dist/commands/chat.js +0 -642
  32. package/dist/commands/chat.js.map +0 -1
  33. package/dist/commands/config.d.ts +0 -2
  34. package/dist/commands/config.d.ts.map +0 -1
  35. package/dist/commands/config.js +0 -84
  36. package/dist/commands/config.js.map +0 -1
  37. package/dist/commands/daemon.d.ts +0 -19
  38. package/dist/commands/daemon.d.ts.map +0 -1
  39. package/dist/commands/daemon.js +0 -72
  40. package/dist/commands/daemon.js.map +0 -1
  41. package/dist/commands/drop.d.ts +0 -12
  42. package/dist/commands/drop.d.ts.map +0 -1
  43. package/dist/commands/drop.js +0 -103
  44. package/dist/commands/drop.js.map +0 -1
  45. package/dist/commands/drops.d.ts +0 -9
  46. package/dist/commands/drops.d.ts.map +0 -1
  47. package/dist/commands/drops.js +0 -96
  48. package/dist/commands/drops.js.map +0 -1
  49. package/dist/commands/essay.d.ts +0 -40
  50. package/dist/commands/essay.d.ts.map +0 -1
  51. package/dist/commands/essay.js +0 -651
  52. package/dist/commands/essay.js.map +0 -1
  53. package/dist/commands/hackathon.d.ts +0 -2
  54. package/dist/commands/hackathon.d.ts.map +0 -1
  55. package/dist/commands/hackathon.js +0 -893
  56. package/dist/commands/hackathon.js.map +0 -1
  57. package/dist/commands/hacker.d.ts +0 -2
  58. package/dist/commands/hacker.d.ts.map +0 -1
  59. package/dist/commands/hacker.js +0 -87
  60. package/dist/commands/hacker.js.map +0 -1
  61. package/dist/commands/jobs.d.ts +0 -18
  62. package/dist/commands/jobs.d.ts.map +0 -1
  63. package/dist/commands/jobs.js +0 -138
  64. package/dist/commands/jobs.js.map +0 -1
  65. package/dist/commands/keys.d.ts +0 -2
  66. package/dist/commands/keys.d.ts.map +0 -1
  67. package/dist/commands/keys.js +0 -138
  68. package/dist/commands/keys.js.map +0 -1
  69. package/dist/commands/login.d.ts +0 -83
  70. package/dist/commands/login.d.ts.map +0 -1
  71. package/dist/commands/login.js +0 -236
  72. package/dist/commands/login.js.map +0 -1
  73. package/dist/commands/logout.d.ts +0 -2
  74. package/dist/commands/logout.d.ts.map +0 -1
  75. package/dist/commands/logout.js +0 -22
  76. package/dist/commands/logout.js.map +0 -1
  77. package/dist/commands/org-jobs.d.ts +0 -50
  78. package/dist/commands/org-jobs.d.ts.map +0 -1
  79. package/dist/commands/org-jobs.js +0 -383
  80. package/dist/commands/org-jobs.js.map +0 -1
  81. package/dist/commands/org.d.ts +0 -67
  82. package/dist/commands/org.d.ts.map +0 -1
  83. package/dist/commands/org.js +0 -1244
  84. package/dist/commands/org.js.map +0 -1
  85. package/dist/commands/ping.d.ts +0 -2
  86. package/dist/commands/ping.d.ts.map +0 -1
  87. package/dist/commands/ping.js +0 -50
  88. package/dist/commands/ping.js.map +0 -1
  89. package/dist/commands/profile.d.ts +0 -72
  90. package/dist/commands/profile.d.ts.map +0 -1
  91. package/dist/commands/profile.js +0 -672
  92. package/dist/commands/profile.js.map +0 -1
  93. package/dist/commands/project.d.ts +0 -2
  94. package/dist/commands/project.d.ts.map +0 -1
  95. package/dist/commands/project.js +0 -583
  96. package/dist/commands/project.js.map +0 -1
  97. package/dist/commands/referral.d.ts +0 -6
  98. package/dist/commands/referral.d.ts.map +0 -1
  99. package/dist/commands/referral.js +0 -93
  100. package/dist/commands/referral.js.map +0 -1
  101. package/dist/commands/rtfm.d.ts +0 -9
  102. package/dist/commands/rtfm.d.ts.map +0 -1
  103. package/dist/commands/rtfm.js +0 -114
  104. package/dist/commands/rtfm.js.map +0 -1
  105. package/dist/commands/scan.d.ts +0 -13
  106. package/dist/commands/scan.d.ts.map +0 -1
  107. package/dist/commands/scan.js +0 -286
  108. package/dist/commands/scan.js.map +0 -1
  109. package/dist/commands/scout.d.ts +0 -18
  110. package/dist/commands/scout.d.ts.map +0 -1
  111. package/dist/commands/scout.js +0 -232
  112. package/dist/commands/scout.js.map +0 -1
  113. package/dist/commands/setup-rail.d.ts +0 -58
  114. package/dist/commands/setup-rail.d.ts.map +0 -1
  115. package/dist/commands/setup-rail.js +0 -135
  116. package/dist/commands/setup-rail.js.map +0 -1
  117. package/dist/commands/setup.d.ts +0 -29
  118. package/dist/commands/setup.d.ts.map +0 -1
  119. package/dist/commands/setup.js +0 -442
  120. package/dist/commands/setup.js.map +0 -1
  121. package/dist/commands/sync.d.ts +0 -9
  122. package/dist/commands/sync.d.ts.map +0 -1
  123. package/dist/commands/sync.js +0 -345
  124. package/dist/commands/sync.js.map +0 -1
  125. package/dist/commands/update.d.ts +0 -2
  126. package/dist/commands/update.d.ts.map +0 -1
  127. package/dist/commands/update.js +0 -92
  128. package/dist/commands/update.js.map +0 -1
  129. package/dist/commands/whoami.d.ts +0 -2
  130. package/dist/commands/whoami.d.ts.map +0 -1
  131. package/dist/commands/whoami.js +0 -41
  132. package/dist/commands/whoami.js.map +0 -1
  133. package/dist/config.d.ts +0 -78
  134. package/dist/config.d.ts.map +0 -1
  135. package/dist/config.js +0 -93
  136. package/dist/config.js.map +0 -1
  137. package/dist/daily-sync.d.ts +0 -150
  138. package/dist/daily-sync.d.ts.map +0 -1
  139. package/dist/daily-sync.js +0 -665
  140. package/dist/daily-sync.js.map +0 -1
  141. package/dist/dossier.d.ts +0 -73
  142. package/dist/dossier.d.ts.map +0 -1
  143. package/dist/dossier.js +0 -141
  144. package/dist/dossier.js.map +0 -1
  145. package/dist/field-normalize.d.ts +0 -4
  146. package/dist/field-normalize.d.ts.map +0 -1
  147. package/dist/field-normalize.js +0 -8
  148. package/dist/field-normalize.js.map +0 -1
  149. package/dist/index.d.ts +0 -3
  150. package/dist/index.d.ts.map +0 -1
  151. package/dist/index.js.map +0 -1
  152. package/dist/job-fields.d.ts +0 -47
  153. package/dist/job-fields.d.ts.map +0 -1
  154. package/dist/job-fields.js +0 -148
  155. package/dist/job-fields.js.map +0 -1
  156. package/dist/machine.d.ts +0 -15
  157. package/dist/machine.d.ts.map +0 -1
  158. package/dist/machine.js +0 -64
  159. package/dist/machine.js.map +0 -1
  160. package/dist/org-fields.d.ts +0 -57
  161. package/dist/org-fields.d.ts.map +0 -1
  162. package/dist/org-fields.js +0 -167
  163. package/dist/org-fields.js.map +0 -1
  164. package/dist/posthog.d.ts +0 -38
  165. package/dist/posthog.d.ts.map +0 -1
  166. package/dist/posthog.js +0 -224
  167. package/dist/posthog.js.map +0 -1
  168. package/dist/project-fields.d.ts +0 -40
  169. package/dist/project-fields.d.ts.map +0 -1
  170. package/dist/project-fields.js +0 -79
  171. package/dist/project-fields.js.map +0 -1
  172. package/dist/prompt-consent.d.ts +0 -73
  173. package/dist/prompt-consent.d.ts.map +0 -1
  174. package/dist/prompt-consent.js +0 -191
  175. package/dist/prompt-consent.js.map +0 -1
  176. package/dist/prompt-stats.d.ts +0 -226
  177. package/dist/prompt-stats.d.ts.map +0 -1
  178. package/dist/prompt-stats.js +0 -561
  179. package/dist/prompt-stats.js.map +0 -1
  180. package/dist/referral.d.ts +0 -14
  181. package/dist/referral.d.ts.map +0 -1
  182. package/dist/referral.js +0 -28
  183. package/dist/referral.js.map +0 -1
  184. package/dist/registry.d.ts +0 -15
  185. package/dist/registry.d.ts.map +0 -1
  186. package/dist/registry.js +0 -180
  187. package/dist/registry.js.map +0 -1
  188. package/dist/resolve-command.d.ts +0 -20
  189. package/dist/resolve-command.d.ts.map +0 -1
  190. package/dist/resolve-command.js +0 -21
  191. package/dist/resolve-command.js.map +0 -1
  192. package/dist/scanners/antigravity.d.ts +0 -41
  193. package/dist/scanners/antigravity.d.ts.map +0 -1
  194. package/dist/scanners/antigravity.js +0 -210
  195. package/dist/scanners/antigravity.js.map +0 -1
  196. package/dist/scanners/github-copilot-telemetry.d.ts +0 -23
  197. package/dist/scanners/github-copilot-telemetry.d.ts.map +0 -1
  198. package/dist/scanners/github-copilot-telemetry.js +0 -220
  199. package/dist/scanners/github-copilot-telemetry.js.map +0 -1
  200. package/dist/scanners/github-copilot.d.ts +0 -68
  201. package/dist/scanners/github-copilot.d.ts.map +0 -1
  202. package/dist/scanners/github-copilot.js +0 -262
  203. package/dist/scanners/github-copilot.js.map +0 -1
  204. package/dist/scanners/incremental.d.ts +0 -282
  205. package/dist/scanners/incremental.d.ts.map +0 -1
  206. package/dist/scanners/incremental.js +0 -788
  207. package/dist/scanners/incremental.js.map +0 -1
  208. package/dist/scanners/index.d.ts +0 -116
  209. package/dist/scanners/index.d.ts.map +0 -1
  210. package/dist/scanners/index.js +0 -726
  211. package/dist/scanners/index.js.map +0 -1
  212. package/dist/scanners/sqlite.d.ts +0 -18
  213. package/dist/scanners/sqlite.d.ts.map +0 -1
  214. package/dist/scanners/sqlite.js +0 -63
  215. package/dist/scanners/sqlite.js.map +0 -1
  216. package/dist/scanners/util.d.ts +0 -112
  217. package/dist/scanners/util.d.ts.map +0 -1
  218. package/dist/scanners/util.js +0 -167
  219. package/dist/scanners/util.js.map +0 -1
  220. package/dist/session.d.ts +0 -106
  221. package/dist/session.d.ts.map +0 -1
  222. package/dist/session.js +0 -191
  223. package/dist/session.js.map +0 -1
  224. package/dist/share-card-colors.d.ts +0 -19
  225. package/dist/share-card-colors.d.ts.map +0 -1
  226. package/dist/share-card-colors.js +0 -36
  227. package/dist/share-card-colors.js.map +0 -1
  228. package/dist/share-card.d.ts +0 -31
  229. package/dist/share-card.d.ts.map +0 -1
  230. package/dist/share-card.js +0 -380
  231. package/dist/share-card.js.map +0 -1
  232. package/dist/share.d.ts +0 -17
  233. package/dist/share.d.ts.map +0 -1
  234. package/dist/share.js +0 -75
  235. package/dist/share.js.map +0 -1
  236. package/dist/sync.d.ts +0 -100
  237. package/dist/sync.d.ts.map +0 -1
  238. package/dist/sync.js +0 -304
  239. package/dist/sync.js.map +0 -1
  240. package/dist/ui.d.ts +0 -33
  241. package/dist/ui.d.ts.map +0 -1
  242. package/dist/ui.js +0 -127
  243. package/dist/ui.js.map +0 -1
  244. package/dist/utils/npmGlobal.d.ts +0 -30
  245. package/dist/utils/npmGlobal.d.ts.map +0 -1
  246. package/dist/utils/npmGlobal.js +0 -69
  247. package/dist/utils/npmGlobal.js.map +0 -1
  248. package/dist/utils/openBrowser.d.ts +0 -14
  249. package/dist/utils/openBrowser.d.ts.map +0 -1
  250. package/dist/utils/openBrowser.js +0 -47
  251. package/dist/utils/openBrowser.js.map +0 -1
  252. package/dist/utils/updateCheck.d.ts +0 -16
  253. package/dist/utils/updateCheck.d.ts.map +0 -1
  254. package/dist/utils/updateCheck.js +0 -111
  255. package/dist/utils/updateCheck.js.map +0 -1
  256. package/dist/utils/waitForEnter.d.ts +0 -12
  257. package/dist/utils/waitForEnter.d.ts.map +0 -1
  258. package/dist/utils/waitForEnter.js +0 -43
  259. package/dist/utils/waitForEnter.js.map +0 -1
package/dist/card.js DELETED
@@ -1,151 +0,0 @@
1
- import { getTitle } from './belt.js';
2
- import { formatTokens } from './scanners/util.js';
3
- import { dim, displayWidth, mint, padEndTo, rankColor, stripControl, truncateToWidth, white, } from './ui.js';
4
- const DESIGN_WIDTH = 68;
5
- const MIN_WIDTH = 45; // below this the fixed 30d row can't fit; wrapping is accepted
6
- /** 8 log-scaled buckets for the 30-day sparkline. Zero renders dim, lit cells mint. */
7
- const SPARK = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];
8
- function resolveWidth(columns) {
9
- const cols = columns ?? DESIGN_WIDTH;
10
- return Math.max(MIN_WIDTH, Math.min(DESIGN_WIDTH, cols));
11
- }
12
- /** ISO string → `YYYY-MM-DD`. */
13
- function ymd(iso) {
14
- return iso.slice(0, 10);
15
- }
16
- function ageDays(iso, now) {
17
- return Math.max(0, Math.floor((now.getTime() - Date.parse(iso)) / 86_400_000));
18
- }
19
- /** A left segment and a right segment on one line, right-aligned to `width`. */
20
- function justify(width, leftColored, rightColored) {
21
- const gap = Math.max(1, width - displayWidth(leftColored) - displayWidth(rightColored));
22
- return leftColored + ' '.repeat(gap) + rightColored;
23
- }
24
- function rule(width) {
25
- return dim('─'.repeat(width));
26
- }
27
- /** `████ L32 SHINOBI` — coloured band + dim romaji rank. Belt derived from level. */
28
- function beltBadge(level) {
29
- const band = rankColor(level, '████');
30
- const label = dim(` L${level} ${getTitle(level).toUpperCase()}`);
31
- return band + label;
32
- }
33
- function sparkline(values) {
34
- const max = Math.max(0, ...values);
35
- const denom = Math.log2(max + 1);
36
- return values
37
- .map((v) => {
38
- if (v <= 0)
39
- return dim('▁');
40
- const frac = denom > 0 ? Math.log2(v + 1) / denom : 0;
41
- const idx = Math.min(SPARK.length - 1, Math.max(0, Math.round(frac * (SPARK.length - 1))));
42
- return mint(SPARK[idx] ?? '█');
43
- })
44
- .join('');
45
- }
46
- /** A `label value` row; the label is dim, the value plain, truncated to width. */
47
- function labelled(width, label, value) {
48
- const head = dim(padEndTo(label, 8)); // "joined ", "streak ", …
49
- const budget = width - displayWidth(head);
50
- return head + truncateToWidth(value, budget);
51
- }
52
- /** A recent-list section: `HEADER N` then rows, or `HEADER 0 nothing yet`. */
53
- function section(width, label, total, rows) {
54
- if (total === 0)
55
- return [dim(`${label} 0 nothing yet`)];
56
- return [`${label} ${total}`, ...rows.map((r) => truncateToWidth(r, width))];
57
- }
58
- /**
59
- * Projects/essays row-budget rule: ≤3 rows below the header. When more than 3
60
- * exist, show 2 items + `+N more`; otherwise show them all.
61
- */
62
- function recentRows(total, items, row) {
63
- if (total > 3) {
64
- return [...items.slice(0, 2).map(row), ` +${total - 2} more`];
65
- }
66
- return items.map(row);
67
- }
68
- /**
69
- * Render the full one-screen card as an array of lines (caller joins with \n).
70
- * Pure: no I/O, deterministic given `now`. Every user-supplied string is passed
71
- * through stripControl before it reaches the terminal.
72
- */
73
- export function renderCard(card, opts = {}) {
74
- const width = resolveWidth(opts.columns);
75
- const now = opts.now ?? new Date();
76
- const lines = [];
77
- // Line 1 — identity + belt.
78
- const name = card.displayName ? ` · ${stripControl(card.displayName)}` : '';
79
- const identity = white(truncateToWidth(`${stripControl(card.handle)}${name}`, width - displayWidth(beltBadge(card.level)) - 1));
80
- lines.push(justify(width, identity, beltBadge(card.level)));
81
- // Line 2 — bio (left) + open-to-work dot (right). Skipped when both absent.
82
- const bio = card.bio
83
- ? truncateToWidth(stripControl(card.bio), width - 16)
84
- : '';
85
- const otw = card.openToWork ? `${mint('●')} open to work` : '';
86
- if (bio || otw)
87
- lines.push(justify(width, bio, otw));
88
- lines.push(rule(width));
89
- // Identity block.
90
- const claimed = card.claimedAt
91
- ? `claimed ${ymd(card.claimedAt)}`
92
- : 'not claimed yet';
93
- const rank = card.rank != null ? ` rank #${card.rank}` : '';
94
- lines.push(labelled(width, 'joined', `${ymd(card.joinedAt)} (${ageDays(card.joinedAt, now)}d) ${claimed}${rank}`));
95
- // Activity block, with the two null-state collapses.
96
- if (card.tokensTotal === 0) {
97
- lines.push(dim('no activity yet. run hacklab sync to bank the proof.'));
98
- }
99
- else {
100
- lines.push(labelled(width, 'streak', `${card.currentStreak}d current · ${card.longestStreak}d longest active ${card.activeDays30}/30d`));
101
- const cost = `$${Math.round(card.estimatedCost).toLocaleString('en-US')} est. cost`;
102
- lines.push(labelled(width, 'tokens', `${formatTokens(card.tokensTotal)} burned · ${formatTokens(card.tokens30d)} last 30d · ${cost}`));
103
- // Models + sparkline collapse when there's no 30-day activity.
104
- if (card.tokens30d > 0) {
105
- const models = card.topModels30d
106
- .slice(0, 2)
107
- .map((m) => `${m.model} ${m.pct}%`)
108
- .join(' · ');
109
- if (models)
110
- lines.push(labelled(width, 'models', models));
111
- lines.push(dim(padEndTo('30d', 8)) + sparkline(card.activity30));
112
- }
113
- }
114
- lines.push(rule(width));
115
- // Recent work.
116
- lines.push(...section(width, 'PROJECTS', card.counts.projects, recentRows(card.counts.projects, card.recent.projects, (p) => ` ${padEndTo(truncateToWidth(stripControl(p.title), 16), 16)} ${stripControl(p.description ?? '')}`)));
117
- lines.push(...section(width, 'ESSAYS', card.counts.essays, recentRows(card.counts.essays, card.recent.essays, (e) => ` ${e.publishedAt ? ymd(e.publishedAt) : ' '} ${stripControl(e.title)}`)));
118
- // Drops: 1 item, no "+N more"; the count lives in the header.
119
- if (card.counts.drops === 0) {
120
- lines.push(dim('DROPS 0 nothing yet'));
121
- }
122
- else {
123
- const last = card.recent.drops[0];
124
- lines.push(`DROPS ${card.counts.drops}${last ? ` · last ${ymd(last.createdAt)}` : ''}`);
125
- if (last) {
126
- lines.push(truncateToWidth(` "${stripControl(last.text)}"`, width));
127
- }
128
- }
129
- lines.push(rule(width));
130
- lines.push(dim(`--json for the full payload · hacklab.so/${card.handle}`));
131
- return lines;
132
- }
133
- /**
134
- * The compact in-chat card (`/who`): 4 lines, no rules, no sparkline. Same
135
- * strip discipline. Returned as separate lines so the chat renderer can push
136
- * them as one Entry per row (preserving the one-row-per-entry invariant).
137
- */
138
- export function renderCompact(card) {
139
- const name = card.displayName ? ` · ${stripControl(card.displayName)}` : '';
140
- const otw = card.openToWork ? ` · ${mint('●')} open to work` : '';
141
- const joined = card.claimedAt
142
- ? `joined ${ageDays(card.claimedAt, new Date())}d ago`
143
- : 'not claimed yet';
144
- return [
145
- `${white(stripControl(card.handle))}${name} · ${beltBadge(card.level)}${otw}`,
146
- `${formatTokens(card.tokensTotal)} tokens · ${formatTokens(card.tokens30d)}/30d · ${card.currentStreak}d streak · ${joined}`,
147
- `${card.counts.projects} projects · ${card.counts.essays} essays · ${card.counts.drops} drops`,
148
- dim(`hacklab.so/${card.handle}`),
149
- ];
150
- }
151
- //# sourceMappingURL=card.js.map
package/dist/card.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"card.js","sourceRoot":"","sources":["../src/card.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js DELETED
@@ -1,238 +0,0 @@
1
- // The real CLI. Loaded via a dynamic import from index.ts *after* its Node
2
- // version guard passes — so the Node 20+ APIs these imports reach (e.g.
3
- // @clack/core's `styleText` from node:util) never link on an unsupported Node.
4
- import { createRequire } from 'node:module';
5
- import { clearSyncPaused, readSyncPaused } from './daily-sync.js';
6
- import { captureException, maybePrintTelemetryNotice, shutdownTelemetry, } from './posthog.js';
7
- import { findCommand } from './registry.js';
8
- import { resolveCommand } from './resolve-command.js';
9
- import { HACKLAB_ENVIRONMENTS, loadSession, resolveHacklabEnv, } from './session.js';
10
- import { banner, bold, dim } from './ui.js';
11
- import { notifyIfOutdated } from './utils/updateCheck.js';
12
- // Single source of the published version: read it from package.json (one level
13
- // up from this module in both `dist/` and `src/`) instead of hardcoding a string
14
- // that silently drifts from the real package version. `createRequire` resolves
15
- // JSON the same way under tsx (dev) and the compiled bin.
16
- const require = createRequire(import.meta.url);
17
- const { version: VERSION } = require('../package.json');
18
- /**
19
- * The global flags, each mapping onto the env var the rest of the CLI already
20
- * reads. Going through the env is what makes precedence fall out for free: the
21
- * flag overwrites any inherited value, and the readers (getAppUrl,
22
- * resolveCursorAuth) prefer the env over the config file. It also means a value
23
- * passed once on the command line reaches anything the command shells out to.
24
- */
25
- const GLOBAL_FLAGS = {
26
- '--env': (value) => {
27
- const env = resolveHacklabEnv(value);
28
- if (!env) {
29
- console.error(`--env must be one of: ${Object.keys(HACKLAB_ENVIRONMENTS).join(', ')} (abbreviations like dev/prod/stag work)`);
30
- process.exit(1);
31
- }
32
- process.env.HACKLAB_APP_URL = HACKLAB_ENVIRONMENTS[env];
33
- },
34
- '--cursor-api-key': (value) => {
35
- process.env.CURSOR_API_KEY = value;
36
- },
37
- '--cursor-email': (value) => {
38
- process.env.CURSOR_EMAIL = value;
39
- },
40
- };
41
- /**
42
- * Pull the global flags out of argv and apply them, returning the remaining args
43
- * so per-command parsing never sees them. Both `--flag value` and `--flag=value`
44
- * spellings work.
45
- */
46
- function applyGlobalFlags(argv) {
47
- const rest = [];
48
- for (let i = 0; i < argv.length; i++) {
49
- const arg = argv[i];
50
- const eq = arg.indexOf('=');
51
- const name = eq === -1 ? arg : arg.slice(0, eq);
52
- const apply = GLOBAL_FLAGS[name];
53
- if (!apply) {
54
- rest.push(arg);
55
- continue;
56
- }
57
- const value = eq === -1 ? argv[++i] : arg.slice(eq + 1);
58
- if (!value) {
59
- console.error(`${name} requires a value`);
60
- process.exit(1);
61
- }
62
- apply(value);
63
- }
64
- return rest;
65
- }
66
- const [cmd, ...args] = applyGlobalFlags(process.argv.slice(2));
67
- // The help page is a curated, hand-grouped tour of the CLI — not a dump of the
68
- // registry. That's deliberate: the registry stays the source of truth for
69
- // dispatch, while this listing groups commands by what the user is trying to do
70
- // and leaves out the niche ones (book, jobs, keys, scout) that would drown the
71
- // core flow. Adding a command to the registry does NOT add it here — decide
72
- // whether it belongs on the front page.
73
- const HELP_GROUPS = [
74
- {
75
- title: 'start here',
76
- rows: [
77
- {
78
- label: 'setup',
79
- summary: 'first run: scan, sign in, start the background sync',
80
- },
81
- ],
82
- },
83
- {
84
- title: 'auth',
85
- rows: [
86
- { label: 'login', summary: 'sign in to hacklab' },
87
- { label: 'logout', summary: "clear this machine's session" },
88
- { label: 'whoami', summary: "who you're logged in as" },
89
- ],
90
- },
91
- {
92
- title: 'you',
93
- rows: [
94
- { label: 'profile', summary: 'view and edit your profile' },
95
- { label: 'referral', summary: 'your invite link' },
96
- ],
97
- },
98
- {
99
- title: 'game',
100
- rows: [
101
- { label: 'rules', summary: 'understand how the ranking works' },
102
- { label: 'scan', summary: 'scan this machine and share the card' },
103
- { label: 'sync', summary: 'upload local AI usage to your profile' },
104
- ],
105
- },
106
- {
107
- title: 'posting',
108
- rows: [
109
- { label: 'drop <message>', summary: 'post a drop' },
110
- { label: 'drops', summary: 'your drops' },
111
- { label: 'project', summary: 'add, list, and edit your projects' },
112
- { label: 'essay', summary: 'post, list, and update your essays' },
113
- ],
114
- },
115
- {
116
- title: 'people',
117
- rows: [
118
- { label: 'chat', summary: 'the live public chat channel' },
119
- { label: 'hacker', summary: 'view hacker profiles' },
120
- ],
121
- },
122
- {
123
- title: 'organisations',
124
- rows: [{ label: 'org', summary: 'create and edit your organisations' }],
125
- },
126
- {
127
- title: 'hackathons',
128
- rows: [{ label: 'hackathon', summary: 'RSVP, team up, and submit' }],
129
- },
130
- {
131
- title: 'manuals',
132
- rows: [
133
- { label: 'rtfm', summary: 'list all manuals' },
134
- {
135
- label: 'rtfm <topic>',
136
- summary: 'print the manual: exact commands, prereqs, done-when criteria',
137
- },
138
- ],
139
- },
140
- {
141
- title: 'settings',
142
- rows: [
143
- { label: 'update', summary: 'update this CLI' },
144
- {
145
- label: 'daemon [off]',
146
- summary: 'summon the background sync (off tears it down)',
147
- },
148
- {
149
- label: 'config <key> <val>',
150
- summary: 'cursor key, email, prompt-sync',
151
- },
152
- ],
153
- },
154
- {
155
- title: 'flags',
156
- rows: [
157
- {
158
- label: '--json',
159
- summary: 'machine-readable output (agents: always use this)',
160
- },
161
- { label: '--help / -h', summary: 'show help for a command' },
162
- { label: '--version / -v', summary: 'show CLI version' },
163
- ],
164
- },
165
- ];
166
- function printHelp() {
167
- banner();
168
- // Align the summaries: pad every label to the widest one across all groups so
169
- // the whole page reads as one table.
170
- const width = Math.max(...HELP_GROUPS.flatMap((g) => g.rows.map((r) => r.label.length)));
171
- for (const { title, rows } of HELP_GROUPS) {
172
- console.log('');
173
- console.log(bold(` ${title}`));
174
- for (const { label, summary } of rows) {
175
- console.log(` ${dim(label.padEnd(width))} ${summary}`);
176
- }
177
- }
178
- console.log('');
179
- }
180
- // Node-version guard (T9). The CLI uses modern Node APIs (global fetch,
181
- // AbortSignal.timeout). Fail fast with a clear message instead of a cryptic
182
- // runtime error on an old runtime. The nvm hint matters because a piped
183
- async function main() {
184
- // Bare `hacklab` (no command) prints help, same as `--help`/`-h`. Runs before
185
- // the update nudge so it reads as plain help, matching the `--help` path.
186
- if (!cmd || cmd === '--help' || cmd === '-h') {
187
- printHelp();
188
- process.exit(0);
189
- }
190
- if (cmd === '--version' || cmd === '-v') {
191
- console.log(VERSION);
192
- process.exit(0);
193
- }
194
- // One-time anonymous-telemetry notice (interactive only, shown once). Before
195
- // the update nudge so, on the very first run, consent is disclosed above any
196
- // other output.
197
- await maybePrintTelemetryNotice();
198
- // One-line nudge if a newer hacklab is published (interactive only, cached
199
- // daily, timeout-guarded). Must run before any command output so it reads as
200
- // a header, not buried in results.
201
- await notifyIfOutdated(VERSION);
202
- // Resolve a possibly-abbreviated command to its full name (e.g. `sy` -> sync,
203
- // `or` -> org). Exact matches always win; an ambiguous prefix is
204
- // rejected with the candidates so the user can disambiguate.
205
- const resolution = resolveCommand(cmd);
206
- if (resolution.kind === 'ambiguous') {
207
- console.error(`ambiguous command "${cmd}": ${resolution.matches.join(' or ')}?`);
208
- process.exit(1);
209
- }
210
- const command = resolution.kind === 'match' ? findCommand(resolution.name) : undefined;
211
- if (!command) {
212
- console.error(`unknown command: ${cmd}`);
213
- console.error('run hacklab --help for usage');
214
- process.exit(1);
215
- }
216
- // Surface a paused daily background sync (e.g. the session expired while the
217
- // machine was off) once, then clear the marker. Skipped for the auth commands
218
- // that fix it (login), so we never nag mid-fix.
219
- if (process.stdout.isTTY && command.name !== 'login') {
220
- const paused = await readSyncPaused();
221
- if (paused) {
222
- console.error(dim(`paused: daily background sync — ${paused}`));
223
- await clearSyncPaused();
224
- }
225
- }
226
- await command.run(args);
227
- // Best-effort final flush for the happy path. Per-event captures already flush
228
- // eagerly (flushAt: 1), so this mainly drains any autocaptured exception.
229
- await shutdownTelemetry();
230
- }
231
- main().catch(async (err) => {
232
- console.error(err instanceof Error ? err.message : String(err));
233
- const session = await loadSession().catch(() => null);
234
- await captureException(err, session?.handle);
235
- await shutdownTelemetry();
236
- process.exit(1);
237
- });
238
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- export type BookArgs = {
2
- title: string;
3
- author: string;
4
- takeaways?: string;
5
- };
6
- /**
7
- * Parse `book` args: free words become the title, `-a/--author` and
8
- * `-t/--takeaways` take a quoted value. Mirrors `parseDropArgs` (drop.ts) so
9
- * each command owns its own parsing. Deliberately no manifest file — a book is
10
- * three fields, and quoting them beats authoring YAML for it.
11
- */
12
- export declare function parseBookArgs(args: string[]): BookArgs;
13
- export declare function book({ title, author, takeaways }: BookArgs): Promise<void>;
14
- //# sourceMappingURL=book.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"book.d.ts","sourceRoot":"","sources":["../../src/commands/book.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CA4CtD;AAED,wBAAsB,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,iBA2ChE"}
@@ -1,90 +0,0 @@
1
- import { loadSession, resolveAppUrl } from '../session.js';
2
- import { dim, error, info, success } from '../ui.js';
3
- const TITLE_MAX = 200;
4
- const AUTHOR_MAX = 200;
5
- const TAKEAWAYS_MAX = 5000;
6
- const USAGE = 'usage: hacklab book "Title" --author "Name" [--takeaways "what stuck with you"]';
7
- /**
8
- * Parse `book` args: free words become the title, `-a/--author` and
9
- * `-t/--takeaways` take a quoted value. Mirrors `parseDropArgs` (drop.ts) so
10
- * each command owns its own parsing. Deliberately no manifest file — a book is
11
- * three fields, and quoting them beats authoring YAML for it.
12
- */
13
- export function parseBookArgs(args) {
14
- let author;
15
- let takeaways;
16
- const words = [];
17
- for (let i = 0; i < args.length; i++) {
18
- const arg = args[i];
19
- if ((arg === '-a' || arg === '--author') && args[i + 1] !== undefined) {
20
- author = args[i + 1];
21
- i++;
22
- }
23
- else if ((arg === '-t' || arg === '--takeaways') &&
24
- args[i + 1] !== undefined) {
25
- takeaways = args[i + 1];
26
- i++;
27
- }
28
- else if (arg.startsWith('-')) {
29
- console.error(`unknown flag: ${arg}`);
30
- process.exit(1);
31
- }
32
- else {
33
- words.push(arg);
34
- }
35
- }
36
- const title = words.join(' ').trim();
37
- if (!title) {
38
- console.error(USAGE);
39
- process.exit(1);
40
- }
41
- if (!author?.trim()) {
42
- console.error('missing --author');
43
- console.error(USAGE);
44
- process.exit(1);
45
- }
46
- const trimmedTakeaways = takeaways?.trim();
47
- return {
48
- title,
49
- author: author.trim(),
50
- ...(trimmedTakeaways ? { takeaways: trimmedTakeaways } : {}),
51
- };
52
- }
53
- export async function book({ title, author, takeaways }) {
54
- const session = await loadSession();
55
- if (!session) {
56
- error('not logged in');
57
- info(`run ${dim('hacklab login')} first`);
58
- process.exit(1);
59
- }
60
- if (title.length > TITLE_MAX) {
61
- error(`title too long — ${title.length}/${TITLE_MAX} chars`);
62
- process.exit(1);
63
- }
64
- if (author.length > AUTHOR_MAX) {
65
- error(`author too long — ${author.length}/${AUTHOR_MAX} chars`);
66
- process.exit(1);
67
- }
68
- if (takeaways && takeaways.length > TAKEAWAYS_MAX) {
69
- error(`takeaways too long — ${takeaways.length}/${TAKEAWAYS_MAX} chars`);
70
- process.exit(1);
71
- }
72
- const res = await fetch(`${resolveAppUrl(session)}/api/books`, {
73
- method: 'POST',
74
- headers: {
75
- 'Content-Type': 'application/json',
76
- Authorization: `Bearer ${session.token}`,
77
- },
78
- body: JSON.stringify({ title, author, takeaways }),
79
- });
80
- if (!res.ok) {
81
- const data = await res.json().catch(() => null);
82
- error(data?.error ?? `failed (${res.status})`);
83
- process.exit(1);
84
- }
85
- success('shelved.');
86
- if (!takeaways) {
87
- info(`no takeaways — the card shows without a details button`);
88
- }
89
- }
90
- //# sourceMappingURL=book.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"book.js","sourceRoot":"","sources":["../../src/commands/book.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- import { type Session } from '../session.js';
2
- export { stripControl } from '../ui.js';
3
- export declare function baseUrl(session?: Session | null): string;
4
- export declare function datePrefix(when: Date, now: Date): string;
5
- export declare function formatTimestamp(when: string | Date, now?: Date): string;
6
- type RenderableMessage = {
7
- createdAt: string;
8
- senderHandle: string;
9
- content: string;
10
- senderLevel?: number | null;
11
- };
12
- export declare function formatLine(m: RenderableMessage, now?: Date): string;
13
- export declare function formatPendingLine(handle: string, content: string, tag: string, at?: string, now?: Date): string;
14
- export type LineIntent = {
15
- kind: 'empty';
16
- } | {
17
- kind: 'command';
18
- cmd: string;
19
- args: string[];
20
- } | {
21
- kind: 'message';
22
- content: string;
23
- };
24
- /**
25
- * Decide what a typed line means. A single leading slash is a local command and
26
- * never posts. A DOUBLED leading slash is how you post a message that starts with
27
- * a slash: it posts (and displays) verbatim, both slashes intact. Nothing is
28
- * stripped, so the optimistic placeholder, the POST body, and the server echo all
29
- * agree (reconcile-by-content) — and the server can reject single-leading-slash
30
- * content (a stale client posting a command it doesn't know is local) without
31
- * catching the doubled form. Pure + exported so these semantics are unit-tested
32
- * without driving readline.
33
- */
34
- export declare function parseLine(input: string): LineIntent;
35
- export declare function chat(args: string[]): Promise<void>;
36
- //# sourceMappingURL=chat.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,KAAK,OAAO,EAAE,MAAM,eAAe,CAAA;AAexE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAqCvC,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAExD;AAqED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,CASxD;AAKD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,GAAG,GAAE,IAAiB,GACrB,MAAM,CAKR;AAED,KAAK,iBAAiB,GAAG;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B,CAAA;AAED,wBAAgB,UAAU,CACxB,CAAC,EAAE,iBAAiB,EACpB,GAAG,GAAE,IAAiB,GACrB,MAAM,CAQR;AAQD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,EAAE,GAAE,MAAiC,EACrC,GAAG,GAAE,IAAiB,GACrB,MAAM,CAIR;AA8MD,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAExC;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CASnD;AA4UD,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,iBAkCxC"}