@vertesia/create-plugin 0.24.0-dev.202601221707

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 (43) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +162 -0
  3. package/lib/configuration.d.ts +63 -0
  4. package/lib/configuration.d.ts.map +1 -0
  5. package/lib/configuration.js +76 -0
  6. package/lib/configuration.js.map +1 -0
  7. package/lib/download-template.d.ts +5 -0
  8. package/lib/download-template.d.ts.map +1 -0
  9. package/lib/download-template.js +33 -0
  10. package/lib/download-template.js.map +1 -0
  11. package/lib/index.d.ts +9 -0
  12. package/lib/index.d.ts.map +1 -0
  13. package/lib/index.js +182 -0
  14. package/lib/index.js.map +1 -0
  15. package/lib/package-manager.d.ts +11 -0
  16. package/lib/package-manager.d.ts.map +1 -0
  17. package/lib/package-manager.js +83 -0
  18. package/lib/package-manager.js.map +1 -0
  19. package/lib/post-install.d.ts +11 -0
  20. package/lib/post-install.d.ts.map +1 -0
  21. package/lib/post-install.js +144 -0
  22. package/lib/post-install.js.map +1 -0
  23. package/lib/process-template.d.ts +30 -0
  24. package/lib/process-template.d.ts.map +1 -0
  25. package/lib/process-template.js +233 -0
  26. package/lib/process-template.js.map +1 -0
  27. package/lib/prompts.d.ts +6 -0
  28. package/lib/prompts.d.ts.map +1 -0
  29. package/lib/prompts.js +97 -0
  30. package/lib/prompts.js.map +1 -0
  31. package/lib/template-config.d.ts +139 -0
  32. package/lib/template-config.d.ts.map +1 -0
  33. package/lib/template-config.js +23 -0
  34. package/lib/template-config.js.map +1 -0
  35. package/lib/template-selector.d.ts +7 -0
  36. package/lib/template-selector.d.ts.map +1 -0
  37. package/lib/template-selector.js +56 -0
  38. package/lib/template-selector.js.map +1 -0
  39. package/lib/transforms.d.ts +37 -0
  40. package/lib/transforms.d.ts.map +1 -0
  41. package/lib/transforms.js +87 -0
  42. package/lib/transforms.js.map +1 -0
  43. package/package.json +39 -0
package/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2024 Composable Prompts
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,162 @@
1
+ # @vertesia/plugin
2
+
3
+ CLI tool to create Vertesia plugins:
4
+ - UI Plugins
5
+ - Tool Server Plugins.
6
+
7
+ ## Usage
8
+
9
+ ```bash
10
+ # Using pnpm create (recommended)
11
+ pnpm create @vertesia/plugin my-project
12
+
13
+ # Using npm create
14
+ npm create @vertesia/plugin my-project
15
+
16
+ # Using pnpm dlx (runs without installing)
17
+ pnpm dlx @vertesia/plugin my-project
18
+
19
+ # Using npx
20
+ npx @vertesia/plugin my-project
21
+
22
+ # Or install globally
23
+ pnpm install -g @vertesia/plugin
24
+ create-tool-server my-project
25
+ ```
26
+
27
+ **Note:** When using `pnpm create` or `npm create`, drop the `create-` prefix from the package name.
28
+
29
+ ## Features
30
+
31
+ - ๐Ÿ“ฆ **Downloads template from GitHub** - Always get the latest template
32
+ - โš™๏ธ **Template-driven configuration** - Template defines its own prompts via `template.config.json`
33
+ - ๐ŸŽจ **Interactive prompts** - User-friendly CLI with validation
34
+ - ๐Ÿ”„ **Variable replacement** - Automatically replaces `{{VARIABLES}}` in files
35
+ - ๐Ÿงน **Smart cleanup** - Removes meta files after installation
36
+ - ๐Ÿ“š **Package manager agnostic** - Works with npm, pnpm, or yarn
37
+
38
+ ## How It Works
39
+
40
+ 1. **Downloads** the template repository from GitHub using `degit`
41
+ 2. **Reads** `template.config.json` from the template to determine configuration
42
+ 3. **Prompts** the user for values (project name, description, etc.)
43
+ 4. **Replaces** variables in specified files (e.g., `{{PROJECT_NAME}}` โ†’ `my-project`)
44
+ 5. **Cleans up** meta files (`.git`, `template.config.json`, etc.)
45
+ 6. **Installs** dependencies using the configured package manager
46
+
47
+ ## Configuration
48
+
49
+ All configuration is centralized in `src/configuration.ts`:
50
+
51
+ ```typescript
52
+ export const config = {
53
+ templateRepo: 'vertesiahq/plugin-template',
54
+ templateConfigFile: 'template.config.json',
55
+ packageManager: 'pnpm',
56
+ // ... more options
57
+ }
58
+ ```
59
+
60
+ ### Key Configuration Options
61
+
62
+ - **`templateRepo`** - GitHub repository for the template (format: `owner/repo`)
63
+ - **`templateConfigFile`** - Name of the config file in the template
64
+ - **`packageManager`** - Which package manager to use (`npm`, `pnpm`, or `yarn`)
65
+ - **`useCache`** - Whether to cache downloaded templates
66
+
67
+ ## Template Structure
68
+
69
+ The template repository should include a `template.config.json` file:
70
+
71
+ ```json
72
+ {
73
+ "version": "1.0",
74
+ "prompts": [
75
+ {
76
+ "type": "text",
77
+ "name": "PROJECT_NAME",
78
+ "message": "Project name",
79
+ "initial": "my-tool-server"
80
+ },
81
+ {
82
+ "type": "text",
83
+ "name": "DESCRIPTION",
84
+ "message": "Project description",
85
+ "initial": "A tool server for LLM integrations"
86
+ }
87
+ ],
88
+ "files": [
89
+ "package.json",
90
+ "README.md",
91
+ "src/server.ts"
92
+ ],
93
+ "removeAfterInstall": [
94
+ ".git",
95
+ "template.config.json"
96
+ ]
97
+ }
98
+ ```
99
+
100
+ ### Template Config Schema
101
+
102
+ - **`prompts`** - Array of prompts using the [prompts](https://www.npmjs.com/package/prompts) library format
103
+ - **`files`** - List of files where variable replacement should occur
104
+ - **`removeAfterInstall`** - Files/directories to remove after installation
105
+ - **`conditionalRemove`** - Conditional file removal based on user answers
106
+
107
+ ## Development
108
+
109
+ ```bash
110
+ # Install dependencies
111
+ pnpm install
112
+
113
+ # Build
114
+ pnpm build
115
+
116
+ # Test locally
117
+ pnpm test
118
+
119
+ # Watch mode
120
+ pnpm dev
121
+ ```
122
+
123
+ ## Publishing
124
+
125
+ ```bash
126
+ # Build and publish
127
+ npm publish
128
+ ```
129
+
130
+ After publishing, users can create projects with:
131
+
132
+ ```bash
133
+ pnpm create @vertesia/plugin my-project
134
+ ```
135
+
136
+ ## Template Development
137
+
138
+ To develop a template:
139
+
140
+ 1. Create a GitHub repository with your template files
141
+ 2. Add a `template.config.json` file with prompts and configuration
142
+ 3. Use `{{VARIABLES}}` in files where you want replacements
143
+ 4. Update `src/configuration.ts` to point to your template repo
144
+ 5. Test with `pnpm test` or run the built CLI directly
145
+
146
+ ## Examples
147
+
148
+ ### Create a project with default settings
149
+
150
+ ```bash
151
+ pnpm create @vertesia/plugin my-project
152
+ ```
153
+
154
+ ### View help
155
+
156
+ ```bash
157
+ pnpm dlx @vertesia/plugin --help
158
+ ```
159
+
160
+ ## License
161
+
162
+ MIT
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Configuration for @vertesia/create-tools
3
+ *
4
+ * This file centralizes all configuration values for the installer.
5
+ * Update these values to point to your template repository and customize behavior.
6
+ */
7
+ /**
8
+ * Template definition
9
+ */
10
+ export interface TemplateDefinition {
11
+ /** Display name for the template (shown to user) */
12
+ name: string;
13
+ /** GitHub repository path */
14
+ repository: string;
15
+ }
16
+ export declare const config: {
17
+ /**
18
+ * Available templates
19
+ * Array of template definitions with display names and repository paths
20
+ *
21
+ * Format for repository: 'owner/repo/subdirectory' or 'owner/repo/subdirectory#branch'
22
+ *
23
+ * Examples:
24
+ * - 'vertesia/composableai/templates/tool-server-template'
25
+ * - 'vertesia/composableai/templates/tool-server-template#main'
26
+ * - 'vertesia/composableai/templates/tool-server-template#v1.0.0'
27
+ */
28
+ readonly templates: TemplateDefinition[];
29
+ /**
30
+ * Name of the template configuration file in the template repo
31
+ * This file should contain prompts and installation instructions
32
+ */
33
+ readonly templateConfigFile: "template.config.json";
34
+ /**
35
+ * Whether to use cache for degit downloads
36
+ * Set to true for faster repeated installs (dev mode)
37
+ * Set to false to always get latest template (production)
38
+ */
39
+ readonly useCache: false;
40
+ /**
41
+ * Documentation URL to show in help messages
42
+ */
43
+ readonly docsUrl: "https://docs.vertesia.com";
44
+ };
45
+ /**
46
+ * Validation rules for project names
47
+ */
48
+ export declare const validation: {
49
+ /**
50
+ * Regex for valid project names
51
+ * Allows: lowercase letters, numbers, hyphens
52
+ */
53
+ readonly projectNamePattern: RegExp;
54
+ /**
55
+ * Error message for invalid project names
56
+ */
57
+ readonly projectNameError: "Project name can only contain lowercase letters, numbers, and hyphens";
58
+ /**
59
+ * Reserved project names that cannot be used
60
+ */
61
+ readonly reservedNames: string[];
62
+ };
63
+ //# sourceMappingURL=configuration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,MAAM;IACjB;;;;;;;;;;OAUG;wBAkBE,kBAAkB,EAAE;IAEzB;;;OAGG;;IAGH;;;;OAIG;;IAGH;;OAEG;;CAEK,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,UAAU;IACrB;;;OAGG;;IAGH;;OAEG;;IAGH;;OAEG;4BAME,MAAM,EAAE;CACL,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Configuration for @vertesia/create-tools
3
+ *
4
+ * This file centralizes all configuration values for the installer.
5
+ * Update these values to point to your template repository and customize behavior.
6
+ */
7
+ export const config = {
8
+ /**
9
+ * Available templates
10
+ * Array of template definitions with display names and repository paths
11
+ *
12
+ * Format for repository: 'owner/repo/subdirectory' or 'owner/repo/subdirectory#branch'
13
+ *
14
+ * Examples:
15
+ * - 'vertesia/composableai/templates/tool-server-template'
16
+ * - 'vertesia/composableai/templates/tool-server-template#main'
17
+ * - 'vertesia/composableai/templates/tool-server-template#v1.0.0'
18
+ */
19
+ templates: [
20
+ {
21
+ name: 'Vertesia Plugin',
22
+ repository: 'vertesia/composableai/templates/plugin-template#preview'
23
+ },
24
+ {
25
+ name: 'Vertesia Tool Server (deprecated)',
26
+ repository: 'vertesia/composableai/templates/tool-server-template#preview'
27
+ },
28
+ {
29
+ name: 'Vertesia UI Plugin (deprecated)',
30
+ repository: 'vertesia/composableai/templates/ui-plugin-template#preview'
31
+ },
32
+ {
33
+ name: 'Vertesia Workflow Worker',
34
+ repository: 'vertesia/composableai/templates/worker-template#preview'
35
+ }
36
+ ],
37
+ /**
38
+ * Name of the template configuration file in the template repo
39
+ * This file should contain prompts and installation instructions
40
+ */
41
+ templateConfigFile: 'template.config.json',
42
+ /**
43
+ * Whether to use cache for degit downloads
44
+ * Set to true for faster repeated installs (dev mode)
45
+ * Set to false to always get latest template (production)
46
+ */
47
+ useCache: false,
48
+ /**
49
+ * Documentation URL to show in help messages
50
+ */
51
+ docsUrl: 'https://docs.vertesia.com',
52
+ };
53
+ /**
54
+ * Validation rules for project names
55
+ */
56
+ export const validation = {
57
+ /**
58
+ * Regex for valid project names
59
+ * Allows: lowercase letters, numbers, hyphens
60
+ */
61
+ projectNamePattern: /^[a-z0-9-]+$/,
62
+ /**
63
+ * Error message for invalid project names
64
+ */
65
+ projectNameError: 'Project name can only contain lowercase letters, numbers, and hyphens',
66
+ /**
67
+ * Reserved project names that cannot be used
68
+ */
69
+ reservedNames: [
70
+ 'test',
71
+ 'node_modules',
72
+ 'dist',
73
+ 'build',
74
+ ],
75
+ };
76
+ //# sourceMappingURL=configuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.js","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB;;;;;;;;;;OAUG;IACH,SAAS,EAAE;QACT;YACE,IAAI,EAAE,iBAAiB;YACvB,UAAU,EAAE,yDAAyD;SACtE;QACD;YACE,IAAI,EAAE,mCAAmC;YACzC,UAAU,EAAE,8DAA8D;SAC3E;QACD;YACE,IAAI,EAAE,iCAAiC;YACvC,UAAU,EAAE,4DAA4D;SACzE;QACD;YACE,IAAI,EAAE,0BAA0B;YAChC,UAAU,EAAE,yDAAyD;SACtE;KACsB;IAEzB;;;OAGG;IACH,kBAAkB,EAAE,sBAAsB;IAE1C;;;;OAIG;IACH,QAAQ,EAAE,KAAK;IAEf;;OAEG;IACH,OAAO,EAAE,2BAA2B;CAC5B,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;;;OAGG;IACH,kBAAkB,EAAE,cAAc;IAElC;;OAEG;IACH,gBAAgB,EAAE,uEAAuE;IAEzF;;OAEG;IACH,aAAa,EAAE;QACb,MAAM;QACN,cAAc;QACd,MAAM;QACN,OAAO;KACI;CACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Download template from GitHub using degit
3
+ */
4
+ export declare function downloadTemplate(projectName: string, repository: string): Promise<void>;
5
+ //# sourceMappingURL=download-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download-template.d.ts","sourceRoot":"","sources":["../src/download-template.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB7F"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Template downloading from GitHub
3
+ */
4
+ import degit from 'degit';
5
+ import chalk from 'chalk';
6
+ import { config } from './configuration.js';
7
+ /**
8
+ * Download template from GitHub using degit
9
+ */
10
+ export async function downloadTemplate(projectName, repository) {
11
+ console.log(chalk.blue('๐Ÿ“ฆ Downloading template from GitHub...\n'));
12
+ console.log(chalk.gray(` Repository: ${repository}`));
13
+ console.log(chalk.gray(` Target: ./${projectName}\n`));
14
+ const emitter = degit(repository, {
15
+ cache: config.useCache,
16
+ force: true,
17
+ });
18
+ // Show download progress
19
+ emitter.on('info', (info) => {
20
+ console.log(chalk.gray(` ${info.message}`));
21
+ });
22
+ emitter.on('warn', (warning) => {
23
+ console.log(chalk.yellow(` โš ๏ธ ${warning.message}`));
24
+ });
25
+ try {
26
+ await emitter.clone(projectName);
27
+ console.log(chalk.green(' โœ“ Template downloaded\n'));
28
+ }
29
+ catch (error) {
30
+ throw new Error(`Failed to download template: ${error instanceof Error ? error.message : 'Unknown error'}`);
31
+ }
32
+ }
33
+ //# sourceMappingURL=download-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download-template.js","sourceRoot":"","sources":["../src/download-template.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB,EAAE,UAAkB;IAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,WAAW,IAAI,CAAC,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE;QAChC,KAAK,EAAE,MAAM,CAAC,QAAQ;QACtB,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IAC9G,CAAC;AACH,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @vertesia/create-tool-server
4
+ *
5
+ * CLI tool to create Vertesia tool server projects from GitHub templates.
6
+ * Reads template.config.json from the template to determine prompts and file replacements.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/lib/index.js ADDED
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @vertesia/create-tool-server
4
+ *
5
+ * CLI tool to create Vertesia tool server projects from GitHub templates.
6
+ * Reads template.config.json from the template to determine prompts and file replacements.
7
+ */
8
+ import chalk from 'chalk';
9
+ import fs from 'fs';
10
+ import { config, validation } from './configuration.js';
11
+ import { selectTemplate } from './template-selector.js';
12
+ import { selectPackageManager, installDependencies } from './package-manager.js';
13
+ import { downloadTemplate } from './download-template.js';
14
+ import { readTemplateConfig } from './template-config.js';
15
+ import { promptUser } from './prompts.js';
16
+ import { replaceVariables, adjustPackageJson, handleConditionalRemoves, renameFiles, removeMetaFiles } from './process-template.js';
17
+ import { runPreInstallHooks, runPostInstallHooks } from './post-install.js';
18
+ /**
19
+ * Parse command line arguments
20
+ */
21
+ function parseArgs(args) {
22
+ let projectName;
23
+ let branch;
24
+ for (let i = 0; i < args.length; i++) {
25
+ const arg = args[i];
26
+ if (arg === '-b' || arg === '--branch') {
27
+ branch = args[i + 1];
28
+ i++; // Skip next arg
29
+ }
30
+ else if (!arg.startsWith('-')) {
31
+ projectName = arg;
32
+ }
33
+ }
34
+ if (!projectName) {
35
+ throw new Error('Project name is required');
36
+ }
37
+ return { projectName, branch };
38
+ }
39
+ /**
40
+ * Main entry point
41
+ */
42
+ async function main() {
43
+ const args = process.argv.slice(2);
44
+ // Show help
45
+ if (args.includes('--help') || args.includes('-h')) {
46
+ showHelp();
47
+ process.exit(0);
48
+ }
49
+ // Parse arguments
50
+ let projectName;
51
+ let branch;
52
+ try {
53
+ const parsed = parseArgs(args);
54
+ projectName = parsed.projectName;
55
+ branch = parsed.branch;
56
+ }
57
+ catch (error) {
58
+ console.log(chalk.red('โŒ Please specify a project name:\n'));
59
+ console.log(chalk.white('Usage:'));
60
+ console.log(chalk.cyan(' npx @vertesia/create-plugin') + chalk.gray(' <project-name> [options]\n'));
61
+ console.log(chalk.white('Example:'));
62
+ console.log(chalk.gray(' npx @vertesia/create-plugin my-project\n'));
63
+ console.log(chalk.white('Options:'));
64
+ console.log(chalk.gray(' -b, --branch <branch> Use specific branch'));
65
+ console.log(chalk.gray(' -h, --help Show help\n'));
66
+ process.exit(1);
67
+ }
68
+ // Validate project name
69
+ if (!validation.projectNamePattern.test(projectName)) {
70
+ console.log(chalk.red(`โŒ ${validation.projectNameError}\n`));
71
+ process.exit(1);
72
+ }
73
+ if (validation.reservedNames.includes(projectName)) {
74
+ console.log(chalk.red(`โŒ "${projectName}" is a reserved name. Please choose a different name.\n`));
75
+ process.exit(1);
76
+ }
77
+ // Check if directory already exists
78
+ if (fs.existsSync(projectName)) {
79
+ console.log(chalk.red(`โŒ Directory "${projectName}" already exists.\n`));
80
+ process.exit(1);
81
+ }
82
+ try {
83
+ // Step 1: Select template (only prompts if multiple templates available)
84
+ const selectedTemplate = await selectTemplate(branch);
85
+ // Show the selected template name with branch if specified
86
+ const branchInfo = branch ? chalk.gray(` (branch: ${branch})`) : '';
87
+ console.log(chalk.blue.bold(`\n๐Ÿš€ Create ${selectedTemplate.name}`) + branchInfo + '\n');
88
+ // Step 2: Download template from GitHub
89
+ await downloadTemplate(projectName, selectedTemplate.repository);
90
+ // Step 3: Read template configuration
91
+ const templateConfig = readTemplateConfig(projectName);
92
+ // Step 4: Detect and select package manager (may be forced by template)
93
+ const packageManager = await selectPackageManager(templateConfig.packageManager);
94
+ // Step 5: Prompt user for configuration
95
+ const answers = await promptUser(projectName, templateConfig);
96
+ // Step 5: Replace variables in files
97
+ replaceVariables(projectName, templateConfig, answers);
98
+ // Step 6: Adjust package.json (name and workspace dependencies)
99
+ adjustPackageJson(projectName, answers);
100
+ // Step 7: Handle conditional removes
101
+ if (templateConfig.conditionalRemove) {
102
+ handleConditionalRemoves(projectName, templateConfig, answers);
103
+ }
104
+ // Step 8: Rename files (e.g., .env.template -> .env)
105
+ renameFiles(projectName, templateConfig);
106
+ // Step 9: Remove meta files
107
+ removeMetaFiles(projectName, templateConfig);
108
+ // Step 9: Run pre-install hooks (if any) - e.g., CLI authentication for private registries
109
+ let skipDependencyInstall = false;
110
+ if (templateConfig.preInstall) {
111
+ const preInstallSuccess = await runPreInstallHooks(projectName, templateConfig.preInstall, packageManager);
112
+ if (!preInstallSuccess) {
113
+ console.log(chalk.yellow('โš ๏ธ Pre-install hooks failed. Skipping dependency installation.\n'));
114
+ console.log(chalk.gray('You can install dependencies manually after resolving the issue:\n'));
115
+ console.log(chalk.gray(` cd ${projectName}`));
116
+ console.log(chalk.gray(` ${packageManager} install\n`));
117
+ skipDependencyInstall = true;
118
+ }
119
+ }
120
+ // Step 10: Install dependencies
121
+ if (!skipDependencyInstall) {
122
+ await installDependencies(projectName, packageManager);
123
+ }
124
+ // Step 11: Run post-install hooks (if any)
125
+ if (!skipDependencyInstall && templateConfig.postInstall) {
126
+ await runPostInstallHooks(projectName, templateConfig.postInstall, packageManager);
127
+ }
128
+ // Step 12: Success!
129
+ showSuccess(projectName, packageManager, selectedTemplate.name, selectedTemplate.repository);
130
+ }
131
+ catch (error) {
132
+ console.log(chalk.red(`\nโŒ Installation failed: ${error instanceof Error ? error.message : 'Unknown error'}\n`));
133
+ // Cleanup on failure
134
+ if (fs.existsSync(projectName)) {
135
+ console.log(chalk.gray('Cleaning up...'));
136
+ fs.rmSync(projectName, { recursive: true, force: true });
137
+ }
138
+ process.exit(1);
139
+ }
140
+ }
141
+ /**
142
+ * Show success message
143
+ */
144
+ function showSuccess(projectName, packageManager, templateName, repository) {
145
+ console.log(chalk.green.bold('โœ… Project created successfully!\n'));
146
+ console.log(chalk.gray('Next steps:\n'));
147
+ console.log(chalk.cyan(` cd ${projectName}`));
148
+ console.log(chalk.cyan(` ${packageManager} dev`));
149
+ console.log();
150
+ console.log(chalk.gray(`Documentation: ${config.docsUrl}`));
151
+ console.log(chalk.gray(`Template: ${templateName}`));
152
+ console.log(chalk.gray(`Repository: ${repository}\n`));
153
+ }
154
+ /**
155
+ * Show help message
156
+ */
157
+ function showHelp() {
158
+ console.log(chalk.blue.bold('\nVertesia Project Generator\n'));
159
+ console.log('Usage:');
160
+ console.log(chalk.gray(' pnpm create @vertesia/tool-server <project-name> [options]'));
161
+ console.log(chalk.gray(' npm create @vertesia/tool-server <project-name> [options]'));
162
+ console.log(chalk.gray(' npx @vertesia/create-tool-server <project-name> [options]\n'));
163
+ console.log('Options:');
164
+ console.log(chalk.gray(' -h, --help Show this help message'));
165
+ console.log(chalk.gray(' -b, --branch <branch> Use specific branch (default: configured branch or main)\n'));
166
+ console.log('Examples:');
167
+ console.log(chalk.gray(' pnpm create @vertesia/tool-server my-tool-server'));
168
+ console.log(chalk.gray(' npm create @vertesia/tool-server my-api-tools -b develop'));
169
+ console.log(chalk.gray(' npx @vertesia/create-tool-server my-project --branch v1.0.0\n'));
170
+ console.log('Available Templates:');
171
+ config.templates.forEach(template => {
172
+ console.log(chalk.gray(` - ${template.name}`));
173
+ });
174
+ console.log();
175
+ console.log(`Documentation: ${chalk.cyan(config.docsUrl)}\n`);
176
+ }
177
+ // Run the installer
178
+ main().catch((error) => {
179
+ console.error(chalk.red(`\nโŒ Fatal error: ${error.message}\n`));
180
+ process.exit(1);
181
+ });
182
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Detect available package managers and let user choose
3
+ * Returns the selected package manager ('pnpm' or 'npm')
4
+ * @param forcedPackageManager - If specified, skip selection and use this package manager
5
+ */
6
+ export declare function selectPackageManager(forcedPackageManager?: 'pnpm' | 'npm'): Promise<string>;
7
+ /**
8
+ * Install dependencies using the specified package manager
9
+ */
10
+ export declare function installDependencies(projectName: string, packageManager: string): Promise<void>;
11
+ //# sourceMappingURL=package-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAsBA;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,oBAAoB,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CjG;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAapG"}