hacklab 0.0.2 → 0.3.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 (154) 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/config.d.ts +2 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +48 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/drop.d.ts +2 -0
  12. package/dist/commands/drop.d.ts.map +1 -0
  13. package/dist/commands/drop.js +29 -0
  14. package/dist/commands/drop.js.map +1 -0
  15. package/dist/commands/exam.d.ts +5 -0
  16. package/dist/commands/exam.d.ts.map +1 -0
  17. package/dist/commands/exam.js +224 -0
  18. package/dist/commands/exam.js.map +1 -0
  19. package/dist/commands/join.d.ts +10 -9
  20. package/dist/commands/join.d.ts.map +1 -1
  21. package/dist/commands/join.js +213 -285
  22. package/dist/commands/join.js.map +1 -1
  23. package/dist/commands/login.d.ts +1 -15
  24. package/dist/commands/login.d.ts.map +1 -1
  25. package/dist/commands/login.js +69 -133
  26. package/dist/commands/login.js.map +1 -1
  27. package/dist/commands/scan-profile.d.ts +33 -0
  28. package/dist/commands/scan-profile.d.ts.map +1 -0
  29. package/dist/commands/scan-profile.js +279 -0
  30. package/dist/commands/scan-profile.js.map +1 -0
  31. package/dist/commands/sync.d.ts +2 -0
  32. package/dist/commands/sync.d.ts.map +1 -0
  33. package/dist/commands/sync.js +55 -0
  34. package/dist/commands/sync.js.map +1 -0
  35. package/dist/commands/whoami.d.ts +1 -3
  36. package/dist/commands/whoami.d.ts.map +1 -1
  37. package/dist/commands/whoami.js +10 -37
  38. package/dist/commands/whoami.js.map +1 -1
  39. package/dist/config.d.ts +7 -0
  40. package/dist/config.d.ts.map +1 -0
  41. package/dist/config.js +18 -0
  42. package/dist/config.js.map +1 -0
  43. package/dist/dd.d.ts +3 -0
  44. package/dist/dd.d.ts.map +1 -0
  45. package/dist/dd.js +28 -0
  46. package/dist/dd.js.map +1 -0
  47. package/dist/index.js +117 -112
  48. package/dist/index.js.map +1 -1
  49. package/dist/project-brag.d.ts +58 -0
  50. package/dist/project-brag.d.ts.map +1 -0
  51. package/dist/project-brag.js +270 -0
  52. package/dist/project-brag.js.map +1 -0
  53. package/dist/scanners/index.d.ts +24 -0
  54. package/dist/scanners/index.d.ts.map +1 -0
  55. package/dist/scanners/index.js +543 -0
  56. package/dist/scanners/index.js.map +1 -0
  57. package/dist/scanners/util.d.ts +83 -0
  58. package/dist/scanners/util.d.ts.map +1 -0
  59. package/dist/scanners/util.js +129 -0
  60. package/dist/scanners/util.js.map +1 -0
  61. package/dist/session.d.ts +17 -13
  62. package/dist/session.d.ts.map +1 -1
  63. package/dist/session.js +46 -155
  64. package/dist/session.js.map +1 -1
  65. package/dist/share-card.d.ts +29 -0
  66. package/dist/share-card.d.ts.map +1 -0
  67. package/dist/share-card.js +401 -0
  68. package/dist/share-card.js.map +1 -0
  69. package/dist/sync.d.ts +64 -0
  70. package/dist/sync.d.ts.map +1 -0
  71. package/dist/sync.js +805 -0
  72. package/dist/sync.js.map +1 -0
  73. package/dist/ui.d.ts +10 -0
  74. package/dist/ui.d.ts.map +1 -0
  75. package/dist/ui.js +21 -0
  76. package/dist/ui.js.map +1 -0
  77. package/dist/utils/openBrowser.js.map +1 -1
  78. package/package.json +36 -29
  79. package/dist/api/client.d.ts +0 -150
  80. package/dist/api/client.d.ts.map +0 -1
  81. package/dist/api/client.js +0 -246
  82. package/dist/api/client.js.map +0 -1
  83. package/dist/commands/admin-waitlist.d.ts +0 -12
  84. package/dist/commands/admin-waitlist.d.ts.map +0 -1
  85. package/dist/commands/admin-waitlist.js +0 -96
  86. package/dist/commands/admin-waitlist.js.map +0 -1
  87. package/dist/commands/brag.utils.d.ts +0 -12
  88. package/dist/commands/brag.utils.d.ts.map +0 -1
  89. package/dist/commands/brag.utils.js +0 -43
  90. package/dist/commands/brag.utils.js.map +0 -1
  91. package/dist/commands/essay.d.ts +0 -18
  92. package/dist/commands/essay.d.ts.map +0 -1
  93. package/dist/commands/essay.js +0 -117
  94. package/dist/commands/essay.js.map +0 -1
  95. package/dist/commands/explore.d.ts +0 -9
  96. package/dist/commands/explore.d.ts.map +0 -1
  97. package/dist/commands/explore.js +0 -32
  98. package/dist/commands/explore.js.map +0 -1
  99. package/dist/commands/init.d.ts +0 -16
  100. package/dist/commands/init.d.ts.map +0 -1
  101. package/dist/commands/init.js +0 -237
  102. package/dist/commands/init.js.map +0 -1
  103. package/dist/commands/link.d.ts +0 -17
  104. package/dist/commands/link.d.ts.map +0 -1
  105. package/dist/commands/link.js +0 -36
  106. package/dist/commands/link.js.map +0 -1
  107. package/dist/commands/login.utils.d.ts +0 -3
  108. package/dist/commands/login.utils.d.ts.map +0 -1
  109. package/dist/commands/login.utils.js +0 -13
  110. package/dist/commands/login.utils.js.map +0 -1
  111. package/dist/commands/new.d.ts +0 -15
  112. package/dist/commands/new.d.ts.map +0 -1
  113. package/dist/commands/new.js +0 -172
  114. package/dist/commands/new.js.map +0 -1
  115. package/dist/commands/new.utils.d.ts +0 -7
  116. package/dist/commands/new.utils.d.ts.map +0 -1
  117. package/dist/commands/new.utils.js +0 -50
  118. package/dist/commands/new.utils.js.map +0 -1
  119. package/dist/commands/onboard.d.ts +0 -10
  120. package/dist/commands/onboard.d.ts.map +0 -1
  121. package/dist/commands/onboard.js +0 -93
  122. package/dist/commands/onboard.js.map +0 -1
  123. package/dist/commands/publish.d.ts +0 -8
  124. package/dist/commands/publish.d.ts.map +0 -1
  125. package/dist/commands/publish.js +0 -47
  126. package/dist/commands/publish.js.map +0 -1
  127. package/dist/commands/tui.d.ts +0 -12
  128. package/dist/commands/tui.d.ts.map +0 -1
  129. package/dist/commands/tui.js +0 -112
  130. package/dist/commands/tui.js.map +0 -1
  131. package/dist/help-format.d.ts +0 -4
  132. package/dist/help-format.d.ts.map +0 -1
  133. package/dist/help-format.js +0 -30
  134. package/dist/help-format.js.map +0 -1
  135. package/dist/lab/config.d.ts +0 -32
  136. package/dist/lab/config.d.ts.map +0 -1
  137. package/dist/lab/config.js +0 -148
  138. package/dist/lab/config.js.map +0 -1
  139. package/dist/lab/contentStatus.d.ts +0 -6
  140. package/dist/lab/contentStatus.d.ts.map +0 -1
  141. package/dist/lab/contentStatus.js +0 -19
  142. package/dist/lab/contentStatus.js.map +0 -1
  143. package/dist/ui/banner.d.ts +0 -2
  144. package/dist/ui/banner.d.ts.map +0 -1
  145. package/dist/ui/banner.js +0 -22
  146. package/dist/ui/banner.js.map +0 -1
  147. package/dist/utils/findRepoRoot.d.ts +0 -2
  148. package/dist/utils/findRepoRoot.d.ts.map +0 -1
  149. package/dist/utils/findRepoRoot.js +0 -17
  150. package/dist/utils/findRepoRoot.js.map +0 -1
  151. package/dist/utils/pathExists.d.ts +0 -2
  152. package/dist/utils/pathExists.d.ts.map +0 -1
  153. package/dist/utils/pathExists.js +0 -11
  154. package/dist/utils/pathExists.js.map +0 -1
@@ -1,314 +1,242 @@
1
- import { execFile } from 'node:child_process';
2
- import { mkdir } from 'node:fs/promises';
3
- import { homedir } from 'node:os';
4
- import { relative, resolve } from 'node:path';
5
- import { promisify } from 'node:util';
6
- import { cancel, intro, isCancel, note, outro, select, text } from '@clack/prompts';
7
- import { initializeRepository } from './init.js';
8
- import { getAppUrl } from './login.utils.js';
9
- import { loginCommand } from './login.js';
10
- import { createPublicCliAgent } from '../api/client.js';
11
- import { linkHqToAccount } from '../session.js';
12
- import { pathExists } from '../utils/pathExists.js';
13
- const execFileAsync = promisify(execFile);
14
- export function normalizeRepoName(rawValue) {
15
- return rawValue
16
- .trim()
17
- .toLowerCase()
18
- .replace(/\s+/g, '-')
19
- .replace(/[^a-z0-9._-]/g, '');
20
- }
21
- export function resolveWizardLocation(input, currentLocation) {
22
- const normalized = input.trim();
23
- if (!normalized) {
24
- return currentLocation;
1
+ import * as clack from '@clack/prompts';
2
+ import { formatTokens, scanAllTools, } from '../scanners/index.js';
3
+ import { getAppUrl, loadSession } from '../session.js';
4
+ import { bold, dim, info } from '../ui.js';
5
+ import { login } from './login.js';
6
+ const TOOL_LABELS = {
7
+ claude_code: 'Claude Code',
8
+ codex: 'Codex',
9
+ cursor: 'Cursor',
10
+ openclaw: 'OpenClaw',
11
+ hermes: 'Hermes',
12
+ opencode: 'OpenCode',
13
+ };
14
+ /**
15
+ * The hero command: the guided join ritual.
16
+ *
17
+ * scan → anonymous rank → pick username + fields → GitHub OAuth → claim
18
+ *
19
+ * Value (rank) is shown before any account exists; GitHub auth comes last.
20
+ * Each stage degrades on its own terms (see the per-stage handling below) so a
21
+ * network blip on the vanity rank never blocks the actual join.
22
+ */
23
+ export async function join() {
24
+ clack.intro(bold('hacklab'));
25
+ const appUrl = getAppUrl();
26
+ // ── Stage 1: scan ────────────────────────────────────────────────────────
27
+ const spin = clack.spinner();
28
+ spin.start('scanning local AI tool usage');
29
+ let scan;
30
+ try {
31
+ scan = await scanAllTools();
25
32
  }
26
- return resolve(currentLocation, normalized);
27
- }
28
- export function pickDefaultBaseLocation(currentDirectory, homeDirectory, hasHomeGhDirectory) {
29
- if (currentDirectory && currentDirectory !== '/') {
30
- return currentDirectory;
33
+ catch (err) {
34
+ spin.stop('scan failed');
35
+ clack.cancel(`couldn't read local AI usage: ${err instanceof Error ? err.message : String(err)}`);
36
+ process.exit(1);
31
37
  }
32
- if (hasHomeGhDirectory) {
33
- return resolve(homeDirectory, 'gh');
38
+ spin.stop('scan complete');
39
+ for (const [tool, total] of Object.entries(scan.toolTotals)) {
40
+ if (total > 0) {
41
+ info(`${(TOOL_LABELS[tool] ?? tool).padEnd(12)} ${formatTokens(total)} tokens`);
42
+ }
34
43
  }
35
- return homeDirectory;
36
- }
37
- async function getDefaultBaseLocation() {
38
- const currentDirectory = process.cwd();
39
- const homeDirectory = homedir();
40
- const homeGhDirectory = resolve(homeDirectory, 'gh');
41
- const hasHomeGhDirectory = await pathExists(homeGhDirectory);
42
- return pickDefaultBaseLocation(currentDirectory, homeDirectory, hasHomeGhDirectory);
43
- }
44
- async function promptForLabLocation(initialLocation) {
45
- let selectedLocation = initialLocation;
46
- while (true) {
47
- const action = await select({
48
- message: `create hq in ${selectedLocation}?`,
49
- options: [
50
- {
51
- value: 'continue',
52
- label: 'yes, continue',
53
- },
54
- {
55
- value: 'change',
56
- label: 'change location',
57
- },
58
- {
59
- value: 'exit',
60
- label: 'exit',
61
- },
62
- ],
44
+ info(bold(`total: ${formatTokens(scan.grandTotal)} tokens`));
45
+ // Empty-scan branch: no hard floor gate, but nothing to rank — let the user
46
+ // decide whether to continue.
47
+ if (scan.grandTotal <= 0) {
48
+ const cont = await clack.confirm({
49
+ message: 'No AI token usage found on this machine. Sign up anyway? (you can sync usage later)',
50
+ initialValue: false,
63
51
  });
64
- if (isCancel(action)) {
65
- cancel('join cancelled.');
66
- process.exit(1);
52
+ if (clack.isCancel(cont) || !cont) {
53
+ clack.outro(dim('come back after some Claude Code / Codex / Cursor sessions.'));
54
+ process.exit(0);
67
55
  }
68
- const parsedAction = String(action);
69
- if (parsedAction === 'continue') {
70
- return selectedLocation;
71
- }
72
- if (parsedAction === 'exit') {
73
- return null;
74
- }
75
- const pathInput = await text({
76
- message: 'new location',
77
- placeholder: selectedLocation,
56
+ }
57
+ // ── Stage 2: anonymous rank (best-effort; never blocks the join) ──────────
58
+ try {
59
+ const res = await fetch(`${appUrl}/api/rank/preview`, {
60
+ method: 'POST',
61
+ headers: { 'Content-Type': 'application/json' },
62
+ body: JSON.stringify({ totalTokens: scan.grandTotal }),
78
63
  });
79
- if (isCancel(pathInput)) {
80
- cancel('join cancelled.');
81
- process.exit(1);
64
+ if (res.ok) {
65
+ const { rank, ofTotal } = (await res.json());
66
+ clack.note(`${bold(`you'd be #${rank}`)} of ${ofTotal} hackers`, 'your rank');
82
67
  }
83
- selectedLocation = resolveWizardLocation(String(pathInput), selectedLocation);
84
68
  }
85
- }
86
- async function ensureGitRepository(repoLocation) {
87
- if (await pathExists(resolve(repoLocation, '.git'))) {
88
- return;
69
+ catch {
70
+ // Rank is a hook, not a gate. Skip silently and continue the join.
71
+ }
72
+ // ── Stage 3: pick username + fields ───────────────────────────────────────
73
+ const username = await promptAvailableUsername(appUrl);
74
+ if (username === null) {
75
+ clack.outro(dim('cancelled.'));
76
+ process.exit(0);
77
+ }
78
+ const bio = await optionalText('one line — what are you building?');
79
+ const xRaw = await optionalText('x / twitter (handle or url, optional)');
80
+ const websiteRaw = await optionalText('website (optional)');
81
+ // ── Stage 4: GitHub OAuth (reuses the existing login flow) ────────────────
82
+ try {
83
+ await login();
89
84
  }
90
- await execFileAsync('git', ['init', '-q'], {
91
- cwd: repoLocation,
92
- });
93
- }
94
- function defaultRepoName(nickname) {
95
- return nickname ? `${nickname}-hq` : 'my-hq';
96
- }
97
- export function normalizeAgentHandle(rawValue) {
98
- return rawValue
99
- .trim()
100
- .toLowerCase()
101
- .replace(/[^a-z0-9-]/g, '-')
102
- .replace(/-+/g, '-')
103
- .replace(/^-|-$/g, '');
104
- }
105
- async function runAgentJoinFlow(options) {
106
- const appUrl = getAppUrl(options.appUrl);
107
- let result = null;
108
- while (!result) {
109
- const handleInput = await text({
110
- message: 'agent handle',
111
- placeholder: 'my-agent',
112
- validate: (value) => {
113
- const normalized = normalizeAgentHandle(String(value));
114
- if (!normalized) {
115
- return 'handle is required.';
116
- }
117
- if (normalized.length < 2) {
118
- return 'handle must be at least 2 characters.';
119
- }
120
- if (normalized.length > 80) {
121
- return 'handle must be at most 80 characters.';
122
- }
123
- return undefined;
85
+ catch (err) {
86
+ clack.cancel(`GitHub sign-in failed: ${err instanceof Error ? err.message : String(err)}. run \`hacklab join\` again.`);
87
+ process.exit(1);
88
+ }
89
+ const session = await loadSession();
90
+ if (!session) {
91
+ clack.cancel('GitHub sign-in did not complete. run `hacklab join` again.');
92
+ process.exit(1);
93
+ }
94
+ // ── Stage 5: claim (re-prompt username on a TOCTOU collision) ─────────────
95
+ let claimedHandle = username;
96
+ while (true) {
97
+ const res = await fetch(`${appUrl}/api/cli/claim`, {
98
+ method: 'POST',
99
+ headers: {
100
+ 'Content-Type': 'application/json',
101
+ Authorization: `Bearer ${session.token}`,
124
102
  },
103
+ body: JSON.stringify({
104
+ username: claimedHandle,
105
+ ...(bio ? { bio } : {}),
106
+ ...(normalizeXUrl(xRaw) ? { xUrl: normalizeXUrl(xRaw) } : {}),
107
+ ...(normalizeWebsite(websiteRaw)
108
+ ? { websiteUrl: normalizeWebsite(websiteRaw) }
109
+ : {}),
110
+ }),
125
111
  });
126
- if (isCancel(handleInput)) {
127
- cancel('join cancelled.');
128
- process.exit(1);
112
+ if (res.ok) {
113
+ const data = (await res.json());
114
+ claimedHandle = data.handle;
115
+ break;
129
116
  }
130
- const handle = normalizeAgentHandle(String(handleInput));
131
- const bioInput = await text({
132
- message: 'agent bio',
133
- placeholder: 'what does this agent do?',
134
- });
135
- if (isCancel(bioInput)) {
136
- cancel('join cancelled.');
137
- process.exit(1);
138
- }
139
- const avatarInput = await text({
140
- message: 'profile pic url',
141
- placeholder: 'https://...',
142
- });
143
- if (isCancel(avatarInput)) {
144
- cancel('join cancelled.');
145
- process.exit(1);
146
- }
147
- const bio = String(bioInput).trim();
148
- const avatarUrl = String(avatarInput).trim();
149
- try {
150
- result = await createPublicCliAgent(appUrl, {
151
- handle,
152
- bio,
153
- avatarUrl,
154
- });
155
- }
156
- catch (error) {
157
- const message = error instanceof Error ? error.message : String(error);
158
- if (message.toLowerCase().includes('handle') &&
159
- message.toLowerCase().includes('taken')) {
160
- note('handle is already taken. choose another one.', 'error');
161
- continue;
162
- }
163
- if (message.toLowerCase().includes('invalid request payload')) {
164
- note('invalid bio or profile pic url. try again.', 'error');
165
- continue;
166
- }
167
- if (message.toLowerCase().includes('fetch failed')) {
168
- cancel('cannot reach hacklab app. use `--app-url <url>`.');
117
+ if (res.status === 409) {
118
+ const reprompt = await promptAvailableUsername(appUrl, 'that name was just taken — pick another');
119
+ if (reprompt === null) {
120
+ clack.cancel('cancelled before claiming a handle.');
169
121
  process.exit(1);
170
122
  }
171
- cancel(`failed to create agent profile: ${message}`);
172
- process.exit(1);
123
+ claimedHandle = reprompt;
124
+ continue;
173
125
  }
126
+ const data = (await res.json().catch(() => null));
127
+ clack.cancel(data?.error ?? `claim failed (${res.status})`);
128
+ process.exit(1);
174
129
  }
175
- note(result.agent.claimState.toLowerCase(), 'claim state');
176
- note(result.agent.slug, 'handle');
177
- note(result.profileUrl, 'profile');
178
- note(result.claimUrl, 'claim link');
179
- outro([
180
- 'agent join complete.',
181
- 'you are currently in unclaimed mode.',
182
- 'share the claim link with a human owner to activate gated capabilities.',
183
- ].join('\n'));
184
- }
185
- async function promptSetupAction() {
186
- const value = await select({
187
- message: 'set up your hq now?',
188
- options: [
189
- {
190
- value: 'setup-now',
191
- label: 'yes, set up hq now (recommended)',
192
- },
193
- {
194
- value: 'skip',
195
- label: 'skip for now',
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}`,
196
138
  },
197
- ],
198
- });
199
- if (isCancel(value)) {
200
- return 'skip';
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
+ }
201
159
  }
202
- return String(value);
203
- }
204
- async function promptJoinIdentity() {
205
- const value = await select({
206
- message: 'who are you?',
207
- options: [
208
- {
209
- value: 'human',
210
- label: 'human',
211
- },
212
- {
213
- value: 'agent',
214
- label: 'agent',
215
- },
216
- ],
217
- });
218
- if (isCancel(value)) {
219
- cancel('join cancelled.');
220
- process.exit(1);
160
+ catch {
161
+ spin.stop('usage sync deferred');
162
+ info(dim('your profile is live; usage will sync next run.'));
221
163
  }
222
- return String(value);
164
+ const base = appUrl.replace(/\/$/, '');
165
+ clack.outro(`${bold('claimed.')} ${base}/${claimedHandle}`);
223
166
  }
224
- export async function joinCommand(options = {}) {
225
- intro('join hacklab');
226
- const identity = await promptJoinIdentity();
227
- note(`identity: ${identity}`, 'identity');
228
- if (identity === 'agent') {
229
- await runAgentJoinFlow(options);
230
- return;
231
- }
232
- const loginResult = await loginCommand({
233
- appUrl: options.appUrl,
234
- mode: 'join',
235
- showIntro: false,
236
- showSuccess: false,
237
- showAuthorizeUrlWhenOpened: true,
238
- });
239
- const nicknameLabel = loginResult.nickname ? ` (${loginResult.nickname})` : '';
240
- note(`joined as ${loginResult.email}${nicknameLabel}`, 'account');
241
- const setupAction = await promptSetupAction();
242
- if (setupAction === 'skip') {
243
- outro([
244
- 'join complete.',
245
- 'next:',
246
- '- run `hacklab init` in a new repo to scaffold a fresh hq',
247
- '- or run `hacklab link` in an existing repo',
248
- ].join('\n'));
249
- return;
250
- }
251
- const defaultBaseLocation = await getDefaultBaseLocation();
252
- const baseLocation = await promptForLabLocation(defaultBaseLocation);
253
- if (!baseLocation) {
254
- outro([
255
- 'join complete.',
256
- 'hq setup skipped.',
257
- 'run `hacklab init` or `hacklab link` when ready.',
258
- ].join('\n'));
259
- return;
260
- }
261
- const suggestedRepoName = defaultRepoName(loginResult.nickname);
262
- const repoNameInput = await text({
263
- message: 'hq repo name',
264
- placeholder: suggestedRepoName,
265
- validate: (value) => {
266
- const rawValue = String(value).trim();
267
- if (!rawValue) {
268
- return undefined;
269
- }
270
- const normalized = normalizeRepoName(rawValue);
271
- if (!normalized) {
272
- return 'repository name is required.';
273
- }
274
- if (normalized.length < 2) {
275
- return 'repository name must be at least 2 characters.';
167
+ /**
168
+ * Prompt for a username and loop until it passes the availability check or the
169
+ * user cancels. Returns the chosen username, or null if cancelled.
170
+ */
171
+ async function promptAvailableUsername(appUrl, firstMessage = 'pick your hacklab username') {
172
+ let message = firstMessage;
173
+ while (true) {
174
+ const value = await clack.text({
175
+ message,
176
+ placeholder: 'e.g. ada-lovelace',
177
+ });
178
+ if (clack.isCancel(value))
179
+ return null;
180
+ const candidate = String(value).trim();
181
+ let available = false;
182
+ let reason = 'could not check availability try again';
183
+ try {
184
+ const res = await fetch(`${appUrl}/api/cli/username-available?u=${encodeURIComponent(candidate)}`);
185
+ if (res.ok) {
186
+ const data = (await res.json());
187
+ available = data.available;
188
+ if (!available && data.reason)
189
+ reason = data.reason;
276
190
  }
277
- if (normalized.length > 64) {
278
- return 'repository name must be at most 64 characters.';
191
+ else if (res.status === 429) {
192
+ reason = 'too many checks wait a moment and try again';
279
193
  }
280
- return undefined;
281
- },
282
- });
283
- if (isCancel(repoNameInput)) {
284
- outro([
285
- 'join complete.',
286
- 'hq setup skipped.',
287
- 'run `hacklab init` or `hacklab link` when ready.',
288
- ].join('\n'));
289
- return;
194
+ }
195
+ catch {
196
+ // network error — fall through to re-prompt with the generic reason
197
+ }
198
+ if (available)
199
+ return candidate;
200
+ message = `${reason}\n pick your hacklab username`;
290
201
  }
291
- const repoName = normalizeRepoName(String(repoNameInput)) || suggestedRepoName;
292
- const repoLocation = resolve(baseLocation, repoName);
293
- await mkdir(repoLocation, { recursive: true });
202
+ }
203
+ /** A clack text prompt that returns trimmed text, or undefined if empty/cancelled. */
204
+ async function optionalText(message) {
205
+ const value = await clack.text({ message, placeholder: '(optional)' });
206
+ if (clack.isCancel(value))
207
+ return undefined;
208
+ const trimmed = String(value).trim();
209
+ return trimmed.length > 0 ? trimmed : undefined;
210
+ }
211
+ /** Discard a value that isn't a parseable URL, so an optional vanity field can
212
+ * never 400 the claim and abort the join at the final step. */
213
+ function asValidUrl(value) {
294
214
  try {
295
- await ensureGitRepository(repoLocation);
215
+ return new URL(value).href;
296
216
  }
297
217
  catch {
298
- cancel('failed to initialize git repository. make sure git is installed.');
299
- process.exit(1);
300
- }
301
- const result = await initializeRepository(repoLocation, {
302
- name: repoName,
303
- });
304
- if (result.status === 'already-initialized') {
305
- note(`hq already initialized at ${repoLocation}`, 'hq');
218
+ return undefined;
306
219
  }
307
- else {
308
- note(`hq ready at ${repoLocation}`, 'hq');
309
- }
310
- await linkHqToAccount(loginResult.email, repoLocation);
311
- const relativePath = relative(process.cwd(), repoLocation) || '.';
312
- outro(`join complete.\nnext: cd ${relativePath} && hacklab tui`);
220
+ }
221
+ /** Turn a handle or partial url into a full x.com url; undefined if blank/invalid. */
222
+ function normalizeXUrl(raw) {
223
+ if (!raw)
224
+ return undefined;
225
+ const v = raw.trim();
226
+ if (!v)
227
+ return undefined;
228
+ if (/^https?:\/\//i.test(v))
229
+ return asValidUrl(v);
230
+ const handle = v.replace(/^@/, '');
231
+ return asValidUrl(`https://x.com/${handle}`);
232
+ }
233
+ /** Ensure a website has a scheme; undefined if blank/invalid. */
234
+ function normalizeWebsite(raw) {
235
+ if (!raw)
236
+ return undefined;
237
+ const v = raw.trim();
238
+ if (!v)
239
+ return undefined;
240
+ return asValidUrl(/^https?:\/\//i.test(v) ? v : `https://${v}`);
313
241
  }
314
242
  //# sourceMappingURL=join.js.map
@@ -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":"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"}
@@ -1,16 +1,2 @@
1
- type LoginOptions = {
2
- appUrl?: string;
3
- token?: string;
4
- nickname?: string;
5
- mode?: 'login' | 'join';
6
- showIntro?: boolean;
7
- showSuccess?: boolean;
8
- showAuthorizeUrlWhenOpened?: boolean;
9
- };
10
- export type LoginResult = {
11
- email: string;
12
- nickname?: string;
13
- };
14
- export declare function loginCommand(options?: LoginOptions): Promise<LoginResult>;
15
- export {};
1
+ export declare function login(): Promise<void>;
16
2
  //# sourceMappingURL=login.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAeA,KAAK,YAAY,GAAG;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,0BAA0B,CAAC,EAAE,OAAO,CAAA;CACvC,CAAA;AAsCD,MAAM,MAAM,WAAW,GAAG;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAiJnF"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAMA,wBAAsB,KAAK,kBAiF1B"}