@kya-os/create-mcpi-app 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +235 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/effects/index.d.ts +14 -0
  4. package/dist/effects/index.d.ts.map +1 -0
  5. package/dist/effects/index.js +51 -0
  6. package/dist/effects/index.js.map +1 -0
  7. package/dist/helpers/apply-identity-preset.d.ts +14 -0
  8. package/dist/helpers/apply-identity-preset.d.ts.map +1 -0
  9. package/dist/helpers/apply-identity-preset.js +171 -0
  10. package/dist/helpers/apply-identity-preset.js.map +1 -0
  11. package/dist/helpers/copy-template.d.ts +2 -0
  12. package/dist/helpers/copy-template.d.ts.map +1 -0
  13. package/dist/helpers/copy-template.js +11 -0
  14. package/dist/helpers/copy-template.js.map +1 -0
  15. package/dist/helpers/create.d.ts +26 -0
  16. package/dist/helpers/create.d.ts.map +1 -0
  17. package/dist/helpers/create.js +150 -0
  18. package/dist/helpers/create.js.map +1 -0
  19. package/dist/helpers/fetch-xmcp-template.d.ts +11 -0
  20. package/dist/helpers/fetch-xmcp-template.d.ts.map +1 -0
  21. package/dist/helpers/fetch-xmcp-template.js +54 -0
  22. package/dist/helpers/fetch-xmcp-template.js.map +1 -0
  23. package/dist/helpers/generate-config.d.ts +2 -0
  24. package/dist/helpers/generate-config.d.ts.map +1 -0
  25. package/dist/helpers/generate-config.js +28 -0
  26. package/dist/helpers/generate-config.js.map +1 -0
  27. package/dist/helpers/install.d.ts +3 -0
  28. package/dist/helpers/install.d.ts.map +1 -0
  29. package/dist/helpers/install.js +52 -0
  30. package/dist/helpers/install.js.map +1 -0
  31. package/dist/helpers/rename.d.ts +2 -0
  32. package/dist/helpers/rename.d.ts.map +1 -0
  33. package/dist/helpers/rename.js +15 -0
  34. package/dist/helpers/rename.js.map +1 -0
  35. package/dist/helpers/validate-project-structure.d.ts +14 -0
  36. package/dist/helpers/validate-project-structure.d.ts.map +1 -0
  37. package/dist/helpers/validate-project-structure.js +103 -0
  38. package/dist/helpers/validate-project-structure.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +322 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/utils/check-node.d.ts +2 -0
  44. package/dist/utils/check-node.d.ts.map +1 -0
  45. package/dist/utils/check-node.js +12 -0
  46. package/dist/utils/check-node.js.map +1 -0
  47. package/dist/utils/is-folder-empty.d.ts +2 -0
  48. package/dist/utils/is-folder-empty.d.ts.map +1 -0
  49. package/dist/utils/is-folder-empty.js +55 -0
  50. package/dist/utils/is-folder-empty.js.map +1 -0
  51. package/dist/utils/validate-project-name.d.ts +15 -0
  52. package/dist/utils/validate-project-name.d.ts.map +1 -0
  53. package/dist/utils/validate-project-name.js +106 -0
  54. package/dist/utils/validate-project-name.js.map +1 -0
  55. package/index.js +4 -0
  56. package/package.json +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/effects/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;AAEpG,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAY,EACZ,OAAa,EACb,iBAA0B,KAAK;IAE/B,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,CAAC,GAAG,CAAC;QACf,MAAM,EAAE,MAAa;QACrB,IAAI;QACJ,cAAc;KACf,CAAC,CAAC;AACL,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,oBAAoB,CAAC,QAAiB;IACpD,IAAI,QAAQ,EAAE,CAAC;QACb,mCAAmC;QACnC,OAAO;;;EAGT,QAAQ;;mCAEyB,CAAC;IAClC,CAAC;IAED,2BAA2B;IAC3B,OAAO,gBAAgB,CACrB,oBAAoB,EACpB,2DAA2D,CAC5D,CAAC;AACJ,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,OAAO,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,IAOnC;IACC,6DAA6D;IAC7D,MAAM,SAAS,GAAG;QAChB,IAAI,EAAE,IAAI,CAAC,SAAS,EAAG,wBAAwB;QAC/C,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,SAAS,EAAE,SAAS,EAAG,iCAAiC;QACxD,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,SAAS,EAAE,SAAS,EAAG,4CAA4C;QACnE,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;IAEF,qCAAqC;IACrC,IAAI,WAAW,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAE9C,6EAA6E;IAC7E,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,WAAW,IAAI,iCAAiC,GAAG,IAAI,CAAC,QAAQ,CAAC;IACnE,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,14 @@
1
+ interface IdentityPresetOptions {
2
+ projectPath: string;
3
+ projectName: string;
4
+ transports: string[];
5
+ noIdentity?: boolean;
6
+ }
7
+ /**
8
+ * Apply identity preset to an XMCP project
9
+ * This enhances the upstream XMCP template with identity features
10
+ * If noIdentity is true, leaves the XMCP project unchanged
11
+ */
12
+ export declare function applyIdentityPreset(options: IdentityPresetOptions): Promise<void>;
13
+ export {};
14
+ //# sourceMappingURL=apply-identity-preset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-identity-preset.d.ts","sourceRoot":"","sources":["../../src/helpers/apply-identity-preset.ts"],"names":[],"mappings":"AAIA,UAAU,qBAAqB;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CA+Gf"}
@@ -0,0 +1,171 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import chalk from "chalk";
4
+ /**
5
+ * Apply identity preset to an XMCP project
6
+ * This enhances the upstream XMCP template with identity features
7
+ * If noIdentity is true, leaves the XMCP project unchanged
8
+ */
9
+ export async function applyIdentityPreset(options) {
10
+ const { projectPath, projectName, transports, noIdentity = false } = options;
11
+ if (noIdentity) {
12
+ console.log(chalk.blue("šŸ“¦ Keeping plain XMCP project (--no-identity flag)"));
13
+ return;
14
+ }
15
+ console.log(chalk.blue("šŸ” Applying identity preset..."));
16
+ const srcDir = path.join(projectPath, "src");
17
+ // Check if upstream XMCP structure exists
18
+ const middlewarePath = path.join(srcDir, "middleware.ts");
19
+ const toolsDir = path.join(srcDir, "tools");
20
+ if (await fs.pathExists(middlewarePath)) {
21
+ // Enhance existing middleware.ts with identity features
22
+ console.log(chalk.gray("šŸ“ Enhancing existing middleware.ts with identity features..."));
23
+ let middlewareContent = await fs.readFile(middlewarePath, "utf-8");
24
+ // Add identity imports at the top
25
+ const identityImports = `import { createMCPIRuntime } from "mcp-i";\n`;
26
+ // Add identity middleware before existing middleware
27
+ const identityMiddleware = `\n// XMCP-I Identity Middleware\nconst mcpiRuntime = await createMCPIRuntime({\n identity: {\n environment: process.env.NODE_ENV === "production" ? "production" : "development",\n devIdentityPath: ".mcp-i/identity.json",\n },\n wellKnown: {\n environment: process.env.NODE_ENV === "production" ? "production" : "development",\n baseUrl: process.env.BASE_URL || "http://localhost:3000",\n },\n});\n\n// Add identity verification to all requests\nexport const identityMiddleware = mcpiRuntime.middleware;\n\n`;
28
+ // Insert identity imports at the beginning
29
+ middlewareContent = identityImports + middlewareContent;
30
+ // Insert identity middleware before the last export
31
+ const lastExportIndex = middlewareContent.lastIndexOf("export");
32
+ if (lastExportIndex !== -1) {
33
+ middlewareContent =
34
+ middlewareContent.slice(0, lastExportIndex) +
35
+ identityMiddleware +
36
+ middlewareContent.slice(lastExportIndex);
37
+ }
38
+ else {
39
+ middlewareContent += identityMiddleware;
40
+ }
41
+ await fs.writeFile(middlewarePath, middlewareContent);
42
+ }
43
+ else {
44
+ // Fallback: create our own structure if upstream doesn't exist
45
+ console.log(chalk.yellow("āš ļø No upstream middleware.ts found, creating mcpi structure..."));
46
+ await fs.ensureDir(srcDir);
47
+ await fs.ensureDir(toolsDir);
48
+ // Create middleware.ts with identity features
49
+ const middlewareContent = `import { createMCPIRuntime } from "mcp-i";\n\n// Create XMCP-I server with identity features\nconst runtime = await createMCPIRuntime({\n identity: {\n environment: process.env.NODE_ENV === "production" ? "production" : "development",\n devIdentityPath: ".mcp-i/identity.json",\n },\n wellKnown: {\n environment: process.env.NODE_ENV === "production" ? "production" : "development",\n baseUrl: process.env.BASE_URL || "http://localhost:3000",\n },\n});\n\n// Export identity middleware\nexport const identityMiddleware = runtime.middleware;\n`;
50
+ await fs.writeFile(middlewarePath, middlewareContent);
51
+ }
52
+ // Enhance existing tools or create identity-aware tools
53
+ if (await fs.pathExists(toolsDir)) {
54
+ console.log(chalk.gray("šŸ”§ Enhancing existing tools with identity features..."));
55
+ // Check for existing tools and enhance them
56
+ const toolFiles = await fs.readdir(toolsDir);
57
+ const tsFiles = toolFiles.filter((f) => f.endsWith(".ts") && f !== "index.ts");
58
+ if (tsFiles.length > 0) {
59
+ // Enhance existing tools
60
+ for (const toolFile of tsFiles) {
61
+ const toolPath = path.join(toolsDir, toolFile);
62
+ let toolContent = await fs.readFile(toolPath, "utf-8");
63
+ // Add identity comment to existing tools
64
+ const identityComment = `// Enhanced with XMCP-I identity features\n`;
65
+ toolContent = identityComment + toolContent;
66
+ await fs.writeFile(toolPath, toolContent);
67
+ }
68
+ }
69
+ else {
70
+ // Create identity-aware hello tool if no tools exist
71
+ await createIdentityHelloTool(toolsDir);
72
+ }
73
+ }
74
+ else {
75
+ // Create tools directory and identity-aware tools
76
+ await fs.ensureDir(toolsDir);
77
+ await createIdentityHelloTool(toolsDir);
78
+ }
79
+ // Update package.json with identity dependencies and scripts
80
+ await updatePackageJsonForIdentity(projectPath, projectName, transports);
81
+ // Create .mcp-i directory for identity files
82
+ const mcpiDir = path.join(projectPath, ".mcp-i");
83
+ await fs.ensureDir(mcpiDir);
84
+ // Create .gitignore with identity-specific entries
85
+ await updateGitignore(projectPath);
86
+ console.log(chalk.green("āœ… Identity preset applied"));
87
+ }
88
+ async function createIdentityHelloTool(toolsDir) {
89
+ // Create tools/hello.ts with identity features
90
+ const helloToolContent = `// Enhanced with XMCP-I identity features
91
+ import { z } from "zod";
92
+
93
+ export const hello = {
94
+ name: "hello",
95
+ description: "Say hello with identity verification",
96
+ inputSchema: z.object({
97
+ name: z.string().describe("Name to greet"),
98
+ }),
99
+ handler: async ({ name }: { name: string }) => {
100
+ return {
101
+ content: [
102
+ {
103
+ type: "text" as const,
104
+ text: \`Hello, \${name}! This message is cryptographically signed.\`,
105
+ },
106
+ ],
107
+ };
108
+ },
109
+ };
110
+ `;
111
+ await fs.writeFile(path.join(toolsDir, "hello.ts"), helloToolContent);
112
+ // Create or update tools/index.ts
113
+ const indexPath = path.join(toolsDir, "index.ts");
114
+ let indexContent = "";
115
+ if (await fs.pathExists(indexPath)) {
116
+ indexContent = await fs.readFile(indexPath, "utf-8");
117
+ }
118
+ // Add hello export if not already present
119
+ if (!indexContent.includes("hello")) {
120
+ indexContent += `\nexport * from "./hello.js";`;
121
+ await fs.writeFile(indexPath, indexContent);
122
+ }
123
+ }
124
+ async function updatePackageJsonForIdentity(projectPath, projectName, transports) {
125
+ const packageJsonPath = path.join(projectPath, "package.json");
126
+ const packageJson = await fs.readJson(packageJsonPath);
127
+ // Add identity dependencies
128
+ // Use workspace dependencies for local testing, published versions for production
129
+ const useWorkspace = process.env.MCPI_USE_WORKSPACE === "true";
130
+ packageJson.dependencies = {
131
+ ...packageJson.dependencies,
132
+ "mcp-i": useWorkspace ? "workspace:*" : "^1.0.0",
133
+ "@kya-os/cli": useWorkspace ? "workspace:*" : "^1.0.0",
134
+ };
135
+ // Add exactly 8 scripts as required by spec
136
+ packageJson.scripts = {
137
+ dev: "mcp-i dev",
138
+ build: "mcp-i build",
139
+ start: "mcp-i start",
140
+ init: "mcp-i init",
141
+ register: "mcp-i register",
142
+ "keys:rotate": "mcp-i keys rotate",
143
+ "identity:clean": "mcp-i identity clean",
144
+ status: "mcp-i status",
145
+ };
146
+ await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
147
+ }
148
+ async function updateGitignore(projectPath) {
149
+ const gitignorePath = path.join(projectPath, ".gitignore");
150
+ let gitignoreContent = "";
151
+ if (await fs.pathExists(gitignorePath)) {
152
+ gitignoreContent = await fs.readFile(gitignorePath, "utf-8");
153
+ }
154
+ // Add identity-specific gitignore entries if not already present
155
+ const identityEntries = [
156
+ "# MCP-I Identity",
157
+ ".mcp-i/",
158
+ ".mcpi/", // Legacy support
159
+ ".xmcpi/", // Legacy support for old naming
160
+ ".env.local",
161
+ "generated-identity.json",
162
+ ".mcp-identity.json",
163
+ ];
164
+ for (const entry of identityEntries) {
165
+ if (!gitignoreContent.includes(entry)) {
166
+ gitignoreContent += `\n${entry}`;
167
+ }
168
+ }
169
+ await fs.writeFile(gitignorePath, gitignoreContent);
170
+ }
171
+ //# sourceMappingURL=apply-identity-preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-identity-preset.js","sourceRoot":"","sources":["../../src/helpers/apply-identity-preset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function copyTemplate(templateDir: string, projectPath: string): void;
2
+ //# sourceMappingURL=copy-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-template.d.ts","sourceRoot":"","sources":["../../src/helpers/copy-template.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAO3E"}
@@ -0,0 +1,11 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ export function copyTemplate(templateDir, projectPath) {
4
+ fs.copySync(templateDir, projectPath, {
5
+ filter: (src) => {
6
+ const basename = path.basename(src);
7
+ return !basename.startsWith(".");
8
+ },
9
+ });
10
+ }
11
+ //# sourceMappingURL=copy-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-template.js","sourceRoot":"","sources":["../../src/helpers/copy-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,WAAmB;IACnE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE;QACpC,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { ScaffolderResult } from "@kya-os/contracts";
2
+ interface CreateProjectOptions {
3
+ projectPath: string;
4
+ projectName: string;
5
+ packageManager: string;
6
+ transports: string[];
7
+ packageVersion: string;
8
+ useLocalXmcp?: boolean;
9
+ xmcpVersion?: string;
10
+ xmcpChannel?: string;
11
+ deployToVercel?: boolean;
12
+ skipInstall?: boolean;
13
+ agentName?: string;
14
+ agentDescription?: string;
15
+ agentRepository?: string;
16
+ skipIdentity?: boolean;
17
+ skipAnimation?: boolean;
18
+ fastAnimation?: boolean;
19
+ spinner?: any;
20
+ }
21
+ /**
22
+ * Create a new xmcp project with identity features
23
+ */
24
+ export declare function createProject(options: CreateProjectOptions): Promise<ScaffolderResult>;
25
+ export {};
26
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/helpers/create.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AA4CrD,UAAU,oBAAoB;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AASD;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAgI3B"}
@@ -0,0 +1,150 @@
1
+ import path from "path";
2
+ import fs from "fs-extra";
3
+ import { fileURLToPath } from "url";
4
+ import { fetchXMCPTemplate } from "./fetch-xmcp-template.js";
5
+ import { applyIdentityPreset } from "./apply-identity-preset.js";
6
+ import { renameFiles } from "./rename.js";
7
+ import { install } from "./install.js";
8
+ import { generateConfig } from "./generate-config.js";
9
+ import { validateProjectStructure, ensureLockfile, } from "./validate-project-structure.js";
10
+ import chalk from "chalk";
11
+ import crypto from "crypto";
12
+ const __filename = fileURLToPath(import.meta.url);
13
+ const __dirname = path.dirname(__filename);
14
+ // Function to generate claim URL
15
+ function generateClaimUrl(did, privateKeyBase64) {
16
+ try {
17
+ const timestamp = Date.now();
18
+ const message = `${did}:${timestamp}`;
19
+ const privateKeyBuffer = Buffer.from(privateKeyBase64, "base64");
20
+ const privateKeyBytes = privateKeyBuffer.length === 64
21
+ ? privateKeyBuffer.subarray(0, 32)
22
+ : privateKeyBuffer;
23
+ const privateKey = crypto.createPrivateKey({
24
+ key: Buffer.concat([
25
+ Buffer.from("302e020100300506032b657004220420", "hex"),
26
+ privateKeyBytes,
27
+ ]),
28
+ format: "der",
29
+ type: "pkcs8",
30
+ });
31
+ const signature = crypto.sign(null, Buffer.from(message), privateKey);
32
+ const signatureBase64 = signature.toString("base64");
33
+ const params = new URLSearchParams({
34
+ did: did,
35
+ timestamp: timestamp.toString(),
36
+ signature: signatureBase64,
37
+ });
38
+ return `https://knowthat.ai/agents/claim?${params.toString()}`;
39
+ }
40
+ catch (error) {
41
+ console.error("Error generating claim URL:", error);
42
+ return "";
43
+ }
44
+ }
45
+ /**
46
+ * Create necessary project directories
47
+ */
48
+ function createProjectDirectories(projectPath) {
49
+ fs.ensureDirSync(path.join(projectPath, ".xmcp"));
50
+ }
51
+ /**
52
+ * Create a new xmcp project with identity features
53
+ */
54
+ export async function createProject(options) {
55
+ const { projectPath, projectName, packageManager, transports, packageVersion, useLocalXmcp, xmcpVersion, xmcpChannel, deployToVercel, skipInstall, agentName = projectName, agentDescription = "XMCP-I server with identity features", agentRepository = "", skipIdentity = false, skipAnimation = false, fastAnimation = false, } = options;
56
+ const warnings = [];
57
+ let resolvedXmcpVersion = xmcpVersion;
58
+ try {
59
+ // Ensure the project directory exists
60
+ fs.ensureDirSync(projectPath);
61
+ // Fetch XMCP template from npm instead of using local templates
62
+ console.log(chalk.blue("\nšŸ“ Scaffolding project..."));
63
+ await fetchXMCPTemplate(projectPath, {
64
+ xmcpVersion,
65
+ xmcpChannel,
66
+ packageManager,
67
+ });
68
+ // Capture the resolved version for the result
69
+ const packageJsonPath = path.join(projectPath, "package.json");
70
+ if (fs.existsSync(packageJsonPath)) {
71
+ const packageJson = fs.readJsonSync(packageJsonPath);
72
+ // Try to extract version from dependencies
73
+ resolvedXmcpVersion =
74
+ packageJson.dependencies?.xmcp || xmcpVersion || "unknown";
75
+ }
76
+ // Rename special files (e.g., _gitignore to .gitignore)
77
+ renameFiles(projectPath);
78
+ // Apply identity preset on top of XMCP template
79
+ await applyIdentityPreset({
80
+ projectPath,
81
+ projectName,
82
+ transports,
83
+ noIdentity: skipIdentity,
84
+ });
85
+ // Generate xmcp.config.ts based on selected transports
86
+ generateConfig(projectPath, transports);
87
+ // Add vercel.json if deployToVercel is true
88
+ if (deployToVercel) {
89
+ // Create a basic vercel.json for XMCP-I deployment
90
+ const vercelConfig = {
91
+ functions: {
92
+ "src/server.ts": {
93
+ runtime: "@vercel/node@3",
94
+ },
95
+ },
96
+ rewrites: [
97
+ {
98
+ source: "/(.*)",
99
+ destination: "/src/server.ts",
100
+ },
101
+ ],
102
+ };
103
+ fs.writeJsonSync(path.join(projectPath, "vercel.json"), vercelConfig, {
104
+ spaces: 2,
105
+ });
106
+ }
107
+ // Create necessary project directories
108
+ createProjectDirectories(projectPath);
109
+ // Install project dependencies
110
+ if (!skipInstall) {
111
+ install(projectPath, packageManager, packageVersion);
112
+ // Ensure lockfile is properly created
113
+ ensureLockfile(projectPath, packageManager);
114
+ }
115
+ // Validate project structure meets requirements
116
+ const validation = validateProjectStructure(projectPath, !skipIdentity);
117
+ if (!validation.valid) {
118
+ console.warn(chalk.yellow("āš ļø Project structure validation issues:"));
119
+ for (const issue of validation.issues) {
120
+ console.warn(chalk.yellow(` - ${issue}`));
121
+ warnings.push(...validation.issues);
122
+ }
123
+ }
124
+ // Identity setup is now handled by the CLI after scaffolding
125
+ if (!skipIdentity) {
126
+ console.log(chalk.blue("\nšŸ” Identity setup will be handled by the CLI"));
127
+ console.log(chalk.gray(" Run 'mcpi init' after scaffolding to set up identity"));
128
+ }
129
+ return {
130
+ success: true,
131
+ projectPath,
132
+ xmcpVersion: resolvedXmcpVersion || "unknown",
133
+ identityEnabled: !skipIdentity,
134
+ warnings: warnings.length > 0 ? warnings : undefined,
135
+ };
136
+ }
137
+ catch (error) {
138
+ console.error(chalk.red("Failed to create project:"), error);
139
+ return {
140
+ success: false,
141
+ projectPath,
142
+ xmcpVersion: resolvedXmcpVersion || "unknown",
143
+ identityEnabled: !skipIdentity,
144
+ warnings: [
145
+ `Project creation failed: ${error instanceof Error ? error.message : String(error)}`,
146
+ ],
147
+ };
148
+ }
149
+ }
150
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/helpers/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ interface ScaffoldTemplateOptions {
2
+ xmcpVersion?: string;
3
+ xmcpChannel?: string;
4
+ packageManager?: string;
5
+ }
6
+ /**
7
+ * Scaffold XMCP project using upstream create-xmcp-app tool
8
+ */
9
+ export declare function fetchXMCPTemplate(projectPath: string, options?: ScaffoldTemplateOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=fetch-xmcp-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-xmcp-template.d.ts","sourceRoot":"","sources":["../../src/helpers/fetch-xmcp-template.ts"],"names":[],"mappings":"AAMA,UAAU,uBAAuB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAwDf"}
@@ -0,0 +1,54 @@
1
+ import { execSync } from "child_process";
2
+ import fs from "fs-extra";
3
+ import path from "path";
4
+ import os from "os";
5
+ import chalk from "chalk";
6
+ /**
7
+ * Scaffold XMCP project using upstream create-xmcp-app tool
8
+ */
9
+ export async function fetchXMCPTemplate(projectPath, options = {}) {
10
+ const { xmcpChannel = "latest", packageManager = "npm" } = options;
11
+ const projectName = path.basename(projectPath);
12
+ // Create temporary directory for scaffolding
13
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "xmcp-scaffold-"));
14
+ try {
15
+ console.log(chalk.blue("šŸ“¦ Scaffolding XMCP project with upstream tool..."));
16
+ // Build the create-xmcp-app command
17
+ const createCommand = xmcpChannel === "next"
18
+ ? "npx create-xmcp-app@next"
19
+ : "npx create-xmcp-app@latest";
20
+ // Scaffold the project using upstream create-xmcp-app
21
+ const scaffoldArgs = [
22
+ projectName,
23
+ "--yes", // Skip prompts
24
+ `--use-${packageManager}`, // Use specified package manager
25
+ "--skip-install", // We'll handle installation later
26
+ ];
27
+ execSync(`${createCommand} ${scaffoldArgs.join(" ")}`, {
28
+ cwd: tempDir,
29
+ stdio: "inherit", // Show output to user
30
+ });
31
+ const scaffoldedPath = path.join(tempDir, projectName);
32
+ if (!fs.existsSync(scaffoldedPath)) {
33
+ throw new Error("Upstream scaffolding failed - project directory not created");
34
+ }
35
+ // Copy scaffolded project to target location
36
+ fs.copySync(scaffoldedPath, projectPath, {
37
+ filter: (src) => {
38
+ const basename = path.basename(src);
39
+ // Skip node_modules if it exists
40
+ return basename !== "node_modules";
41
+ },
42
+ });
43
+ console.log(chalk.green("āœ… XMCP project scaffolded successfully"));
44
+ }
45
+ catch (error) {
46
+ console.error(chalk.red("Failed to scaffold XMCP project:"), error);
47
+ throw error;
48
+ }
49
+ finally {
50
+ // Clean up temp directory
51
+ fs.removeSync(tempDir);
52
+ }
53
+ }
54
+ //# sourceMappingURL=fetch-xmcp-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-xmcp-template.js","sourceRoot":"","sources":["../../src/helpers/fetch-xmcp-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,UAAmC,EAAE;IAErC,MAAM,EAAE,WAAW,GAAG,QAAQ,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACnE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE/C,6CAA6C;IAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEzE,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAChE,CAAC;QAEF,oCAAoC;QACpC,MAAM,aAAa,GACjB,WAAW,KAAK,MAAM;YACpB,CAAC,CAAC,0BAA0B;YAC5B,CAAC,CAAC,4BAA4B,CAAC;QAEnC,sDAAsD;QACtD,MAAM,YAAY,GAAG;YACnB,WAAW;YACX,OAAO,EAAE,eAAe;YACxB,SAAS,cAAc,EAAE,EAAE,gCAAgC;YAC3D,gBAAgB,EAAE,kCAAkC;SACrD,CAAC;QAEF,QAAQ,CAAC,GAAG,aAAa,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;YACrD,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,SAAS,EAAE,sBAAsB;SACzC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QAED,6CAA6C;QAC7C,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,WAAW,EAAE;YACvC,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE;gBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACpC,iCAAiC;gBACjC,OAAO,QAAQ,KAAK,cAAc,CAAC;YACrC,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,EAAE,KAAK,CAAC,CAAC;QACpE,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,0BAA0B;QAC1B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function generateConfig(projectPath: string, transports: string[]): void;
2
+ //# sourceMappingURL=generate-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-config.d.ts","sourceRoot":"","sources":["../../src/helpers/generate-config.ts"],"names":[],"mappings":"AAGA,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAAE,GACnB,IAAI,CA6BN"}
@@ -0,0 +1,28 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ export function generateConfig(projectPath, transports) {
4
+ const hasHttp = transports.includes("http");
5
+ const hasStdio = transports.includes("stdio");
6
+ let configContent = `import type { XmcpConfig } from "@kya-os/mcp-i";
7
+
8
+ const config: XmcpConfig = {`;
9
+ if (hasHttp) {
10
+ configContent += `
11
+ http: true,`;
12
+ }
13
+ if (hasStdio) {
14
+ configContent += `
15
+ stdio: true,`;
16
+ }
17
+ configContent += `
18
+ identity: {
19
+ enabled: true,
20
+ },
21
+ };
22
+
23
+ export default config;
24
+ `;
25
+ const configPath = path.join(projectPath, "xmcp.config.ts");
26
+ fs.writeFileSync(configPath, configContent);
27
+ }
28
+ //# sourceMappingURL=generate-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-config.js","sourceRoot":"","sources":["../../src/helpers/generate-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,cAAc,CAC5B,WAAmB,EACnB,UAAoB;IAEpB,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,aAAa,GAAG;;6BAEO,CAAC;IAE5B,IAAI,OAAO,EAAE,CAAC;QACZ,aAAa,IAAI;cACP,CAAC;IACb,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,aAAa,IAAI;eACN,CAAC;IACd,CAAC;IAED,aAAa,IAAI;;;;;;;CAOlB,CAAC;IAEA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAC5D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function detectPackageManager(projectPath: string): "npm" | "yarn" | "pnpm" | null;
2
+ export declare function install(projectPath: string, packageManager: string, packageVersion: string): void;
3
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/helpers/install.ts"],"names":[],"mappings":"AAKA,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,GAClB,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAWhC;AAED,wBAAgB,OAAO,CACrB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GACrB,IAAI,CAsBN"}
@@ -0,0 +1,52 @@
1
+ import { execSync } from "child_process";
2
+ import fs from "fs-extra";
3
+ import path from "path";
4
+ import chalk from "chalk";
5
+ export function detectPackageManager(projectPath) {
6
+ if (fs.existsSync(path.join(projectPath, "pnpm-lock.yaml"))) {
7
+ return "pnpm";
8
+ }
9
+ if (fs.existsSync(path.join(projectPath, "yarn.lock"))) {
10
+ return "yarn";
11
+ }
12
+ if (fs.existsSync(path.join(projectPath, "package-lock.json"))) {
13
+ return "npm";
14
+ }
15
+ return null;
16
+ }
17
+ export function install(projectPath, packageManager, packageVersion) {
18
+ console.log(`\nšŸ“¦ Installing dependencies with ${packageManager}...`);
19
+ const command = packageManager === "yarn"
20
+ ? "yarn install"
21
+ : packageManager === "pnpm"
22
+ ? "pnpm install"
23
+ : "npm install";
24
+ try {
25
+ execSync(command, {
26
+ cwd: projectPath,
27
+ stdio: "inherit",
28
+ });
29
+ // Check for lockfile and provide guidance
30
+ checkLockfile(projectPath, packageManager);
31
+ }
32
+ catch (error) {
33
+ console.error(`Failed to install dependencies with ${packageManager}.`);
34
+ throw error;
35
+ }
36
+ }
37
+ function checkLockfile(projectPath, packageManager) {
38
+ const lockfiles = {
39
+ npm: "package-lock.json",
40
+ yarn: "yarn.lock",
41
+ pnpm: "pnpm-lock.yaml",
42
+ };
43
+ const expectedLockfile = lockfiles[packageManager];
44
+ const lockfilePath = path.join(projectPath, expectedLockfile);
45
+ if (fs.existsSync(lockfilePath)) {
46
+ console.log(chalk.gray(`āœ“ Lockfile created (${expectedLockfile}) - remember to commit it`));
47
+ }
48
+ else {
49
+ console.warn(chalk.yellow(`āš ļø Warning: No lockfile generated (${expectedLockfile})`));
50
+ }
51
+ }
52
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/helpers/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,oBAAoB,CAClC,WAAmB;IAEnB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,WAAmB,EACnB,cAAsB,EACtB,cAAsB;IAEtB,OAAO,CAAC,GAAG,CAAC,qCAAqC,cAAc,KAAK,CAAC,CAAC;IAEtE,MAAM,OAAO,GACX,cAAc,KAAK,MAAM;QACvB,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,cAAc,KAAK,MAAM;YACzB,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,aAAa,CAAC;IAEtB,IAAI,CAAC;QACH,QAAQ,CAAC,OAAO,EAAE;YAChB,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,0CAA0C;QAC1C,aAAa,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,cAAc,GAAG,CAAC,CAAC;QACxE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,WAAmB,EAAE,cAAsB;IAChE,MAAM,SAAS,GAAG;QAChB,GAAG,EAAE,mBAAmB;QACxB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,gBAAgB;KACvB,CAAC;IAEF,MAAM,gBAAgB,GAAG,SAAS,CAAC,cAAwC,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAE9D,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,uBAAuB,gBAAgB,2BAA2B,CACnE,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CAAC,uCAAuC,gBAAgB,GAAG,CAAC,CACzE,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function renameFiles(projectPath: string): void;
2
+ //# sourceMappingURL=rename.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.d.ts","sourceRoot":"","sources":["../../src/helpers/rename.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAarD"}
@@ -0,0 +1,15 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ export function renameFiles(projectPath) {
4
+ const filesToRename = [
5
+ { from: "_gitignore", to: ".gitignore" },
6
+ ];
7
+ filesToRename.forEach(({ from, to }) => {
8
+ const fromPath = path.join(projectPath, from);
9
+ const toPath = path.join(projectPath, to);
10
+ if (fs.existsSync(fromPath)) {
11
+ fs.renameSync(fromPath, toPath);
12
+ }
13
+ });
14
+ }
15
+ //# sourceMappingURL=rename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/helpers/rename.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,MAAM,aAAa,GAAG;QACpB,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE;KACzC,CAAC;IAEF,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAE1C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}