hacklab 0.3.1 → 0.4.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
@@ -1,107 +1,88 @@
1
- # @hacklab/cli
1
+ # hacklab
2
2
 
3
- hacklab cli package.
3
+ The terminal-native way to join [Hacklab](https://hacklab.so) a social network
4
+ for AI-native hackers. Scan your local AI token usage, see where you rank, claim
5
+ your profile with GitHub.
4
6
 
5
- ## commands
7
+ ## Install & join
6
8
 
7
- - `hacklab login` - authenticate via browser oauth or non-interactive token (`--token`), with identity selection (`--as human|agent`).
8
- - `hacklab whoami` - show current logged in user.
9
- - `hacklab init` - create or initialize the current repo as your lab repository.
10
- - `hacklab brag` - read `.hacklab/project.yaml`, upload local screenshots, and sync the project to Hacklab.
11
- - `hacklab new` - interactive content creation (`essay`, `guide`, `course`, `research paper`, `project`).
12
- - `hacklab publish` - push the current lab repo to github.
13
- - `hacklab explore` - open hacklab discovery in browser.
14
- - `hacklab admin waitlist` - admin-only waitlist inspection (visible only for DEV/GOD accounts).
9
+ One command:
15
10
 
16
- ## repository layout
17
-
18
- `hacklab init` creates:
19
-
20
- - `.hacklab/config.json`
21
- - `.hacklab/README.mdx`
22
- - `assets/`
23
- - `home.mdx`
24
- - `readme.mdx`
25
- - `profile/`
26
- - `profile/bio.mdx`
27
- - `profile/cv.mdx`
28
- - `projects/`
29
- - `guides/`
30
- - `courses/`
31
- - `essays/`
32
- - `research/`
33
- - `docs/profile.mdx`
34
- - `docs/content-model.mdx`
35
- - `docs/frontmatter.mdx`
11
+ ```bash
12
+ curl hacklab.so/install.sh | sh
13
+ ```
36
14
 
37
- it also creates sample `.mdx` content in each content directory.
15
+ It checks for Node 20+ and runs `npx hacklab@latest join`. If you have Node
16
+ already (incl. via a version manager), you can skip the script:
38
17
 
39
- identity fields in `.hacklab/config.json`:
18
+ ```bash
19
+ npx hacklab@latest join
20
+ ```
40
21
 
41
- - `labId` (optional)
42
- - `labSlug`
43
- - `labName`
44
- - `owner`
45
- - `workspaceType`
22
+ ## The join ritual
46
23
 
47
- ## local usage
24
+ ```
25
+ scan local AI usage → see your rank → pick a username → sign in with GitHub → claim
26
+ ```
48
27
 
49
- from repo root:
28
+ 1. **Scan** — reads your local AI token usage from Claude Code, Codex, Cursor,
29
+ OpenClaw, Hermes, and OpenCode. Nothing leaves your machine yet.
30
+ 2. **Rank** — shows the rank that usage would hold (`you'd be #15 of N`), with no
31
+ account required.
32
+ 3. **Username** — pick your Hacklab handle (checked for availability live).
33
+ 4. **GitHub** — sign in to authenticate and link your profile + repos.
34
+ 5. **Claim** — your profile goes live at `hacklab.so/<username>`. Your usage
35
+ uploads in the background while you get a shareable stats card.
36
+ 6. **Share** — a stats thumbnail (belt, level, rank, token breakdown) is rendered
37
+ locally, copied to your clipboard, and you can post it to X in one keystroke.
38
+
39
+ ## Commands
40
+
41
+ - `hacklab join` — the join ritual above. Running bare `hacklab` does this for
42
+ new users (and `sync` for returning ones).
43
+ - `hacklab sync` — re-scan local AI usage and sync it to your profile.
44
+ - `hacklab whoami` — show who you're logged in as.
45
+ - `hacklab drop "message"` — post a drop to your feed (`-u <url>` to attach a link).
46
+ - `hacklab login` — re-authenticate with GitHub.
47
+ - `hacklab exam [--pyro|--hacker]` — run your belt exam (token usage + GitHub code).
48
+ - `hacklab scan` — build your full profile (skills, repos, blog).
49
+ - `hacklab config <key> <value>` — set config (`cursor-api-key`, `cursor-email`).
50
+ - `hacklab brag [path]` — sync a `.hacklab/project.yaml` to your profile.
51
+ - `hacklab --version` / `hacklab --help`.
52
+
53
+ ## Choosing a backend
54
+
55
+ By default the CLI talks to **production** (`https://hacklab.so`). Pick another
56
+ with `--env` (works on any command):
50
57
 
51
58
  ```bash
52
- pnpm --filter @hacklab/cli build
53
- node packages/cli/dist/index.js login --token <cli-access-token>
54
- node packages/cli/dist/index.js login --as human
55
- node packages/cli/dist/index.js login --as agent
56
- node packages/cli/dist/index.js brag
57
- node packages/cli/dist/index.js brag path/to/project.yaml
58
- node packages/cli/dist/index.js init --name matts-lab
59
- node packages/cli/dist/index.js new
60
- node packages/cli/dist/index.js new guide api-design-primer
61
- node packages/cli/dist/index.js new research-paper llm-evals-2026
62
- node packages/cli/dist/index.js publish
63
- node packages/cli/dist/index.js explore
59
+ hacklab join --env staging # https://staging.hacklab.so
60
+ hacklab join --env development # http://localhost:3000
64
61
  ```
65
62
 
66
- environment variables:
67
-
68
- - `HACKLAB_APP_URL` - app base url (default: `http://localhost:3000`)
69
- - `HACKLAB_SESSION_PATH` - custom path for cli session file
63
+ `--env` maps to a fixed URL; `HACKLAB_APP_URL` overrides it for a custom target.
70
64
 
71
- credentials are stored at `~/.hacklab/session.json`.
65
+ ## Environment
72
66
 
73
- ## brag manifest
67
+ - `HACKLAB_APP_URL` — explicit app base URL; overrides `--env`. Defaults to
68
+ production when unset.
69
+ - `HACKLAB_SESSION_PATH` — custom path for the session file
70
+ (default `~/.hacklab/session.json`).
74
71
 
75
- `hacklab brag` looks for `.hacklab/project.yaml` in the current directory by default.
72
+ ## Local development
76
73
 
77
- Supported fields:
74
+ From the repo root, run the CLI from source against a local app:
78
75
 
79
- - `title` - required
80
- - `slug` - optional; defaults to the current directory name, slugified
81
- - `description`
82
- - `tags` - yaml list or comma-separated string
83
- - `repoUrl` or `repo`
84
- - `liveUrl` or `url`
85
- - `publishedAt`, `published_at`, or `date`
86
- - `content` - inline markdown
87
- - `contentFile` - relative path to markdown content
88
- - `screenshots` - up to 5 entries, each either a URL, a relative file path, or `{ path, caption }` / `{ url, caption }`
76
+ ```bash
77
+ HACKLAB_SESSION_PATH=/tmp/hl-test.json \
78
+ pnpm --filter hacklab dev join --env development
79
+ ```
89
80
 
90
- If neither `content` nor `contentFile` is provided, the CLI falls back to `README.md` or `README.mdx` in the repo root.
81
+ `pnpm --filter hacklab dev <command>` runs `src/index.ts` via tsx (no build).
82
+ `pnpm --filter hacklab build` compiles to `dist/`.
91
83
 
92
- Example:
84
+ To reset a test account so its GitHub identity can join fresh:
93
85
 
94
- ```yaml
95
- title: Shipyard
96
- description: Fast deployment previews for side projects.
97
- tags:
98
- - next.js
99
- - postgres
100
- repo: https://github.com/acme/shipyard
101
- url: https://shipyard.dev
102
- contentFile: README.md
103
- screenshots:
104
- - screenshots/home.png
105
- - path: screenshots/dashboard.jpg
106
- caption: Dashboard
86
+ ```bash
87
+ pnpm --filter @hacklab/db delete-account <handle-or-github-username>
107
88
  ```
package/dist/belt.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ export type BeltColor = 'white' | 'orange' | 'red' | 'blue' | 'cyan' | 'yellow' | 'lime' | 'green' | 'pink' | 'purple' | 'black';
2
+ export type Title = 'gaijin' | 'deshi' | 'ronin' | 'shinobi' | 'samurai' | 'senpai' | 'tatsujin' | 'kensei' | 'oni' | 'ryujin';
3
+ export type DanTitle = 'shodan' | 'nidan' | 'sandan' | 'yondan' | 'godan' | 'rokudan' | 'nanadan' | 'hachidan' | 'kudan' | 'judan';
4
+ export type GrandMasterTitle = 'shihan' | 'hanshi' | 'meijin' | 'oyama';
5
+ /** Convert raw token count to Pyro XP. 1,000 tokens = 1 XP. */
6
+ export declare function tokensToXp(tokens: number): number;
7
+ /** Convert total XP to level (fractional). */
8
+ export declare function xpToLevel(xp: number): number;
9
+ /** Convert level to minimum XP required. */
10
+ export declare function levelToMinXp(level: number): number;
11
+ /** Get the integer level (floor of fractional level). */
12
+ export declare function getLevel(xp: number): number;
13
+ /** Get belt color for a given level. */
14
+ export declare function getBeltColor(level: number): BeltColor;
15
+ /** Get title for a given level. */
16
+ export declare function getTitle(level: number): Title | DanTitle | GrandMasterTitle;
17
+ export type BeltProgress = {
18
+ level: number;
19
+ title: Title | DanTitle | GrandMasterTitle;
20
+ beltColor: BeltColor;
21
+ progressPercent: number;
22
+ };
23
+ /** Belt info for a raw token total (pyro-only — correct for a fresh join). */
24
+ export declare function beltForTokens(tokensTotal: number): BeltProgress;
25
+ //# sourceMappingURL=belt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"belt.d.ts","sourceRoot":"","sources":["../src/belt.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,QAAQ,GACR,KAAK,GACL,MAAM,GACN,MAAM,GACN,QAAQ,GACR,MAAM,GACN,OAAO,GACP,MAAM,GACN,QAAQ,GACR,OAAO,CAAA;AAEX,MAAM,MAAM,KAAK,GACb,QAAQ,GACR,OAAO,GACP,OAAO,GACP,SAAS,GACT,SAAS,GACT,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,KAAK,GACL,QAAQ,CAAA;AAEZ,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,SAAS,GACT,SAAS,GACT,UAAU,GACV,OAAO,GACP,OAAO,CAAA;AAEX,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;AAqCvE,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,8CAA8C;AAC9C,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,yDAAyD;AACzD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAMrD;AAED,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,gBAAgB,CAkB3E;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,gBAAgB,CAAA;IAC1C,SAAS,EAAE,SAAS,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAgB/D"}
package/dist/belt.js ADDED
@@ -0,0 +1,113 @@
1
+ // Belt / level math — ported verbatim from @hacklab/db `levels.ts` so the CLI
2
+ // can render the share card instantly (locally) without waiting on the server.
3
+ // The CLI is a standalone published package and must not pull in @hacklab/db
4
+ // (drizzle/pg/etc.), so we copy the small, stable curve here.
5
+ //
6
+ // One curve: xp(level) = 23 × level^3.32 up to level 100, exponential above.
7
+ // Pyro XP = tokens / 1000. For a brand-new join, hacker + mason XP are 0, so
8
+ // belt XP == pyro XP — which is exactly what the server computes right after
9
+ // the first sync. Kept in sync via belt.test.ts (anchored to the known points).
10
+ const K = 3.32;
11
+ const A = 23;
12
+ const LEVEL_100_XP = 100_000_000; // 100M XP
13
+ const BELT_TIERS = [
14
+ { minLevel: 0, color: 'white', title: 'gaijin' },
15
+ { minLevel: 10, color: 'orange', title: 'deshi' },
16
+ { minLevel: 20, color: 'red', title: 'ronin' },
17
+ { minLevel: 30, color: 'blue', title: 'shinobi' },
18
+ { minLevel: 40, color: 'cyan', title: 'samurai' },
19
+ { minLevel: 50, color: 'yellow', title: 'senpai' },
20
+ { minLevel: 60, color: 'lime', title: 'tatsujin' },
21
+ { minLevel: 70, color: 'green', title: 'kensei' },
22
+ { minLevel: 80, color: 'pink', title: 'oni' },
23
+ { minLevel: 90, color: 'purple', title: 'ryujin' },
24
+ ];
25
+ const DAN_TITLES = [
26
+ 'shodan',
27
+ 'nidan',
28
+ 'sandan',
29
+ 'yondan',
30
+ 'godan',
31
+ 'rokudan',
32
+ 'nanadan',
33
+ 'hachidan',
34
+ 'kudan',
35
+ 'judan',
36
+ ];
37
+ const GRAND_MASTER_TIERS = [
38
+ { minLevel: 200, title: 'shihan' },
39
+ { minLevel: 300, title: 'hanshi' },
40
+ { minLevel: 400, title: 'meijin' },
41
+ { minLevel: 500, title: 'oyama' },
42
+ ];
43
+ /** Convert raw token count to Pyro XP. 1,000 tokens = 1 XP. */
44
+ export function tokensToXp(tokens) {
45
+ return Math.floor(tokens / 1_000);
46
+ }
47
+ /** Convert total XP to level (fractional). */
48
+ export function xpToLevel(xp) {
49
+ if (xp <= 0)
50
+ return 0;
51
+ if (xp >= LEVEL_100_XP) {
52
+ return 100 + 100 * Math.log10(xp / LEVEL_100_XP);
53
+ }
54
+ return (xp / A) ** (1 / K);
55
+ }
56
+ /** Convert level to minimum XP required. */
57
+ export function levelToMinXp(level) {
58
+ if (level <= 0)
59
+ return 0;
60
+ if (level >= 100) {
61
+ return Math.round(LEVEL_100_XP * 10 ** ((level - 100) / 100));
62
+ }
63
+ return Math.round(A * level ** K);
64
+ }
65
+ /** Get the integer level (floor of fractional level). */
66
+ export function getLevel(xp) {
67
+ return Math.floor(xpToLevel(xp));
68
+ }
69
+ /** Get belt color for a given level. */
70
+ export function getBeltColor(level) {
71
+ if (level >= 100)
72
+ return 'black';
73
+ for (let i = BELT_TIERS.length - 1; i >= 0; i--) {
74
+ if (level >= BELT_TIERS[i].minLevel)
75
+ return BELT_TIERS[i].color;
76
+ }
77
+ return 'white';
78
+ }
79
+ /** Get title for a given level. */
80
+ export function getTitle(level) {
81
+ if (level >= 200) {
82
+ for (let i = GRAND_MASTER_TIERS.length - 1; i >= 0; i--) {
83
+ if (level >= GRAND_MASTER_TIERS[i].minLevel)
84
+ return GRAND_MASTER_TIERS[i].title;
85
+ }
86
+ }
87
+ if (level >= 100) {
88
+ const danIndex = Math.min(Math.floor((level - 100) / 10), DAN_TITLES.length - 1);
89
+ return DAN_TITLES[danIndex];
90
+ }
91
+ for (let i = BELT_TIERS.length - 1; i >= 0; i--) {
92
+ if (level >= BELT_TIERS[i].minLevel)
93
+ return BELT_TIERS[i].title;
94
+ }
95
+ return 'gaijin';
96
+ }
97
+ /** Belt info for a raw token total (pyro-only — correct for a fresh join). */
98
+ export function beltForTokens(tokensTotal) {
99
+ const xp = tokensToXp(tokensTotal);
100
+ const level = getLevel(xp);
101
+ const currentLevelXp = levelToMinXp(level);
102
+ const nextLevelXp = levelToMinXp(level + 1);
103
+ const xpIntoLevel = xp - currentLevelXp;
104
+ const xpNeeded = nextLevelXp - currentLevelXp;
105
+ const progressPercent = xpNeeded > 0 ? Math.min(Math.round((xpIntoLevel / xpNeeded) * 100), 100) : 0;
106
+ return {
107
+ level,
108
+ title: getTitle(level),
109
+ beltColor: getBeltColor(level),
110
+ progressPercent,
111
+ };
112
+ }
113
+ //# sourceMappingURL=belt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"belt.js","sourceRoot":"","sources":["../src/belt.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../src/commands/join.ts"],"names":[],"mappings":"AAoBA;;;;;;;;GAQG;AACH,wBAAsB,IAAI,kBAiLzB"}
1
+ {"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../src/commands/join.ts"],"names":[],"mappings":"AAkCA;;;;;;;;GAQG;AACH,wBAAsB,IAAI,kBA2NzB"}
@@ -1,6 +1,8 @@
1
1
  import * as clack from '@clack/prompts';
2
- import { formatTokens, scanAllTools, } from '../scanners/index.js';
2
+ import { beltForTokens } from '../belt.js';
3
+ import { computeStreaks, formatTokens, scanAllTools, } from '../scanners/index.js';
3
4
  import { getAppUrl, loadSession } from '../session.js';
5
+ import { promptShareOnX, renderShareCard, } from '../share.js';
4
6
  import { bold, dim, info } from '../ui.js';
5
7
  import { login } from './login.js';
6
8
  const TOOL_LABELS = {
@@ -55,6 +57,10 @@ export async function join() {
55
57
  }
56
58
  }
57
59
  // ── Stage 2: anonymous rank (best-effort; never blocks the join) ──────────
60
+ // Captured for the share card later — the preview rank equals the post-sync
61
+ // rank (rank counts users with MORE tokens, so the user joining the set
62
+ // doesn't change it), so the card can show it without waiting on the upload.
63
+ let previewRank = null;
58
64
  try {
59
65
  const res = await fetch(`${appUrl}/api/rank/preview`, {
60
66
  method: 'POST',
@@ -63,6 +69,7 @@ export async function join() {
63
69
  });
64
70
  if (res.ok) {
65
71
  const { rank, ofTotal } = (await res.json());
72
+ previewRank = rank;
66
73
  clack.note(`${bold(`you'd be #${rank}`)} of ${ofTotal} hackers`, 'your rank');
67
74
  }
68
75
  }
@@ -127,43 +134,104 @@ export async function join() {
127
134
  clack.cancel(data?.error ?? `claim failed (${res.status})`);
128
135
  process.exit(1);
129
136
  }
130
- // ── Stage 6: sync token totals to the claimed profile ─────────────────────
131
- spin.start('syncing your usage');
132
- try {
133
- const res = await fetch(`${appUrl}/api/claim/sync`, {
134
- method: 'POST',
135
- headers: {
136
- 'Content-Type': 'application/json',
137
- Authorization: `Bearer ${session.token}`,
137
+ // ── Stage 6: kick the heavy token upload off in the BACKGROUND ────────────
138
+ // It uploads while the user looks at their card and shares on X, so the
139
+ // upload never feels blocking. `.catch` keeps a transient failure from
140
+ // becoming an unhandled rejection; we reconcile the result in Stage 8.
141
+ const syncPromise = fetch(`${appUrl}/api/claim/sync`, {
142
+ method: 'POST',
143
+ headers: {
144
+ 'Content-Type': 'application/json',
145
+ Authorization: `Bearer ${session.token}`,
146
+ },
147
+ body: JSON.stringify({
148
+ dailyTotals: scan.dailyTotals,
149
+ toolTotals: scan.toolTotals,
150
+ modelTotals: scan.modelTotals,
151
+ hourlyTotals: scan.hourlyTotals,
152
+ }),
153
+ // Hard cap so a slow/stuck upload can never freeze the CLI indefinitely.
154
+ // On timeout the fetch rejects → .catch → null → "syncing" message.
155
+ signal: AbortSignal.timeout(120_000),
156
+ })
157
+ .then((res) => (res.ok ? res.json() : null))
158
+ .catch(() => null);
159
+ // ── Stage 7: stats thumbnail + share (runs while the upload is in flight) ─
160
+ // Card is rendered from local data: scan totals, the captured preview rank,
161
+ // and the locally-computed belt (pyro-only, which matches the server for a
162
+ // fresh join). No dependency on the in-flight sync.
163
+ if (scan.grandTotal > 0) {
164
+ const belt = beltForTokens(scan.grandTotal);
165
+ const streaks = computeStreaks(scan.dailyTotals.map((e) => e.date));
166
+ const card = {
167
+ handle: claimedHandle,
168
+ level: belt.level,
169
+ title: belt.title,
170
+ beltColor: belt.beltColor,
171
+ tokensTotal: scan.grandTotal,
172
+ rank: previewRank ?? 0,
173
+ streak: streaks.current,
174
+ longestStreak: streaks.longest,
175
+ progressPercent: belt.progressPercent,
176
+ estimatedCost: estimateCost(scan.toolTotals),
177
+ toolBreakdown: {
178
+ claudeCode: scan.toolTotals.claude_code ?? 0,
179
+ codex: scan.toolTotals.codex ?? 0,
180
+ cursor: scan.toolTotals.cursor ?? 0,
138
181
  },
139
- body: JSON.stringify({
140
- dailyTotals: scan.dailyTotals,
141
- toolTotals: scan.toolTotals,
142
- modelTotals: scan.modelTotals,
143
- hourlyTotals: scan.hourlyTotals,
144
- }),
145
- });
146
- if (res.ok) {
147
- const r = (await res.json());
148
- spin.stop('usage synced');
149
- if (r.title && r.level != null) {
150
- info(`${bold(r.title)} lv.${r.level}${r.beltColor ? ` (${r.beltColor} belt)` : ''}`);
151
- }
152
- if (r.rankAfter)
153
- info(`rank: #${r.rankAfter}`);
154
- }
155
- else {
156
- spin.stop('usage sync deferred');
157
- info(dim('your profile is live; usage will sync next run.'));
158
- }
182
+ models: Object.entries(scan.modelTotals)
183
+ .map(([name, tokens]) => ({ name, tokens }))
184
+ .sort((a, b) => b.tokens - a.tokens),
185
+ dailyActivity: aggregateDailyActivity(scan.dailyTotals),
186
+ };
187
+ await renderShareCard(card);
188
+ await promptShareOnX(card);
159
189
  }
160
- catch {
190
+ // ── Stage 8: reconcile the background upload ──────────────────────────────
191
+ // It was uploading during the card + share, so it's usually done by now. Show
192
+ // a spinner for the remainder so a heavy upload reads as "working", never a
193
+ // silent freeze; the AbortSignal above guarantees this resolves.
194
+ spin.start('saving your usage');
195
+ const syncResult = await syncPromise;
196
+ const base = appUrl.replace(/\/$/, '');
197
+ if (syncResult?.title && syncResult.level != null) {
198
+ spin.stop('usage saved');
199
+ info(`${bold(syncResult.title)} lv.${syncResult.level}${syncResult.beltColor ? ` (${syncResult.beltColor} belt)` : ''}`);
200
+ if (syncResult.rankAfter)
201
+ info(`rank: #${syncResult.rankAfter}`);
202
+ }
203
+ else {
161
204
  spin.stop('usage sync deferred');
162
- info(dim('your profile is live; usage will sync next run.'));
205
+ info(dim('your profile is live run `hacklab sync` if your stats look off.'));
163
206
  }
164
- const base = appUrl.replace(/\/$/, '');
165
207
  clack.outro(`${bold('claimed.')} ${base}/${claimedHandle}`);
166
208
  }
209
+ /** Blended cost estimate ($/M tokens) across the scanned tools, for the card. */
210
+ function estimateCost(toolTotals) {
211
+ const rate = {
212
+ claude_code: 0.6,
213
+ codex: 0.25,
214
+ cursor: 0.4,
215
+ openclaw: 0.5,
216
+ hermes: 0.5,
217
+ opencode: 0.5,
218
+ };
219
+ let cost = 0;
220
+ for (const [tool, tokens] of Object.entries(toolTotals)) {
221
+ cost += (tokens / 1_000_000) * (rate[tool] ?? 0.4);
222
+ }
223
+ return cost;
224
+ }
225
+ /** Collapse per-tool daily entries into one {date, tokens}[] for the card graph. */
226
+ function aggregateDailyActivity(dailyTotals) {
227
+ const byDate = new Map();
228
+ for (const entry of dailyTotals) {
229
+ byDate.set(entry.date, (byDate.get(entry.date) ?? 0) + entry.tokens);
230
+ }
231
+ return Array.from(byDate.entries())
232
+ .map(([date, tokens]) => ({ date, tokens }))
233
+ .sort((a, b) => a.date.localeCompare(b.date));
234
+ }
167
235
  /**
168
236
  * Prompt for a username and loop until it passes the availability check or the
169
237
  * user cancels. Returns the chosen username, or null if cancelled.
@@ -1 +1 @@
1
- {"version":3,"file":"join.js","sourceRoot":"","sources":["../../src/commands/join.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"join.js","sourceRoot":"","sources":["../../src/commands/join.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAEL,cAAc,EACd,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EACL,cAAc,EACd,eAAe,GAEhB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AASlC,MAAM,WAAW,GAA2B;IAC1C,WAAW,EAAE,aAAa;IAC1B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;CACrB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;IAC5B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,4EAA4E;IAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;IAC5B,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAC1C,IAAI,IAAmB,CAAA;IACvB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,YAAY,EAAE,CAAA;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACxB,KAAK,CAAC,MAAM,CACV,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACpF,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAE1B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,IAAI,CACF,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,SAAS,CAC1E,CAAA;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,UAAU,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;IAE5D,4EAA4E;IAC5E,8BAA8B;IAC9B,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC;YAC/B,OAAO,EACL,qFAAqF;YACvF,YAAY,EAAE,KAAK;SACpB,CAAC,CAAA;QACF,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAClC,KAAK,CAAC,KAAK,CACT,GAAG,CAAC,6DAA6D,CAAC,CACnE,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,4EAA4E;IAC5E,wEAAwE;IACxE,6EAA6E;IAC7E,IAAI,WAAW,GAAkB,IAAI,CAAA;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,mBAAmB,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;SACvD,CAAC,CAAA;QACF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG1C,CAAA;YACD,WAAW,GAAG,IAAI,CAAA;YAClB,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,OAAO,OAAO,UAAU,EACpD,WAAW,CACZ,CAAA;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;IAED,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,CAAA;IACtD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAA;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,mCAAmC,CAAC,CAAA;IACnE,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,uCAAuC,CAAC,CAAA;IACxE,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,oBAAoB,CAAC,CAAA;IAE3D,6EAA6E;IAC7E,IAAI,CAAC;QACH,MAAM,KAAK,EAAE,CAAA;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,CACV,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,CAC1G,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAA;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,CAAC,4DAA4D,CAAC,CAAA;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,6EAA6E;IAC7E,IAAI,aAAa,GAAG,QAAQ,CAAA;IAC5B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,gBAAgB,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;aACzC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,aAAa;gBACvB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvB,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC;oBAC9B,CAAC,CAAC,EAAE,UAAU,EAAE,gBAAgB,CAAC,UAAU,CAAC,EAAE;oBAC9C,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;SACH,CAAC,CAAA;QAEF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2C,CAAA;YACzE,aAAa,GAAG,IAAI,CAAC,MAAM,CAAA;YAC3B,MAAK;QACP,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAC5C,MAAM,EACN,yCAAyC,CAC1C,CAAA;YACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,KAAK,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAA;gBACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,aAAa,GAAG,QAAQ,CAAA;YACxB,SAAQ;QACV,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAExC,CAAA;QACR,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,iBAAiB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,6EAA6E;IAC7E,wEAAwE;IACxE,uEAAuE;IACvE,uEAAuE;IACvE,MAAM,WAAW,GAA+B,KAAK,CACnD,GAAG,MAAM,iBAAiB,EAC1B;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;SACzC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;QACF,yEAAyE;QACzE,oEAAoE;QACpE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;KACrC,CACF;SACE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,IAAI,EAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACpE,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAEpB,6EAA6E;IAC7E,4EAA4E;IAC5E,2EAA2E;IAC3E,oDAAoD;IACpD,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC3C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACnE,MAAM,IAAI,GAAkB;YAC1B,MAAM,EAAE,aAAa;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,UAAU;YAC5B,IAAI,EAAE,WAAW,IAAI,CAAC;YACtB,MAAM,EAAE,OAAO,CAAC,OAAO;YACvB,aAAa,EAAE,OAAO,CAAC,OAAO;YAC9B,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,aAAa,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;YAC5C,aAAa,EAAE;gBACb,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC;gBAC5C,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;gBACjC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC;aACpC;YACD,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;iBACrC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;iBAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACtC,aAAa,EAAE,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC;SACxD,CAAA;QACD,MAAM,eAAe,CAAC,IAAI,CAAC,CAAA;QAC3B,MAAM,cAAc,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED,6EAA6E;IAC7E,8EAA8E;IAC9E,4EAA4E;IAC5E,iEAAiE;IACjE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;IAC/B,MAAM,UAAU,GAAG,MAAM,WAAW,CAAA;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACtC,IAAI,UAAU,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACxB,IAAI,CACF,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CACnH,CAAA;QACD,IAAI,UAAU,CAAC,SAAS;YAAE,IAAI,CAAC,UAAU,UAAU,CAAC,SAAS,EAAE,CAAC,CAAA;IAClE,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QAChC,IAAI,CACF,GAAG,CAAC,mEAAmE,CAAC,CACzE,CAAA;IACH,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,aAAa,EAAE,CAAC,CAAA;AAC7D,CAAC;AAED,iFAAiF;AACjF,SAAS,YAAY,CAAC,UAAkC;IACtD,MAAM,IAAI,GAA2B;QACnC,WAAW,EAAE,GAAG;QAChB,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,GAAG;QACX,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,GAAG;QACX,QAAQ,EAAE,GAAG;KACd,CAAA;IACD,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,oFAAoF;AACpF,SAAS,sBAAsB,CAC7B,WAAyC;IAEzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;IACtE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;SAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AACjD,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,uBAAuB,CACpC,MAAc,EACd,YAAY,GAAG,4BAA4B;IAE3C,IAAI,OAAO,GAAG,YAAY,CAAA;IAC1B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;YAC7B,OAAO;YACP,WAAW,EAAE,mBAAmB;SACjC,CAAC,CAAA;QACF,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;QAEtC,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,IAAI,MAAM,GAAG,0CAA0C,CAAA;QACvD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,MAAM,iCAAiC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAC1E,CAAA;YACD,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAA;gBACD,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;gBAC1B,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM;oBAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACrD,CAAC;iBAAM,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC9B,MAAM,GAAG,+CAA+C,CAAA;YAC1D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;QACtE,CAAC;QAED,IAAI,SAAS;YAAE,OAAO,SAAS,CAAA;QAC/B,OAAO,GAAG,GAAG,MAAM,gCAAgC,CAAA;IACrD,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,KAAK,UAAU,YAAY,CAAC,OAAe;IACzC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAA;IACtE,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;IACpC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;AACjD,CAAC;AAED;+DAC+D;AAC/D,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,SAAS,aAAa,CAAC,GAAuB;IAC5C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACpB,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACxB,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAClC,OAAO,UAAU,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,iEAAiE;AACjE,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACpB,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACxB,OAAO,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;AACjE,CAAC"}
package/dist/index.js CHANGED
@@ -8,9 +8,39 @@ import { login } from './commands/login.js';
8
8
  import { scanProfile } from './commands/scan-profile.js';
9
9
  import { sync } from './commands/sync.js';
10
10
  import { whoami } from './commands/whoami.js';
11
- import { loadSession } from './session.js';
11
+ import { HACKLAB_ENVIRONMENTS, isHacklabEnv, loadSession } from './session.js';
12
12
  import { banner, bold, dim } from './ui.js';
13
- const [cmd, ...args] = process.argv.slice(2);
13
+ /**
14
+ * Pull a global `--env <production|staging|development>` (or `--env=<…>`) flag
15
+ * out of the args and point the CLI at that backend by setting HACKLAB_APP_URL
16
+ * (which getAppUrl + every command reads). Returns the remaining args so
17
+ * per-command parsing never sees the flag. An explicit --env overrides any
18
+ * inherited HACKLAB_APP_URL.
19
+ */
20
+ function applyEnvFlag(argv) {
21
+ const rest = [];
22
+ for (let i = 0; i < argv.length; i++) {
23
+ const arg = argv[i];
24
+ let value;
25
+ if (arg === '--env') {
26
+ value = argv[++i];
27
+ }
28
+ else if (arg.startsWith('--env=')) {
29
+ value = arg.slice('--env='.length);
30
+ }
31
+ else {
32
+ rest.push(arg);
33
+ continue;
34
+ }
35
+ if (!value || !isHacklabEnv(value)) {
36
+ console.error(`--env must be one of: ${Object.keys(HACKLAB_ENVIRONMENTS).join(', ')}`);
37
+ process.exit(1);
38
+ }
39
+ process.env.HACKLAB_APP_URL = HACKLAB_ENVIRONMENTS[value];
40
+ }
41
+ return rest;
42
+ }
43
+ const [cmd, ...args] = applyEnvFlag(process.argv.slice(2));
14
44
  function printHelp() {
15
45
  banner();
16
46
  console.log('');
@@ -25,6 +55,8 @@ function printHelp() {
25
55
  console.log(` hacklab ${dim('config')} ${dim('<key> <val>')} set config (cursor-api-key, cursor-email)`);
26
56
  console.log(` hacklab ${dim('brag')} ${dim('[path]')} sync .hacklab/project.yaml`);
27
57
  console.log('');
58
+ console.log(` ${dim('--env')} ${dim('<production|staging|development>')} pick the backend (default: production)`);
59
+ console.log('');
28
60
  }
29
61
  // Node-version guard (T9). The CLI uses modern Node APIs (global fetch,
30
62
  // AbortSignal.timeout). Fail fast with a clear message instead of a cryptic
@@ -46,7 +78,7 @@ async function main() {
46
78
  process.exit(0);
47
79
  }
48
80
  if (cmd === '--version' || cmd === '-v') {
49
- console.log('0.3.1');
81
+ console.log('0.4.2');
50
82
  process.exit(0);
51
83
  }
52
84
  // Bare invocation (e.g. `npx hacklab@latest`): join for newcomers, sync for
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAE3C,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAE5C,SAAS,SAAS;IAChB,MAAM,EAAE,CAAA;IACR,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC3B,OAAO,CAAC,GAAG,CACT,aAAa,GAAG,CAAC,MAAM,CAAC,gDAAgD,CACzE,CAAA;IACD,OAAO,CAAC,GAAG,CACT,aAAa,GAAG,CAAC,MAAM,CAAC,oDAAoD,CAC7E,CAAA;IACD,OAAO,CAAC,GAAG,CACT,aAAa,GAAG,CAAC,QAAQ,CAAC,4CAA4C,CACvE,CAAA;IACD,OAAO,CAAC,GAAG,CACT,aAAa,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,+BAA+B,CAC5E,CAAA;IACD,OAAO,CAAC,GAAG,CACT,aAAa,GAAG,CAAC,OAAO,CAAC,2CAA2C,CACrE,CAAA;IACD,OAAO,CAAC,GAAG,CACT,aAAa,GAAG,CAAC,MAAM,CAAC,mDAAmD,CAC5E,CAAA;IACD,OAAO,CAAC,GAAG,CACT,aAAa,GAAG,CAAC,MAAM,CAAC,8DAA8D,CACvF,CAAA;IACD,OAAO,CAAC,GAAG,CACT,aAAa,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,6CAA6C,CAC9F,CAAA;IACD,OAAO,CAAC,GAAG,CACT,aAAa,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,oCAAoC,CAC9E,CAAA;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACjB,CAAC;AAED,wEAAwE;AACxE,4EAA4E;AAC5E,wEAAwE;AACxE,+EAA+E;AAC/E,4EAA4E;AAC5E,SAAS,kBAAkB;IACzB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACzD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CACX,+CAA+C,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CACzE,CAAA;QACD,OAAO,CAAC,KAAK,CACX,kFAAkF,CACnF,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,kBAAkB,EAAE,CAAA;IAEpB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACrC,SAAS,EAAE,CAAA;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,4EAA4E;IAC5E,2CAA2C;IAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAA;QACnC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,EAAE,CAAA;QACd,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,EAAE,CAAA;QACd,CAAC;QACD,OAAM;IACR,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,EAAE,CAAA;IACd,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,EAAE,CAAA;IACf,CAAC;SAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,EAAE,CAAA;IAChB,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,EAAE,CAAA;IACd,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IACvC,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACxC,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IAC9B,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,WAAW,EAAE,CAAA;IACrB,CAAC;SAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAClC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAA;QACxC,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAc;IACnC,IAAI,GAAuB,CAAA;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QACpB,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YACjB,CAAC,EAAE,CAAA;QACL,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAA;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAA;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;AACtB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -62,6 +62,16 @@ export declare function toDateStr(ts: string | number | Date): string;
62
62
  export declare function hourlyCutoff(): string;
63
63
  export declare function formatTokens(n: number): string;
64
64
  export declare function formatBytes(n: number): string;
65
+ /**
66
+ * Current + longest activity-day streak from a set of activity dates
67
+ * (YYYY-MM-DD, UTC). Mirrors the server's updateStreak so the share card shows
68
+ * the same numbers the profile will after sync: the current streak only counts
69
+ * if the most recent activity was today or yesterday.
70
+ */
71
+ export declare function computeStreaks(dates: string[]): {
72
+ current: number;
73
+ longest: number;
74
+ };
65
75
  /** Recursively collect files with a given extension; unreadable dirs are skipped. */
66
76
  export declare function findFiles(dir: string, ext: string): Promise<string[]>;
67
77
  /**