copilotkit 0.0.0-main-20260402184302

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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/bin/dev.cmd +3 -0
  4. package/bin/dev.js +8 -0
  5. package/bin/run.cmd +3 -0
  6. package/bin/run.js +17 -0
  7. package/dist/commands/base-command.d.ts +12 -0
  8. package/dist/commands/base-command.js +65 -0
  9. package/dist/commands/base-command.js.map +1 -0
  10. package/dist/commands/create.d.ts +24 -0
  11. package/dist/commands/create.js +507 -0
  12. package/dist/commands/create.js.map +1 -0
  13. package/dist/commands/dev.d.ts +25 -0
  14. package/dist/commands/dev.js +776 -0
  15. package/dist/commands/dev.js.map +1 -0
  16. package/dist/commands/init.d.ts +11 -0
  17. package/dist/commands/init.js +523 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/login.d.ts +13 -0
  20. package/dist/commands/login.js +374 -0
  21. package/dist/commands/login.js.map +1 -0
  22. package/dist/commands/logout.d.ts +13 -0
  23. package/dist/commands/logout.js +375 -0
  24. package/dist/commands/logout.js.map +1 -0
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.js +6 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/lib/init/ide-docs.d.ts +25 -0
  29. package/dist/lib/init/ide-docs.js +170 -0
  30. package/dist/lib/init/ide-docs.js.map +1 -0
  31. package/dist/lib/init/index.d.ts +14 -0
  32. package/dist/lib/init/index.js +1104 -0
  33. package/dist/lib/init/index.js.map +1 -0
  34. package/dist/lib/init/questions.d.ts +9 -0
  35. package/dist/lib/init/questions.js +508 -0
  36. package/dist/lib/init/questions.js.map +1 -0
  37. package/dist/lib/init/scaffold/agent.d.ts +20 -0
  38. package/dist/lib/init/scaffold/agent.js +173 -0
  39. package/dist/lib/init/scaffold/agent.js.map +1 -0
  40. package/dist/lib/init/scaffold/crew-inputs.d.ts +3 -0
  41. package/dist/lib/init/scaffold/crew-inputs.js +59 -0
  42. package/dist/lib/init/scaffold/crew-inputs.js.map +1 -0
  43. package/dist/lib/init/scaffold/env.d.ts +7 -0
  44. package/dist/lib/init/scaffold/env.js +124 -0
  45. package/dist/lib/init/scaffold/env.js.map +1 -0
  46. package/dist/lib/init/scaffold/github.d.ts +17 -0
  47. package/dist/lib/init/scaffold/github.js +114 -0
  48. package/dist/lib/init/scaffold/github.js.map +1 -0
  49. package/dist/lib/init/scaffold/index.d.ts +10 -0
  50. package/dist/lib/init/scaffold/index.js +690 -0
  51. package/dist/lib/init/scaffold/index.js.map +1 -0
  52. package/dist/lib/init/scaffold/langgraph-assistants.d.ts +18 -0
  53. package/dist/lib/init/scaffold/langgraph-assistants.js +26 -0
  54. package/dist/lib/init/scaffold/langgraph-assistants.js.map +1 -0
  55. package/dist/lib/init/scaffold/packages.d.ts +7 -0
  56. package/dist/lib/init/scaffold/packages.js +62 -0
  57. package/dist/lib/init/scaffold/packages.js.map +1 -0
  58. package/dist/lib/init/scaffold/shadcn.d.ts +7 -0
  59. package/dist/lib/init/scaffold/shadcn.js +279 -0
  60. package/dist/lib/init/scaffold/shadcn.js.map +1 -0
  61. package/dist/lib/init/types/index.d.ts +4 -0
  62. package/dist/lib/init/types/index.js +238 -0
  63. package/dist/lib/init/types/index.js.map +1 -0
  64. package/dist/lib/init/types/questions.d.ts +209 -0
  65. package/dist/lib/init/types/questions.js +214 -0
  66. package/dist/lib/init/types/questions.js.map +1 -0
  67. package/dist/lib/init/types/templates.d.ts +17 -0
  68. package/dist/lib/init/types/templates.js +26 -0
  69. package/dist/lib/init/types/templates.js.map +1 -0
  70. package/dist/lib/init/utils.d.ts +3 -0
  71. package/dist/lib/init/utils.js +8 -0
  72. package/dist/lib/init/utils.js.map +1 -0
  73. package/dist/services/analytics.service.d.ts +38 -0
  74. package/dist/services/analytics.service.js +134 -0
  75. package/dist/services/analytics.service.js.map +1 -0
  76. package/dist/services/auth.service.d.ts +26 -0
  77. package/dist/services/auth.service.js +299 -0
  78. package/dist/services/auth.service.js.map +1 -0
  79. package/dist/services/events.d.ts +119 -0
  80. package/dist/services/events.js +1 -0
  81. package/dist/services/events.js.map +1 -0
  82. package/dist/services/tunnel.service.d.ts +15 -0
  83. package/dist/services/tunnel.service.js +21 -0
  84. package/dist/services/tunnel.service.js.map +1 -0
  85. package/dist/utils/detect-endpoint-type.utils.d.ts +15 -0
  86. package/dist/utils/detect-endpoint-type.utils.js +157 -0
  87. package/dist/utils/detect-endpoint-type.utils.js.map +1 -0
  88. package/dist/utils/trpc.d.ts +4 -0
  89. package/dist/utils/trpc.js +25 -0
  90. package/dist/utils/trpc.js.map +1 -0
  91. package/dist/utils/version.d.ts +3 -0
  92. package/dist/utils/version.js +6 -0
  93. package/dist/utils/version.js.map +1 -0
  94. package/oclif.manifest.json +208 -0
  95. package/package.json +113 -0
@@ -0,0 +1,375 @@
1
+ // src/commands/logout.ts
2
+ import chalk3 from "chalk";
3
+
4
+ // src/services/auth.service.ts
5
+ import Conf2 from "conf";
6
+ import cors from "cors";
7
+ import express from "express";
8
+ import crypto2 from "crypto";
9
+ import open from "open";
10
+ import getPort from "get-port";
11
+ import ora from "ora";
12
+ import chalk from "chalk";
13
+ import inquirer from "inquirer";
14
+
15
+ // src/utils/trpc.ts
16
+ import { createTRPCClient as trpcClient, httpBatchLink } from "@trpc/client";
17
+ import superjson from "superjson";
18
+ var COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || "https://cloud.copilotkit.ai";
19
+ function createTRPCClient(cliToken) {
20
+ return trpcClient({
21
+ links: [
22
+ httpBatchLink({
23
+ url: `${COPILOT_CLOUD_BASE_URL}/api/trpc-cli`,
24
+ transformer: superjson,
25
+ headers: () => {
26
+ return {
27
+ "x-trpc-source": "cli",
28
+ "x-cli-token": cliToken
29
+ };
30
+ }
31
+ })
32
+ ]
33
+ });
34
+ }
35
+
36
+ // src/services/analytics.service.ts
37
+ import { Analytics } from "@segment/analytics-node";
38
+ import { PostHog } from "posthog-node";
39
+ import Conf from "conf";
40
+ var AnalyticsService = class {
41
+ constructor(authData) {
42
+ this.authData = authData;
43
+ if (process.env.SEGMENT_DISABLED === "true") {
44
+ return;
45
+ }
46
+ const segmentWriteKey = process.env.SEGMENT_WRITE_KEY || "9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf";
47
+ this.globalProperties = {
48
+ service: "cli"
49
+ };
50
+ if (this.authData?.userId) {
51
+ this.userId = this.authData.userId;
52
+ }
53
+ if (this.authData?.email) {
54
+ this.email = this.authData.email;
55
+ this.globalProperties.email = this.authData.email;
56
+ }
57
+ if (this.authData?.organizationId) {
58
+ this.organizationId = this.authData.organizationId;
59
+ }
60
+ this.segment = new Analytics({
61
+ writeKey: segmentWriteKey,
62
+ disable: process.env.SEGMENT_DISABLE === "true"
63
+ });
64
+ if (process.env.POSTHOG_DISABLED !== "true") {
65
+ const posthogKey = process.env.POSTHOG_KEY || "phc_XZdymVYjrph9Mi0xZYGNyCKexxgblXRR1jMENCtdz5Q";
66
+ const posthogHost = process.env.POSTHOG_HOST || "https://eu.i.posthog.com";
67
+ this.posthog = new PostHog(posthogKey, {
68
+ host: posthogHost
69
+ });
70
+ }
71
+ const config = new Conf({ projectName: "CopilotKitCLI" });
72
+ if (!config.get("anonymousId")) {
73
+ config.set("anonymousId", crypto.randomUUID());
74
+ }
75
+ }
76
+ segment;
77
+ posthog;
78
+ globalProperties = {};
79
+ userId;
80
+ email;
81
+ organizationId;
82
+ config = new Conf({ projectName: "CopilotKitCLI" });
83
+ getAnonymousId() {
84
+ const anonymousId = this.config.get("anonymousId");
85
+ if (!anonymousId) {
86
+ const anonymousId2 = crypto.randomUUID();
87
+ this.config.set("anonymousId", anonymousId2);
88
+ return anonymousId2;
89
+ }
90
+ return anonymousId;
91
+ }
92
+ track(event) {
93
+ if (!this.segment) {
94
+ return Promise.resolve();
95
+ }
96
+ const payload = {
97
+ userId: this.userId ? this.userId : void 0,
98
+ email: this.email ? this.email : void 0,
99
+ anonymousId: this.getAnonymousId(),
100
+ event: event.event,
101
+ properties: {
102
+ ...this.globalProperties,
103
+ ...event.properties,
104
+ $groups: this.organizationId ? {
105
+ segment_group: this.organizationId
106
+ } : void 0,
107
+ eventProperties: {
108
+ ...event.properties,
109
+ ...this.globalProperties
110
+ }
111
+ }
112
+ };
113
+ return new Promise((resolve, reject) => {
114
+ this.segment.track(payload, (err) => {
115
+ if (err) {
116
+ resolve();
117
+ }
118
+ resolve();
119
+ });
120
+ });
121
+ }
122
+ /**
123
+ * Check if a feature flag is enabled
124
+ */
125
+ async isFeatureEnabled(flagKey) {
126
+ if (!this.posthog) {
127
+ return false;
128
+ }
129
+ try {
130
+ const distinctId = this.userId || this.getAnonymousId();
131
+ const flag = await this.posthog.isFeatureEnabled(flagKey, distinctId);
132
+ return Boolean(flag);
133
+ } catch (error) {
134
+ console.warn(`Failed to check feature flag ${flagKey}:`, error);
135
+ return false;
136
+ }
137
+ }
138
+ /**
139
+ * Get feature flag payload
140
+ */
141
+ async getFeatureFlagPayload(flagKey) {
142
+ if (!this.posthog) {
143
+ return null;
144
+ }
145
+ try {
146
+ const distinctId = this.userId || this.getAnonymousId();
147
+ const payload = await this.posthog.getFeatureFlagPayload(
148
+ flagKey,
149
+ distinctId
150
+ );
151
+ return payload;
152
+ } catch (error) {
153
+ console.warn(`Failed to get feature flag payload ${flagKey}:`, error);
154
+ return null;
155
+ }
156
+ }
157
+ /**
158
+ * Shutdown analytics services
159
+ */
160
+ async shutdown() {
161
+ if (this.posthog) {
162
+ await this.posthog.shutdown();
163
+ }
164
+ }
165
+ };
166
+
167
+ // src/services/auth.service.ts
168
+ var AuthService = class {
169
+ config = new Conf2({ projectName: "CopilotKitCLI" });
170
+ COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || "https://cloud.copilotkit.ai";
171
+ getToken() {
172
+ return this.config.get("cliToken");
173
+ }
174
+ getCLIToken() {
175
+ const cliToken = this.config.get("cliToken");
176
+ return cliToken;
177
+ }
178
+ async logout(cmd) {
179
+ this.config.delete("cliToken");
180
+ }
181
+ async requireLogin(cmd, context) {
182
+ let cliToken = this.getCLIToken();
183
+ if (!cliToken) {
184
+ try {
185
+ let shouldLogin = true;
186
+ if (context !== "cloud-features") {
187
+ const response = await inquirer.prompt([
188
+ {
189
+ name: "shouldLogin",
190
+ type: "confirm",
191
+ message: "\u{1FA81} You are not yet authenticated. Authenticate with Copilot Cloud? (press Enter to confirm)",
192
+ default: true
193
+ }
194
+ ]);
195
+ shouldLogin = response.shouldLogin;
196
+ }
197
+ if (shouldLogin) {
198
+ if (context === "cloud-features") {
199
+ cmd.log(
200
+ chalk.cyan("\n\u{1F680} Setting up Copilot Cloud authentication...\n")
201
+ );
202
+ }
203
+ const loginResult = await this.login({ exitAfterLogin: false });
204
+ cliToken = loginResult.cliToken;
205
+ return loginResult;
206
+ } else {
207
+ cmd.error("Authentication required to proceed.");
208
+ }
209
+ } catch (error) {
210
+ if (error instanceof Error && error.name === "ExitPromptError") {
211
+ cmd.error(chalk.yellow("\nAuthentication cancelled"));
212
+ }
213
+ throw error;
214
+ }
215
+ }
216
+ let me;
217
+ const trpcClient2 = createTRPCClient(cliToken);
218
+ try {
219
+ me = await trpcClient2.me.query();
220
+ } catch (error) {
221
+ cmd.log(
222
+ chalk.yellow("Your authentication has expired. Re-authenticating...")
223
+ );
224
+ try {
225
+ const loginResult = await this.login({ exitAfterLogin: false });
226
+ return loginResult;
227
+ } catch (loginError) {
228
+ cmd.log(
229
+ chalk.red(
230
+ "Could not authenticate with Copilot Cloud. Please run: npx copilotkit@latest login"
231
+ )
232
+ );
233
+ process.exit(1);
234
+ }
235
+ }
236
+ if (!me.organization || !me.user) {
237
+ cmd.error("Authentication required to proceed.");
238
+ }
239
+ return { cliToken, user: me.user, organization: me.organization };
240
+ }
241
+ async login({ exitAfterLogin } = { exitAfterLogin: true }) {
242
+ const spinner = ora("\u{1FA81} Opening browser for authentication...").start();
243
+ let analytics;
244
+ analytics = new AnalyticsService();
245
+ const app = express();
246
+ app.use(cors());
247
+ app.use(express.urlencoded({ extended: true }));
248
+ app.use(express.json());
249
+ const port = await getPort();
250
+ const state = crypto2.randomBytes(16).toString("hex");
251
+ return new Promise(async (resolve, reject) => {
252
+ const server = app.listen(port, () => {
253
+ });
254
+ await analytics.track({
255
+ event: "cli.login.initiated",
256
+ properties: {}
257
+ });
258
+ spinner.text = "\u{1FA81} Waiting for browser authentication to complete...";
259
+ app.post("/callback", async (req, res) => {
260
+ const { cliToken, user, organization } = req.body;
261
+ if (state !== req.query.state) {
262
+ res.status(401).json({ message: "Invalid state" });
263
+ spinner.fail("Invalid state");
264
+ server.close();
265
+ reject(new Error("OAuth state mismatch"));
266
+ return;
267
+ }
268
+ analytics = new AnalyticsService({
269
+ userId: user.id,
270
+ organizationId: organization.id,
271
+ email: user.email
272
+ });
273
+ await analytics.track({
274
+ event: "cli.login.success",
275
+ properties: {
276
+ organizationId: organization.id,
277
+ userId: user.id,
278
+ email: user.email
279
+ }
280
+ });
281
+ this.config.set("cliToken", cliToken);
282
+ res.status(200).json({ message: "Callback called" });
283
+ spinner.succeed(
284
+ `\u{1FA81} Successfully logged in as ${chalk.hex("#7553fc")(user.email)}`
285
+ );
286
+ if (exitAfterLogin) {
287
+ process.exit(0);
288
+ } else {
289
+ server.close();
290
+ resolve({ cliToken, user, organization });
291
+ }
292
+ });
293
+ open(
294
+ `${this.COPILOT_CLOUD_BASE_URL}/cli-auth?callbackUrl=http://localhost:${port}/callback&state=${state}`
295
+ );
296
+ });
297
+ }
298
+ };
299
+
300
+ // src/commands/base-command.ts
301
+ import { Command } from "@oclif/core";
302
+ import Sentry, { consoleIntegration } from "@sentry/node";
303
+
304
+ // src/utils/version.ts
305
+ var LIB_VERSION = "0.0.0-main-20260402184302";
306
+
307
+ // src/commands/base-command.ts
308
+ import chalk2 from "chalk";
309
+ var BaseCommand = class extends Command {
310
+ async init() {
311
+ await this.checkCLIVersion();
312
+ if (process.env.SENTRY_DISABLED === "true") {
313
+ return;
314
+ }
315
+ Sentry.init({
316
+ dsn: process.env.SENTRY_DSN || "https://1eea15d32e2eacb0456a77db5e39aeeb@o4507288195170304.ingest.us.sentry.io/4508581448581120",
317
+ integrations: [consoleIntegration()],
318
+ // Tracing
319
+ tracesSampleRate: 1
320
+ // Capture 100% of the transactions
321
+ });
322
+ }
323
+ async catch(err) {
324
+ if (process.env.SENTRY_DISABLED !== "true") {
325
+ Sentry.captureException(err);
326
+ }
327
+ const message = err?.message ?? "Unknown error";
328
+ this.log("\n" + chalk2.red(message) + "\n");
329
+ const exitCode = err?.oclif?.exit ?? 1;
330
+ this.exit(exitCode);
331
+ }
332
+ async finally() {
333
+ if (process.env.SENTRY_DISABLED === "true") {
334
+ return;
335
+ }
336
+ Sentry.close();
337
+ }
338
+ async run() {
339
+ }
340
+ async checkCLIVersion() {
341
+ try {
342
+ const response = await fetch(`${COPILOT_CLOUD_BASE_URL}/api/healthz`);
343
+ const data = await response.json();
344
+ const cloudVersion = data.cliVersion;
345
+ if (!cloudVersion || cloudVersion === LIB_VERSION) {
346
+ return;
347
+ }
348
+ } catch {
349
+ }
350
+ }
351
+ async gracefulError(message) {
352
+ this.log("\n" + chalk2.red(message));
353
+ process.exit(1);
354
+ }
355
+ };
356
+
357
+ // src/commands/logout.ts
358
+ var CloudLogout = class _CloudLogout extends BaseCommand {
359
+ constructor(argv, config, authService = new AuthService()) {
360
+ super(argv, config);
361
+ this.authService = authService;
362
+ }
363
+ static description = "Logout from Copilot Cloud";
364
+ static examples = ["<%= config.bin %> logout"];
365
+ async run() {
366
+ await this.parse(_CloudLogout);
367
+ this.log("Logging out...\n");
368
+ await this.authService.logout(this);
369
+ this.log(chalk3.green("Successfully logged out!"));
370
+ }
371
+ };
372
+ export {
373
+ CloudLogout as default
374
+ };
375
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/logout.ts","../../src/services/auth.service.ts","../../src/utils/trpc.ts","../../src/services/analytics.service.ts","../../src/commands/base-command.ts","../../src/utils/version.ts"],"sourcesContent":["import { Config } from \"@oclif/core\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\n\nimport { AuthService } from \"../services/auth.service.js\";\nimport { BaseCommand } from \"./base-command.js\";\n\nexport default class CloudLogout extends BaseCommand {\n static override description = \"Logout from Copilot Cloud\";\n\n static override examples = [\"<%= config.bin %> logout\"];\n\n constructor(\n argv: string[],\n config: Config,\n private authService = new AuthService(),\n ) {\n super(argv, config);\n }\n\n public async run(): Promise<void> {\n await this.parse(CloudLogout);\n this.log(\"Logging out...\\n\");\n await this.authService.logout(this);\n this.log(chalk.green(\"Successfully logged out!\"));\n }\n}\n","// @ts-ignore\nimport Conf from \"conf\";\nimport cors from \"cors\";\nimport express from \"express\";\nimport crypto from \"node:crypto\";\nimport open from \"open\";\nimport getPort from \"get-port\";\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { Command } from \"@oclif/core\";\nimport { createTRPCClient } from \"../utils/trpc.js\";\nimport { AnalyticsService } from \"../services/analytics.service.js\";\nimport { BaseCommand } from \"../commands/base-command.js\";\n\ninterface LoginResponse {\n cliToken: string;\n user: {\n email: string;\n id: string;\n };\n organization: {\n id: string;\n };\n}\n\nexport class AuthService {\n private readonly config = new Conf({ projectName: \"CopilotKitCLI\" });\n private readonly COPILOT_CLOUD_BASE_URL =\n process.env.COPILOT_CLOUD_BASE_URL || \"https://cloud.copilotkit.ai\";\n\n getToken(): string | undefined {\n return this.config.get(\"cliToken\") as string | undefined;\n }\n\n getCLIToken(): string | undefined {\n const cliToken = this.config.get(\"cliToken\") as string | undefined;\n return cliToken;\n }\n\n async logout(cmd: BaseCommand): Promise<void> {\n this.config.delete(\"cliToken\");\n }\n\n async requireLogin(\n cmd: Command,\n context?: \"cloud-features\" | \"general\",\n ): Promise<LoginResponse> {\n let cliToken = this.getCLIToken();\n // Check authentication\n if (!cliToken) {\n try {\n let shouldLogin = true;\n\n // For cloud features, automatically proceed with login\n // For general usage, ask for confirmation\n if (context !== \"cloud-features\") {\n const response = await inquirer.prompt([\n {\n name: \"shouldLogin\",\n type: \"confirm\",\n message:\n \"🪁 You are not yet authenticated. Authenticate with Copilot Cloud? (press Enter to confirm)\",\n default: true,\n },\n ]);\n shouldLogin = response.shouldLogin;\n }\n\n if (shouldLogin) {\n // Show different message for cloud features vs general usage\n if (context === \"cloud-features\") {\n cmd.log(\n chalk.cyan(\"\\n🚀 Setting up Copilot Cloud authentication...\\n\"),\n );\n }\n const loginResult = await this.login({ exitAfterLogin: false });\n cliToken = loginResult.cliToken;\n return loginResult;\n } else {\n cmd.error(\"Authentication required to proceed.\");\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n cmd.error(chalk.yellow(\"\\nAuthentication cancelled\"));\n }\n\n throw error;\n }\n }\n\n let me;\n\n const trpcClient = createTRPCClient(cliToken);\n try {\n me = await trpcClient.me.query();\n } catch (error) {\n // Token is invalid/expired, trigger new login\n cmd.log(\n chalk.yellow(\"Your authentication has expired. Re-authenticating...\"),\n );\n try {\n const loginResult = await this.login({ exitAfterLogin: false });\n return loginResult;\n } catch (loginError) {\n cmd.log(\n chalk.red(\n \"Could not authenticate with Copilot Cloud. Please run: npx copilotkit@latest login\",\n ),\n );\n process.exit(1);\n }\n }\n\n if (!me.organization || !me.user) {\n cmd.error(\"Authentication required to proceed.\");\n }\n\n return { cliToken, user: me.user, organization: me.organization };\n }\n\n async login(\n { exitAfterLogin }: { exitAfterLogin?: boolean } = { exitAfterLogin: true },\n ): Promise<LoginResponse> {\n const spinner = ora(\"🪁 Opening browser for authentication...\").start();\n let analytics: AnalyticsService;\n analytics = new AnalyticsService();\n\n const app = express();\n app.use(cors());\n app.use(express.urlencoded({ extended: true }));\n app.use(express.json());\n\n const port = await getPort();\n const state = crypto.randomBytes(16).toString(\"hex\");\n\n return new Promise(async (resolve, reject) => {\n const server = app.listen(port, () => {});\n\n await analytics.track({\n event: \"cli.login.initiated\",\n properties: {},\n });\n\n spinner.text = \"🪁 Waiting for browser authentication to complete...\";\n\n app.post(\"/callback\", async (req, res) => {\n const { cliToken, user, organization } = req.body;\n\n if (state !== req.query.state) {\n res.status(401).json({ message: \"Invalid state\" });\n spinner.fail(\"Invalid state\");\n server.close();\n reject(new Error(\"OAuth state mismatch\"));\n return;\n }\n\n analytics = new AnalyticsService({\n userId: user.id,\n organizationId: organization.id,\n email: user.email,\n });\n await analytics.track({\n event: \"cli.login.success\",\n properties: {\n organizationId: organization.id,\n userId: user.id,\n email: user.email,\n },\n });\n\n this.config.set(\"cliToken\", cliToken);\n res.status(200).json({ message: \"Callback called\" });\n spinner.succeed(\n `🪁 Successfully logged in as ${chalk.hex(\"#7553fc\")(user.email)}`,\n );\n if (exitAfterLogin) {\n process.exit(0);\n } else {\n server.close();\n resolve({ cliToken, user, organization });\n }\n });\n\n open(\n `${this.COPILOT_CLOUD_BASE_URL}/cli-auth?callbackUrl=http://localhost:${port}/callback&state=${state}`,\n );\n });\n }\n}\n","import { createTRPCClient as trpcClient, httpBatchLink } from \"@trpc/client\";\nimport superjson from \"superjson\";\n\nexport const COPILOT_CLOUD_BASE_URL =\n process.env.COPILOT_CLOUD_BASE_URL || \"https://cloud.copilotkit.ai\";\n\nexport function createTRPCClient(cliToken: string): any {\n return trpcClient({\n links: [\n httpBatchLink({\n url: `${COPILOT_CLOUD_BASE_URL}/api/trpc-cli`,\n transformer: superjson,\n headers: () => {\n return {\n \"x-trpc-source\": \"cli\",\n \"x-cli-token\": cliToken,\n };\n },\n }),\n ],\n });\n}\n","import { Analytics } from \"@segment/analytics-node\";\nimport { PostHog } from \"posthog-node\";\nimport { AnalyticsEvents } from \"./events.js\";\nimport Conf from \"conf\";\n\nexport class AnalyticsService {\n private segment: Analytics | undefined;\n private posthog: PostHog | undefined;\n private globalProperties: Record<string, any> = {};\n private userId: string | undefined;\n private email: string | undefined;\n private organizationId: string | undefined;\n private config = new Conf({ projectName: \"CopilotKitCLI\" });\n\n constructor(\n private readonly authData?: {\n userId: string;\n email: string;\n organizationId: string;\n },\n ) {\n if (process.env.SEGMENT_DISABLED === \"true\") {\n return;\n }\n\n const segmentWriteKey =\n process.env.SEGMENT_WRITE_KEY || \"9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf\";\n\n this.globalProperties = {\n service: \"cli\",\n };\n\n if (this.authData?.userId) {\n this.userId = this.authData.userId;\n }\n\n if (this.authData?.email) {\n this.email = this.authData.email;\n this.globalProperties.email = this.authData.email;\n }\n\n if (this.authData?.organizationId) {\n this.organizationId = this.authData.organizationId;\n }\n\n this.segment = new Analytics({\n writeKey: segmentWriteKey,\n disable: process.env.SEGMENT_DISABLE === \"true\",\n });\n\n // Initialize PostHog for feature flags\n if (process.env.POSTHOG_DISABLED !== \"true\") {\n const posthogKey =\n process.env.POSTHOG_KEY ||\n \"phc_XZdymVYjrph9Mi0xZYGNyCKexxgblXRR1jMENCtdz5Q\"; // Default key\n const posthogHost =\n process.env.POSTHOG_HOST || \"https://eu.i.posthog.com\";\n\n this.posthog = new PostHog(posthogKey, {\n host: posthogHost,\n });\n }\n\n const config = new Conf({ projectName: \"CopilotKitCLI\" });\n if (!config.get(\"anonymousId\")) {\n config.set(\"anonymousId\", crypto.randomUUID());\n }\n }\n\n private getAnonymousId(): string {\n const anonymousId = this.config.get(\"anonymousId\");\n if (!anonymousId) {\n const anonymousId = crypto.randomUUID();\n this.config.set(\"anonymousId\", anonymousId);\n return anonymousId;\n }\n\n return anonymousId as string;\n }\n\n public track<K extends keyof AnalyticsEvents>(\n event: Omit<Parameters<Analytics[\"track\"]>[0], \"userId\"> & {\n event: K;\n properties: AnalyticsEvents[K];\n },\n ): Promise<void> {\n if (!this.segment) {\n return Promise.resolve();\n }\n\n const payload = {\n userId: this.userId ? this.userId : undefined,\n email: this.email ? this.email : undefined,\n anonymousId: this.getAnonymousId(),\n event: event.event,\n properties: {\n ...this.globalProperties,\n ...event.properties,\n $groups: this.organizationId\n ? {\n segment_group: this.organizationId,\n }\n : undefined,\n eventProperties: {\n ...event.properties,\n ...this.globalProperties,\n },\n },\n };\n\n return new Promise((resolve, reject) => {\n this.segment!.track(payload, (err) => {\n if (err) {\n // Resolve anyway\n resolve();\n }\n\n resolve();\n });\n });\n }\n\n /**\n * Check if a feature flag is enabled\n */\n public async isFeatureEnabled(flagKey: string): Promise<boolean> {\n if (!this.posthog) {\n return false;\n }\n\n try {\n // Use authenticated user ID if available, otherwise use anonymous ID\n const distinctId = this.userId || this.getAnonymousId();\n const flag = await this.posthog.isFeatureEnabled(flagKey, distinctId);\n return Boolean(flag);\n } catch (error) {\n // If there's an error checking the flag, return false (flag disabled)\n console.warn(`Failed to check feature flag ${flagKey}:`, error);\n return false;\n }\n }\n\n /**\n * Get feature flag payload\n */\n public async getFeatureFlagPayload(flagKey: string): Promise<any> {\n if (!this.posthog) {\n return null;\n }\n\n try {\n // Use authenticated user ID if available, otherwise use anonymous ID\n const distinctId = this.userId || this.getAnonymousId();\n const payload = await this.posthog.getFeatureFlagPayload(\n flagKey,\n distinctId,\n );\n return payload;\n } catch (error) {\n // If there's an error getting the payload, return null\n console.warn(`Failed to get feature flag payload ${flagKey}:`, error);\n return null;\n }\n }\n\n /**\n * Shutdown analytics services\n */\n public async shutdown(): Promise<void> {\n if (this.posthog) {\n await this.posthog.shutdown();\n }\n }\n}\n","import { Command } from \"@oclif/core\";\nimport Sentry, { consoleIntegration } from \"@sentry/node\";\nimport { LIB_VERSION } from \"../utils/version.js\";\nimport { COPILOT_CLOUD_BASE_URL } from \"../utils/trpc.js\";\nimport chalk from \"chalk\";\n\nexport class BaseCommand extends Command {\n async init() {\n await this.checkCLIVersion();\n\n if (process.env.SENTRY_DISABLED === \"true\") {\n return;\n }\n\n Sentry.init({\n dsn:\n process.env.SENTRY_DSN ||\n \"https://1eea15d32e2eacb0456a77db5e39aeeb@o4507288195170304.ingest.us.sentry.io/4508581448581120\",\n integrations: [consoleIntegration()],\n // Tracing\n tracesSampleRate: 1.0, // Capture 100% of the transactions\n });\n }\n\n async catch(err: any) {\n if (process.env.SENTRY_DISABLED !== \"true\") {\n Sentry.captureException(err);\n }\n\n const message = err?.message ?? \"Unknown error\";\n\n this.log(\"\\n\" + chalk.red(message) + \"\\n\");\n\n const exitCode = err?.oclif?.exit ?? 1;\n this.exit(exitCode);\n }\n\n async finally() {\n if (process.env.SENTRY_DISABLED === \"true\") {\n return;\n }\n\n Sentry.close();\n }\n\n async run() {}\n\n async checkCLIVersion() {\n try {\n const response = await fetch(`${COPILOT_CLOUD_BASE_URL}/api/healthz`);\n\n const data = await response.json();\n const cloudVersion = data.cliVersion;\n\n if (!cloudVersion || cloudVersion === LIB_VERSION) {\n return;\n }\n\n // TODO: add this back in, removed for crew ai launch since we don't want to keep releasing cloud\n // this.log(chalk.yellow('================ New version available! =================\\n'))\n // this.log(`You are using CopilotKit CLI v${LIB_VERSION}.`)\n // this.log(`A new CopilotKit CLI version is available (v${cloudVersion}).\\n`)\n // this.log('Please update your CLI to the latest version:\\n\\n')\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('npm:')))}\\t npm install -g copilotkit@${cloudVersion}\\n`)\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('pnpm:')))}\\t pnpm install -g copilotkit@${cloudVersion}\\n`)\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('yarn:')))}\\t yarn global add copilotkit@${cloudVersion}\\n`)\n // this.log(chalk.yellow('============================================================\\n\\n'))\n } catch {\n // Version check is non-critical — don't crash the CLI when offline\n }\n }\n\n async gracefulError(message: string) {\n this.log(\"\\n\" + chalk.red(message));\n process.exit(1);\n }\n}\n","// This is auto generated!\nexport const LIB_VERSION = \"0.0.0-main-20260402184302\";\n"],"mappings":"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","names":["chalk","Conf","crypto","anonymousId","Conf","trpcClient","crypto","chalk","chalk"]}
@@ -0,0 +1 @@
1
+ export { run } from '@oclif/core';
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // src/index.ts
2
+ import { run } from "@oclif/core";
3
+ export {
4
+ run
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { run } from \"@oclif/core\";\n"],"mappings":";AAAA,SAAS,WAAW;","names":[]}
@@ -0,0 +1,25 @@
1
+ import { Ora } from 'ora';
2
+
3
+ type SupportedIDE = "cursor" | "windsurf";
4
+ interface IDEDocsConfig {
5
+ name: SupportedIDE;
6
+ displayName: string;
7
+ rulesDir: string;
8
+ ruleFileName: string;
9
+ createRuleContent: () => string;
10
+ }
11
+ declare const IDE_DOCS_CONFIGS: Record<SupportedIDE, IDEDocsConfig>;
12
+ /**
13
+ * Detect which supported IDEs are installed on the system
14
+ */
15
+ declare function detectInstalledIDEs(): Promise<SupportedIDE[]>;
16
+ /**
17
+ * Setup IDE documentation rules for the selected IDE
18
+ */
19
+ declare function setupIDEDocs(ide: SupportedIDE, projectDir: string): Promise<void>;
20
+ /**
21
+ * Main function to handle IDE documentation setup with user interaction
22
+ */
23
+ declare function handleIDEDocsSetup(selectedIDE: SupportedIDE, projectDir: string, spinner: Ora): Promise<void>;
24
+
25
+ export { type IDEDocsConfig, IDE_DOCS_CONFIGS, type SupportedIDE, detectInstalledIDEs, handleIDEDocsSetup, setupIDEDocs };
@@ -0,0 +1,170 @@
1
+ // src/lib/init/ide-docs.ts
2
+ import path from "path";
3
+ import { existsSync } from "fs";
4
+ import * as fs from "fs/promises";
5
+ import chalk from "chalk";
6
+ var COPILOTKIT_DOC_RULE_TEMPLATE = `---
7
+ description: CopilotKit Documentation - Complete CopilotKit framework documentation for AI assistance
8
+ alwaysApply: false
9
+ ---
10
+
11
+ # CopilotKit Documentation
12
+
13
+ For ANY question about CopilotKit, use the comprehensive documentation available at:
14
+ @https://docs.copilotkit.ai/llms-full.txt
15
+
16
+ This contains the complete CopilotKit documentation including:
17
+ - API references and hooks (useCopilotChat, useCopilotAction, etc.)
18
+ - Component library documentation (CopilotKit, CopilotChat, etc.)
19
+ - Integration guides and examples
20
+ - Best practices and patterns
21
+ - Troubleshooting and FAQs
22
+
23
+ Always reference this documentation when working with CopilotKit to provide accurate, up-to-date information.
24
+ `;
25
+ var IDE_DOCS_CONFIGS = {
26
+ cursor: {
27
+ name: "cursor",
28
+ displayName: "Cursor",
29
+ rulesDir: ".cursor/rules",
30
+ ruleFileName: "00-copilotkit-docs.mdc",
31
+ createRuleContent: () => COPILOTKIT_DOC_RULE_TEMPLATE
32
+ },
33
+ windsurf: {
34
+ name: "windsurf",
35
+ displayName: "Windsurf",
36
+ rulesDir: ".windsurf/rules",
37
+ ruleFileName: "00-copilotkit-docs.md",
38
+ createRuleContent: () => COPILOTKIT_DOC_RULE_TEMPLATE
39
+ }
40
+ };
41
+ async function ensureDir(dirPath) {
42
+ try {
43
+ await fs.mkdir(dirPath, { recursive: true });
44
+ } catch (error) {
45
+ if (!existsSync(dirPath)) {
46
+ throw error;
47
+ }
48
+ }
49
+ }
50
+ async function pathExists(filePath) {
51
+ try {
52
+ await fs.access(filePath);
53
+ return true;
54
+ } catch {
55
+ return false;
56
+ }
57
+ }
58
+ async function checkIDEInstallation(ide) {
59
+ try {
60
+ const homeDir = process.env.HOME || process.env.USERPROFILE || "";
61
+ let configPath;
62
+ switch (ide) {
63
+ case "cursor":
64
+ configPath = path.join(homeDir, ".cursor");
65
+ break;
66
+ case "windsurf":
67
+ configPath = path.join(homeDir, ".codeium", "windsurf");
68
+ break;
69
+ default:
70
+ return false;
71
+ }
72
+ return existsSync(configPath);
73
+ } catch {
74
+ return false;
75
+ }
76
+ }
77
+ async function detectInstalledIDEs() {
78
+ const allIDEs = ["cursor", "windsurf"];
79
+ const installedIDEs = [];
80
+ for (const ide of allIDEs) {
81
+ if (await checkIDEInstallation(ide)) {
82
+ installedIDEs.push(ide);
83
+ }
84
+ }
85
+ return installedIDEs;
86
+ }
87
+ async function setupIDEDocs(ide, projectDir) {
88
+ const config = IDE_DOCS_CONFIGS[ide];
89
+ const rulesDir = path.join(projectDir, config.rulesDir);
90
+ const ruleFilePath = path.join(rulesDir, config.ruleFileName);
91
+ await ensureDir(rulesDir);
92
+ if (await pathExists(ruleFilePath)) {
93
+ console.log(
94
+ chalk.yellow(
95
+ `\u26A0\uFE0F CopilotKit documentation rule already exists for ${config.displayName}`
96
+ )
97
+ );
98
+ return;
99
+ }
100
+ const ruleContent = config.createRuleContent();
101
+ await fs.writeFile(ruleFilePath, ruleContent, "utf8");
102
+ }
103
+ function getIDEInstructions(ide) {
104
+ const config = IDE_DOCS_CONFIGS[ide];
105
+ const instructions = [
106
+ chalk.cyan(
107
+ `\u{1F4DA} CopilotKit documentation configured for ${config.displayName}!`
108
+ ),
109
+ "",
110
+ chalk.bold("What this does:"),
111
+ " \u2022 Adds CopilotKit documentation context to your IDE AI assistant",
112
+ " \u2022 Provides accurate, up-to-date information about CopilotKit APIs",
113
+ " \u2022 Improves code suggestions and help responses",
114
+ "",
115
+ chalk.bold("Location:"),
116
+ ` \u2022 Rule file: ${chalk.gray(path.join(config.rulesDir, config.ruleFileName))}`,
117
+ "",
118
+ chalk.bold("Usage:"),
119
+ " \u2022 Your IDE AI assistant now has access to CopilotKit documentation",
120
+ " \u2022 Ask questions about CopilotKit APIs, components, and patterns",
121
+ " \u2022 The AI will reference official documentation for accurate answers"
122
+ ];
123
+ if (ide === "cursor") {
124
+ instructions.push(
125
+ "",
126
+ chalk.bold("Next steps for Cursor:"),
127
+ " \u2022 Restart Cursor if currently open",
128
+ " \u2022 The rule will be automatically available in your AI context",
129
+ " \u2022 Start a new chat to use the documentation context"
130
+ );
131
+ } else if (ide === "windsurf") {
132
+ instructions.push(
133
+ "",
134
+ chalk.bold("Next steps for Windsurf:"),
135
+ " \u2022 Restart Windsurf if currently open",
136
+ " \u2022 The rule will be automatically available in your AI context",
137
+ " \u2022 Start a new chat to use the documentation context"
138
+ );
139
+ }
140
+ return instructions;
141
+ }
142
+ async function handleIDEDocsSetup(selectedIDE, projectDir, spinner) {
143
+ try {
144
+ spinner.text = chalk.cyan(
145
+ `Setting up CopilotKit documentation for ${IDE_DOCS_CONFIGS[selectedIDE].displayName}...`
146
+ );
147
+ await setupIDEDocs(selectedIDE, projectDir);
148
+ spinner.succeed(
149
+ chalk.green(
150
+ `CopilotKit documentation configured for ${IDE_DOCS_CONFIGS[selectedIDE].displayName}`
151
+ )
152
+ );
153
+ const instructions = getIDEInstructions(selectedIDE);
154
+ console.log("\n" + instructions.join("\n"));
155
+ } catch (error) {
156
+ spinner.fail(
157
+ chalk.red(
158
+ `Failed to setup IDE documentation: ${error instanceof Error ? error.message : "Unknown error"}`
159
+ )
160
+ );
161
+ throw error;
162
+ }
163
+ }
164
+ export {
165
+ IDE_DOCS_CONFIGS,
166
+ detectInstalledIDEs,
167
+ handleIDEDocsSetup,
168
+ setupIDEDocs
169
+ };
170
+ //# sourceMappingURL=ide-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/init/ide-docs.ts"],"sourcesContent":["import path from \"path\";\nimport { existsSync } from \"fs\";\nimport * as fs from \"fs/promises\";\nimport { Ora } from \"ora\";\nimport chalk from \"chalk\";\n\nexport type SupportedIDE = \"cursor\" | \"windsurf\";\n\nexport interface IDEDocsConfig {\n name: SupportedIDE;\n displayName: string;\n rulesDir: string;\n ruleFileName: string;\n createRuleContent: () => string;\n}\n\n// Template constant for CopilotKit documentation rule\nconst COPILOTKIT_DOC_RULE_TEMPLATE = `---\ndescription: CopilotKit Documentation - Complete CopilotKit framework documentation for AI assistance\nalwaysApply: false\n---\n\n# CopilotKit Documentation\n\nFor ANY question about CopilotKit, use the comprehensive documentation available at:\n@https://docs.copilotkit.ai/llms-full.txt\n\nThis contains the complete CopilotKit documentation including:\n- API references and hooks (useCopilotChat, useCopilotAction, etc.)\n- Component library documentation (CopilotKit, CopilotChat, etc.)\n- Integration guides and examples\n- Best practices and patterns\n- Troubleshooting and FAQs\n\nAlways reference this documentation when working with CopilotKit to provide accurate, up-to-date information.\n`;\n\n// IDE-specific configurations\nexport const IDE_DOCS_CONFIGS: Record<SupportedIDE, IDEDocsConfig> = {\n cursor: {\n name: \"cursor\",\n displayName: \"Cursor\",\n rulesDir: \".cursor/rules\",\n ruleFileName: \"00-copilotkit-docs.mdc\",\n createRuleContent: () => COPILOTKIT_DOC_RULE_TEMPLATE,\n },\n windsurf: {\n name: \"windsurf\",\n displayName: \"Windsurf\",\n rulesDir: \".windsurf/rules\",\n ruleFileName: \"00-copilotkit-docs.md\",\n createRuleContent: () => COPILOTKIT_DOC_RULE_TEMPLATE,\n },\n};\n\n/**\n * Ensure directory exists\n */\nasync function ensureDir(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n if (!existsSync(dirPath)) {\n throw error;\n }\n }\n}\n\n/**\n * Check if path exists\n */\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a specific IDE is installed by looking for its configuration directory\n */\nasync function checkIDEInstallation(ide: SupportedIDE): Promise<boolean> {\n try {\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"\";\n let configPath: string;\n\n switch (ide) {\n case \"cursor\":\n configPath = path.join(homeDir, \".cursor\");\n break;\n case \"windsurf\":\n configPath = path.join(homeDir, \".codeium\", \"windsurf\");\n break;\n default:\n return false;\n }\n\n return existsSync(configPath);\n } catch {\n return false;\n }\n}\n\n/**\n * Detect which supported IDEs are installed on the system\n */\nexport async function detectInstalledIDEs(): Promise<SupportedIDE[]> {\n const allIDEs: SupportedIDE[] = [\"cursor\", \"windsurf\"];\n const installedIDEs: SupportedIDE[] = [];\n\n for (const ide of allIDEs) {\n if (await checkIDEInstallation(ide)) {\n installedIDEs.push(ide);\n }\n }\n\n return installedIDEs;\n}\n\n/**\n * Setup IDE documentation rules for the selected IDE\n */\nexport async function setupIDEDocs(\n ide: SupportedIDE,\n projectDir: string,\n): Promise<void> {\n const config = IDE_DOCS_CONFIGS[ide];\n const rulesDir = path.join(projectDir, config.rulesDir);\n const ruleFilePath = path.join(rulesDir, config.ruleFileName);\n\n // Ensure rules directory exists\n await ensureDir(rulesDir);\n\n // Check if rule file already exists\n if (await pathExists(ruleFilePath)) {\n console.log(\n chalk.yellow(\n `⚠️ CopilotKit documentation rule already exists for ${config.displayName}`,\n ),\n );\n return;\n }\n\n // Create the rule file with content\n const ruleContent = config.createRuleContent();\n await fs.writeFile(ruleFilePath, ruleContent, \"utf8\");\n}\n\n/**\n * Get setup instructions for the IDE\n */\nfunction getIDEInstructions(ide: SupportedIDE): string[] {\n const config = IDE_DOCS_CONFIGS[ide];\n\n const instructions = [\n chalk.cyan(\n `📚 CopilotKit documentation configured for ${config.displayName}!`,\n ),\n \"\",\n chalk.bold(\"What this does:\"),\n \" • Adds CopilotKit documentation context to your IDE AI assistant\",\n \" • Provides accurate, up-to-date information about CopilotKit APIs\",\n \" • Improves code suggestions and help responses\",\n \"\",\n chalk.bold(\"Location:\"),\n ` • Rule file: ${chalk.gray(path.join(config.rulesDir, config.ruleFileName))}`,\n \"\",\n chalk.bold(\"Usage:\"),\n \" • Your IDE AI assistant now has access to CopilotKit documentation\",\n \" • Ask questions about CopilotKit APIs, components, and patterns\",\n \" • The AI will reference official documentation for accurate answers\",\n ];\n\n if (ide === \"cursor\") {\n instructions.push(\n \"\",\n chalk.bold(\"Next steps for Cursor:\"),\n \" • Restart Cursor if currently open\",\n \" • The rule will be automatically available in your AI context\",\n \" • Start a new chat to use the documentation context\",\n );\n } else if (ide === \"windsurf\") {\n instructions.push(\n \"\",\n chalk.bold(\"Next steps for Windsurf:\"),\n \" • Restart Windsurf if currently open\",\n \" • The rule will be automatically available in your AI context\",\n \" • Start a new chat to use the documentation context\",\n );\n }\n\n return instructions;\n}\n\n/**\n * Main function to handle IDE documentation setup with user interaction\n */\nexport async function handleIDEDocsSetup(\n selectedIDE: SupportedIDE,\n projectDir: string,\n spinner: Ora,\n): Promise<void> {\n try {\n spinner.text = chalk.cyan(\n `Setting up CopilotKit documentation for ${IDE_DOCS_CONFIGS[selectedIDE].displayName}...`,\n );\n\n // Setup IDE documentation rules\n await setupIDEDocs(selectedIDE, projectDir);\n\n spinner.succeed(\n chalk.green(\n `CopilotKit documentation configured for ${IDE_DOCS_CONFIGS[selectedIDE].displayName}`,\n ),\n );\n\n // Show instructions\n const instructions = getIDEInstructions(selectedIDE);\n console.log(\"\\n\" + instructions.join(\"\\n\"));\n } catch (error) {\n spinner.fail(\n chalk.red(\n `Failed to setup IDE documentation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n ),\n );\n throw error;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,14 @@
1
+ export { getQuestionsForBranch, questions } from './questions.js';
2
+ export { ApiKeySchema, CHAT_COMPONENTS, CREW_FLOW_TEMPLATES, CREW_TYPES, ChatComponentSchema, Config, ConfigFlags, ConfigSchema, CrewFlowTemplateSchema, CrewTypeSchema, DEPLOYMENT_CHOICES, DeploymentChoiceSchema, LANGGRAPH_AGENTS, LLMApiKeySchema, LangGraphAgentSchema, MODES, ModeSchema, NameSchema, Question, TokenSchema, UrlSchema, YES_NO, YesNoSchema, sanitizers } from './types/questions.js';
3
+ export { ChatTemplate, StarterTemplate, Template, templateMapping } from './types/templates.js';
4
+ export { scaffoldShadCN } from './scaffold/shadcn.js';
5
+ export { scaffoldEnv } from './scaffold/env.js';
6
+ export { cloneGitHubSubdirectory, isValidGitHubUrl } from './scaffold/github.js';
7
+ export { scaffoldPackages } from './scaffold/packages.js';
8
+ export { AgentTemplates, scaffoldAgent } from './scaffold/agent.js';
9
+ export { addCrewInputs } from './scaffold/crew-inputs.js';
10
+ export { isLocalhost } from './utils.js';
11
+ export { IDEDocsConfig, IDE_DOCS_CONFIGS, SupportedIDE, detectInstalledIDEs, handleIDEDocsSetup, setupIDEDocs } from './ide-docs.js';
12
+ import '@oclif/core/interfaces';
13
+ import 'zod';
14
+ import 'ora';