flingit 0.0.41 → 0.0.43
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 +1 -1
- package/dist/cli/commands/launch.d.ts +0 -8
- package/dist/cli/commands/launch.d.ts.map +1 -1
- package/dist/cli/commands/launch.js +1 -12
- package/dist/cli/commands/launch.js.map +1 -1
- package/dist/cli/commands/verify.js +1 -1
- package/dist/cli/index.js +1 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/cli-io-impl.d.ts +1 -3
- package/dist/cli/utils/cli-io-impl.d.ts.map +1 -1
- package/dist/cli/utils/cli-io-impl.js +2 -53
- package/dist/cli/utils/cli-io-impl.js.map +1 -1
- package/dist/cli/utils/cli-io.d.ts +0 -47
- package/dist/cli/utils/cli-io.d.ts.map +1 -1
- package/dist/cli/utils/config.d.ts.map +1 -1
- package/dist/cli/utils/config.js +9 -1
- package/dist/cli/utils/config.js.map +1 -1
- package/dist/cli/utils/prompt-new-project.d.ts.map +1 -1
- package/dist/cli/utils/prompt-new-project.js +6 -5
- package/dist/cli/utils/prompt-new-project.js.map +1 -1
- package/dist/cli/utils/retry.d.ts +16 -1
- package/dist/cli/utils/retry.d.ts.map +1 -1
- package/dist/cli/utils/retry.js +62 -3
- package/dist/cli/utils/retry.js.map +1 -1
- package/dist/shared/constants.d.ts +11 -0
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +11 -0
- package/dist/shared/constants.js.map +1 -1
- package/package.json +2 -1
- package/dist/cli/commands/onboard.d.ts +0 -56
- package/dist/cli/commands/onboard.d.ts.map +0 -1
- package/dist/cli/commands/onboard.js +0 -443
- package/dist/cli/commands/onboard.js.map +0 -1
- package/dist/cli/utils/token.d.ts +0 -12
- package/dist/cli/utils/token.d.ts.map +0 -1
- package/dist/cli/utils/token.js +0 -27
- package/dist/cli/utils/token.js.map +0 -1
|
@@ -1,443 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* fling onboard - Interactive onboarding for first-time users
|
|
3
|
-
*/
|
|
4
|
-
import { Command } from "commander";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { homedir } from "node:os";
|
|
7
|
-
import { normalizeInviteToken } from "../utils/token.js";
|
|
8
|
-
import { defaultOnboardingIO, configIO } from "../utils/cli-io-impl.js";
|
|
9
|
-
import { getProjectSkillsDir } from "../utils/project.js";
|
|
10
|
-
import { getConfigDirWithIO } from "../utils/config.js";
|
|
11
|
-
import { DEFAULT_PLATFORM_API_URL } from "../../shared/constants.js";
|
|
12
|
-
/**
|
|
13
|
-
* Create the onboarding context from options.
|
|
14
|
-
*/
|
|
15
|
-
function createContext(io, options) {
|
|
16
|
-
// Use the shared config directory logic (XDG-compliant with migration)
|
|
17
|
-
const configDir = options?.configDir ?? getConfigDirWithIO(configIO);
|
|
18
|
-
const tokenFile = join(configDir, "token");
|
|
19
|
-
const apiUrlFile = join(configDir, "api-url");
|
|
20
|
-
const flingHome = options?.flingHome ?? join(homedir(), "fling");
|
|
21
|
-
return {
|
|
22
|
-
io,
|
|
23
|
-
paths: { tokenFile, apiUrlFile, configDir, flingHome },
|
|
24
|
-
getApiUrl() {
|
|
25
|
-
const envUrl = process.env["FLING_API_URL"];
|
|
26
|
-
if (envUrl)
|
|
27
|
-
return envUrl;
|
|
28
|
-
if (options?.apiUrl)
|
|
29
|
-
return options.apiUrl;
|
|
30
|
-
const stored = io.file.readFileString(apiUrlFile);
|
|
31
|
-
if (stored)
|
|
32
|
-
return stored;
|
|
33
|
-
return DEFAULT_PLATFORM_API_URL;
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Check if user is logged in (token file exists and is non-empty).
|
|
39
|
-
*/
|
|
40
|
-
function isLoggedIn(ctx) {
|
|
41
|
-
const token = ctx.io.file.readFileString(ctx.paths.tokenFile);
|
|
42
|
-
return token !== null && token.length > 0;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Save the auth token.
|
|
46
|
-
*/
|
|
47
|
-
function setToken(ctx, token) {
|
|
48
|
-
if (!ctx.io.file.exists(ctx.paths.configDir)) {
|
|
49
|
-
ctx.io.file.mkdir(ctx.paths.configDir);
|
|
50
|
-
}
|
|
51
|
-
ctx.io.file.writeFileString(ctx.paths.tokenFile, token, { mode: 0o600 });
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Save the API URL override.
|
|
55
|
-
*/
|
|
56
|
-
function setApiUrl(ctx, url) {
|
|
57
|
-
if (!ctx.io.file.exists(ctx.paths.configDir)) {
|
|
58
|
-
ctx.io.file.mkdir(ctx.paths.configDir);
|
|
59
|
-
}
|
|
60
|
-
ctx.io.file.writeFileString(ctx.paths.apiUrlFile, url);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Check if a directory is a Fling project root.
|
|
64
|
-
*/
|
|
65
|
-
function isFlingProject(ctx, dir) {
|
|
66
|
-
return ctx.io.file.exists(getProjectSkillsDir(dir));
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Handle the API token login flow.
|
|
70
|
-
* Returns true if authentication succeeded, or the symbol if cancelled.
|
|
71
|
-
*/
|
|
72
|
-
async function handleApiTokenFlow(ctx) {
|
|
73
|
-
const { io } = ctx;
|
|
74
|
-
const token = await io.user.password({
|
|
75
|
-
message: "Paste your token",
|
|
76
|
-
validate: (value) => {
|
|
77
|
-
if (!value)
|
|
78
|
-
return "Token is required";
|
|
79
|
-
if (!value.startsWith("usr_"))
|
|
80
|
-
return "Token must start with 'usr_'";
|
|
81
|
-
return undefined;
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
if (io.user.isCancel(token))
|
|
85
|
-
return token;
|
|
86
|
-
// Verify token by calling /me (don't save until verification succeeds)
|
|
87
|
-
const s = io.user.spinner();
|
|
88
|
-
s.start("Verifying token...");
|
|
89
|
-
try {
|
|
90
|
-
const apiUrl = ctx.getApiUrl();
|
|
91
|
-
const response = await io.network.fetch(`${apiUrl}/me`, {
|
|
92
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
93
|
-
});
|
|
94
|
-
const data = (await response.json());
|
|
95
|
-
if (!response.ok) {
|
|
96
|
-
s.stop(`Login failed: ${data.error ?? "Invalid token"}`, 1);
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
|
-
// Only save token after successful verification
|
|
100
|
-
setToken(ctx, token);
|
|
101
|
-
const project = data.projects?.[0];
|
|
102
|
-
s.stop(`Logged in as ${data.user?.name} (${data.user?.email})`);
|
|
103
|
-
if (project) {
|
|
104
|
-
io.user.log.info(`Project: ${project.slug}\n URL: ${project.url}`);
|
|
105
|
-
}
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
s.stop(`Login failed: ${error instanceof Error ? error.message : "Network error"}`, 1);
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Validate an invite token without claiming it.
|
|
115
|
-
* Returns true if valid, false otherwise (with error shown via spinner).
|
|
116
|
-
*/
|
|
117
|
-
async function validateInviteToken(ctx, inviteToken) {
|
|
118
|
-
const { io } = ctx;
|
|
119
|
-
const s = io.user.spinner();
|
|
120
|
-
s.start("Validating invite token...");
|
|
121
|
-
try {
|
|
122
|
-
const apiUrl = ctx.getApiUrl();
|
|
123
|
-
const response = await io.network.fetch(`${apiUrl}/invites/${encodeURIComponent(inviteToken)}/validate`);
|
|
124
|
-
const data = (await response.json());
|
|
125
|
-
if (!response.ok) {
|
|
126
|
-
s.stop(`Invalid token: ${data.error ?? "Unknown error"}`, 1);
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
s.stop("Token valid");
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
catch (error) {
|
|
133
|
-
s.stop(`Validation failed: ${error instanceof Error ? error.message : "Network error"}`, 1);
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Handle the invite token registration flow.
|
|
139
|
-
* Returns true if registration succeeded, or the symbol if cancelled.
|
|
140
|
-
*
|
|
141
|
-
* Flow:
|
|
142
|
-
* 1. Ask for invite token
|
|
143
|
-
* 2. Validate token immediately (loop if invalid)
|
|
144
|
-
* 3. Ask for email/name (skipped if already remembered)
|
|
145
|
-
* 4. Register with the API
|
|
146
|
-
*/
|
|
147
|
-
async function handleInviteFlow(ctx, state) {
|
|
148
|
-
const { io } = ctx;
|
|
149
|
-
// Step 1: Get and validate invite token (loop until valid or cancelled)
|
|
150
|
-
let inviteToken;
|
|
151
|
-
for (;;) {
|
|
152
|
-
const inviteTokenRaw = await io.user.text({
|
|
153
|
-
message: "Paste your token",
|
|
154
|
-
placeholder: "ab1-cd2",
|
|
155
|
-
validate: (value) => {
|
|
156
|
-
if (!value)
|
|
157
|
-
return "Invite token is required";
|
|
158
|
-
return undefined;
|
|
159
|
-
},
|
|
160
|
-
});
|
|
161
|
-
if (io.user.isCancel(inviteTokenRaw))
|
|
162
|
-
return inviteTokenRaw;
|
|
163
|
-
inviteToken = normalizeInviteToken(inviteTokenRaw);
|
|
164
|
-
// Validate token immediately
|
|
165
|
-
const isValid = await validateInviteToken(ctx, inviteToken);
|
|
166
|
-
if (isValid)
|
|
167
|
-
break;
|
|
168
|
-
// Token invalid - loop back to ask again
|
|
169
|
-
}
|
|
170
|
-
// Step 2: Get email/name (use remembered values if available)
|
|
171
|
-
let email = state.email;
|
|
172
|
-
let name = state.name;
|
|
173
|
-
if (!email) {
|
|
174
|
-
const emailInput = await io.user.text({
|
|
175
|
-
message: "Email",
|
|
176
|
-
validate: (value) => {
|
|
177
|
-
if (!value)
|
|
178
|
-
return "Email is required";
|
|
179
|
-
return undefined;
|
|
180
|
-
},
|
|
181
|
-
});
|
|
182
|
-
if (io.user.isCancel(emailInput))
|
|
183
|
-
return emailInput;
|
|
184
|
-
email = emailInput;
|
|
185
|
-
state.email = email; // Remember for next time
|
|
186
|
-
}
|
|
187
|
-
if (!name) {
|
|
188
|
-
const nameInput = await io.user.text({
|
|
189
|
-
message: "Name",
|
|
190
|
-
validate: (value) => {
|
|
191
|
-
if (!value)
|
|
192
|
-
return "Name is required";
|
|
193
|
-
return undefined;
|
|
194
|
-
},
|
|
195
|
-
});
|
|
196
|
-
if (io.user.isCancel(nameInput))
|
|
197
|
-
return nameInput;
|
|
198
|
-
name = nameInput;
|
|
199
|
-
state.name = name; // Remember for next time
|
|
200
|
-
}
|
|
201
|
-
// Step 3: Register via API
|
|
202
|
-
const s = io.user.spinner();
|
|
203
|
-
s.start("Registering...");
|
|
204
|
-
try {
|
|
205
|
-
const apiUrl = ctx.getApiUrl();
|
|
206
|
-
const response = await io.network.fetch(`${apiUrl}/me`, {
|
|
207
|
-
method: "POST",
|
|
208
|
-
headers: {
|
|
209
|
-
Authorization: `Bearer ${inviteToken}`,
|
|
210
|
-
"Content-Type": "application/json",
|
|
211
|
-
},
|
|
212
|
-
body: JSON.stringify({ email, name }),
|
|
213
|
-
});
|
|
214
|
-
const data = (await response.json());
|
|
215
|
-
if (!response.ok) {
|
|
216
|
-
s.stop(`Registration failed: ${data.error ?? "Unknown error"}`, 1);
|
|
217
|
-
return false;
|
|
218
|
-
}
|
|
219
|
-
if (!data.token) {
|
|
220
|
-
s.stop("Registration failed: No token returned", 1);
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
// Store the user token
|
|
224
|
-
setToken(ctx, data.token);
|
|
225
|
-
s.stop(`Welcome to Fling, ${data.name}!`);
|
|
226
|
-
return true;
|
|
227
|
-
}
|
|
228
|
-
catch (error) {
|
|
229
|
-
s.stop(`Registration failed: ${error instanceof Error ? error.message : "Network error"}`, 1);
|
|
230
|
-
return false;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Internal version of promptCredentials that uses context.
|
|
235
|
-
*/
|
|
236
|
-
async function promptCredentialsInternal(ctx, options) {
|
|
237
|
-
const { io } = ctx;
|
|
238
|
-
let step = "credential-choice";
|
|
239
|
-
// Remember email/name during the session so user doesn't have to re-enter
|
|
240
|
-
const inviteFlowState = {};
|
|
241
|
-
for (;;) {
|
|
242
|
-
switch (step) {
|
|
243
|
-
case "credential-choice": {
|
|
244
|
-
const choice = await io.user.select({
|
|
245
|
-
message: options?.message ?? "Would you like to connect your Fling account?",
|
|
246
|
-
options: [
|
|
247
|
-
{ value: "invite", label: "I have an invite link/token" },
|
|
248
|
-
{ value: "api-token", label: "I have an API token" },
|
|
249
|
-
{
|
|
250
|
-
value: "skip",
|
|
251
|
-
label: "Skip for now",
|
|
252
|
-
hint: "local development only",
|
|
253
|
-
},
|
|
254
|
-
],
|
|
255
|
-
});
|
|
256
|
-
if (io.user.isCancel(choice)) {
|
|
257
|
-
return "cancelled";
|
|
258
|
-
}
|
|
259
|
-
if (choice === "invite") {
|
|
260
|
-
step = "invite-flow";
|
|
261
|
-
}
|
|
262
|
-
else if (choice === "api-token") {
|
|
263
|
-
step = "api-token";
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
return "skipped";
|
|
267
|
-
}
|
|
268
|
-
break;
|
|
269
|
-
}
|
|
270
|
-
case "api-token": {
|
|
271
|
-
const result = await handleApiTokenFlow(ctx);
|
|
272
|
-
if (io.user.isCancel(result)) {
|
|
273
|
-
step = "credential-choice";
|
|
274
|
-
}
|
|
275
|
-
else if (!result) {
|
|
276
|
-
// Auth failed - go back to credential choice so user can try again
|
|
277
|
-
step = "credential-choice";
|
|
278
|
-
}
|
|
279
|
-
else {
|
|
280
|
-
return "authenticated";
|
|
281
|
-
}
|
|
282
|
-
break;
|
|
283
|
-
}
|
|
284
|
-
case "invite-flow": {
|
|
285
|
-
const result = await handleInviteFlow(ctx, inviteFlowState);
|
|
286
|
-
if (io.user.isCancel(result)) {
|
|
287
|
-
step = "credential-choice";
|
|
288
|
-
}
|
|
289
|
-
else if (!result) {
|
|
290
|
-
// Registration failed - go back to credential choice so user can try again
|
|
291
|
-
step = "credential-choice";
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
return "authenticated";
|
|
295
|
-
}
|
|
296
|
-
break;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Prompt the user to authenticate.
|
|
303
|
-
* This is the public API that creates its own context using defaults.
|
|
304
|
-
*/
|
|
305
|
-
export async function promptCredentials(options) {
|
|
306
|
-
const ctx = createContext(defaultOnboardingIO);
|
|
307
|
-
return promptCredentialsInternal(ctx, options);
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* Run the interactive onboarding flow.
|
|
311
|
-
*
|
|
312
|
-
* This can be called programmatically (from launch.ts) or via the command.
|
|
313
|
-
* Returns whether the user authenticated and whether to set up the default project.
|
|
314
|
-
*/
|
|
315
|
-
export async function runOnboarding(io = defaultOnboardingIO, options) {
|
|
316
|
-
const ctx = createContext(io, options);
|
|
317
|
-
io.user.intro("Welcome to Fling!");
|
|
318
|
-
// Check if already logged in
|
|
319
|
-
const wasLoggedIn = isLoggedIn(ctx);
|
|
320
|
-
if (wasLoggedIn) {
|
|
321
|
-
const replace = await io.user.confirm({
|
|
322
|
-
message: "You're already logged in. Replace existing token?",
|
|
323
|
-
initialValue: false,
|
|
324
|
-
});
|
|
325
|
-
if (io.user.isCancel(replace) || !replace) {
|
|
326
|
-
io.user.outro("Keeping existing credentials.");
|
|
327
|
-
return { authenticated: true, setupProject: true };
|
|
328
|
-
}
|
|
329
|
-
// Don't clear the old token yet - keep it until new auth succeeds.
|
|
330
|
-
// This way if new auth fails, the user still has their old credentials.
|
|
331
|
-
}
|
|
332
|
-
const credResult = await promptCredentialsInternal(ctx, {
|
|
333
|
-
message: "How would you like to onboard?",
|
|
334
|
-
});
|
|
335
|
-
if (credResult === "cancelled" || credResult === "failed") {
|
|
336
|
-
io.user.cancel("Onboarding cancelled.");
|
|
337
|
-
return { authenticated: false, setupProject: false };
|
|
338
|
-
}
|
|
339
|
-
// Save API URL if using a non-default URL (from --api-url option or FLING_API_URL env var).
|
|
340
|
-
// This ensures subsequent commands use the same API without needing the env var set.
|
|
341
|
-
const apiUrl = ctx.getApiUrl();
|
|
342
|
-
if (apiUrl !== DEFAULT_PLATFORM_API_URL) {
|
|
343
|
-
setApiUrl(ctx, apiUrl);
|
|
344
|
-
}
|
|
345
|
-
if (credResult === "skipped") {
|
|
346
|
-
io.user.log.info("No problem! You can still use Fling for local development.");
|
|
347
|
-
io.user.log.message("To deploy later, run:\n" +
|
|
348
|
-
" fling onboard - Interactive setup\n" +
|
|
349
|
-
" fling signup - Create a new account\n" +
|
|
350
|
-
" fling login - Log in with an existing account");
|
|
351
|
-
}
|
|
352
|
-
const authenticated = credResult === "authenticated";
|
|
353
|
-
// Check if ~/fling already exists
|
|
354
|
-
const flingHome = ctx.paths.flingHome;
|
|
355
|
-
if (io.file.exists(flingHome)) {
|
|
356
|
-
if (isFlingProject(ctx, flingHome)) {
|
|
357
|
-
// ~/fling exists and is a Fling project - skip creation
|
|
358
|
-
io.user.outro("You're all set!");
|
|
359
|
-
return { authenticated, setupProject: true, projectDir: flingHome };
|
|
360
|
-
}
|
|
361
|
-
else {
|
|
362
|
-
// ~/fling exists but is not a Fling project - explain and finish
|
|
363
|
-
io.user.log.warn("~/fling exists but is not a Fling project.");
|
|
364
|
-
io.user.log.message("To create a Fling project elsewhere, run:\n" +
|
|
365
|
-
" mkdir ~/my-project && cd ~/my-project\n" +
|
|
366
|
-
" fling init");
|
|
367
|
-
io.user.outro("Onboarding complete.");
|
|
368
|
-
return { authenticated, setupProject: false };
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
// ~/fling doesn't exist - ask about project directory
|
|
372
|
-
const setupProject = await io.user.confirm({
|
|
373
|
-
message: "Create your Fling project at ~/fling?",
|
|
374
|
-
initialValue: true,
|
|
375
|
-
});
|
|
376
|
-
if (io.user.isCancel(setupProject)) {
|
|
377
|
-
io.user.cancel("Onboarding cancelled.");
|
|
378
|
-
return { authenticated, setupProject: false };
|
|
379
|
-
}
|
|
380
|
-
io.user.outro("You're all set!");
|
|
381
|
-
if (setupProject) {
|
|
382
|
-
return { authenticated, setupProject, projectDir: flingHome };
|
|
383
|
-
}
|
|
384
|
-
return { authenticated, setupProject };
|
|
385
|
-
}
|
|
386
|
-
/**
|
|
387
|
-
* Action handler for the onboard command.
|
|
388
|
-
* Runs onboarding, then launches Claude Code if a project is ready.
|
|
389
|
-
*/
|
|
390
|
-
export async function onboardAction(opts, deps) {
|
|
391
|
-
const result = await deps.runOnboarding(deps.io, opts.apiUrl ? { apiUrl: opts.apiUrl } : undefined);
|
|
392
|
-
if (result.setupProject && result.projectDir) {
|
|
393
|
-
if (!deps.isProjectRoot(result.projectDir)) {
|
|
394
|
-
await deps.createProject(result.projectDir);
|
|
395
|
-
}
|
|
396
|
-
deps.launchClaudeCode(result.projectDir);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* Create default dependencies for the onboard command action.
|
|
401
|
-
* Uses dynamic imports to avoid circular dependency (launch.ts imports from onboard.ts).
|
|
402
|
-
*/
|
|
403
|
-
async function createDefaultOnboardActionIO() {
|
|
404
|
-
const { launchClaudeCode, createProject } = await import("./launch.js");
|
|
405
|
-
const { isProjectRoot } = await import("../utils/project.js");
|
|
406
|
-
const { createDefaultLaunchIO, projectFileIO } = await import("../utils/cli-io-impl.js");
|
|
407
|
-
const launchIO = createDefaultLaunchIO();
|
|
408
|
-
return {
|
|
409
|
-
runOnboarding,
|
|
410
|
-
io: defaultOnboardingIO,
|
|
411
|
-
isProjectRoot: (dir) => isProjectRoot(dir, projectFileIO),
|
|
412
|
-
createProject: (dir) => createProject(dir, launchIO),
|
|
413
|
-
launchClaudeCode: (dir) => {
|
|
414
|
-
launchClaudeCode(dir, launchIO);
|
|
415
|
-
},
|
|
416
|
-
};
|
|
417
|
-
}
|
|
418
|
-
export const onboardCommand = new Command("onboard")
|
|
419
|
-
.description("Interactive setup for new Fling users")
|
|
420
|
-
.option("--api-url <url>", "Override API endpoint (internal/testing use only)")
|
|
421
|
-
.addHelpText("after", `
|
|
422
|
-
What it does:
|
|
423
|
-
- Guides you through account setup (login or registration)
|
|
424
|
-
- Optionally creates your first Fling project at ~/fling
|
|
425
|
-
|
|
426
|
-
When to use:
|
|
427
|
-
- First time using Fling
|
|
428
|
-
- Re-authenticate after logging out
|
|
429
|
-
- Start fresh with a new account
|
|
430
|
-
|
|
431
|
-
Alternatives:
|
|
432
|
-
fling signup Create a new account
|
|
433
|
-
fling login Log in with an existing account
|
|
434
|
-
fling init Initialize a project without account setup
|
|
435
|
-
|
|
436
|
-
Examples:
|
|
437
|
-
fling onboard Start interactive setup
|
|
438
|
-
`)
|
|
439
|
-
.action(async (opts) => {
|
|
440
|
-
const deps = await createDefaultOnboardActionIO();
|
|
441
|
-
await onboardAction(opts, deps);
|
|
442
|
-
});
|
|
443
|
-
//# sourceMappingURL=onboard.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../../src/cli/commands/onboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token utilities for Fling CLI
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Normalize an invite token:
|
|
6
|
-
* - Trims whitespace
|
|
7
|
-
* - Prepends 'inv_' if missing
|
|
8
|
-
* - Lowercases short-format codes (xxx-xxx) for case-insensitive entry
|
|
9
|
-
* - Preserves case for legacy long-format tokens
|
|
10
|
-
*/
|
|
11
|
-
export declare function normalizeInviteToken(token: string): string;
|
|
12
|
-
//# sourceMappingURL=token.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/token.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAc1D"}
|
package/dist/cli/utils/token.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token utilities for Fling CLI
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Normalize an invite token:
|
|
6
|
-
* - Trims whitespace
|
|
7
|
-
* - Prepends 'inv_' if missing
|
|
8
|
-
* - Lowercases short-format codes (xxx-xxx) for case-insensitive entry
|
|
9
|
-
* - Preserves case for legacy long-format tokens
|
|
10
|
-
*/
|
|
11
|
-
export function normalizeInviteToken(token) {
|
|
12
|
-
const trimmed = token.trim();
|
|
13
|
-
let withPrefix;
|
|
14
|
-
if (trimmed.startsWith("inv_")) {
|
|
15
|
-
withPrefix = trimmed;
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
withPrefix = "inv_" + trimmed;
|
|
19
|
-
}
|
|
20
|
-
// Only normalize case for short codes (inv_ + xxx-xxx = 11 chars total)
|
|
21
|
-
const code = withPrefix.slice(4);
|
|
22
|
-
if (code.length === 7 && code[3] === "-") {
|
|
23
|
-
return "inv_" + code.toLowerCase();
|
|
24
|
-
}
|
|
25
|
-
return withPrefix;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=token.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/cli/utils/token.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,UAAkB,CAAC;IACvB,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,UAAU,GAAG,OAAO,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;IAChC,CAAC;IACD,wEAAwE;IACxE,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACzC,OAAO,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|