@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,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
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Simple wrapper to ensure the CLI runs correctly
4
+ import('./dist/index.js');
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
+ }