@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.
- package/README.md +235 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/effects/index.d.ts +14 -0
- package/dist/effects/index.d.ts.map +1 -0
- package/dist/effects/index.js +51 -0
- package/dist/effects/index.js.map +1 -0
- package/dist/helpers/apply-identity-preset.d.ts +14 -0
- package/dist/helpers/apply-identity-preset.d.ts.map +1 -0
- package/dist/helpers/apply-identity-preset.js +171 -0
- package/dist/helpers/apply-identity-preset.js.map +1 -0
- package/dist/helpers/copy-template.d.ts +2 -0
- package/dist/helpers/copy-template.d.ts.map +1 -0
- package/dist/helpers/copy-template.js +11 -0
- package/dist/helpers/copy-template.js.map +1 -0
- package/dist/helpers/create.d.ts +26 -0
- package/dist/helpers/create.d.ts.map +1 -0
- package/dist/helpers/create.js +150 -0
- package/dist/helpers/create.js.map +1 -0
- package/dist/helpers/fetch-xmcp-template.d.ts +11 -0
- package/dist/helpers/fetch-xmcp-template.d.ts.map +1 -0
- package/dist/helpers/fetch-xmcp-template.js +54 -0
- package/dist/helpers/fetch-xmcp-template.js.map +1 -0
- package/dist/helpers/generate-config.d.ts +2 -0
- package/dist/helpers/generate-config.d.ts.map +1 -0
- package/dist/helpers/generate-config.js +28 -0
- package/dist/helpers/generate-config.js.map +1 -0
- package/dist/helpers/install.d.ts +3 -0
- package/dist/helpers/install.d.ts.map +1 -0
- package/dist/helpers/install.js +52 -0
- package/dist/helpers/install.js.map +1 -0
- package/dist/helpers/rename.d.ts +2 -0
- package/dist/helpers/rename.d.ts.map +1 -0
- package/dist/helpers/rename.js +15 -0
- package/dist/helpers/rename.js.map +1 -0
- package/dist/helpers/validate-project-structure.d.ts +14 -0
- package/dist/helpers/validate-project-structure.d.ts.map +1 -0
- package/dist/helpers/validate-project-structure.js +103 -0
- package/dist/helpers/validate-project-structure.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +322 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/check-node.d.ts +2 -0
- package/dist/utils/check-node.d.ts.map +1 -0
- package/dist/utils/check-node.js +12 -0
- package/dist/utils/check-node.js.map +1 -0
- package/dist/utils/is-folder-empty.d.ts +2 -0
- package/dist/utils/is-folder-empty.d.ts.map +1 -0
- package/dist/utils/is-folder-empty.js +55 -0
- package/dist/utils/is-folder-empty.js.map +1 -0
- package/dist/utils/validate-project-name.d.ts +15 -0
- package/dist/utils/validate-project-name.d.ts.map +1 -0
- package/dist/utils/validate-project-name.js +106 -0
- package/dist/utils/validate-project-name.js.map +1 -0
- package/index.js +4 -0
- package/package.json +65 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import path from "path";
|
|
3
|
+
/**
|
|
4
|
+
* Validate project name meets requirements
|
|
5
|
+
*/
|
|
6
|
+
export function validateProjectName(name) {
|
|
7
|
+
const issues = [];
|
|
8
|
+
// Check if name is empty
|
|
9
|
+
if (!name || name.trim().length === 0) {
|
|
10
|
+
issues.push("Project name cannot be empty");
|
|
11
|
+
return { valid: false, issues };
|
|
12
|
+
}
|
|
13
|
+
const trimmedName = name.trim();
|
|
14
|
+
// Check length
|
|
15
|
+
if (trimmedName.length < 1) {
|
|
16
|
+
issues.push("Project name must be at least 1 character long");
|
|
17
|
+
}
|
|
18
|
+
if (trimmedName.length > 214) {
|
|
19
|
+
issues.push("Project name must be less than 214 characters");
|
|
20
|
+
}
|
|
21
|
+
// Check for invalid characters (npm package name rules)
|
|
22
|
+
if (!/^[a-z0-9@._/-]+$/.test(trimmedName)) {
|
|
23
|
+
issues.push("Project name can only contain lowercase letters, numbers, and the characters @._/-");
|
|
24
|
+
}
|
|
25
|
+
// Check if it starts with . or _
|
|
26
|
+
if (trimmedName.startsWith(".") || trimmedName.startsWith("_")) {
|
|
27
|
+
issues.push("Project name cannot start with . or _");
|
|
28
|
+
}
|
|
29
|
+
// Check for reserved names
|
|
30
|
+
const reservedNames = [
|
|
31
|
+
"node_modules",
|
|
32
|
+
"favicon.ico",
|
|
33
|
+
"package.json",
|
|
34
|
+
"package-lock.json",
|
|
35
|
+
"yarn.lock",
|
|
36
|
+
"pnpm-lock.yaml",
|
|
37
|
+
".git",
|
|
38
|
+
".gitignore",
|
|
39
|
+
".env",
|
|
40
|
+
"readme",
|
|
41
|
+
"readme.md",
|
|
42
|
+
"readme.txt",
|
|
43
|
+
"license",
|
|
44
|
+
"license.md",
|
|
45
|
+
"license.txt",
|
|
46
|
+
"changelog",
|
|
47
|
+
"changelog.md",
|
|
48
|
+
"changelog.txt",
|
|
49
|
+
];
|
|
50
|
+
if (reservedNames.includes(trimmedName.toLowerCase())) {
|
|
51
|
+
issues.push(`"${trimmedName}" is a reserved name and cannot be used as a project name`);
|
|
52
|
+
}
|
|
53
|
+
// Check for scoped package format
|
|
54
|
+
if (trimmedName.startsWith("@")) {
|
|
55
|
+
const parts = trimmedName.split("/");
|
|
56
|
+
if (parts.length !== 2) {
|
|
57
|
+
issues.push("Scoped package names must be in the format @scope/name");
|
|
58
|
+
}
|
|
59
|
+
else if (parts[1].length === 0) {
|
|
60
|
+
issues.push("Scoped package name cannot have empty package name");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
valid: issues.length === 0,
|
|
65
|
+
issues,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if directory is available for project creation
|
|
70
|
+
*/
|
|
71
|
+
export function validateDirectoryAvailability(projectPath) {
|
|
72
|
+
const issues = [];
|
|
73
|
+
try {
|
|
74
|
+
// Check if path exists
|
|
75
|
+
if (fs.existsSync(projectPath)) {
|
|
76
|
+
const stats = fs.statSync(projectPath);
|
|
77
|
+
if (!stats.isDirectory()) {
|
|
78
|
+
issues.push(`Path exists but is not a directory: ${projectPath}`);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// Check if directory is empty
|
|
82
|
+
const files = fs.readdirSync(projectPath);
|
|
83
|
+
const nonHiddenFiles = files.filter((file) => !file.startsWith("."));
|
|
84
|
+
if (nonHiddenFiles.length > 0) {
|
|
85
|
+
issues.push(`Directory is not empty: ${projectPath}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Check if parent directory is writable
|
|
90
|
+
const parentDir = path.dirname(projectPath);
|
|
91
|
+
try {
|
|
92
|
+
fs.accessSync(parentDir, fs.constants.W_OK);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
issues.push(`Parent directory is not writable: ${parentDir}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
issues.push(`Error checking directory: ${error instanceof Error ? error.message : String(error)}`);
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
valid: issues.length === 0,
|
|
103
|
+
issues,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=validate-project-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-project-name.js","sourceRoot":"","sources":["../../src/utils/validate-project-name.ts"],"names":[],"mappings":"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"}
|
package/index.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kya-os/create-mcpi-app",
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"description": "Bootstrap MCP applications with identity features",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"create-mcpi-app": "index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"index.js",
|
|
11
|
+
"dist/**/*"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "npm run validate-config && tsc --build && chmod +x dist/index.js",
|
|
15
|
+
"dev": "tsc --watch",
|
|
16
|
+
"validate-config": "node scripts/validate-config.js",
|
|
17
|
+
"prepublishOnly": "npm run build"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@kya-os/cli": "^1.0.0",
|
|
21
|
+
"@kya-os/cli-effects": "^1.0.9",
|
|
22
|
+
"@kya-os/contracts": "^1.2.0",
|
|
23
|
+
"@noble/ed25519": "^2.1.0",
|
|
24
|
+
"axios": "^1.12.0",
|
|
25
|
+
"chalk": "^5.3.0",
|
|
26
|
+
"commander": "^11.1.0",
|
|
27
|
+
"dotenv-cli": "^7.4.4",
|
|
28
|
+
"fs-extra": "^11.2.0",
|
|
29
|
+
"inquirer": "^12.9.4",
|
|
30
|
+
"jose": "^6.0.12",
|
|
31
|
+
"ora": "^8.0.1",
|
|
32
|
+
"swc-loader": "^0.2.6",
|
|
33
|
+
"tsx": "^4.20.4",
|
|
34
|
+
"zod": "^3.25.76"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/fs-extra": "^11.0.4",
|
|
38
|
+
"@types/inquirer": "^9.0.7",
|
|
39
|
+
"@types/node": "^20.0.0",
|
|
40
|
+
"typescript": "^5.3.0"
|
|
41
|
+
},
|
|
42
|
+
"keywords": [
|
|
43
|
+
"mcp",
|
|
44
|
+
"mcp-i",
|
|
45
|
+
"create-app",
|
|
46
|
+
"cli",
|
|
47
|
+
"bootstrap",
|
|
48
|
+
"identity",
|
|
49
|
+
"mcpi"
|
|
50
|
+
],
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=20.0.0"
|
|
53
|
+
},
|
|
54
|
+
"author": "MCP-I Team",
|
|
55
|
+
"license": "MIT",
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "https://github.com/modelcontextprotocol-identity/mcp-i.git",
|
|
59
|
+
"directory": "packages/create-mcpi-app"
|
|
60
|
+
},
|
|
61
|
+
"bugs": {
|
|
62
|
+
"url": "https://github.com/modelcontextprotocol-identity/mcp-i/issues"
|
|
63
|
+
},
|
|
64
|
+
"homepage": "https://github.com/modelcontextprotocol-identity/mcp-i#readme"
|
|
65
|
+
}
|