flingit 0.0.5 → 0.0.6

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
@@ -6,7 +6,7 @@
6
6
 
7
7
  ## What is Fling?
8
8
 
9
- Fling lets you build personal software tools by describing what you want. You open a terminal, type `fling`, and start talking to Claude. That's it.
9
+ Fling is the fastest way from Claude Code to deployed software.
10
10
 
11
11
  > "I want a podcast feed that picks randomly between Hard Fork and The Daily each day, and gives me one episode per day."
12
12
 
@@ -24,26 +24,9 @@ That's it. This creates a project at `~/fling`, sets up the environment, and ope
24
24
 
25
25
  Requires Node.js 22 or later.
26
26
 
27
- ### Global Install (Optional)
28
-
29
- If you prefer a global command:
30
-
31
- ```bash
32
- npm install -g flingit
33
- fling
34
- ```
35
-
36
- ### Returning to Your Project
37
-
38
- ```bash
39
- npx flingit
40
- ```
41
-
42
- Opens Claude Code in your existing project. Continue where you left off.
43
-
44
27
  ## How It Works
45
28
 
46
- Fling provides four primitives that Claude uses to build your tools:
29
+ Fling provides four primitives (more to come) that Claude uses to build your tools:
47
30
 
48
31
  | Primitive | What it does |
49
32
  |-----------|--------------|
@@ -52,7 +35,7 @@ Fling provides four primitives that Claude uses to build your tools:
52
35
  | **Database** | Store and query data (SQLite) |
53
36
  | **Secrets** | Manage API keys and credentials |
54
37
 
55
- Everything works locally during development. When you're ready, `fling push` deploys to production.
38
+ Everything works locally during development. When you're ready, just tell Claude Code to deploys to production.
56
39
 
57
40
  ## Design Philosophy
58
41
 
@@ -60,10 +43,20 @@ Everything works locally during development. When you're ready, `fling push` dep
60
43
 
61
44
  2. **Standard tools over custom abstractions** — Hono for HTTP, SQLite for data, standard cron syntax. Claude already knows these.
62
45
 
63
- 3. **Local-first development** — Everything works locally. Deployment is an optimization.
46
+ 3. **Local-first development** — Everything works and can be tested locally.
64
47
 
65
48
  4. **Fail fast** — Missing secrets throw. Invalid syntax throws. Obvious errors help Claude debug.
66
49
 
50
+ ## Running Fling From Source
51
+
52
+ To run fling from this repo, just do
53
+
54
+ ```bash
55
+ npm run cli
56
+ ```
57
+
58
+ That's the equivalent of running `npx flingit`. It will also do the onboarding flow and create a Fling project, but the `flingit` dependency there will point to your local package instead of the public package on NPM.
59
+
67
60
  ## Publishing
68
61
 
69
62
  The package is published to npm as `flingit`. The `prepublishOnly` script runs lint, typecheck, build, and tests automatically.
@@ -82,4 +75,8 @@ npm pack --dry-run
82
75
 
83
76
  - [ARCHITECTURE.md](./ARCHITECTURE.md) — How Fling works internally (CLI commands, runtime API, platform)
84
77
  - [API.md](./API.md) — Platform HTTP API reference
78
+ - [DEPLOYMENT.md](./DEPLOYMENT.md) — How the Fling platform deploys
79
+ - [SCRIPTS.md](./SCRIPTS.md) — All the scripts in this repo
80
+ - [CLI.md](./CLI.md) — All the commands provided by the CLI
81
+ - [SMOKE-TEST.md](./SMOKE-TEST.md) — What the smoke-test tests
85
82
  - [SPEC.md](./SPEC.md) — Original product specification
@@ -2,6 +2,7 @@
2
2
  * fling onboard - Interactive onboarding for first-time users
3
3
  */
4
4
  import { Command } from "commander";
5
+ import type { OnboardingIO } from "../utils/onboarding-io.js";
5
6
  /**
6
7
  * Result from the onboarding flow.
7
8
  */
@@ -9,9 +10,18 @@ export interface OnboardingResult {
9
10
  authenticated: boolean;
10
11
  setupProject: boolean;
11
12
  }
13
+ /**
14
+ * Options for running onboarding (mostly for testing).
15
+ */
16
+ export interface OnboardingOptions {
17
+ apiUrl?: string;
18
+ configDir?: string;
19
+ flingHome?: string;
20
+ }
12
21
  export type CredentialResult = "authenticated" | "skipped" | "failed" | "cancelled";
13
22
  /**
14
23
  * Prompt the user to authenticate.
24
+ * This is the public API that creates its own context using defaults.
15
25
  */
16
26
  export declare function promptCredentials(options?: {
17
27
  message?: string;
@@ -22,8 +32,6 @@ export declare function promptCredentials(options?: {
22
32
  * This can be called programmatically (from launch.ts) or via the command.
23
33
  * Returns whether the user authenticated and whether to set up the default project.
24
34
  */
25
- export declare function runOnboarding(options?: {
26
- apiUrl?: string;
27
- }): Promise<OnboardingResult>;
35
+ export declare function runOnboarding(io?: OnboardingIO, options?: OnboardingOptions): Promise<OnboardingResult>;
28
36
  export declare const onboardCommand: Command;
29
37
  //# sourceMappingURL=onboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/onboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;CACvB;AA0ID,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf,SAAS,GACT,QAAQ,GACR,WAAW,CAAC;AAEhB;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsD5B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuD5B;AAED,eAAO,MAAM,cAAc,SA0BvB,CAAC"}
1
+ {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/onboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAK9D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgOD,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf,SAAS,GACT,QAAQ,GACR,WAAW,CAAC;AAuEhB;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAG5B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,EAAE,GAAE,YAAkC,EACtC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAiF3B;AAED,eAAO,MAAM,cAAc,SA0BvB,CAAC"}
@@ -2,15 +2,73 @@
2
2
  * fling onboard - Interactive onboarding for first-time users
3
3
  */
4
4
  import { Command } from "commander";
5
- import * as p from "@clack/prompts";
6
- import { setToken, isLoggedIn, clearToken, platformFetch, getApiUrl, setApiUrl, } from "../utils/config.js";
5
+ import { join } from "node:path";
6
+ import { homedir } from "node:os";
7
7
  import { normalizeInviteToken } from "../utils/token.js";
8
+ import { defaultOnboardingIO } from "../utils/onboarding-io-impl.js";
9
+ const DEFAULT_API_URL = "https://api.justdeployit.dev";
10
+ /**
11
+ * Create the onboarding context from options.
12
+ */
13
+ function createContext(io, options) {
14
+ const configDir = options?.configDir ?? join(homedir(), ".fling");
15
+ const tokenFile = join(configDir, "token");
16
+ const apiUrlFile = join(configDir, "api-url");
17
+ const flingHome = options?.flingHome ?? join(homedir(), "fling");
18
+ return {
19
+ io,
20
+ paths: { tokenFile, apiUrlFile, configDir, flingHome },
21
+ getApiUrl() {
22
+ const envUrl = process.env["FLING_API_URL"];
23
+ if (envUrl)
24
+ return envUrl;
25
+ if (options?.apiUrl)
26
+ return options.apiUrl;
27
+ const stored = io.file.read(apiUrlFile);
28
+ if (stored)
29
+ return stored;
30
+ return DEFAULT_API_URL;
31
+ },
32
+ };
33
+ }
34
+ /**
35
+ * Check if user is logged in (token file exists and is non-empty).
36
+ */
37
+ function isLoggedIn(ctx) {
38
+ const token = ctx.io.file.read(ctx.paths.tokenFile);
39
+ return token !== null && token.length > 0;
40
+ }
41
+ /**
42
+ * Save the auth token.
43
+ */
44
+ function setToken(ctx, token) {
45
+ if (!ctx.io.file.exists(ctx.paths.configDir)) {
46
+ ctx.io.file.mkdir(ctx.paths.configDir);
47
+ }
48
+ ctx.io.file.write(ctx.paths.tokenFile, token, 0o600);
49
+ }
50
+ /**
51
+ * Save the API URL override.
52
+ */
53
+ function setApiUrl(ctx, url) {
54
+ if (!ctx.io.file.exists(ctx.paths.configDir)) {
55
+ ctx.io.file.mkdir(ctx.paths.configDir);
56
+ }
57
+ ctx.io.file.write(ctx.paths.apiUrlFile, url);
58
+ }
59
+ /**
60
+ * Check if a directory is a Fling project root.
61
+ */
62
+ function isFlingProject(ctx, dir) {
63
+ return ctx.io.file.exists(join(dir, ".claude", "skills", "fling"));
64
+ }
8
65
  /**
9
66
  * Handle the API token login flow.
10
67
  * Returns true if authentication succeeded, or the symbol if cancelled.
11
68
  */
12
- async function handleApiTokenFlow() {
13
- const token = await p.password({
69
+ async function handleApiTokenFlow(ctx) {
70
+ const { io } = ctx;
71
+ const token = await io.user.password({
14
72
  message: "Paste your token",
15
73
  validate: (value) => {
16
74
  if (!value)
@@ -20,30 +78,31 @@ async function handleApiTokenFlow() {
20
78
  return undefined;
21
79
  },
22
80
  });
23
- if (p.isCancel(token))
81
+ if (io.user.isCancel(token))
24
82
  return token;
25
- // Store token temporarily
26
- setToken(token);
27
- // Verify token by calling /me
28
- const s = p.spinner();
83
+ // Verify token by calling /me (don't save until verification succeeds)
84
+ const s = io.user.spinner();
29
85
  s.start("Verifying token...");
30
86
  try {
31
- const response = await platformFetch("/me");
87
+ const apiUrl = ctx.getApiUrl();
88
+ const response = await io.network.fetch(`${apiUrl}/me`, {
89
+ headers: { Authorization: `Bearer ${token}` },
90
+ });
32
91
  const data = (await response.json());
33
92
  if (!response.ok) {
34
- clearToken();
35
93
  s.stop(`Login failed: ${data.error ?? "Invalid token"}`, 1);
36
94
  return false;
37
95
  }
96
+ // Only save token after successful verification
97
+ setToken(ctx, token);
38
98
  const project = data.projects?.[0];
39
99
  s.stop(`Logged in as ${data.user?.name} (${data.user?.email})`);
40
100
  if (project) {
41
- p.log.info(`Project: ${project.slug}\n URL: ${project.url}`);
101
+ io.user.log.info(`Project: ${project.slug}\n URL: ${project.url}`);
42
102
  }
43
103
  return true;
44
104
  }
45
105
  catch (error) {
46
- clearToken();
47
106
  s.stop(`Login failed: ${error instanceof Error ? error.message : "Network error"}`, 1);
48
107
  return false;
49
108
  }
@@ -52,8 +111,9 @@ async function handleApiTokenFlow() {
52
111
  * Handle the invite token registration flow.
53
112
  * Returns true if registration succeeded, or the symbol if cancelled.
54
113
  */
55
- async function handleInviteFlow() {
56
- const inviteTokenRaw = await p.text({
114
+ async function handleInviteFlow(ctx) {
115
+ const { io } = ctx;
116
+ const inviteTokenRaw = await io.user.text({
57
117
  message: "Paste your token",
58
118
  placeholder: "inv_...",
59
119
  validate: (value) => {
@@ -62,10 +122,10 @@ async function handleInviteFlow() {
62
122
  return undefined;
63
123
  },
64
124
  });
65
- if (p.isCancel(inviteTokenRaw))
125
+ if (io.user.isCancel(inviteTokenRaw))
66
126
  return inviteTokenRaw;
67
127
  const inviteToken = normalizeInviteToken(inviteTokenRaw);
68
- const email = await p.text({
128
+ const email = await io.user.text({
69
129
  message: "Email",
70
130
  validate: (value) => {
71
131
  if (!value)
@@ -73,9 +133,9 @@ async function handleInviteFlow() {
73
133
  return undefined;
74
134
  },
75
135
  });
76
- if (p.isCancel(email))
136
+ if (io.user.isCancel(email))
77
137
  return email;
78
- const name = await p.text({
138
+ const name = await io.user.text({
79
139
  message: "Name",
80
140
  validate: (value) => {
81
141
  if (!value)
@@ -83,13 +143,14 @@ async function handleInviteFlow() {
83
143
  return undefined;
84
144
  },
85
145
  });
86
- if (p.isCancel(name))
146
+ if (io.user.isCancel(name))
87
147
  return name;
88
148
  // Register via API
89
- const s = p.spinner();
149
+ const s = io.user.spinner();
90
150
  s.start("Registering...");
91
151
  try {
92
- const response = await fetch(`${getApiUrl()}/me`, {
152
+ const apiUrl = ctx.getApiUrl();
153
+ const response = await io.network.fetch(`${apiUrl}/me`, {
93
154
  method: "POST",
94
155
  headers: {
95
156
  Authorization: `Bearer ${inviteToken}`,
@@ -107,7 +168,7 @@ async function handleInviteFlow() {
107
168
  return false;
108
169
  }
109
170
  // Store the user token
110
- setToken(data.token);
171
+ setToken(ctx, data.token);
111
172
  s.stop(`Welcome to Fling, ${data.name}!`);
112
173
  return true;
113
174
  }
@@ -117,22 +178,27 @@ async function handleInviteFlow() {
117
178
  }
118
179
  }
119
180
  /**
120
- * Prompt the user to authenticate.
181
+ * Internal version of promptCredentials that uses context.
121
182
  */
122
- export async function promptCredentials(options) {
183
+ async function promptCredentialsInternal(ctx, options) {
184
+ const { io } = ctx;
123
185
  let step = "credential-choice";
124
186
  for (;;) {
125
187
  switch (step) {
126
188
  case "credential-choice": {
127
- const choice = await p.select({
189
+ const choice = await io.user.select({
128
190
  message: options?.message ?? "Would you like to connect your Fling account?",
129
191
  options: [
130
192
  { value: "invite", label: "I have an invite link/token" },
131
193
  { value: "api-token", label: "I have an API token" },
132
- { value: "skip", label: "Skip for now", hint: "local development only" },
194
+ {
195
+ value: "skip",
196
+ label: "Skip for now",
197
+ hint: "local development only",
198
+ },
133
199
  ],
134
200
  });
135
- if (p.isCancel(choice)) {
201
+ if (io.user.isCancel(choice)) {
136
202
  return "cancelled";
137
203
  }
138
204
  if (choice === "invite") {
@@ -147,8 +213,8 @@ export async function promptCredentials(options) {
147
213
  break;
148
214
  }
149
215
  case "api-token": {
150
- const result = await handleApiTokenFlow();
151
- if (p.isCancel(result)) {
216
+ const result = await handleApiTokenFlow(ctx);
217
+ if (io.user.isCancel(result)) {
152
218
  step = "credential-choice";
153
219
  }
154
220
  else if (!result) {
@@ -160,8 +226,8 @@ export async function promptCredentials(options) {
160
226
  break;
161
227
  }
162
228
  case "invite-flow": {
163
- const result = await handleInviteFlow();
164
- if (p.isCancel(result)) {
229
+ const result = await handleInviteFlow(ctx);
230
+ if (io.user.isCancel(result)) {
165
231
  step = "credential-choice";
166
232
  }
167
233
  else if (!result) {
@@ -175,53 +241,84 @@ export async function promptCredentials(options) {
175
241
  }
176
242
  }
177
243
  }
244
+ /**
245
+ * Prompt the user to authenticate.
246
+ * This is the public API that creates its own context using defaults.
247
+ */
248
+ export async function promptCredentials(options) {
249
+ const ctx = createContext(defaultOnboardingIO);
250
+ return promptCredentialsInternal(ctx, options);
251
+ }
178
252
  /**
179
253
  * Run the interactive onboarding flow.
180
254
  *
181
255
  * This can be called programmatically (from launch.ts) or via the command.
182
256
  * Returns whether the user authenticated and whether to set up the default project.
183
257
  */
184
- export async function runOnboarding(options) {
258
+ export async function runOnboarding(io = defaultOnboardingIO, options) {
259
+ const ctx = createContext(io, options);
185
260
  // Set API URL if provided
186
261
  if (options?.apiUrl) {
187
- setApiUrl(options.apiUrl);
262
+ setApiUrl(ctx, options.apiUrl);
188
263
  }
189
- p.intro("Welcome to Fling!");
264
+ io.user.intro("Welcome to Fling!");
190
265
  // Check if already logged in
191
- if (isLoggedIn()) {
192
- const replace = await p.confirm({
266
+ const wasLoggedIn = isLoggedIn(ctx);
267
+ if (wasLoggedIn) {
268
+ const replace = await io.user.confirm({
193
269
  message: "You're already logged in. Replace existing token?",
194
270
  initialValue: false,
195
271
  });
196
- if (p.isCancel(replace) || !replace) {
197
- p.outro("Keeping existing credentials.");
272
+ if (io.user.isCancel(replace) || !replace) {
273
+ io.user.outro("Keeping existing credentials.");
198
274
  return { authenticated: true, setupProject: true };
199
275
  }
200
- clearToken();
276
+ // Don't clear the old token yet - keep it until new auth succeeds.
277
+ // This way if new auth fails, the user still has their old credentials.
201
278
  }
202
- const credResult = await promptCredentials({ message: "How would you like to onboard?" });
279
+ const credResult = await promptCredentialsInternal(ctx, {
280
+ message: "How would you like to onboard?",
281
+ });
203
282
  if (credResult === "cancelled" || credResult === "failed") {
204
- p.cancel("Onboarding cancelled.");
283
+ io.user.cancel("Onboarding cancelled.");
205
284
  return { authenticated: false, setupProject: false };
206
285
  }
207
286
  if (credResult === "skipped") {
208
- p.log.info("No problem! You can still use Fling for local development.");
209
- p.log.message("To deploy later, run:\n" +
287
+ io.user.log.info("No problem! You can still use Fling for local development.");
288
+ io.user.log.message("To deploy later, run:\n" +
210
289
  " fling onboard - Interactive setup\n" +
211
290
  " fling login <token> - If you have an API token\n" +
212
291
  " fling register <inv> - If you have an invite link");
213
292
  }
214
293
  const authenticated = credResult === "authenticated";
215
- // Ask about project directory
216
- const setupProject = await p.confirm({
294
+ // Check if ~/fling already exists
295
+ const flingHome = ctx.paths.flingHome;
296
+ if (io.file.exists(flingHome)) {
297
+ if (isFlingProject(ctx, flingHome)) {
298
+ // ~/fling exists and is a Fling project - skip creation and launch Claude Code there
299
+ io.user.outro("Opening your existing Fling project at ~/fling");
300
+ return { authenticated, setupProject: true };
301
+ }
302
+ else {
303
+ // ~/fling exists but is not a Fling project - explain and finish
304
+ io.user.log.warn("~/fling exists but is not a Fling project.");
305
+ io.user.log.message("To create a Fling project elsewhere, run:\n" +
306
+ " mkdir ~/my-project && cd ~/my-project\n" +
307
+ " fling init");
308
+ io.user.outro("Onboarding complete.");
309
+ return { authenticated, setupProject: false };
310
+ }
311
+ }
312
+ // ~/fling doesn't exist - ask about project directory
313
+ const setupProject = await io.user.confirm({
217
314
  message: "Create your Fling project at ~/fling?",
218
315
  initialValue: true,
219
316
  });
220
- if (p.isCancel(setupProject)) {
221
- p.cancel("Onboarding cancelled.");
317
+ if (io.user.isCancel(setupProject)) {
318
+ io.user.cancel("Onboarding cancelled.");
222
319
  return { authenticated, setupProject: false };
223
320
  }
224
- p.outro("You're all set!");
321
+ io.user.outro("You're all set!");
225
322
  return { authenticated, setupProject };
226
323
  }
227
324
  export const onboardCommand = new Command("onboard")
@@ -245,7 +342,7 @@ Alternatives:
245
342
  Examples:
246
343
  fling onboard Start interactive setup
247
344
  `)
248
- .action(async (options) => {
249
- await runOnboarding(options.apiUrl ? { apiUrl: options.apiUrl } : undefined);
345
+ .action(async (opts) => {
346
+ await runOnboarding(defaultOnboardingIO, opts.apiUrl ? { apiUrl: opts.apiUrl } : undefined);
250
347
  });
251
348
  //# sourceMappingURL=onboard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../../src/cli/commands/onboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,SAAS,GACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAWzD;;;GAGG;AACH,KAAK,UAAU,kBAAkB;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC;QAC7B,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,KAAK;gBAAE,OAAO,mBAAmB,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO,8BAA8B,CAAC;YACrE,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,0BAA0B;IAC1B,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhB,8BAA8B;IAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAIlC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,UAAU,EAAE,CAAC;YACb,CAAC,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,KAAK,IAAI,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC;QAChE,IAAI,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,aAAa,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;QACb,CAAC,CAAC,IAAI,CACJ,iBAAiB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAC3E,CAAC,CACF,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,gBAAgB;IAC7B,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QAClC,OAAO,EAAE,kBAAkB;QAC3B,WAAW,EAAE,SAAS;QACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,KAAK;gBAAE,OAAO,0BAA0B,CAAC;YAC9C,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,cAAc,CAAC;IAEtD,MAAM,WAAW,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAEzD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACzB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,KAAK;gBAAE,OAAO,mBAAmB,CAAC;YACvC,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACxB,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,KAAK;gBAAE,OAAO,kBAAkB,CAAC;YACtC,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,mBAAmB;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;gBACtC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SACtC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAOlC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,CAAC,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,KAAK,IAAI,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC,CAAC,IAAI,CAAC,wCAAwC,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,uBAAuB;QACvB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErB,CAAC,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,IAAI,CACJ,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAClF,CAAC,CACF,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAQD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAEvC;IACC,IAAI,IAAI,GAAsD,mBAAmB,CAAC;IAElF,SAAS,CAAC;QACR,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACzB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;oBAC5B,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,+CAA+C;oBAC5E,OAAO,EAAE;wBACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,6BAA6B,EAAE;wBACzD,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,qBAAqB,EAAE;wBACpD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,wBAAwB,EAAE;qBACzE;iBACF,CAAC,CAAC;gBAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvB,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACxB,IAAI,GAAG,aAAa,CAAC;gBACvB,CAAC;qBAAM,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;oBAClC,IAAI,GAAG,WAAW,CAAC;gBACrB,CAAC;qBAAM,CAAC;oBACN,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;gBAC1C,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvB,IAAI,GAAG,mBAAmB,CAAC;gBAC7B,CAAC;qBAAM,IAAI,CAAC,MAAM,EAAE,CAAC;oBACnB,OAAO,QAAQ,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,OAAO,eAAe,CAAC;gBACzB,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBACxC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvB,IAAI,GAAG,mBAAmB,CAAC;gBAC7B,CAAC;qBAAM,IAAI,CAAC,MAAM,EAAE,CAAC;oBACnB,OAAO,QAAQ,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,OAAO,eAAe,CAAC;gBACzB,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAEnC;IACC,0BAA0B;IAC1B,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAE7B,6BAA6B;IAC7B,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;YAC9B,OAAO,EAAE,mDAAmD;YAC5D,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACzC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,UAAU,EAAE,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAC;IAE1F,IAAI,UAAU,KAAK,WAAW,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1D,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAClC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QACzE,CAAC,CAAC,GAAG,CAAC,OAAO,CACX,yBAAyB;YACzB,8CAA8C;YAC9C,sDAAsD;YACtD,sDAAsD,CACvD,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,UAAU,KAAK,eAAe,CAAC;IAErD,8BAA8B;IAC9B,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QACnC,OAAO,EAAE,uCAAuC;QAChD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAClC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAE3B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;KAC9E,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;CAiBH,CACE;KACA,MAAM,CAAC,KAAK,EAAE,OAA4B,EAAE,EAAE;IAC7C,MAAM,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC/E,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../../src/cli/commands/onboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,eAAe,GAAG,8BAA8B,CAAC;AAkCvD;;GAEG;AACH,SAAS,aAAa,CACpB,EAAgB,EAChB,OAA2B;IAE3B,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IAEjE,OAAO;QACL,EAAE;QACF,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE;QACtD,SAAS;YACP,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC5C,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;YAC1B,IAAI,OAAO,EAAE,MAAM;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC;YAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;YAC1B,OAAO,eAAe,CAAC;QACzB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,GAAsB;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,GAAsB,EAAE,KAAa;IACrD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IACD,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAsB,EAAE,GAAW;IACpD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IACD,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAsB,EAAE,GAAW;IACzD,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,kBAAkB,CAC/B,GAAsB;IAEtB,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;IAEnB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;QACnC,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,KAAK;gBAAE,OAAO,mBAAmB,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO,8BAA8B,CAAC;YACrE,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1C,uEAAuE;IACvE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,KAAK,EAAE;YACtD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAIlC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,CAAC,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,KAAK,IAAI,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,gDAAgD;QAChD,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAErB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC;QAChE,IAAI,OAAO,EAAE,CAAC;YACZ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,aAAa,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,IAAI,CACJ,iBAAiB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAC3E,CAAC,CACF,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,gBAAgB,CAC7B,GAAsB;IAEtB,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;IAEnB,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QACxC,OAAO,EAAE,kBAAkB;QAC3B,WAAW,EAAE,SAAS;QACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,KAAK;gBAAE,OAAO,0BAA0B,CAAC;YAC9C,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,cAAc,CAAC;IAE5D,MAAM,WAAW,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAEzD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,KAAK;gBAAE,OAAO,mBAAmB,CAAC;YACvC,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,KAAK;gBAAE,OAAO,kBAAkB,CAAC;YACtC,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,mBAAmB;IACnB,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,KAAK,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;gBACtC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SACtC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAOlC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,CAAC,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,KAAK,IAAI,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC,CAAC,IAAI,CAAC,wCAAwC,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,uBAAuB;QACvB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1B,CAAC,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,IAAI,CACJ,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAClF,CAAC,CACF,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAQD;;GAEG;AACH,KAAK,UAAU,yBAAyB,CACtC,GAAsB,EACtB,OAA8B;IAE9B,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;IACnB,IAAI,IAAI,GACN,mBAAmB,CAAC;IAEtB,SAAS,CAAC;QACR,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;oBAClC,OAAO,EACL,OAAO,EAAE,OAAO,IAAI,+CAA+C;oBACrE,OAAO,EAAE;wBACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,6BAA6B,EAAE;wBACzD,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,qBAAqB,EAAE;wBACpD;4BACE,KAAK,EAAE,MAAM;4BACb,KAAK,EAAE,cAAc;4BACrB,IAAI,EAAE,wBAAwB;yBAC/B;qBACF;iBACF,CAAC,CAAC;gBAEH,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7B,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACxB,IAAI,GAAG,aAAa,CAAC;gBACvB,CAAC;qBAAM,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;oBAClC,IAAI,GAAG,WAAW,CAAC;gBACrB,CAAC;qBAAM,CAAC;oBACN,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7B,IAAI,GAAG,mBAAmB,CAAC;gBAC7B,CAAC;qBAAM,IAAI,CAAC,MAAM,EAAE,CAAC;oBACnB,OAAO,QAAQ,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,OAAO,eAAe,CAAC;gBACzB,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBAC3C,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7B,IAAI,GAAG,mBAAmB,CAAC;gBAC7B,CAAC;qBAAM,IAAI,CAAC,MAAM,EAAE,CAAC;oBACnB,OAAO,QAAQ,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,OAAO,eAAe,CAAC;gBACzB,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAEvC;IACC,MAAM,GAAG,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC/C,OAAO,yBAAyB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAmB,mBAAmB,EACtC,OAA2B;IAE3B,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAEvC,0BAA0B;IAC1B,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAEnC,6BAA6B;IAC7B,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,mDAAmD;YAC5D,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1C,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,mEAAmE;QACnE,wEAAwE;IAC1E,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,GAAG,EAAE;QACtD,OAAO,EAAE,gCAAgC;KAC1C,CAAC,CAAC;IAEH,IAAI,UAAU,KAAK,WAAW,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1D,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACxC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAC/E,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CACjB,yBAAyB;YACvB,8CAA8C;YAC9C,sDAAsD;YACtD,sDAAsD,CACzD,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,UAAU,KAAK,eAAe,CAAC;IAErD,kCAAkC;IAClC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;IACtC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,IAAI,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;YACnC,qFAAqF;YACrF,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAChE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,iEAAiE;YACjE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC/D,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CACjB,6CAA6C;gBAC3C,2CAA2C;gBAC3C,cAAc,CACjB,CAAC;YACF,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACtC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;QACzC,OAAO,EAAE,uCAAuC;QAChD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACxC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IAED,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAEjC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;KAC9E,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;CAiBH,CACE;KACA,MAAM,CAAC,KAAK,EAAE,IAAyB,EAAE,EAAE;IAC1C,MAAM,aAAa,CAAC,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Production implementations of onboarding I/O interfaces.
3
+ *
4
+ * These wrap the real dependencies (@clack/prompts, fs, fetch)
5
+ * used in production. Tests can substitute mock implementations.
6
+ */
7
+ import type { UserIO, FileIO, NetworkIO, OnboardingIO } from "./onboarding-io.js";
8
+ export declare const clackUserIO: UserIO;
9
+ export declare const nodeFileIO: FileIO;
10
+ export declare const fetchNetworkIO: NetworkIO;
11
+ export declare const defaultOnboardingIO: OnboardingIO;
12
+ //# sourceMappingURL=onboarding-io-impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-io-impl.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/onboarding-io-impl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAa,MAAM,oBAAoB,CAAC;AAM7F,eAAO,MAAM,WAAW,EAAE,MA4CzB,CAAC;AAMF,eAAO,MAAM,UAAU,EAAE,MAaxB,CAAC;AAMF,eAAO,MAAM,cAAc,EAAE,SAE5B,CAAC;AAMF,eAAO,MAAM,mBAAmB,EAAE,YAIjC,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Production implementations of onboarding I/O interfaces.
3
+ *
4
+ * These wrap the real dependencies (@clack/prompts, fs, fetch)
5
+ * used in production. Tests can substitute mock implementations.
6
+ */
7
+ import * as p from "@clack/prompts";
8
+ import { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync, } from "node:fs";
9
+ // ═══════════════════════════════════════════════════════
10
+ // USER INTERACTION (wraps @clack/prompts)
11
+ // ═══════════════════════════════════════════════════════
12
+ export const clackUserIO = {
13
+ intro: (msg) => {
14
+ p.intro(msg);
15
+ },
16
+ outro: (msg) => {
17
+ p.outro(msg);
18
+ },
19
+ cancel: (msg) => {
20
+ p.cancel(msg);
21
+ },
22
+ select: async (opts) => {
23
+ // Cast required due to exactOptionalPropertyTypes mismatch with Clack's types
24
+ const result = await p.select(opts);
25
+ return result;
26
+ },
27
+ password: (opts) => p.password(opts),
28
+ text: (opts) => p.text(opts),
29
+ confirm: (opts) => p.confirm(opts),
30
+ spinner: () => {
31
+ const spinner = p.spinner();
32
+ return {
33
+ start: (msg) => {
34
+ spinner.start(msg);
35
+ },
36
+ stop: (msg, exitCode) => {
37
+ spinner.stop(msg, exitCode);
38
+ },
39
+ };
40
+ },
41
+ log: {
42
+ info: (msg) => {
43
+ p.log.info(msg);
44
+ },
45
+ warn: (msg) => {
46
+ p.log.warn(msg);
47
+ },
48
+ message: (msg) => {
49
+ p.log.message(msg);
50
+ },
51
+ },
52
+ isCancel: p.isCancel,
53
+ };
54
+ // ═══════════════════════════════════════════════════════
55
+ // FILE SYSTEM (wraps node:fs)
56
+ // ═══════════════════════════════════════════════════════
57
+ export const nodeFileIO = {
58
+ exists: existsSync,
59
+ read: (path) => existsSync(path) ? readFileSync(path, "utf-8").trim() : null,
60
+ write: (path, content, mode) => {
61
+ writeFileSync(path, content, mode ? { mode } : undefined);
62
+ },
63
+ delete: (path) => {
64
+ if (existsSync(path))
65
+ unlinkSync(path);
66
+ },
67
+ mkdir: (path) => {
68
+ mkdirSync(path, { recursive: true });
69
+ },
70
+ };
71
+ // ═══════════════════════════════════════════════════════
72
+ // NETWORK (wraps global fetch)
73
+ // ═══════════════════════════════════════════════════════
74
+ export const fetchNetworkIO = {
75
+ fetch: globalThis.fetch,
76
+ };
77
+ // ═══════════════════════════════════════════════════════
78
+ // DEFAULT COMBINED CONTEXT
79
+ // ═══════════════════════════════════════════════════════
80
+ export const defaultOnboardingIO = {
81
+ user: clackUserIO,
82
+ file: nodeFileIO,
83
+ network: fetchNetworkIO,
84
+ };
85
+ //# sourceMappingURL=onboarding-io-impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-io-impl.js","sourceRoot":"","sources":["../../../src/cli/utils/onboarding-io-impl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,EACb,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAC;AAGjB,0DAA0D;AAC1D,0CAA0C;AAC1C,0DAA0D;AAE1D,MAAM,CAAC,MAAM,WAAW,GAAW;IACjC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;QACb,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;QACb,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;QACd,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,EAAE,KAAK,EAAoB,IAGhC,EAAuB,EAAE;QACxB,8EAA8E;QAC9E,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,IAAsC,CAAC,CAAC;QACtE,OAAO,MAAoB,CAAC;IAC9B,CAAC;IACD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IACpC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,OAAO,EAAE,GAAc,EAAE;QACvB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO;YACL,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;gBACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;YACD,IAAI,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;gBACtB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC9B,CAAC;SACF,CAAC;IACJ,CAAC;IACD,GAAG,EAAE;QACH,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACZ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACZ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;KACF;IACD,QAAQ,EAAE,CAAC,CAAC,QAAQ;CACrB,CAAC;AAEF,0DAA0D;AAC1D,8BAA8B;AAC9B,0DAA0D;AAE1D,MAAM,CAAC,MAAM,UAAU,GAAW;IAChC,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACb,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;IAC9D,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC7B,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;QACd,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;CACF,CAAC;AAEF,0DAA0D;AAC1D,+BAA+B;AAC/B,0DAA0D;AAE1D,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,KAAK,EAAE,UAAU,CAAC,KAAK;CACxB,CAAC;AAEF,0DAA0D;AAC1D,2BAA2B;AAC3B,0DAA0D;AAE1D,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,cAAc;CACxB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * I/O abstraction interfaces for onboarding flow.
3
+ *
4
+ * These interfaces allow the onboarding logic to be tested without
5
+ * mocking individual modules. Tests can provide script-based implementations
6
+ * that verify the exact sequence of I/O operations.
7
+ */
8
+ export interface SpinnerIO {
9
+ start(message: string): void;
10
+ stop(message: string, exitCode?: number): void;
11
+ }
12
+ export interface UserIO {
13
+ intro(message: string): void;
14
+ outro(message: string): void;
15
+ cancel(message: string): void;
16
+ select<T extends string>(opts: {
17
+ message: string;
18
+ options: Array<{
19
+ value: T;
20
+ label: string;
21
+ hint?: string | undefined;
22
+ }>;
23
+ }): Promise<T | symbol>;
24
+ password(opts: {
25
+ message: string;
26
+ validate?: (value: string) => string | undefined;
27
+ }): Promise<string | symbol>;
28
+ text(opts: {
29
+ message: string;
30
+ placeholder?: string;
31
+ validate?: (value: string) => string | undefined;
32
+ }): Promise<string | symbol>;
33
+ confirm(opts: {
34
+ message: string;
35
+ initialValue?: boolean;
36
+ }): Promise<boolean | symbol>;
37
+ spinner(): SpinnerIO;
38
+ log: {
39
+ info(message: string): void;
40
+ warn(message: string): void;
41
+ message(message: string): void;
42
+ };
43
+ isCancel(value: unknown): value is symbol;
44
+ }
45
+ export interface FileIO {
46
+ exists(path: string): boolean;
47
+ read(path: string): string | null;
48
+ write(path: string, content: string, mode?: number): void;
49
+ delete(path: string): void;
50
+ mkdir(path: string): void;
51
+ }
52
+ export interface NetworkIO {
53
+ fetch(url: string, options?: RequestInit): Promise<Response>;
54
+ }
55
+ export interface OnboardingIO {
56
+ user: UserIO;
57
+ file: FileIO;
58
+ network: NetworkIO;
59
+ }
60
+ //# sourceMappingURL=onboarding-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-io.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/onboarding-io.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE;QAC7B,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,CAAC,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAAE,CAAC,CAAC;KACxE,GAAG,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IAExB,QAAQ,CAAC,IAAI,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;KAClD,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAE7B,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;KAClD,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAE7B,OAAO,CAAC,IAAI,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;IAE9B,OAAO,IAAI,SAAS,CAAC;IAErB,GAAG,EAAE;QACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAChC,CAAC;IAEF,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC;CAC3C;AAMD,MAAM,WAAW,MAAM;IACrB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAMD,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC9D;AAMD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,SAAS,CAAC;CACpB"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * I/O abstraction interfaces for onboarding flow.
3
+ *
4
+ * These interfaces allow the onboarding logic to be tested without
5
+ * mocking individual modules. Tests can provide script-based implementations
6
+ * that verify the exact sequence of I/O operations.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=onboarding-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-io.js","sourceRoot":"","sources":["../../../src/cli/utils/onboarding-io.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flingit",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "Personal Software Platform - Build and deploy personal tools through conversation",
5
5
  "type": "module",
6
6
  "engines": {