copilotkit 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/dev.js +4 -4
- package/bin/run.js +7 -7
- package/dist/commands/base-command.js +1 -1
- package/dist/commands/base-command.js.map +1 -1
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.js +209 -6
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dev.js +2 -2
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/init.js +209 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/lib/init/index.js +3 -1
- package/dist/lib/init/index.js.map +1 -1
- package/dist/lib/init/scaffold/env.js +3 -1
- package/dist/lib/init/scaffold/env.js.map +1 -1
- package/dist/lib/init/scaffold/index.js +3 -1
- package/dist/lib/init/scaffold/index.js.map +1 -1
- package/dist/lib/init/scaffold/langgraph-assistants.js +3 -1
- package/dist/lib/init/scaffold/langgraph-assistants.js.map +1 -1
- package/dist/utils/version.d.ts +1 -1
- package/dist/utils/version.js +1 -1
- package/dist/utils/version.js.map +1 -1
- package/oclif.manifest.json +10 -2
- package/package.json +35 -41
package/bin/dev.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env -S node --loader ts-node/esm --disable-warning=ExperimentalWarning
|
|
2
2
|
|
|
3
3
|
// eslint-disable-next-line n/shebang
|
|
4
|
-
import {execute} from
|
|
4
|
+
import { execute } from "@oclif/core";
|
|
5
5
|
|
|
6
|
-
process.env.SENTRY_DISABLED =
|
|
7
|
-
process.env.SEGMENT_DISABLED =
|
|
8
|
-
await execute({development: true, dir: import.meta.url})
|
|
6
|
+
process.env.SENTRY_DISABLED = "true";
|
|
7
|
+
process.env.SEGMENT_DISABLED = "true";
|
|
8
|
+
await execute({ development: true, dir: import.meta.url });
|
package/bin/run.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import {execute} from
|
|
3
|
+
import { execute } from "@oclif/core";
|
|
4
4
|
|
|
5
5
|
const main = async () => {
|
|
6
6
|
try {
|
|
7
|
-
await execute({dir: import.meta.url})
|
|
7
|
+
await execute({ dir: import.meta.url });
|
|
8
8
|
} catch (error) {
|
|
9
9
|
// Rely on command-level error handling to surface friendly messages.
|
|
10
10
|
// If we reach here it means something happened before oclif handed off to the command.
|
|
11
|
-
const message = error?.message ||
|
|
12
|
-
console.error(message)
|
|
13
|
-
process.exitCode = 1
|
|
11
|
+
const message = error?.message || "Unknown error";
|
|
12
|
+
console.error(message);
|
|
13
|
+
process.exitCode = 1;
|
|
14
14
|
}
|
|
15
|
-
}
|
|
15
|
+
};
|
|
16
16
|
|
|
17
|
-
void main()
|
|
17
|
+
void main();
|
|
@@ -3,7 +3,7 @@ import { Command } from "@oclif/core";
|
|
|
3
3
|
import Sentry, { consoleIntegration } from "@sentry/node";
|
|
4
4
|
|
|
5
5
|
// src/utils/version.ts
|
|
6
|
-
var LIB_VERSION = "1.0.
|
|
6
|
+
var LIB_VERSION = "1.0.2";
|
|
7
7
|
|
|
8
8
|
// src/utils/trpc.ts
|
|
9
9
|
import { createTRPCClient as trpcClient, httpBatchLink } from "@trpc/client";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/base-command.ts","../../src/utils/version.ts","../../src/utils/trpc.ts"],"sourcesContent":["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 = \"1.0.
|
|
1
|
+
{"version":3,"sources":["../../src/commands/base-command.ts","../../src/utils/version.ts","../../src/utils/trpc.ts"],"sourcesContent":["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 = \"1.0.2\";\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"],"mappings":";AAAA,SAAS,eAAe;AACxB,OAAO,UAAU,0BAA0B;;;ACApC,IAAM,cAAc;;;ACD3B,SAAS,oBAAoB,YAAY,qBAAqB;AAC9D,OAAO,eAAe;AAEf,IAAM,yBACX,QAAQ,IAAI,0BAA0B;;;AFAxC,OAAO,WAAW;AAEX,IAAM,cAAN,cAA0B,QAAQ;AAAA,EACvC,MAAM,OAAO;AACX,UAAM,KAAK,gBAAgB;AAE3B,QAAI,QAAQ,IAAI,oBAAoB,QAAQ;AAC1C;AAAA,IACF;AAEA,WAAO,KAAK;AAAA,MACV,KACE,QAAQ,IAAI,cACZ;AAAA,MACF,cAAc,CAAC,mBAAmB,CAAC;AAAA;AAAA,MAEnC,kBAAkB;AAAA;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,KAAU;AACpB,QAAI,QAAQ,IAAI,oBAAoB,QAAQ;AAC1C,aAAO,iBAAiB,GAAG;AAAA,IAC7B;AAEA,UAAM,UAAU,KAAK,WAAW;AAEhC,SAAK,IAAI,OAAO,MAAM,IAAI,OAAO,IAAI,IAAI;AAEzC,UAAM,WAAW,KAAK,OAAO,QAAQ;AACrC,SAAK,KAAK,QAAQ;AAAA,EACpB;AAAA,EAEA,MAAM,UAAU;AACd,QAAI,QAAQ,IAAI,oBAAoB,QAAQ;AAC1C;AAAA,IACF;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,MAAM,MAAM;AAAA,EAAC;AAAA,EAEb,MAAM,kBAAkB;AACtB,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,sBAAsB,cAAc;AAEpE,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,eAAe,KAAK;AAE1B,UAAI,CAAC,gBAAgB,iBAAiB,aAAa;AACjD;AAAA,MACF;AAAA,IAWF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,SAAiB;AACnC,SAAK,IAAI,OAAO,MAAM,IAAI,OAAO,CAAC;AAClC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":[]}
|
|
@@ -18,7 +18,10 @@ declare class Create extends BaseCommand {
|
|
|
18
18
|
run(): Promise<void>;
|
|
19
19
|
private promptProjectName;
|
|
20
20
|
private promptAgentFramework;
|
|
21
|
+
private configureAgentCore;
|
|
21
22
|
private downloadTemplate;
|
|
23
|
+
private static readonly SHOWCASE_FRAMEWORKS;
|
|
24
|
+
private applyShowcaseConfig;
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
export { Create as default };
|
package/dist/commands/create.js
CHANGED
|
@@ -15,7 +15,7 @@ import { Command } from "@oclif/core";
|
|
|
15
15
|
import Sentry, { consoleIntegration } from "@sentry/node";
|
|
16
16
|
|
|
17
17
|
// src/utils/version.ts
|
|
18
|
-
var LIB_VERSION = "1.0.
|
|
18
|
+
var LIB_VERSION = "1.0.2";
|
|
19
19
|
|
|
20
20
|
// src/utils/trpc.ts
|
|
21
21
|
import { createTRPCClient as trpcClient, httpBatchLink } from "@trpc/client";
|
|
@@ -209,7 +209,11 @@ var TEMPLATE_REPOS = {
|
|
|
209
209
|
a2a: "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/a2a-middleware",
|
|
210
210
|
"microsoft-agent-framework-dotnet": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/ms-agent-framework-dotnet",
|
|
211
211
|
"microsoft-agent-framework-py": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/ms-agent-framework-python",
|
|
212
|
-
"mcp-apps": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/mcp-apps"
|
|
212
|
+
"mcp-apps": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/mcp-apps",
|
|
213
|
+
"agentcore-langgraph": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/agentcore",
|
|
214
|
+
"agentcore-strands": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/agentcore",
|
|
215
|
+
a2ui: "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/langgraph-python",
|
|
216
|
+
opengenui: "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/langgraph-python"
|
|
213
217
|
};
|
|
214
218
|
var FRAMEWORK_DOCUMENTATION = {
|
|
215
219
|
"langgraph-py": "https://langchain-ai.github.io/langgraph/concepts/why-langgraph",
|
|
@@ -225,7 +229,11 @@ var FRAMEWORK_DOCUMENTATION = {
|
|
|
225
229
|
a2a: "https://a2a-protocol.org/latest/",
|
|
226
230
|
"microsoft-agent-framework-dotnet": "https://learn.microsoft.com/en-us/agent-framework/",
|
|
227
231
|
"microsoft-agent-framework-py": "https://learn.microsoft.com/en-us/agent-framework/",
|
|
228
|
-
"mcp-apps": "https://modelcontextprotocol.github.io/ext-apps"
|
|
232
|
+
"mcp-apps": "https://modelcontextprotocol.github.io/ext-apps",
|
|
233
|
+
"agentcore-langgraph": "https://docs.copilotkit.ai/agentcore/quickstart",
|
|
234
|
+
"agentcore-strands": "https://docs.copilotkit.ai/agentcore/quickstart",
|
|
235
|
+
a2ui: "https://a2ui.org/specification/",
|
|
236
|
+
opengenui: "https://docs.copilotkit.ai"
|
|
229
237
|
};
|
|
230
238
|
var FRAMEWORK_EMOJI = {
|
|
231
239
|
"langgraph-js": "\u{1F99C}",
|
|
@@ -241,7 +249,11 @@ var FRAMEWORK_EMOJI = {
|
|
|
241
249
|
"aws-strands-py": "\u{1F9EC}",
|
|
242
250
|
"microsoft-agent-framework-dotnet": "\u{1F7E6}",
|
|
243
251
|
"microsoft-agent-framework-py": "\u{1F7E6}",
|
|
244
|
-
"mcp-apps": "\u264D"
|
|
252
|
+
"mcp-apps": "\u264D",
|
|
253
|
+
"agentcore-langgraph": "\u2601\uFE0F",
|
|
254
|
+
"agentcore-strands": "\u2601\uFE0F",
|
|
255
|
+
a2ui: "\u{1F3A8}",
|
|
256
|
+
opengenui: "\u{1F5BC}\uFE0F"
|
|
245
257
|
};
|
|
246
258
|
var KITE = `
|
|
247
259
|
\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF
|
|
@@ -356,6 +368,11 @@ Directory "${projectName}" already exists.`));
|
|
|
356
368
|
await fs2.ensureDir(projectDir);
|
|
357
369
|
spinner.text = theme.secondary.bold("Downloading template...");
|
|
358
370
|
await this.downloadTemplate(projectDir, options.agentFramework, spinner);
|
|
371
|
+
await this.applyShowcaseConfig(projectDir, options.agentFramework);
|
|
372
|
+
if (options.agentFramework === "agentcore-langgraph" || options.agentFramework === "agentcore-strands") {
|
|
373
|
+
spinner.text = theme.secondary.bold("Configuring AgentCore...");
|
|
374
|
+
await this.configureAgentCore(projectDir, options.agentFramework);
|
|
375
|
+
}
|
|
359
376
|
const displayName = usingCurrentDir ? "current directory" : `"${projectName}"`;
|
|
360
377
|
spinner.succeed(
|
|
361
378
|
theme.secondary.bold(`Project ${displayName} created successfully!`)
|
|
@@ -462,14 +479,188 @@ Your project is ready to explore CopilotKit locally.`
|
|
|
462
479
|
},
|
|
463
480
|
{ name: `${FRAMEWORK_EMOJI.agno} Agno`, value: "agno" },
|
|
464
481
|
{ name: `${FRAMEWORK_EMOJI.ag2} AG2`, value: "ag2" },
|
|
465
|
-
{ name: `${FRAMEWORK_EMOJI.a2a} A2A`, value: "a2a" }
|
|
482
|
+
{ name: `${FRAMEWORK_EMOJI.a2a} A2A`, value: "a2a" },
|
|
483
|
+
{
|
|
484
|
+
name: `${FRAMEWORK_EMOJI["agentcore-langgraph"]} AgentCore + LangGraph`,
|
|
485
|
+
value: "agentcore-langgraph"
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
name: `${FRAMEWORK_EMOJI["agentcore-strands"]} AgentCore + Strands`,
|
|
489
|
+
value: "agentcore-strands"
|
|
490
|
+
},
|
|
491
|
+
{ name: `${FRAMEWORK_EMOJI.a2ui} A2UI`, value: "a2ui" },
|
|
492
|
+
{
|
|
493
|
+
name: `${FRAMEWORK_EMOJI.opengenui} Open Generative UI`,
|
|
494
|
+
value: "opengenui"
|
|
495
|
+
}
|
|
466
496
|
]
|
|
467
497
|
}
|
|
468
498
|
]);
|
|
469
499
|
return framework;
|
|
470
500
|
}
|
|
501
|
+
async configureAgentCore(projectDir, framework) {
|
|
502
|
+
const pattern = framework === "agentcore-langgraph" ? "langgraph-single-agent" : "strands-single-agent";
|
|
503
|
+
const suffix = framework === "agentcore-langgraph" ? "-lg" : "-st";
|
|
504
|
+
const examplePath = path2.join(projectDir, "config.yaml.example");
|
|
505
|
+
const configPath = path2.join(projectDir, "config.yaml");
|
|
506
|
+
if (!await fs2.pathExists(examplePath)) {
|
|
507
|
+
throw new Error(
|
|
508
|
+
`config.yaml.example not found in the AgentCore template at "${projectDir}". The downloaded template may be incomplete. Please try again.`
|
|
509
|
+
);
|
|
510
|
+
}
|
|
511
|
+
let content = await fs2.readFile(examplePath, "utf-8");
|
|
512
|
+
const patternRegex = /^(\s*pattern:\s*)\S+(.*)$/m;
|
|
513
|
+
const stackRegex = /^(\s*stack_name_base:\s*)\S+(.*)$/m;
|
|
514
|
+
if (!patternRegex.test(content) || !stackRegex.test(content)) {
|
|
515
|
+
throw new Error(
|
|
516
|
+
`Unexpected config.yaml.example format in the AgentCore template. Expected "pattern:" and "stack_name_base:" keys. Please try again or report this issue at https://github.com/CopilotKit/CopilotKit/issues`
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
content = content.replace(patternRegex, `$1${pattern}$2`);
|
|
520
|
+
content = content.replace(
|
|
521
|
+
stackRegex,
|
|
522
|
+
`$1my-copilotkit-agentcore${suffix}$2`
|
|
523
|
+
);
|
|
524
|
+
await fs2.writeFile(configPath, content, "utf-8");
|
|
525
|
+
const isLanggraph = framework === "agentcore-langgraph";
|
|
526
|
+
const removeAgent = isLanggraph ? "strands-single-agent" : "langgraph-single-agent";
|
|
527
|
+
const removeScript = isLanggraph ? "deploy-strands.sh" : "deploy-langgraph.sh";
|
|
528
|
+
const keepScript = isLanggraph ? "deploy-langgraph.sh" : "deploy-strands.sh";
|
|
529
|
+
await Promise.all([
|
|
530
|
+
fs2.remove(path2.join(projectDir, "agents", removeAgent)),
|
|
531
|
+
fs2.remove(path2.join(projectDir, removeScript)),
|
|
532
|
+
fs2.remove(path2.join(projectDir, "infra-terraform"))
|
|
533
|
+
]);
|
|
534
|
+
const keepScriptPath = path2.join(projectDir, keepScript);
|
|
535
|
+
if (await fs2.pathExists(keepScriptPath)) {
|
|
536
|
+
await fs2.move(keepScriptPath, path2.join(projectDir, "deploy.sh"));
|
|
537
|
+
}
|
|
538
|
+
const deployShPath = path2.join(projectDir, "deploy.sh");
|
|
539
|
+
if (await fs2.pathExists(deployShPath)) {
|
|
540
|
+
let deployContent = await fs2.readFile(deployShPath, "utf-8");
|
|
541
|
+
deployContent = deployContent.replace(/\(isolated from deploy-(?:langgraph|strands)\.sh\)\s*/g, "").replace(/# Using Terraform instead\?.*\n/g, "");
|
|
542
|
+
await fs2.writeFile(deployShPath, deployContent, "utf-8");
|
|
543
|
+
}
|
|
544
|
+
const configYamlPath = path2.join(projectDir, "config.yaml");
|
|
545
|
+
if (await fs2.pathExists(configYamlPath)) {
|
|
546
|
+
let configContent = await fs2.readFile(configYamlPath, "utf-8");
|
|
547
|
+
configContent = configContent.replace(
|
|
548
|
+
/# overwritten by deploy-langgraph\.sh \/ deploy-strands\.sh/g,
|
|
549
|
+
"# set by the CLI \u2014 do not change"
|
|
550
|
+
);
|
|
551
|
+
await fs2.writeFile(configYamlPath, configContent, "utf-8");
|
|
552
|
+
}
|
|
553
|
+
const agentShortName = isLanggraph ? "langgraph" : "strands";
|
|
554
|
+
const otherShortName = isLanggraph ? "strands" : "langgraph";
|
|
555
|
+
for (const relPath of ["docker/docker-compose.yml", "docker/up.sh"]) {
|
|
556
|
+
const filePath = path2.join(projectDir, relPath);
|
|
557
|
+
if (await fs2.pathExists(filePath)) {
|
|
558
|
+
let fileContent = await fs2.readFile(filePath, "utf-8");
|
|
559
|
+
fileContent = fileContent.replaceAll(
|
|
560
|
+
`AGENT:-${otherShortName}`,
|
|
561
|
+
`AGENT:-${agentShortName}`
|
|
562
|
+
);
|
|
563
|
+
fileContent = fileContent.replaceAll(
|
|
564
|
+
`echo "${otherShortName}"`,
|
|
565
|
+
`echo "${agentShortName}"`
|
|
566
|
+
);
|
|
567
|
+
await fs2.writeFile(filePath, fileContent, "utf-8");
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
const resolveEnvPath = path2.join(projectDir, "docker/resolve-env.py");
|
|
571
|
+
if (await fs2.pathExists(resolveEnvPath)) {
|
|
572
|
+
let resolveContent = await fs2.readFile(resolveEnvPath, "utf-8");
|
|
573
|
+
resolveContent = resolveContent.replaceAll(
|
|
574
|
+
`os.environ.get("AGENT", "${otherShortName}")`,
|
|
575
|
+
`os.environ.get("AGENT", "${agentShortName}")`
|
|
576
|
+
);
|
|
577
|
+
await fs2.writeFile(resolveEnvPath, resolveContent, "utf-8");
|
|
578
|
+
}
|
|
579
|
+
const frameworkLabel = isLanggraph ? "LangGraph" : "Strands";
|
|
580
|
+
const stackSuffix = isLanggraph ? "lg" : "st";
|
|
581
|
+
const agentFolder = isLanggraph ? "langgraph-single-agent" : "strands-single-agent";
|
|
582
|
+
const readme = `# CopilotKit + AWS AgentCore (${frameworkLabel})
|
|
583
|
+
|
|
584
|
+
Chat UI with generative charts, shared-state todo canvas, and inline tool rendering \u2014 deployed on AWS Bedrock AgentCore.
|
|
585
|
+
|
|
586
|
+
## Prerequisites
|
|
587
|
+
|
|
588
|
+
| Tool | Version |
|
|
589
|
+
| ------- | ---------------------------- |
|
|
590
|
+
| AWS CLI | configured (\`aws configure\`) |
|
|
591
|
+
| Node.js | 18+ |
|
|
592
|
+
| Python | 3.8+ |
|
|
593
|
+
| Docker | running |
|
|
594
|
+
|
|
595
|
+
## Deploy
|
|
596
|
+
|
|
597
|
+
1. **Edit \`config.yaml\`** \u2014 set \`stack_name_base\` and \`admin_user_email\`
|
|
598
|
+
|
|
599
|
+
2. **Deploy:**
|
|
600
|
+
|
|
601
|
+
\`\`\`bash
|
|
602
|
+
./deploy.sh # full deploy (infra + frontend)
|
|
603
|
+
./deploy.sh --skip-frontend # infra/agent only
|
|
604
|
+
./deploy.sh --skip-backend # frontend only
|
|
605
|
+
\`\`\`
|
|
606
|
+
|
|
607
|
+
3. **Open** the Amplify URL printed at the end. Sign in with your email.
|
|
608
|
+
|
|
609
|
+
## Local Development
|
|
610
|
+
|
|
611
|
+
\`\`\`bash
|
|
612
|
+
cd docker
|
|
613
|
+
cp .env.example .env
|
|
614
|
+
# Fill in AWS creds \u2014 STACK_NAME, MEMORY_ID, and aws-exports.json are auto-resolved
|
|
615
|
+
./up.sh --build
|
|
616
|
+
\`\`\`
|
|
617
|
+
|
|
618
|
+
- **Frontend** \u2192 hot reloads on save
|
|
619
|
+
- **Agent** \u2192 rebuild on changes: \`docker compose up --build agent\`
|
|
620
|
+
- **Browser** \u2192 \`http://localhost:3000\`
|
|
621
|
+
|
|
622
|
+
The full chain runs locally: \`browser:3000 \u2192 bridge:3001 \u2192 agent:8080\`. AWS is only used for Memory and Gateway.
|
|
623
|
+
|
|
624
|
+
## What's inside
|
|
625
|
+
|
|
626
|
+
| Piece | What it does |
|
|
627
|
+
| ------------------------------ | ---------------------------------------------------------- |
|
|
628
|
+
| \`frontend/\` | Vite + React with CopilotKit chat, charts, todo canvas |
|
|
629
|
+
| \`agents/${agentFolder}/\` | ${frameworkLabel} agent with tools + shared todo state |
|
|
630
|
+
| \`infra-cdk/\` | CDK: Cognito, AgentCore, CopilotKit Lambda, Amplify |
|
|
631
|
+
| \`docker/\` | Local dev via Docker Compose |
|
|
632
|
+
|
|
633
|
+
## Tear down
|
|
634
|
+
|
|
635
|
+
\`\`\`bash
|
|
636
|
+
cd infra-cdk && npx cdk@latest destroy --all --output ../cdk.out-${stackSuffix}
|
|
637
|
+
\`\`\`
|
|
638
|
+
|
|
639
|
+
## Docs
|
|
640
|
+
|
|
641
|
+
- [CopilotKit](https://docs.copilotkit.ai)
|
|
642
|
+
- [AWS Bedrock AgentCore](https://aws.amazon.com/bedrock/agentcore/)
|
|
643
|
+
- [AgentCore + CopilotKit Guide](https://docs.copilotkit.ai/agentcore/quickstart)
|
|
644
|
+
`;
|
|
645
|
+
await fs2.writeFile(path2.join(projectDir, "README.md"), readme, "utf-8");
|
|
646
|
+
}
|
|
471
647
|
async downloadTemplate(projectDir, framework, spinner) {
|
|
472
648
|
const templateRef = TEMPLATE_REPOS[framework];
|
|
649
|
+
if (templateRef.startsWith("/")) {
|
|
650
|
+
const EXCLUDE = [
|
|
651
|
+
"node_modules",
|
|
652
|
+
"cdk.out",
|
|
653
|
+
".git",
|
|
654
|
+
"__pycache__",
|
|
655
|
+
".venv"
|
|
656
|
+
];
|
|
657
|
+
await fs2.copy(templateRef, projectDir, {
|
|
658
|
+
filter: (src) => !EXCLUDE.some(
|
|
659
|
+
(ex) => src.split("/").includes(ex) || src.includes(`/${ex}`)
|
|
660
|
+
)
|
|
661
|
+
});
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
473
664
|
if (isValidGitHubUrl(templateRef)) {
|
|
474
665
|
const success = await cloneGitHubSubdirectory(
|
|
475
666
|
templateRef,
|
|
@@ -497,9 +688,21 @@ Your project is ready to explore CopilotKit locally.`
|
|
|
497
688
|
});
|
|
498
689
|
await fs2.remove(tempFile);
|
|
499
690
|
} catch (error) {
|
|
500
|
-
throw new Error(`Failed to download template: ${error.message}
|
|
691
|
+
throw new Error(`Failed to download template: ${error.message}`, {
|
|
692
|
+
cause: error
|
|
693
|
+
});
|
|
501
694
|
}
|
|
502
695
|
}
|
|
696
|
+
static SHOWCASE_FRAMEWORKS = {
|
|
697
|
+
a2ui: "a2ui",
|
|
698
|
+
opengenui: "opengenui"
|
|
699
|
+
};
|
|
700
|
+
async applyShowcaseConfig(projectDir, framework) {
|
|
701
|
+
const showcase = _Create.SHOWCASE_FRAMEWORKS[framework];
|
|
702
|
+
if (!showcase) return;
|
|
703
|
+
const configPath = path2.join(projectDir, "showcase.json");
|
|
704
|
+
await fs2.writeJSON(configPath, { showcase });
|
|
705
|
+
}
|
|
503
706
|
};
|
|
504
707
|
export {
|
|
505
708
|
Create as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/create.ts","../../src/commands/base-command.ts","../../src/utils/version.ts","../../src/utils/trpc.ts","../../src/lib/init/scaffold/github.ts"],"sourcesContent":["import { Config, Flags, Args } from \"@oclif/core\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport { promisify } from \"util\";\nimport { pipeline } from \"stream\";\nimport { createWriteStream } from \"fs\";\nimport { extract } from \"tar\";\nimport ora, { Ora } from \"ora\";\n\nimport { BaseCommand } from \"./base-command.js\";\nimport {\n cloneGitHubSubdirectory,\n isValidGitHubUrl,\n} from \"../lib/init/scaffold/github.js\";\n\nconst streamPipeline = promisify(pipeline);\n\nconst theme = {\n primary: chalk.magenta,\n secondary: chalk.gray,\n tertiary: chalk.gray,\n error: chalk.red,\n command: chalk.blue,\n success: chalk.green,\n warning: chalk.yellow,\n divider: chalk.gray(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"),\n bottomPadding: \"\",\n};\n\ninterface CreateOptions {\n projectName: string;\n agentFramework: AgentFramework;\n}\n\ntype AgentFramework =\n | \"langgraph-py\"\n | \"langgraph-js\"\n | \"flows\"\n | \"mastra\"\n | \"pydantic-ai\"\n | \"llamaindex\"\n | \"agno\"\n | \"ag2\"\n | \"adk\"\n | \"aws-strands-py\"\n | \"a2a\"\n | \"microsoft-agent-framework-dotnet\"\n | \"microsoft-agent-framework-py\"\n | \"mcp-apps\";\n\nconst TEMPLATE_REPOS: Record<AgentFramework, string> = {\n \"langgraph-py\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/langgraph-python\",\n \"langgraph-js\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/langgraph-js\",\n mastra:\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/mastra\",\n flows:\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/crewai-flows\",\n llamaindex:\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/llamaindex\",\n agno: \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/agno\",\n \"pydantic-ai\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/pydantic-ai\",\n ag2: \"ag2ai/ag2-copilotkit-starter\",\n adk: \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/adk\",\n \"aws-strands-py\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/strands-python\",\n a2a: \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/a2a-middleware\",\n \"microsoft-agent-framework-dotnet\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/ms-agent-framework-dotnet\",\n \"microsoft-agent-framework-py\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/ms-agent-framework-python\",\n \"mcp-apps\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/mcp-apps\",\n};\n\nconst FRAMEWORK_DOCUMENTATION: Record<AgentFramework, string> = {\n \"langgraph-py\":\n \"https://langchain-ai.github.io/langgraph/concepts/why-langgraph\",\n \"langgraph-js\": \"https://langchain-ai.github.io/langgraphjs\",\n flows: \"https://docs.crewai.com/guides/flows/first-flow\",\n mastra: \"https://mastra.ai/en/docs\",\n \"pydantic-ai\": \"https://ai.pydantic.dev/ag-ui/\",\n llamaindex: \"https://docs.llamaindex.ai/en/stable\",\n agno: \"https://docs.agno.com/\",\n ag2: \"https://docs.ag2.ai/latest/docs/user-guide/basic-concepts/overview\",\n adk: \"https://google.github.io/adk-docs/\",\n \"aws-strands-py\": \"https://strandsagents.com/latest/documentation/docs/\",\n a2a: \"https://a2a-protocol.org/latest/\",\n \"microsoft-agent-framework-dotnet\":\n \"https://learn.microsoft.com/en-us/agent-framework/\",\n \"microsoft-agent-framework-py\":\n \"https://learn.microsoft.com/en-us/agent-framework/\",\n \"mcp-apps\": \"https://modelcontextprotocol.github.io/ext-apps\",\n};\n\nconst FRAMEWORK_EMOJI: Record<AgentFramework, string> = {\n \"langgraph-js\": \"🦜\",\n \"langgraph-py\": \"🦜\",\n flows: \"👥\",\n mastra: \"🌑\",\n \"pydantic-ai\": \"🔼\",\n llamaindex: \"🦙\",\n ag2: \"🤖\",\n agno: \"🅰️\",\n adk: \"🤖\",\n a2a: \"🤖\",\n \"aws-strands-py\": \"🧬\",\n \"microsoft-agent-framework-dotnet\": \"🟦\",\n \"microsoft-agent-framework-py\": \"🟦\",\n \"mcp-apps\": \"♍\",\n};\n\nconst KITE = `\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠙⣿⡛⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠈⢿⡄⠀⠀⠀⠈⠉⠙⣻⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠈⢿⡄⠀⢀⣠⣴⠾⠋⢸⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⢀⣀⣀⣀⣀⣤⣤⡾⢿⡟⠛⠉⠀⠀⠀⠀⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡛⠛⠛⠛⠉⠉⠉⠁⠀⢠⡿⣿⡀⠀⠀⠀⠀⠀⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⣰⡟⠀⠸⣧⠀⠀⠀⠀⢠⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⢀⣼⠏⠀⠀⠀⣿⡀⠀⠀⠀⢸⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠂⣠⡿⠁⠀⠀⠀⠀⢸⡇⠀⠀⠀⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⣡⣾⣿⣄⠀⠀⠀⠀⠀⢸⡇⠀⠀⢰⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⡟⠛⡿⠋⣡⣾⣿⣿⣿⣿⣦⡀⠀⠀⠀⢸⡇⠀⠀⣿⣿⣿⣿\n⣿⣿⣿⣿⡿⠿⣿⠷⠂⡀⠘⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⢸⡇⠀⣼⣿⣿⣿⣿\n⣿⣿⠻⢿⡷⠀⠁⠴⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⣾⠇⣴⣿⣿⣿⣿⣿\n⡿⠛⠀⠀⢴⣾⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣤⣿⣾⣿⣿⣿⣿⣿⣿\n⣷⣾⣿⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n`;\n\nexport default class Create extends BaseCommand {\n static description = \"Create a new CopilotKit project\";\n\n static examples = [\n \"$ copilotkit create my-app\",\n \"$ copilotkit create my-app --framework langgraph-js\",\n \"$ copilotkit create -n my-app -f langgraph-js\",\n ];\n\n static flags = {\n ...BaseCommand.flags,\n framework: Flags.string({\n char: \"f\",\n description: \"Agent framework to use\",\n options: Object.keys(TEMPLATE_REPOS),\n required: false,\n }),\n name: Flags.string({\n char: \"n\",\n description: \"Name of the project\",\n required: false,\n }),\n \"no-banner\": Flags.boolean({\n char: \"q\",\n description: \"Removes the banner\",\n default: false,\n required: false,\n }),\n project: Flags.string({\n description: \"project ID (deprecated, kept for backwards compatibility)\",\n }),\n };\n\n static args = {\n projectName: Args.string({\n description: \"Name of the project\",\n required: false,\n }),\n };\n\n constructor(argv: string[], config: Config) {\n super(argv, config);\n }\n\n async run() {\n const { args, flags } = await this.parse(Create);\n\n if (!flags[\"no-banner\"]) {\n this.log(theme.primary(KITE));\n this.log(theme.primary(\"~ Welcome to CopilotKit! ~\\n\"));\n this.log(theme.divider);\n\n if (!flags.name && !args.projectName && !flags.framework) {\n this.log(\n \"\\n\" + theme.secondary(\"Just a few questions to get started!\\n\"),\n );\n }\n }\n\n const projectNameInput =\n flags.name || args.projectName || (await this.promptProjectName());\n const projectName = projectNameInput.trim();\n const usingCurrentDir = projectName === \".\" || projectName === \"./\";\n const agentFramework =\n flags.framework || (await this.promptAgentFramework());\n\n const projectDir = usingCurrentDir\n ? process.cwd()\n : path.resolve(process.cwd(), projectName);\n\n if (usingCurrentDir) {\n const allowedEntries = new Set([\".git\", \".gitignore\", \".DS_Store\"]);\n const existingEntries = await fs.readdir(projectDir);\n const blockingEntries = existingEntries.filter(\n (entry) => !allowedEntries.has(entry),\n );\n\n if (blockingEntries.length > 0) {\n this.log(theme.error(\"\\nCurrent directory is not empty.\"));\n this.log(\n theme.secondary(\n \"\\nPlease run create in an empty directory or specify a new project name.\",\n ),\n );\n this.exit(1);\n }\n } else if (await fs.pathExists(projectDir)) {\n this.log(theme.error(`\\nDirectory \"${projectName}\" already exists.`));\n this.log(theme.secondary(\"\\nYou can:\"));\n this.log(theme.secondary(\" 1. Choose a different project name\"));\n this.log(\n theme.secondary(\n \" 2. Remove the existing directory manually if you want to use this name\\n\",\n ),\n );\n this.exit(1);\n }\n\n const options: CreateOptions = {\n projectName,\n agentFramework: agentFramework as AgentFramework,\n };\n\n const spinner = ora({\n text: theme.secondary.bold(\"Creating your project...\"),\n color: \"cyan\",\n spinner: \"dots\",\n }).start();\n\n try {\n await fs.ensureDir(projectDir);\n\n spinner.text = theme.secondary.bold(\"Downloading template...\");\n await this.downloadTemplate(projectDir, options.agentFramework, spinner);\n\n const displayName = usingCurrentDir\n ? \"current directory\"\n : `\"${projectName}\"`;\n spinner.succeed(\n theme.secondary.bold(`Project ${displayName} created successfully!`),\n );\n } catch (error: any) {\n spinner.fail(theme.error(`Failed to create project: ${error.message}`));\n this.exit(1);\n }\n\n this.log(\"\\n\" + theme.divider);\n this.log(\n \"\\n\" +\n theme.secondary.bold(\n `🪁🤝${FRAMEWORK_EMOJI[options.agentFramework]} All set! \\n\\nYour project is ready to explore CopilotKit locally.`,\n ),\n );\n this.log(\"\\n\" + theme.secondary(\"Next steps:\"));\n if (usingCurrentDir) {\n this.log(\n theme.secondary(\n \" • You are already inside your new project directory\",\n ),\n );\n } else {\n this.log(theme.secondary(` • ${theme.command(`cd ${projectName}`)}`));\n }\n this.log(\n theme.secondary(\" • Follow the setup instructions in the README.md\"),\n );\n this.log(\"\\n\" + theme.secondary(\"Documentation:\"));\n this.log(\n theme.secondary(\" • \") + theme.command(\"https://docs.copilotkit.ai\"),\n );\n this.log(\n theme.secondary(\" • \") +\n theme.command(FRAMEWORK_DOCUMENTATION[options.agentFramework]),\n );\n this.log(theme.bottomPadding);\n }\n\n private async promptProjectName(): Promise<string> {\n const { projectName } = await inquirer.prompt([\n {\n type: \"input\",\n name: \"projectName\",\n message: theme.secondary(\"What is your project named?\"),\n validate: (input: string) => {\n if (!input) return theme.error(\"Project name is required\");\n if (!/^[a-z0-9-]+$/.test(input)) {\n return theme.error(\n \"Project name can only contain lowercase letters, numbers, and hyphens\",\n );\n }\n if (input.length > 30) {\n return theme.error(\"Project name must be less than 30 characters\");\n }\n return true;\n },\n },\n ]);\n return projectName;\n }\n\n private async promptAgentFramework(): Promise<string> {\n const { framework } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"framework\",\n message: theme.secondary(\n \"Which agent framework would you like to use?\",\n ),\n choices: [\n {\n name: `${FRAMEWORK_EMOJI[\"langgraph-py\"]} LangGraph (Python)`,\n value: \"langgraph-py\",\n },\n {\n name: `${FRAMEWORK_EMOJI[\"langgraph-js\"]} LangGraph (JavaScript)`,\n value: \"langgraph-js\",\n },\n { name: `${FRAMEWORK_EMOJI.mastra} Mastra`, value: \"mastra\" },\n {\n name: `${FRAMEWORK_EMOJI[\"pydantic-ai\"]} Pydantic AI`,\n value: \"pydantic-ai\",\n },\n {\n name: `${FRAMEWORK_EMOJI[\"aws-strands-py\"]} AWS Strands (Python)`,\n value: \"aws-strands-py\",\n },\n { name: `${FRAMEWORK_EMOJI.adk} ADK`, value: \"adk\" },\n {\n name: `${FRAMEWORK_EMOJI[\"microsoft-agent-framework-dotnet\"]} Microsoft Agent Framework (.NET)`,\n value: \"microsoft-agent-framework-dotnet\",\n },\n {\n name: `${FRAMEWORK_EMOJI[\"microsoft-agent-framework-py\"]} Microsoft Agent Framework (Python)`,\n value: \"microsoft-agent-framework-py\",\n },\n {\n name: `${FRAMEWORK_EMOJI[\"mcp-apps\"]} MCP Apps`,\n value: \"mcp-apps\",\n },\n { name: `${FRAMEWORK_EMOJI.flows} CrewAI Flows`, value: \"flows\" },\n {\n name: `${FRAMEWORK_EMOJI.llamaindex} LlamaIndex`,\n value: \"llamaindex\",\n },\n { name: `${FRAMEWORK_EMOJI.agno} Agno`, value: \"agno\" },\n { name: `${FRAMEWORK_EMOJI.ag2} AG2`, value: \"ag2\" },\n { name: `${FRAMEWORK_EMOJI.a2a} A2A`, value: \"a2a\" },\n ],\n },\n ]);\n return framework;\n }\n\n private async downloadTemplate(\n projectDir: string,\n framework: AgentFramework,\n spinner: Ora,\n ): Promise<void> {\n const templateRef = TEMPLATE_REPOS[framework];\n\n // Monorepo subdirectory URLs use sparse checkout; standalone repos use tarball download\n if (isValidGitHubUrl(templateRef)) {\n const success = await cloneGitHubSubdirectory(\n templateRef,\n projectDir,\n spinner,\n );\n if (!success) {\n throw new Error(`Failed to clone template from ${templateRef}`);\n }\n return;\n }\n\n // Fallback: standalone repo tarball (e.g. ag2ai/ag2-copilotkit-starter)\n const url = `https://github.com/${templateRef}/archive/refs/heads/main.tar.gz`;\n\n try {\n const response = await fetch(url);\n if (!response.ok)\n throw new Error(`Failed to download template: ${response.statusText}`);\n\n const tempFile = path.join(projectDir, \"template.tar.gz\");\n const fileStream = createWriteStream(tempFile);\n\n if (!response.body) throw new Error(\"Failed to get response body\");\n await streamPipeline(response.body as any, fileStream);\n\n await extract({\n file: tempFile,\n cwd: projectDir,\n strip: 1,\n });\n\n await fs.remove(tempFile);\n } catch (error: any) {\n throw new Error(`Failed to download template: ${error.message}`);\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 = \"1.0.0\";\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 { execSync } from \"child_process\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { Config } from \"../types/index.js\";\nimport chalk from \"chalk\";\nimport ora, { Ora } from \"ora\";\n\n/**\n * Clones a specific subdirectory from a GitHub repository\n *\n * @param githubUrl - The GitHub URL to the repository or subdirectory\n * @param destinationPath - The local path where the content should be copied\n * @param spinner - The spinner to update with progress information\n * @returns A boolean indicating success or failure\n */\nexport async function cloneGitHubSubdirectory(\n githubUrl: string,\n destinationPath: string,\n spinner: Ora,\n): Promise<boolean> {\n try {\n // Parse the GitHub URL to extract repo info\n const { owner, repo, branch, subdirectoryPath } = parseGitHubUrl(githubUrl);\n\n spinner.text = chalk.cyan(`Cloning from ${owner}/${repo}...`);\n\n // Method 1: Use sparse checkout (more efficient than full clone)\n return await sparseCheckout(\n owner,\n repo,\n branch,\n subdirectoryPath,\n destinationPath,\n spinner,\n );\n } catch (error) {\n spinner.text = chalk.red(`Failed to clone from GitHub: ${error}`);\n return false;\n }\n}\n\n/**\n * Uses Git sparse-checkout to efficiently download only the needed subdirectory\n */\nasync function sparseCheckout(\n owner: string,\n repo: string,\n branch: string,\n subdirectoryPath: string,\n destinationPath: string,\n spinner: Ora,\n): Promise<boolean> {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"copilotkit-sparse-\"));\n\n try {\n spinner.text = chalk.cyan(\"Creating temporary workspace...\");\n\n // Initialize git repo\n execSync(\"git init\", { cwd: tempDir, stdio: \"pipe\" });\n\n spinner.text = chalk.cyan(\"Connecting to repository...\");\n\n // Add remote\n execSync(`git remote add origin https://github.com/${owner}/${repo}.git`, {\n cwd: tempDir,\n stdio: \"pipe\",\n });\n\n // Enable sparse checkout\n execSync(\"git config core.sparseCheckout true\", {\n cwd: tempDir,\n stdio: \"pipe\",\n });\n\n // Specify which subdirectory to checkout\n fs.writeFileSync(\n path.join(tempDir, \".git/info/sparse-checkout\"),\n subdirectoryPath,\n );\n\n spinner.text = chalk.cyan(\"Downloading agent files...\");\n\n // Pull only the specified branch\n execSync(`git pull origin ${branch} --depth=1`, {\n cwd: tempDir,\n stdio: \"pipe\",\n });\n\n // Copy the subdirectory to the destination\n const sourcePath = path.join(tempDir, subdirectoryPath);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(\n `Subdirectory '${subdirectoryPath}' not found in the repository.`,\n );\n }\n\n // Ensure destination directory exists\n fs.mkdirSync(destinationPath, { recursive: true });\n\n spinner.text = chalk.cyan(\"Installing agent files...\");\n\n // Copy the subdirectory to the destination\n await copyDirectoryAsync(sourcePath, destinationPath);\n\n return true;\n } finally {\n // Clean up the temporary directory\n try {\n fs.rmSync(tempDir, { recursive: true, force: true });\n } catch (error) {\n console.warn(`Failed to clean up temporary directory: ${error}`);\n }\n }\n}\n\n/**\n * Recursively copies a directory with async pauses\n */\nasync function copyDirectoryAsync(\n source: string,\n destination: string,\n): Promise<void> {\n // Create destination directory if it doesn't exist\n if (!fs.existsSync(destination)) {\n fs.mkdirSync(destination, { recursive: true });\n }\n\n // Read all files/directories from source\n const entries = fs.readdirSync(source, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(source, entry.name);\n const destPath = path.join(destination, entry.name);\n\n if (entry.isDirectory()) {\n // Recursively copy subdirectories\n await copyDirectoryAsync(srcPath, destPath);\n } else {\n // Copy files\n fs.copyFileSync(srcPath, destPath);\n }\n\n // For large directories, add small pauses\n if (entries.length > 10) {\n await new Promise((resolve) => setTimeout(resolve, 1));\n }\n }\n}\n\n/**\n * Parses a GitHub URL to extract owner, repo, branch and subdirectory path\n */\nfunction parseGitHubUrl(githubUrl: string): {\n owner: string;\n repo: string;\n branch: string;\n subdirectoryPath: string;\n} {\n const url = new URL(githubUrl);\n\n if (url.hostname !== \"github.com\") {\n throw new Error(\"Only GitHub URLs are supported\");\n }\n\n const pathParts = url.pathname.split(\"/\").filter(Boolean);\n\n if (pathParts.length < 2) {\n throw new Error(\"Invalid GitHub URL format\");\n }\n\n const owner = pathParts[0];\n const repo = pathParts[1];\n let branch = \"main\"; // Default branch\n let subdirectoryPath = \"\";\n\n if (\n pathParts.length > 3 &&\n (pathParts[2] === \"tree\" || pathParts[2] === \"blob\")\n ) {\n branch = pathParts[3];\n subdirectoryPath = pathParts.slice(4).join(\"/\");\n }\n\n return { owner, repo, branch, subdirectoryPath };\n}\n\n/**\n * Validates if a string is a valid GitHub URL\n */\nexport function isValidGitHubUrl(url: string): boolean {\n try {\n const parsedUrl = new URL(url);\n return (\n parsedUrl.hostname === \"github.com\" &&\n parsedUrl.pathname.split(\"/\").filter(Boolean).length >= 2\n );\n } catch {\n return false;\n }\n}\n"],"mappings":"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","names":["chalk","fs","path","chalk","chalk","path","fs"]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/create.ts","../../src/commands/base-command.ts","../../src/utils/version.ts","../../src/utils/trpc.ts","../../src/lib/init/scaffold/github.ts"],"sourcesContent":["import { Config, Flags, Args } from \"@oclif/core\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport { promisify } from \"util\";\nimport { pipeline } from \"stream\";\nimport { createWriteStream } from \"fs\";\nimport { extract } from \"tar\";\nimport ora, { Ora } from \"ora\";\n\nimport { BaseCommand } from \"./base-command.js\";\nimport {\n cloneGitHubSubdirectory,\n isValidGitHubUrl,\n} from \"../lib/init/scaffold/github.js\";\n\nconst streamPipeline = promisify(pipeline);\n\nconst theme = {\n primary: chalk.magenta,\n secondary: chalk.gray,\n tertiary: chalk.gray,\n error: chalk.red,\n command: chalk.blue,\n success: chalk.green,\n warning: chalk.yellow,\n divider: chalk.gray(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"),\n bottomPadding: \"\",\n};\n\ninterface CreateOptions {\n projectName: string;\n agentFramework: AgentFramework;\n}\n\ntype AgentFramework =\n | \"langgraph-py\"\n | \"langgraph-js\"\n | \"flows\"\n | \"mastra\"\n | \"pydantic-ai\"\n | \"llamaindex\"\n | \"agno\"\n | \"ag2\"\n | \"adk\"\n | \"aws-strands-py\"\n | \"a2a\"\n | \"microsoft-agent-framework-dotnet\"\n | \"microsoft-agent-framework-py\"\n | \"mcp-apps\"\n | \"agentcore-langgraph\"\n | \"agentcore-strands\"\n | \"a2ui\"\n | \"opengenui\";\n\nconst TEMPLATE_REPOS: Record<AgentFramework, string> = {\n \"langgraph-py\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/langgraph-python\",\n \"langgraph-js\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/langgraph-js\",\n mastra:\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/mastra\",\n flows:\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/crewai-flows\",\n llamaindex:\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/llamaindex\",\n agno: \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/agno\",\n \"pydantic-ai\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/pydantic-ai\",\n ag2: \"ag2ai/ag2-copilotkit-starter\",\n adk: \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/adk\",\n \"aws-strands-py\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/strands-python\",\n a2a: \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/a2a-middleware\",\n \"microsoft-agent-framework-dotnet\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/ms-agent-framework-dotnet\",\n \"microsoft-agent-framework-py\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/ms-agent-framework-python\",\n \"mcp-apps\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/mcp-apps\",\n \"agentcore-langgraph\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/agentcore\",\n \"agentcore-strands\":\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/agentcore\",\n a2ui: \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/langgraph-python\",\n opengenui:\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/langgraph-python\",\n};\n\nconst FRAMEWORK_DOCUMENTATION: Record<AgentFramework, string> = {\n \"langgraph-py\":\n \"https://langchain-ai.github.io/langgraph/concepts/why-langgraph\",\n \"langgraph-js\": \"https://langchain-ai.github.io/langgraphjs\",\n flows: \"https://docs.crewai.com/guides/flows/first-flow\",\n mastra: \"https://mastra.ai/en/docs\",\n \"pydantic-ai\": \"https://ai.pydantic.dev/ag-ui/\",\n llamaindex: \"https://docs.llamaindex.ai/en/stable\",\n agno: \"https://docs.agno.com/\",\n ag2: \"https://docs.ag2.ai/latest/docs/user-guide/basic-concepts/overview\",\n adk: \"https://google.github.io/adk-docs/\",\n \"aws-strands-py\": \"https://strandsagents.com/latest/documentation/docs/\",\n a2a: \"https://a2a-protocol.org/latest/\",\n \"microsoft-agent-framework-dotnet\":\n \"https://learn.microsoft.com/en-us/agent-framework/\",\n \"microsoft-agent-framework-py\":\n \"https://learn.microsoft.com/en-us/agent-framework/\",\n \"mcp-apps\": \"https://modelcontextprotocol.github.io/ext-apps\",\n \"agentcore-langgraph\": \"https://docs.copilotkit.ai/agentcore/quickstart\",\n \"agentcore-strands\": \"https://docs.copilotkit.ai/agentcore/quickstart\",\n a2ui: \"https://a2ui.org/specification/\",\n opengenui: \"https://docs.copilotkit.ai\",\n};\n\nconst FRAMEWORK_EMOJI: Record<AgentFramework, string> = {\n \"langgraph-js\": \"🦜\",\n \"langgraph-py\": \"🦜\",\n flows: \"👥\",\n mastra: \"🌑\",\n \"pydantic-ai\": \"🔼\",\n llamaindex: \"🦙\",\n ag2: \"🤖\",\n agno: \"🅰️\",\n adk: \"🤖\",\n a2a: \"🤖\",\n \"aws-strands-py\": \"🧬\",\n \"microsoft-agent-framework-dotnet\": \"🟦\",\n \"microsoft-agent-framework-py\": \"🟦\",\n \"mcp-apps\": \"♍\",\n \"agentcore-langgraph\": \"☁️\",\n \"agentcore-strands\": \"☁️\",\n a2ui: \"🎨\",\n opengenui: \"🖼️\",\n};\n\nconst KITE = `\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠙⣿⡛⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠈⢿⡄⠀⠀⠀⠈⠉⠙⣻⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠈⢿⡄⠀⢀⣠⣴⠾⠋⢸⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⢀⣀⣀⣀⣀⣤⣤⡾⢿⡟⠛⠉⠀⠀⠀⠀⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡛⠛⠛⠛⠉⠉⠉⠁⠀⢠⡿⣿⡀⠀⠀⠀⠀⠀⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⣰⡟⠀⠸⣧⠀⠀⠀⠀⢠⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⢀⣼⠏⠀⠀⠀⣿⡀⠀⠀⠀⢸⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠂⣠⡿⠁⠀⠀⠀⠀⢸⡇⠀⠀⠀⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⣡⣾⣿⣄⠀⠀⠀⠀⠀⢸⡇⠀⠀⢰⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⡟⠛⡿⠋⣡⣾⣿⣿⣿⣿⣦⡀⠀⠀⠀⢸⡇⠀⠀⣿⣿⣿⣿\n⣿⣿⣿⣿⡿⠿⣿⠷⠂⡀⠘⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⢸⡇⠀⣼⣿⣿⣿⣿\n⣿⣿⠻⢿⡷⠀⠁⠴⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⣾⠇⣴⣿⣿⣿⣿⣿\n⡿⠛⠀⠀⢴⣾⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣤⣿⣾⣿⣿⣿⣿⣿⣿\n⣷⣾⣿⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n`;\n\nexport default class Create extends BaseCommand {\n static description = \"Create a new CopilotKit project\";\n\n static examples = [\n \"$ copilotkit create my-app\",\n \"$ copilotkit create my-app --framework langgraph-js\",\n \"$ copilotkit create -n my-app -f langgraph-js\",\n ];\n\n static flags = {\n ...BaseCommand.flags,\n framework: Flags.string({\n char: \"f\",\n description: \"Agent framework to use\",\n options: Object.keys(TEMPLATE_REPOS),\n required: false,\n }),\n name: Flags.string({\n char: \"n\",\n description: \"Name of the project\",\n required: false,\n }),\n \"no-banner\": Flags.boolean({\n char: \"q\",\n description: \"Removes the banner\",\n default: false,\n required: false,\n }),\n project: Flags.string({\n description: \"project ID (deprecated, kept for backwards compatibility)\",\n }),\n };\n\n static args = {\n projectName: Args.string({\n description: \"Name of the project\",\n required: false,\n }),\n };\n\n constructor(argv: string[], config: Config) {\n super(argv, config);\n }\n\n async run() {\n const { args, flags } = await this.parse(Create);\n\n if (!flags[\"no-banner\"]) {\n this.log(theme.primary(KITE));\n this.log(theme.primary(\"~ Welcome to CopilotKit! ~\\n\"));\n this.log(theme.divider);\n\n if (!flags.name && !args.projectName && !flags.framework) {\n this.log(\n \"\\n\" + theme.secondary(\"Just a few questions to get started!\\n\"),\n );\n }\n }\n\n const projectNameInput =\n flags.name || args.projectName || (await this.promptProjectName());\n const projectName = projectNameInput.trim();\n const usingCurrentDir = projectName === \".\" || projectName === \"./\";\n const agentFramework =\n flags.framework || (await this.promptAgentFramework());\n\n const projectDir = usingCurrentDir\n ? process.cwd()\n : path.resolve(process.cwd(), projectName);\n\n if (usingCurrentDir) {\n const allowedEntries = new Set([\".git\", \".gitignore\", \".DS_Store\"]);\n const existingEntries = await fs.readdir(projectDir);\n const blockingEntries = existingEntries.filter(\n (entry) => !allowedEntries.has(entry),\n );\n\n if (blockingEntries.length > 0) {\n this.log(theme.error(\"\\nCurrent directory is not empty.\"));\n this.log(\n theme.secondary(\n \"\\nPlease run create in an empty directory or specify a new project name.\",\n ),\n );\n this.exit(1);\n }\n } else if (await fs.pathExists(projectDir)) {\n this.log(theme.error(`\\nDirectory \"${projectName}\" already exists.`));\n this.log(theme.secondary(\"\\nYou can:\"));\n this.log(theme.secondary(\" 1. Choose a different project name\"));\n this.log(\n theme.secondary(\n \" 2. Remove the existing directory manually if you want to use this name\\n\",\n ),\n );\n this.exit(1);\n }\n\n const options: CreateOptions = {\n projectName,\n agentFramework: agentFramework as AgentFramework,\n };\n\n const spinner = ora({\n text: theme.secondary.bold(\"Creating your project...\"),\n color: \"cyan\",\n spinner: \"dots\",\n }).start();\n\n try {\n await fs.ensureDir(projectDir);\n\n spinner.text = theme.secondary.bold(\"Downloading template...\");\n await this.downloadTemplate(projectDir, options.agentFramework, spinner);\n await this.applyShowcaseConfig(projectDir, options.agentFramework);\n\n if (\n options.agentFramework === \"agentcore-langgraph\" ||\n options.agentFramework === \"agentcore-strands\"\n ) {\n spinner.text = theme.secondary.bold(\"Configuring AgentCore...\");\n await this.configureAgentCore(projectDir, options.agentFramework);\n }\n\n const displayName = usingCurrentDir\n ? \"current directory\"\n : `\"${projectName}\"`;\n spinner.succeed(\n theme.secondary.bold(`Project ${displayName} created successfully!`),\n );\n } catch (error: any) {\n spinner.fail(theme.error(`Failed to create project: ${error.message}`));\n this.exit(1);\n }\n\n this.log(\"\\n\" + theme.divider);\n this.log(\n \"\\n\" +\n theme.secondary.bold(\n `🪁🤝${FRAMEWORK_EMOJI[options.agentFramework]} All set! \\n\\nYour project is ready to explore CopilotKit locally.`,\n ),\n );\n this.log(\"\\n\" + theme.secondary(\"Next steps:\"));\n if (usingCurrentDir) {\n this.log(\n theme.secondary(\n \" • You are already inside your new project directory\",\n ),\n );\n } else {\n this.log(theme.secondary(` • ${theme.command(`cd ${projectName}`)}`));\n }\n this.log(\n theme.secondary(\" • Follow the setup instructions in the README.md\"),\n );\n this.log(\"\\n\" + theme.secondary(\"Documentation:\"));\n this.log(\n theme.secondary(\" • \") + theme.command(\"https://docs.copilotkit.ai\"),\n );\n this.log(\n theme.secondary(\" • \") +\n theme.command(FRAMEWORK_DOCUMENTATION[options.agentFramework]),\n );\n this.log(theme.bottomPadding);\n }\n\n private async promptProjectName(): Promise<string> {\n const { projectName } = await inquirer.prompt([\n {\n type: \"input\",\n name: \"projectName\",\n message: theme.secondary(\"What is your project named?\"),\n validate: (input: string) => {\n if (!input) return theme.error(\"Project name is required\");\n if (!/^[a-z0-9-]+$/.test(input)) {\n return theme.error(\n \"Project name can only contain lowercase letters, numbers, and hyphens\",\n );\n }\n if (input.length > 30) {\n return theme.error(\"Project name must be less than 30 characters\");\n }\n return true;\n },\n },\n ]);\n return projectName;\n }\n\n private async promptAgentFramework(): Promise<string> {\n const { framework } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"framework\",\n message: theme.secondary(\n \"Which agent framework would you like to use?\",\n ),\n choices: [\n {\n name: `${FRAMEWORK_EMOJI[\"langgraph-py\"]} LangGraph (Python)`,\n value: \"langgraph-py\",\n },\n {\n name: `${FRAMEWORK_EMOJI[\"langgraph-js\"]} LangGraph (JavaScript)`,\n value: \"langgraph-js\",\n },\n { name: `${FRAMEWORK_EMOJI.mastra} Mastra`, value: \"mastra\" },\n {\n name: `${FRAMEWORK_EMOJI[\"pydantic-ai\"]} Pydantic AI`,\n value: \"pydantic-ai\",\n },\n {\n name: `${FRAMEWORK_EMOJI[\"aws-strands-py\"]} AWS Strands (Python)`,\n value: \"aws-strands-py\",\n },\n { name: `${FRAMEWORK_EMOJI.adk} ADK`, value: \"adk\" },\n {\n name: `${FRAMEWORK_EMOJI[\"microsoft-agent-framework-dotnet\"]} Microsoft Agent Framework (.NET)`,\n value: \"microsoft-agent-framework-dotnet\",\n },\n {\n name: `${FRAMEWORK_EMOJI[\"microsoft-agent-framework-py\"]} Microsoft Agent Framework (Python)`,\n value: \"microsoft-agent-framework-py\",\n },\n {\n name: `${FRAMEWORK_EMOJI[\"mcp-apps\"]} MCP Apps`,\n value: \"mcp-apps\",\n },\n { name: `${FRAMEWORK_EMOJI.flows} CrewAI Flows`, value: \"flows\" },\n {\n name: `${FRAMEWORK_EMOJI.llamaindex} LlamaIndex`,\n value: \"llamaindex\",\n },\n { name: `${FRAMEWORK_EMOJI.agno} Agno`, value: \"agno\" },\n { name: `${FRAMEWORK_EMOJI.ag2} AG2`, value: \"ag2\" },\n { name: `${FRAMEWORK_EMOJI.a2a} A2A`, value: \"a2a\" },\n {\n name: `${FRAMEWORK_EMOJI[\"agentcore-langgraph\"]} AgentCore + LangGraph`,\n value: \"agentcore-langgraph\",\n },\n {\n name: `${FRAMEWORK_EMOJI[\"agentcore-strands\"]} AgentCore + Strands`,\n value: \"agentcore-strands\",\n },\n { name: `${FRAMEWORK_EMOJI.a2ui} A2UI`, value: \"a2ui\" },\n {\n name: `${FRAMEWORK_EMOJI.opengenui} Open Generative UI`,\n value: \"opengenui\",\n },\n ],\n },\n ]);\n return framework;\n }\n\n private async configureAgentCore(\n projectDir: string,\n framework: \"agentcore-langgraph\" | \"agentcore-strands\",\n ): Promise<void> {\n const pattern =\n framework === \"agentcore-langgraph\"\n ? \"langgraph-single-agent\"\n : \"strands-single-agent\";\n const suffix = framework === \"agentcore-langgraph\" ? \"-lg\" : \"-st\";\n\n const examplePath = path.join(projectDir, \"config.yaml.example\");\n const configPath = path.join(projectDir, \"config.yaml\");\n\n if (!(await fs.pathExists(examplePath))) {\n throw new Error(\n `config.yaml.example not found in the AgentCore template at \"${projectDir}\". ` +\n `The downloaded template may be incomplete. Please try again.`,\n );\n }\n\n let content = await fs.readFile(examplePath, \"utf-8\");\n\n const patternRegex = /^(\\s*pattern:\\s*)\\S+(.*)$/m;\n const stackRegex = /^(\\s*stack_name_base:\\s*)\\S+(.*)$/m;\n\n if (!patternRegex.test(content) || !stackRegex.test(content)) {\n throw new Error(\n `Unexpected config.yaml.example format in the AgentCore template. ` +\n `Expected \"pattern:\" and \"stack_name_base:\" keys. Please try again or ` +\n `report this issue at https://github.com/CopilotKit/CopilotKit/issues`,\n );\n }\n\n content = content.replace(patternRegex, `$1${pattern}$2`);\n content = content.replace(\n stackRegex,\n `$1my-copilotkit-agentcore${suffix}$2`,\n );\n await fs.writeFile(configPath, content, \"utf-8\");\n\n // Remove the other agent, the other deploy script, and terraform\n const isLanggraph = framework === \"agentcore-langgraph\";\n const removeAgent = isLanggraph\n ? \"strands-single-agent\"\n : \"langgraph-single-agent\";\n const removeScript = isLanggraph\n ? \"deploy-strands.sh\"\n : \"deploy-langgraph.sh\";\n const keepScript = isLanggraph\n ? \"deploy-langgraph.sh\"\n : \"deploy-strands.sh\";\n\n await Promise.all([\n fs.remove(path.join(projectDir, \"agents\", removeAgent)),\n fs.remove(path.join(projectDir, removeScript)),\n fs.remove(path.join(projectDir, \"infra-terraform\")),\n ]);\n\n // Rename the remaining deploy script to deploy.sh\n const keepScriptPath = path.join(projectDir, keepScript);\n if (await fs.pathExists(keepScriptPath)) {\n await fs.move(keepScriptPath, path.join(projectDir, \"deploy.sh\"));\n }\n\n // Patch deploy.sh — remove stale references to the other script and terraform\n const deployShPath = path.join(projectDir, \"deploy.sh\");\n if (await fs.pathExists(deployShPath)) {\n let deployContent = await fs.readFile(deployShPath, \"utf-8\");\n deployContent = deployContent\n .replace(/\\(isolated from deploy-(?:langgraph|strands)\\.sh\\)\\s*/g, \"\")\n .replace(/# Using Terraform instead\\?.*\\n/g, \"\");\n await fs.writeFile(deployShPath, deployContent, \"utf-8\");\n }\n\n // Patch config.yaml — remove stale comment about deploy scripts\n const configYamlPath = path.join(projectDir, \"config.yaml\");\n if (await fs.pathExists(configYamlPath)) {\n let configContent = await fs.readFile(configYamlPath, \"utf-8\");\n configContent = configContent.replace(\n /# overwritten by deploy-langgraph\\.sh \\/ deploy-strands\\.sh/g,\n \"# set by the CLI — do not change\",\n );\n await fs.writeFile(configYamlPath, configContent, \"utf-8\");\n }\n\n // Patch docker files — set the correct default agent\n const agentShortName = isLanggraph ? \"langgraph\" : \"strands\";\n const otherShortName = isLanggraph ? \"strands\" : \"langgraph\";\n\n for (const relPath of [\"docker/docker-compose.yml\", \"docker/up.sh\"]) {\n const filePath = path.join(projectDir, relPath);\n if (await fs.pathExists(filePath)) {\n let fileContent = await fs.readFile(filePath, \"utf-8\");\n fileContent = fileContent.replaceAll(\n `AGENT:-${otherShortName}`,\n `AGENT:-${agentShortName}`,\n );\n fileContent = fileContent.replaceAll(\n `echo \"${otherShortName}\"`,\n `echo \"${agentShortName}\"`,\n );\n await fs.writeFile(filePath, fileContent, \"utf-8\");\n }\n }\n\n // resolve-env.py uses Python syntax — patch separately\n const resolveEnvPath = path.join(projectDir, \"docker/resolve-env.py\");\n if (await fs.pathExists(resolveEnvPath)) {\n let resolveContent = await fs.readFile(resolveEnvPath, \"utf-8\");\n resolveContent = resolveContent.replaceAll(\n `os.environ.get(\"AGENT\", \"${otherShortName}\")`,\n `os.environ.get(\"AGENT\", \"${agentShortName}\")`,\n );\n await fs.writeFile(resolveEnvPath, resolveContent, \"utf-8\");\n }\n\n // Write a clean framework-specific README\n const frameworkLabel = isLanggraph ? \"LangGraph\" : \"Strands\";\n const stackSuffix = isLanggraph ? \"lg\" : \"st\";\n const agentFolder = isLanggraph\n ? \"langgraph-single-agent\"\n : \"strands-single-agent\";\n const readme = `# CopilotKit + AWS AgentCore (${frameworkLabel})\n\nChat UI with generative charts, shared-state todo canvas, and inline tool rendering — deployed on AWS Bedrock AgentCore.\n\n## Prerequisites\n\n| Tool | Version |\n| ------- | ---------------------------- |\n| AWS CLI | configured (\\`aws configure\\`) |\n| Node.js | 18+ |\n| Python | 3.8+ |\n| Docker | running |\n\n## Deploy\n\n1. **Edit \\`config.yaml\\`** — set \\`stack_name_base\\` and \\`admin_user_email\\`\n\n2. **Deploy:**\n\n \\`\\`\\`bash\n ./deploy.sh # full deploy (infra + frontend)\n ./deploy.sh --skip-frontend # infra/agent only\n ./deploy.sh --skip-backend # frontend only\n \\`\\`\\`\n\n3. **Open** the Amplify URL printed at the end. Sign in with your email.\n\n## Local Development\n\n\\`\\`\\`bash\ncd docker\ncp .env.example .env\n# Fill in AWS creds — STACK_NAME, MEMORY_ID, and aws-exports.json are auto-resolved\n./up.sh --build\n\\`\\`\\`\n\n- **Frontend** → hot reloads on save\n- **Agent** → rebuild on changes: \\`docker compose up --build agent\\`\n- **Browser** → \\`http://localhost:3000\\`\n\nThe full chain runs locally: \\`browser:3000 → bridge:3001 → agent:8080\\`. AWS is only used for Memory and Gateway.\n\n## What's inside\n\n| Piece | What it does |\n| ------------------------------ | ---------------------------------------------------------- |\n| \\`frontend/\\` | Vite + React with CopilotKit chat, charts, todo canvas |\n| \\`agents/${agentFolder}/\\` | ${frameworkLabel} agent with tools + shared todo state |\n| \\`infra-cdk/\\` | CDK: Cognito, AgentCore, CopilotKit Lambda, Amplify |\n| \\`docker/\\` | Local dev via Docker Compose |\n\n## Tear down\n\n\\`\\`\\`bash\ncd infra-cdk && npx cdk@latest destroy --all --output ../cdk.out-${stackSuffix}\n\\`\\`\\`\n\n## Docs\n\n- [CopilotKit](https://docs.copilotkit.ai)\n- [AWS Bedrock AgentCore](https://aws.amazon.com/bedrock/agentcore/)\n- [AgentCore + CopilotKit Guide](https://docs.copilotkit.ai/agentcore/quickstart)\n`;\n await fs.writeFile(path.join(projectDir, \"README.md\"), readme, \"utf-8\");\n }\n\n private async downloadTemplate(\n projectDir: string,\n framework: AgentFramework,\n spinner: Ora,\n ): Promise<void> {\n const templateRef = TEMPLATE_REPOS[framework];\n\n // Local path — copy directly from filesystem (excluding heavy generated dirs)\n if (templateRef.startsWith(\"/\")) {\n const EXCLUDE = [\n \"node_modules\",\n \"cdk.out\",\n \".git\",\n \"__pycache__\",\n \".venv\",\n ];\n await fs.copy(templateRef, projectDir, {\n filter: (src: string) =>\n !EXCLUDE.some(\n (ex) => src.split(\"/\").includes(ex) || src.includes(`/${ex}`),\n ),\n });\n return;\n }\n\n // Monorepo subdirectory URLs use sparse checkout; standalone repos use tarball download\n if (isValidGitHubUrl(templateRef)) {\n const success = await cloneGitHubSubdirectory(\n templateRef,\n projectDir,\n spinner,\n );\n if (!success) {\n throw new Error(`Failed to clone template from ${templateRef}`);\n }\n return;\n }\n\n // Fallback: standalone repo tarball (e.g. ag2ai/ag2-copilotkit-starter)\n const url = `https://github.com/${templateRef}/archive/refs/heads/main.tar.gz`;\n\n try {\n const response = await fetch(url);\n if (!response.ok)\n throw new Error(`Failed to download template: ${response.statusText}`);\n\n const tempFile = path.join(projectDir, \"template.tar.gz\");\n const fileStream = createWriteStream(tempFile);\n\n if (!response.body) throw new Error(\"Failed to get response body\");\n await streamPipeline(response.body as any, fileStream);\n\n await extract({\n file: tempFile,\n cwd: projectDir,\n strip: 1,\n });\n\n await fs.remove(tempFile);\n } catch (error: any) {\n throw new Error(`Failed to download template: ${error.message}`, {\n cause: error,\n });\n }\n }\n\n private static readonly SHOWCASE_FRAMEWORKS: Partial<\n Record<AgentFramework, string>\n > = {\n a2ui: \"a2ui\",\n opengenui: \"opengenui\",\n };\n\n private async applyShowcaseConfig(\n projectDir: string,\n framework: AgentFramework,\n ): Promise<void> {\n const showcase = Create.SHOWCASE_FRAMEWORKS[framework];\n if (!showcase) return;\n const configPath = path.join(projectDir, \"showcase.json\");\n await fs.writeJSON(configPath, { showcase });\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 = \"1.0.2\";\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 { execSync } from \"child_process\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { Config } from \"../types/index.js\";\nimport chalk from \"chalk\";\nimport ora, { Ora } from \"ora\";\n\n/**\n * Clones a specific subdirectory from a GitHub repository\n *\n * @param githubUrl - The GitHub URL to the repository or subdirectory\n * @param destinationPath - The local path where the content should be copied\n * @param spinner - The spinner to update with progress information\n * @returns A boolean indicating success or failure\n */\nexport async function cloneGitHubSubdirectory(\n githubUrl: string,\n destinationPath: string,\n spinner: Ora,\n): Promise<boolean> {\n try {\n // Parse the GitHub URL to extract repo info\n const { owner, repo, branch, subdirectoryPath } = parseGitHubUrl(githubUrl);\n\n spinner.text = chalk.cyan(`Cloning from ${owner}/${repo}...`);\n\n // Method 1: Use sparse checkout (more efficient than full clone)\n return await sparseCheckout(\n owner,\n repo,\n branch,\n subdirectoryPath,\n destinationPath,\n spinner,\n );\n } catch (error) {\n spinner.text = chalk.red(`Failed to clone from GitHub: ${error}`);\n return false;\n }\n}\n\n/**\n * Uses Git sparse-checkout to efficiently download only the needed subdirectory\n */\nasync function sparseCheckout(\n owner: string,\n repo: string,\n branch: string,\n subdirectoryPath: string,\n destinationPath: string,\n spinner: Ora,\n): Promise<boolean> {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"copilotkit-sparse-\"));\n\n try {\n spinner.text = chalk.cyan(\"Creating temporary workspace...\");\n\n // Initialize git repo\n execSync(\"git init\", { cwd: tempDir, stdio: \"pipe\" });\n\n spinner.text = chalk.cyan(\"Connecting to repository...\");\n\n // Add remote\n execSync(`git remote add origin https://github.com/${owner}/${repo}.git`, {\n cwd: tempDir,\n stdio: \"pipe\",\n });\n\n // Enable sparse checkout\n execSync(\"git config core.sparseCheckout true\", {\n cwd: tempDir,\n stdio: \"pipe\",\n });\n\n // Specify which subdirectory to checkout\n fs.writeFileSync(\n path.join(tempDir, \".git/info/sparse-checkout\"),\n subdirectoryPath,\n );\n\n spinner.text = chalk.cyan(\"Downloading agent files...\");\n\n // Pull only the specified branch\n execSync(`git pull origin ${branch} --depth=1`, {\n cwd: tempDir,\n stdio: \"pipe\",\n });\n\n // Copy the subdirectory to the destination\n const sourcePath = path.join(tempDir, subdirectoryPath);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(\n `Subdirectory '${subdirectoryPath}' not found in the repository.`,\n );\n }\n\n // Ensure destination directory exists\n fs.mkdirSync(destinationPath, { recursive: true });\n\n spinner.text = chalk.cyan(\"Installing agent files...\");\n\n // Copy the subdirectory to the destination\n await copyDirectoryAsync(sourcePath, destinationPath);\n\n return true;\n } finally {\n // Clean up the temporary directory\n try {\n fs.rmSync(tempDir, { recursive: true, force: true });\n } catch (error) {\n console.warn(`Failed to clean up temporary directory: ${error}`);\n }\n }\n}\n\n/**\n * Recursively copies a directory with async pauses\n */\nasync function copyDirectoryAsync(\n source: string,\n destination: string,\n): Promise<void> {\n // Create destination directory if it doesn't exist\n if (!fs.existsSync(destination)) {\n fs.mkdirSync(destination, { recursive: true });\n }\n\n // Read all files/directories from source\n const entries = fs.readdirSync(source, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(source, entry.name);\n const destPath = path.join(destination, entry.name);\n\n if (entry.isDirectory()) {\n // Recursively copy subdirectories\n await copyDirectoryAsync(srcPath, destPath);\n } else {\n // Copy files\n fs.copyFileSync(srcPath, destPath);\n }\n\n // For large directories, add small pauses\n if (entries.length > 10) {\n await new Promise((resolve) => setTimeout(resolve, 1));\n }\n }\n}\n\n/**\n * Parses a GitHub URL to extract owner, repo, branch and subdirectory path\n */\nfunction parseGitHubUrl(githubUrl: string): {\n owner: string;\n repo: string;\n branch: string;\n subdirectoryPath: string;\n} {\n const url = new URL(githubUrl);\n\n if (url.hostname !== \"github.com\") {\n throw new Error(\"Only GitHub URLs are supported\");\n }\n\n const pathParts = url.pathname.split(\"/\").filter(Boolean);\n\n if (pathParts.length < 2) {\n throw new Error(\"Invalid GitHub URL format\");\n }\n\n const owner = pathParts[0];\n const repo = pathParts[1];\n let branch = \"main\"; // Default branch\n let subdirectoryPath = \"\";\n\n if (\n pathParts.length > 3 &&\n (pathParts[2] === \"tree\" || pathParts[2] === \"blob\")\n ) {\n branch = pathParts[3];\n subdirectoryPath = pathParts.slice(4).join(\"/\");\n }\n\n return { owner, repo, branch, subdirectoryPath };\n}\n\n/**\n * Validates if a string is a valid GitHub URL\n */\nexport function isValidGitHubUrl(url: string): boolean {\n try {\n const parsedUrl = new URL(url);\n return (\n parsedUrl.hostname === \"github.com\" &&\n parsedUrl.pathname.split(\"/\").filter(Boolean).length >= 2\n );\n } catch {\n return false;\n }\n}\n"],"mappings":"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","names":["chalk","fs","path","chalk","chalk","path","fs"]}
|
package/dist/commands/dev.js
CHANGED
|
@@ -468,7 +468,7 @@ import { Command } from "@oclif/core";
|
|
|
468
468
|
import Sentry, { consoleIntegration } from "@sentry/node";
|
|
469
469
|
|
|
470
470
|
// src/utils/version.ts
|
|
471
|
-
var LIB_VERSION = "1.0.
|
|
471
|
+
var LIB_VERSION = "1.0.2";
|
|
472
472
|
|
|
473
473
|
// src/commands/base-command.ts
|
|
474
474
|
import chalk2 from "chalk";
|
|
@@ -671,7 +671,7 @@ var Dev = class _Dev extends BaseCommand {
|
|
|
671
671
|
},
|
|
672
672
|
spinner
|
|
673
673
|
});
|
|
674
|
-
await
|
|
674
|
+
[await setupTunnel];
|
|
675
675
|
}
|
|
676
676
|
async setupTunnel({
|
|
677
677
|
port,
|