nitrostack 1.0.0
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/CHANGELOG.md +227 -0
- package/CONTRIBUTING.md +182 -0
- package/LICENSE +201 -0
- package/LICENSE_URLS_UPDATE_COMPLETE.md +388 -0
- package/NOTICE +153 -0
- package/README.md +571 -0
- package/dist/auth/api-key.d.ts +118 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +168 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/client.d.ts +151 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +330 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/index.d.ts +30 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +43 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +95 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +260 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/pkce.d.ts +53 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +105 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/quick-setup.d.ts +94 -0
- package/dist/auth/quick-setup.d.ts.map +1 -0
- package/dist/auth/quick-setup.js +210 -0
- package/dist/auth/quick-setup.js.map +1 -0
- package/dist/auth/server-integration.d.ts +97 -0
- package/dist/auth/server-integration.d.ts.map +1 -0
- package/dist/auth/server-integration.js +182 -0
- package/dist/auth/server-integration.js.map +1 -0
- package/dist/auth/server-metadata.d.ts +51 -0
- package/dist/auth/server-metadata.d.ts.map +1 -0
- package/dist/auth/server-metadata.js +106 -0
- package/dist/auth/server-metadata.js.map +1 -0
- package/dist/auth/simple-jwt.d.ts +88 -0
- package/dist/auth/simple-jwt.d.ts.map +1 -0
- package/dist/auth/simple-jwt.js +152 -0
- package/dist/auth/simple-jwt.js.map +1 -0
- package/dist/auth/token-store.d.ts +104 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +205 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/auth/token-validation.d.ts +47 -0
- package/dist/auth/token-validation.d.ts.map +1 -0
- package/dist/auth/token-validation.js +237 -0
- package/dist/auth/token-validation.js.map +1 -0
- package/dist/auth/types.d.ts +215 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +6 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/commands/build.d.ts +6 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +104 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +7 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +312 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/generate-types.d.ts +8 -0
- package/dist/cli/commands/generate-types.d.ts.map +1 -0
- package/dist/cli/commands/generate-types.js +220 -0
- package/dist/cli/commands/generate-types.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +5 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +365 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +365 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/start.d.ts +6 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +61 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +47 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/mcp-dev-wrapper.d.ts +3 -0
- package/dist/cli/mcp-dev-wrapper.d.ts.map +1 -0
- package/dist/cli/mcp-dev-wrapper.js +116 -0
- package/dist/cli/mcp-dev-wrapper.js.map +1 -0
- package/dist/core/apikey-module.d.ts +69 -0
- package/dist/core/apikey-module.d.ts.map +1 -0
- package/dist/core/apikey-module.js +114 -0
- package/dist/core/apikey-module.js.map +1 -0
- package/dist/core/app-decorator.d.ts +58 -0
- package/dist/core/app-decorator.d.ts.map +1 -0
- package/dist/core/app-decorator.js +261 -0
- package/dist/core/app-decorator.js.map +1 -0
- package/dist/core/builders.d.ts +38 -0
- package/dist/core/builders.d.ts.map +1 -0
- package/dist/core/builders.js +129 -0
- package/dist/core/builders.js.map +1 -0
- package/dist/core/component.d.ts +105 -0
- package/dist/core/component.d.ts.map +1 -0
- package/dist/core/component.js +182 -0
- package/dist/core/component.js.map +1 -0
- package/dist/core/config-module.d.ts +55 -0
- package/dist/core/config-module.d.ts.map +1 -0
- package/dist/core/config-module.js +94 -0
- package/dist/core/config-module.js.map +1 -0
- package/dist/core/decorators/cache.decorator.d.ts +61 -0
- package/dist/core/decorators/cache.decorator.d.ts.map +1 -0
- package/dist/core/decorators/cache.decorator.js +115 -0
- package/dist/core/decorators/cache.decorator.js.map +1 -0
- package/dist/core/decorators/health-check.decorator.d.ts +80 -0
- package/dist/core/decorators/health-check.decorator.d.ts.map +1 -0
- package/dist/core/decorators/health-check.decorator.js +153 -0
- package/dist/core/decorators/health-check.decorator.js.map +1 -0
- package/dist/core/decorators/rate-limit.decorator.d.ts +62 -0
- package/dist/core/decorators/rate-limit.decorator.d.ts.map +1 -0
- package/dist/core/decorators/rate-limit.decorator.js +129 -0
- package/dist/core/decorators/rate-limit.decorator.js.map +1 -0
- package/dist/core/decorators.d.ts +151 -0
- package/dist/core/decorators.d.ts.map +1 -0
- package/dist/core/decorators.js +142 -0
- package/dist/core/decorators.js.map +1 -0
- package/dist/core/di/container.d.ts +42 -0
- package/dist/core/di/container.d.ts.map +1 -0
- package/dist/core/di/container.js +76 -0
- package/dist/core/di/container.js.map +1 -0
- package/dist/core/di/injectable.decorator.d.ts +35 -0
- package/dist/core/di/injectable.decorator.d.ts.map +1 -0
- package/dist/core/di/injectable.decorator.js +57 -0
- package/dist/core/di/injectable.decorator.js.map +1 -0
- package/dist/core/errors.d.ts +54 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +87 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events/event-emitter.d.ts +50 -0
- package/dist/core/events/event-emitter.d.ts.map +1 -0
- package/dist/core/events/event-emitter.js +94 -0
- package/dist/core/events/event-emitter.js.map +1 -0
- package/dist/core/events/event.decorator.d.ts +48 -0
- package/dist/core/events/event.decorator.d.ts.map +1 -0
- package/dist/core/events/event.decorator.js +68 -0
- package/dist/core/events/event.decorator.js.map +1 -0
- package/dist/core/filters/exception-filter.decorator.d.ts +40 -0
- package/dist/core/filters/exception-filter.decorator.d.ts.map +1 -0
- package/dist/core/filters/exception-filter.decorator.js +54 -0
- package/dist/core/filters/exception-filter.decorator.js.map +1 -0
- package/dist/core/filters/exception-filter.interface.d.ts +30 -0
- package/dist/core/filters/exception-filter.interface.d.ts.map +1 -0
- package/dist/core/filters/exception-filter.interface.js +2 -0
- package/dist/core/filters/exception-filter.interface.js.map +1 -0
- package/dist/core/guards/apikey.guard.d.ts +22 -0
- package/dist/core/guards/apikey.guard.d.ts.map +1 -0
- package/dist/core/guards/apikey.guard.js +11 -0
- package/dist/core/guards/apikey.guard.js.map +1 -0
- package/dist/core/guards/guard.interface.d.ts +18 -0
- package/dist/core/guards/guard.interface.d.ts.map +1 -0
- package/dist/core/guards/guard.interface.js +2 -0
- package/dist/core/guards/guard.interface.js.map +1 -0
- package/dist/core/guards/jwt.guard.d.ts +18 -0
- package/dist/core/guards/jwt.guard.d.ts.map +1 -0
- package/dist/core/guards/jwt.guard.js +2 -0
- package/dist/core/guards/jwt.guard.js.map +1 -0
- package/dist/core/guards/oauth.guard.d.ts +35 -0
- package/dist/core/guards/oauth.guard.d.ts.map +1 -0
- package/dist/core/guards/oauth.guard.js +2 -0
- package/dist/core/guards/oauth.guard.js.map +1 -0
- package/dist/core/guards/use-guards.decorator.d.ts +25 -0
- package/dist/core/guards/use-guards.decorator.d.ts.map +1 -0
- package/dist/core/guards/use-guards.decorator.js +32 -0
- package/dist/core/guards/use-guards.decorator.js.map +1 -0
- package/dist/core/health/health-checks.resource.d.ts +14 -0
- package/dist/core/health/health-checks.resource.d.ts.map +1 -0
- package/dist/core/health/health-checks.resource.js +29 -0
- package/dist/core/health/health-checks.resource.js.map +1 -0
- package/dist/core/index.d.ts +55 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +57 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/interceptors/interceptor.decorator.d.ts +37 -0
- package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -0
- package/dist/core/interceptors/interceptor.decorator.js +51 -0
- package/dist/core/interceptors/interceptor.decorator.js.map +1 -0
- package/dist/core/interceptors/interceptor.interface.d.ts +31 -0
- package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -0
- package/dist/core/interceptors/interceptor.interface.js +2 -0
- package/dist/core/interceptors/interceptor.interface.js.map +1 -0
- package/dist/core/jwt-module.d.ts +51 -0
- package/dist/core/jwt-module.d.ts.map +1 -0
- package/dist/core/jwt-module.js +52 -0
- package/dist/core/jwt-module.js.map +1 -0
- package/dist/core/logger.d.ts +18 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +51 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/middleware/middleware.decorator.d.ts +39 -0
- package/dist/core/middleware/middleware.decorator.d.ts.map +1 -0
- package/dist/core/middleware/middleware.decorator.js +53 -0
- package/dist/core/middleware/middleware.decorator.js.map +1 -0
- package/dist/core/middleware/middleware.interface.d.ts +29 -0
- package/dist/core/middleware/middleware.interface.d.ts.map +1 -0
- package/dist/core/middleware/middleware.interface.js +2 -0
- package/dist/core/middleware/middleware.interface.js.map +1 -0
- package/dist/core/module.d.ts +74 -0
- package/dist/core/module.d.ts.map +1 -0
- package/dist/core/module.js +82 -0
- package/dist/core/module.js.map +1 -0
- package/dist/core/oauth-module.d.ts +144 -0
- package/dist/core/oauth-module.d.ts.map +1 -0
- package/dist/core/oauth-module.js +190 -0
- package/dist/core/oauth-module.js.map +1 -0
- package/dist/core/pipes/pipe.decorator.d.ts +55 -0
- package/dist/core/pipes/pipe.decorator.d.ts.map +1 -0
- package/dist/core/pipes/pipe.decorator.js +85 -0
- package/dist/core/pipes/pipe.decorator.js.map +1 -0
- package/dist/core/pipes/pipe.interface.d.ts +36 -0
- package/dist/core/pipes/pipe.interface.d.ts.map +1 -0
- package/dist/core/pipes/pipe.interface.js +2 -0
- package/dist/core/pipes/pipe.interface.js.map +1 -0
- package/dist/core/prompt.d.ts +37 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +76 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/resource.d.ts +42 -0
- package/dist/core/resource.d.ts.map +1 -0
- package/dist/core/resource.js +90 -0
- package/dist/core/resource.js.map +1 -0
- package/dist/core/server.d.ts +72 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +406 -0
- package/dist/core/server.js.map +1 -0
- package/dist/core/tool.d.ts +78 -0
- package/dist/core/tool.d.ts.map +1 -0
- package/dist/core/tool.js +190 -0
- package/dist/core/tool.js.map +1 -0
- package/dist/core/transports/http-server.d.ts +102 -0
- package/dist/core/transports/http-server.d.ts.map +1 -0
- package/dist/core/transports/http-server.js +265 -0
- package/dist/core/transports/http-server.js.map +1 -0
- package/dist/core/types.d.ts +123 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/widgets/widget-examples.resource.d.ts +17 -0
- package/dist/core/widgets/widget-examples.resource.d.ts.map +1 -0
- package/dist/core/widgets/widget-examples.resource.js +28 -0
- package/dist/core/widgets/widget-examples.resource.js.map +1 -0
- package/dist/core/widgets/widget-registry.d.ts +56 -0
- package/dist/core/widgets/widget-registry.d.ts.map +1 -0
- package/dist/core/widgets/widget-registry.js +75 -0
- package/dist/core/widgets/widget-registry.js.map +1 -0
- package/dist/testing/index.d.ts +82 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +164 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/ui-next/index.d.ts +31 -0
- package/dist/ui-next/index.d.ts.map +1 -0
- package/dist/ui-next/index.js +687 -0
- package/dist/ui-next/index.js.map +1 -0
- package/dist/widgets/index.d.ts +9 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/widgets/index.js +9 -0
- package/dist/widgets/index.js.map +1 -0
- package/dist/widgets/metadata.d.ts +53 -0
- package/dist/widgets/metadata.d.ts.map +1 -0
- package/dist/widgets/metadata.js +29 -0
- package/dist/widgets/metadata.js.map +1 -0
- package/dist/widgets/withToolData.d.ts +19 -0
- package/dist/widgets/withToolData.d.ts.map +1 -0
- package/dist/widgets/withToolData.js +240 -0
- package/dist/widgets/withToolData.js.map +1 -0
- package/jest.config.js +21 -0
- package/package.json +108 -0
- package/templates/typescript-auth/AI_AGENT_CLI_REFERENCE.md +702 -0
- package/templates/typescript-auth/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-auth/README.md +400 -0
- package/templates/typescript-auth/package.json +44 -0
- package/templates/typescript-auth-api-key/AI_AGENT_CLI_REFERENCE.md +701 -0
- package/templates/typescript-auth-api-key/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-auth-api-key/README.md +483 -0
- package/templates/typescript-auth-api-key/package-lock.json +124 -0
- package/templates/typescript-auth-api-key/package.json +29 -0
- package/templates/typescript-oauth/AI_AGENT_CLI_REFERENCE.md +701 -0
- package/templates/typescript-oauth/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-oauth/OAUTH_SETUP.md +406 -0
- package/templates/typescript-oauth/README.md +350 -0
- package/templates/typescript-oauth/package.json +30 -0
- package/templates/typescript-starter/AI_AGENT_CLI_REFERENCE.md +701 -0
- package/templates/typescript-starter/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-starter/README.md +312 -0
- package/templates/typescript-starter/package.json +32 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname } from 'path';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
import inquirer from 'inquirer';
|
|
8
|
+
import { execSync } from 'child_process';
|
|
9
|
+
// ES module equivalent of __dirname
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
/**
|
|
13
|
+
* Check if nitrostack is installed globally from npm registry
|
|
14
|
+
* Returns true if installed from npm, false if linked locally or not found
|
|
15
|
+
*/
|
|
16
|
+
function isNitrostackFromNpm() {
|
|
17
|
+
try {
|
|
18
|
+
// Check if nitrostack is available globally
|
|
19
|
+
const result = execSync('npm list -g nitrostack --json', {
|
|
20
|
+
encoding: 'utf-8',
|
|
21
|
+
stdio: 'pipe'
|
|
22
|
+
});
|
|
23
|
+
const parsed = JSON.parse(result);
|
|
24
|
+
// If it has dependencies, it's installed from npm
|
|
25
|
+
// Linked packages appear differently in npm list
|
|
26
|
+
if (parsed.dependencies && parsed.dependencies.nitrostack) {
|
|
27
|
+
const nitrostackInfo = parsed.dependencies.nitrostack;
|
|
28
|
+
// Check if it's a real installation (has version) vs a link (has resolved path to local)
|
|
29
|
+
return nitrostackInfo.version && !nitrostackInfo.resolved?.includes('file:');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
// Not found globally
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if we're running nitrostack from a local development environment
|
|
40
|
+
*/
|
|
41
|
+
function isLocalDevelopment() {
|
|
42
|
+
// Check if the CLI is running from a development path (contains src/cli)
|
|
43
|
+
return __dirname.includes('/src/cli/') || __dirname.includes('\\src\\cli\\');
|
|
44
|
+
}
|
|
45
|
+
export async function initCommand(projectName, options) {
|
|
46
|
+
console.log(chalk.blue.bold('\n🚀 NitroStack - MCP Server Generator\n'));
|
|
47
|
+
// Prompt for project name if not provided
|
|
48
|
+
if (!projectName) {
|
|
49
|
+
const answers = await inquirer.prompt([
|
|
50
|
+
{
|
|
51
|
+
type: 'input',
|
|
52
|
+
name: 'projectName',
|
|
53
|
+
message: 'What is your project name?',
|
|
54
|
+
default: 'my-mcp-server',
|
|
55
|
+
validate: (input) => {
|
|
56
|
+
if (input.trim().length === 0) {
|
|
57
|
+
return 'Project name cannot be empty';
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
]);
|
|
63
|
+
projectName = answers.projectName;
|
|
64
|
+
}
|
|
65
|
+
// Ensure projectName is defined
|
|
66
|
+
const finalProjectName = projectName;
|
|
67
|
+
const targetDir = path.join(process.cwd(), finalProjectName);
|
|
68
|
+
// Check if directory exists
|
|
69
|
+
if (fs.existsSync(targetDir)) {
|
|
70
|
+
const { overwrite } = await inquirer.prompt([
|
|
71
|
+
{
|
|
72
|
+
type: 'confirm',
|
|
73
|
+
name: 'overwrite',
|
|
74
|
+
message: `Directory ${finalProjectName} already exists. Overwrite?`,
|
|
75
|
+
default: false,
|
|
76
|
+
},
|
|
77
|
+
]);
|
|
78
|
+
if (!overwrite) {
|
|
79
|
+
console.log(chalk.yellow('Cancelled'));
|
|
80
|
+
process.exit(0);
|
|
81
|
+
}
|
|
82
|
+
fs.removeSync(targetDir);
|
|
83
|
+
}
|
|
84
|
+
// Prompt for additional info
|
|
85
|
+
const answers = await inquirer.prompt([
|
|
86
|
+
{
|
|
87
|
+
type: 'list',
|
|
88
|
+
name: 'template',
|
|
89
|
+
message: 'Choose a template:',
|
|
90
|
+
choices: [
|
|
91
|
+
{
|
|
92
|
+
name: '🔢 Starter (Calculator) - Simple template for learning basics',
|
|
93
|
+
value: 'typescript-starter',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: '🛍️ E-commerce Server (JWT Auth) - Advanced template with authentication',
|
|
97
|
+
value: 'typescript-auth',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: '🔑 API Key Auth - Demonstrates API key authentication',
|
|
101
|
+
value: 'typescript-auth-api-key',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: '🔐 OAuth 2.1 - Demonstrates OAuth 2.1 authentication (OpenAI Apps SDK compatible)',
|
|
105
|
+
value: 'typescript-oauth',
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
default: 'typescript-starter',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'input',
|
|
112
|
+
name: 'description',
|
|
113
|
+
message: 'Project description:',
|
|
114
|
+
default: 'My awesome MCP server',
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
type: 'input',
|
|
118
|
+
name: 'author',
|
|
119
|
+
message: 'Author:',
|
|
120
|
+
default: '',
|
|
121
|
+
},
|
|
122
|
+
]);
|
|
123
|
+
const spinner = ora('Creating project...').start();
|
|
124
|
+
try {
|
|
125
|
+
// Create project directory
|
|
126
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
127
|
+
// Get template path based on user choice
|
|
128
|
+
const templateDir = path.join(__dirname, '../../../templates', answers.template);
|
|
129
|
+
// Copy template files
|
|
130
|
+
if (fs.existsSync(templateDir)) {
|
|
131
|
+
fs.copySync(templateDir, targetDir);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// Create from scratch if template doesn't exist
|
|
135
|
+
await createProjectFromScratch(targetDir, finalProjectName, answers);
|
|
136
|
+
}
|
|
137
|
+
// Update package.json
|
|
138
|
+
const packageJsonPath = path.join(targetDir, 'package.json');
|
|
139
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
140
|
+
const packageJson = fs.readJSONSync(packageJsonPath);
|
|
141
|
+
packageJson.name = finalProjectName;
|
|
142
|
+
packageJson.description = answers.description;
|
|
143
|
+
packageJson.author = answers.author;
|
|
144
|
+
fs.writeJSONSync(packageJsonPath, packageJson, { spaces: 2 });
|
|
145
|
+
}
|
|
146
|
+
spinner.succeed(chalk.green('Project created successfully!'));
|
|
147
|
+
// Install dependencies
|
|
148
|
+
if (!options.skipInstall) {
|
|
149
|
+
spinner.start('Installing dependencies...');
|
|
150
|
+
try {
|
|
151
|
+
execSync('npm install', {
|
|
152
|
+
cwd: targetDir,
|
|
153
|
+
stdio: 'ignore',
|
|
154
|
+
});
|
|
155
|
+
spinner.succeed(chalk.green('Dependencies installed!'));
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
spinner.warn(chalk.yellow('Failed to install dependencies. Run npm install manually.'));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// For templates with widgets, install dependencies (but don't build - dev command will handle that)
|
|
162
|
+
if (!options.skipInstall && (answers.template === 'typescript-auth' || answers.template === 'typescript-starter')) {
|
|
163
|
+
const fromNpm = isNitrostackFromNpm();
|
|
164
|
+
const isLocalDev = isLocalDevelopment();
|
|
165
|
+
// Only link if we're in local development AND nitrostack is not from npm
|
|
166
|
+
if (isLocalDev && !fromNpm) {
|
|
167
|
+
try {
|
|
168
|
+
spinner.start('Linking local nitrostack to project...');
|
|
169
|
+
execSync('npm link nitrostack', { cwd: targetDir, stdio: 'ignore' });
|
|
170
|
+
spinner.succeed(chalk.green('Local nitrostack linked to project.'));
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
spinner.warn(chalk.yellow('Failed to link nitrostack. Ensure nitrostack is globally linked.'));
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
spinner.start('Linking nitrostack to widgets...');
|
|
177
|
+
const widgetsDir = path.join(targetDir, 'src', 'widgets');
|
|
178
|
+
execSync('npm link nitrostack', { cwd: widgetsDir, stdio: 'ignore' });
|
|
179
|
+
spinner.succeed(chalk.green('nitrostack linked to widgets.'));
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
spinner.warn(chalk.yellow('Failed to link nitrostack to widgets.'));
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
spinner.start('Installing widget dependencies...');
|
|
186
|
+
execSync('npm install', { cwd: path.join(targetDir, 'src', 'widgets'), stdio: 'ignore' });
|
|
187
|
+
spinner.succeed(chalk.green('Widget dependencies installed.'));
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
spinner.warn(chalk.yellow('Widget dependencies will be installed on first `npm run dev`.'));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// Published package - just install dependencies normally
|
|
195
|
+
try {
|
|
196
|
+
spinner.start('Installing widget dependencies...');
|
|
197
|
+
execSync('npm install', { cwd: path.join(targetDir, 'src', 'widgets'), stdio: 'ignore' });
|
|
198
|
+
spinner.succeed(chalk.green('Widget dependencies installed.'));
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
spinner.warn(chalk.yellow('Widget dependencies will be installed on first `npm run dev`.'));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Don't build widgets here - let dev command handle it for better DX
|
|
205
|
+
console.log(chalk.gray('\n💡 Widgets will be built automatically when you run `npm run dev`\n'));
|
|
206
|
+
}
|
|
207
|
+
// Show next steps
|
|
208
|
+
console.log(chalk.blue.bold('\n✨ Success! Your MCP server is ready.\n'));
|
|
209
|
+
console.log(chalk.white('Next steps:\n'));
|
|
210
|
+
console.log(chalk.cyan(` cd ${finalProjectName}`));
|
|
211
|
+
if (options.skipInstall) {
|
|
212
|
+
console.log(chalk.cyan(' npm install'));
|
|
213
|
+
}
|
|
214
|
+
// Add setup-db step for e-commerce template
|
|
215
|
+
if (answers.template === 'typescript-auth') {
|
|
216
|
+
console.log(chalk.cyan(' npm run setup-db # Setup database & get test credentials'));
|
|
217
|
+
}
|
|
218
|
+
console.log(chalk.cyan(' npm run dev'));
|
|
219
|
+
// Template-specific notes
|
|
220
|
+
if (answers.template === 'typescript-auth') {
|
|
221
|
+
console.log(chalk.white('\n📚 Test Users (after setup-db):'));
|
|
222
|
+
console.log(chalk.yellow(' emily.johnson@x.dummyjson.com / password123'));
|
|
223
|
+
console.log(chalk.yellow(' michael.chen@x.dummyjson.com / password123'));
|
|
224
|
+
console.log(chalk.yellow(' sarah.williams@x.dummyjson.com / password123'));
|
|
225
|
+
}
|
|
226
|
+
else if (answers.template === 'typescript-auth-api-key') {
|
|
227
|
+
console.log(chalk.white('\n🔑 Test API Keys:'));
|
|
228
|
+
console.log(chalk.yellow(' sk_test_public_demo_key_12345'));
|
|
229
|
+
console.log(chalk.yellow(' sk_test_admin_demo_key_67890'));
|
|
230
|
+
console.log(chalk.white('\n💡 Set your API key in Studio → Auth → API Key'));
|
|
231
|
+
}
|
|
232
|
+
else if (answers.template === 'typescript-oauth') {
|
|
233
|
+
console.log(chalk.white('\n🔐 OAuth 2.1 Setup Required:'));
|
|
234
|
+
console.log(chalk.yellow(' 1. Copy .env.example to .env'));
|
|
235
|
+
console.log(chalk.yellow(' 2. Configure your OAuth provider (Auth0, Okta, etc.)'));
|
|
236
|
+
console.log(chalk.yellow(' 3. See OAUTH_SETUP.md for provider-specific guides'));
|
|
237
|
+
console.log(chalk.white('\n💡 Configure OAuth in Studio → Auth → OAuth 2.1'));
|
|
238
|
+
}
|
|
239
|
+
else if (answers.template === 'typescript-starter') {
|
|
240
|
+
console.log(chalk.white('\n🔢 Calculator Operations:'));
|
|
241
|
+
console.log(chalk.yellow(' add, subtract, multiply, divide'));
|
|
242
|
+
console.log(chalk.yellow(' Try: calculate(add, 5, 3) → 8'));
|
|
243
|
+
}
|
|
244
|
+
console.log(chalk.white('\nHappy coding! 🎉\n'));
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
spinner.fail(chalk.red('Failed to create project'));
|
|
248
|
+
console.error(chalk.red(error.message));
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
async function createProjectFromScratch(targetDir, projectName, answers) {
|
|
253
|
+
// Create package.json
|
|
254
|
+
const packageJson = {
|
|
255
|
+
name: projectName,
|
|
256
|
+
version: '1.0.0',
|
|
257
|
+
description: answers.description,
|
|
258
|
+
author: answers.author,
|
|
259
|
+
main: 'dist/index.js',
|
|
260
|
+
scripts: {
|
|
261
|
+
dev: 'tsx watch src/index.ts',
|
|
262
|
+
build: 'tsc',
|
|
263
|
+
start: 'node dist/index.js',
|
|
264
|
+
},
|
|
265
|
+
dependencies: {
|
|
266
|
+
nitrostack: '^1.0.0',
|
|
267
|
+
dotenv: '^16.3.1',
|
|
268
|
+
},
|
|
269
|
+
devDependencies: {
|
|
270
|
+
'@types/node': '^20.10.5',
|
|
271
|
+
typescript: '^5.3.3',
|
|
272
|
+
tsx: '^4.7.0',
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
fs.writeJSONSync(path.join(targetDir, 'package.json'), packageJson, { spaces: 2 });
|
|
276
|
+
// Create tsconfig.json
|
|
277
|
+
const tsconfig = {
|
|
278
|
+
compilerOptions: {
|
|
279
|
+
target: 'ES2022',
|
|
280
|
+
module: 'commonjs',
|
|
281
|
+
outDir: './dist',
|
|
282
|
+
rootDir: './src',
|
|
283
|
+
strict: true,
|
|
284
|
+
esModuleInterop: true,
|
|
285
|
+
skipLibCheck: true,
|
|
286
|
+
forceConsistentCasingInFileNames: true,
|
|
287
|
+
},
|
|
288
|
+
include: ['src/**/*'],
|
|
289
|
+
exclude: ['node_modules'],
|
|
290
|
+
};
|
|
291
|
+
fs.writeJSONSync(path.join(targetDir, 'tsconfig.json'), tsconfig, { spaces: 2 });
|
|
292
|
+
// Create src directory
|
|
293
|
+
fs.mkdirSync(path.join(targetDir, 'src'), { recursive: true });
|
|
294
|
+
// Create example index.ts
|
|
295
|
+
const indexTs = `import { createServer, createTool, z } from 'nitrostack';
|
|
296
|
+
|
|
297
|
+
const server = createServer({
|
|
298
|
+
name: '${projectName}',
|
|
299
|
+
version: '1.0.0',
|
|
300
|
+
description: '${answers.description}',
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
// Example tool
|
|
304
|
+
server.tool(
|
|
305
|
+
createTool({
|
|
306
|
+
name: 'hello',
|
|
307
|
+
description: 'Say hello to someone',
|
|
308
|
+
inputSchema: z.object({
|
|
309
|
+
name: z.string().describe('The name to greet'),
|
|
310
|
+
}),
|
|
311
|
+
handler: async (input, context) => {
|
|
312
|
+
context.logger.info(\`Greeting \${input.name}\`);
|
|
313
|
+
return \`Hello, \${input.name}! 👋\`;
|
|
314
|
+
},
|
|
315
|
+
})
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
// Start the server
|
|
319
|
+
server.start().catch((error) => {
|
|
320
|
+
console.error('Failed to start server:', error);
|
|
321
|
+
process.exit(1);
|
|
322
|
+
});
|
|
323
|
+
`;
|
|
324
|
+
fs.writeFileSync(path.join(targetDir, 'src', 'index.ts'), indexTs);
|
|
325
|
+
// Create .env file
|
|
326
|
+
fs.writeFileSync(path.join(targetDir, '.env'), '# Environment variables\n');
|
|
327
|
+
// Create .gitignore
|
|
328
|
+
const gitignore = `node_modules/
|
|
329
|
+
dist/
|
|
330
|
+
.env
|
|
331
|
+
.env.local
|
|
332
|
+
*.log
|
|
333
|
+
`;
|
|
334
|
+
fs.writeFileSync(path.join(targetDir, '.gitignore'), gitignore);
|
|
335
|
+
// Create README.md
|
|
336
|
+
const readme = `# ${projectName}
|
|
337
|
+
|
|
338
|
+
${answers.description}
|
|
339
|
+
|
|
340
|
+
## Getting Started
|
|
341
|
+
|
|
342
|
+
\`\`\`bash
|
|
343
|
+
npm install
|
|
344
|
+
npm run dev
|
|
345
|
+
\`\`\`
|
|
346
|
+
|
|
347
|
+
## Building for Production
|
|
348
|
+
|
|
349
|
+
\`\`\`bash
|
|
350
|
+
npm run build
|
|
351
|
+
npm start
|
|
352
|
+
\`\`\`
|
|
353
|
+
|
|
354
|
+
## Project Structure
|
|
355
|
+
|
|
356
|
+
\`\`\`
|
|
357
|
+
src/
|
|
358
|
+
index.ts # Main server file
|
|
359
|
+
\`\`\`
|
|
360
|
+
|
|
361
|
+
Built with [NitroStack](https://github.com/yourusername/nitrostack) ⚡
|
|
362
|
+
`;
|
|
363
|
+
fs.writeFileSync(path.join(targetDir, 'README.md'), readme);
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAKA,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,iBAgEvD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { spawn } from 'child_process';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
export async function startCommand(options) {
|
|
6
|
+
console.log(chalk.blue.bold('\n🚀 Starting NitroStack server in production mode...\n'));
|
|
7
|
+
// Check if dist/index.js exists
|
|
8
|
+
const distIndexPath = path.join(process.cwd(), 'dist', 'index.js');
|
|
9
|
+
if (!fs.existsSync(distIndexPath)) {
|
|
10
|
+
console.error(chalk.red('Error: dist/index.js not found. Did you run `npm run build`?'));
|
|
11
|
+
console.log(chalk.yellow('\nRun this first:\n'));
|
|
12
|
+
console.log(chalk.cyan(' npm run build'));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
// Auto-detect widgets
|
|
16
|
+
const widgetsPath = path.join(process.cwd(), 'src', 'widgets', '.next');
|
|
17
|
+
const hasBuiltWidgets = fs.existsSync(widgetsPath);
|
|
18
|
+
if (!hasBuiltWidgets) {
|
|
19
|
+
const widgetsPackageJsonPath = path.join(process.cwd(), 'src', 'widgets', 'package.json');
|
|
20
|
+
if (fs.existsSync(widgetsPackageJsonPath)) {
|
|
21
|
+
console.log(chalk.yellow('⚠️ Widgets not built. Run `npm run build` to build widgets.\n'));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
console.log(chalk.green('✅ Starting MCP server...'));
|
|
25
|
+
if (hasBuiltWidgets) {
|
|
26
|
+
console.log(chalk.green('✅ Built widgets detected'));
|
|
27
|
+
}
|
|
28
|
+
console.log(chalk.cyan('\n📡 Server: http://localhost:' + (options.port || '3000')));
|
|
29
|
+
console.log(chalk.gray('\nPress Ctrl+C to stop\n'));
|
|
30
|
+
// Start the MCP server
|
|
31
|
+
const serverProcess = spawn('node', [distIndexPath], {
|
|
32
|
+
cwd: process.cwd(),
|
|
33
|
+
stdio: 'inherit',
|
|
34
|
+
env: {
|
|
35
|
+
...process.env,
|
|
36
|
+
NODE_ENV: 'production',
|
|
37
|
+
PORT: options.port || '3000',
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
// Handle process exit
|
|
41
|
+
serverProcess.on('exit', (code) => {
|
|
42
|
+
if (code !== 0) {
|
|
43
|
+
console.error(chalk.red(`\n❌ Server exited with code ${code}`));
|
|
44
|
+
process.exit(code || 1);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
// Handle graceful shutdown
|
|
48
|
+
const shutdown = () => {
|
|
49
|
+
console.log(chalk.yellow('\n\n🛑 Shutting down...'));
|
|
50
|
+
serverProcess.kill('SIGTERM');
|
|
51
|
+
setTimeout(() => {
|
|
52
|
+
serverProcess.kill('SIGKILL');
|
|
53
|
+
process.exit(0);
|
|
54
|
+
}, 5000);
|
|
55
|
+
};
|
|
56
|
+
process.on('SIGINT', shutdown);
|
|
57
|
+
process.on('SIGTERM', shutdown);
|
|
58
|
+
// Keep process alive
|
|
59
|
+
await new Promise(() => { });
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { initCommand } from './commands/init.js';
|
|
4
|
+
import { devCommand } from './commands/dev.js';
|
|
5
|
+
import { buildCommand } from './commands/build.js';
|
|
6
|
+
import { startCommand } from './commands/start.js';
|
|
7
|
+
import { generate } from './commands/generate.js';
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program
|
|
10
|
+
.name('nitrostack')
|
|
11
|
+
.description('NitroStack - Build MCP servers with ease')
|
|
12
|
+
.version('1.0.0');
|
|
13
|
+
program
|
|
14
|
+
.command('init')
|
|
15
|
+
.description('Initialize a new NitroStack project')
|
|
16
|
+
.argument('[project-name]', 'Name of the project')
|
|
17
|
+
.option('--template <template>', 'Template to use (typescript, typescript-auth)', 'typescript')
|
|
18
|
+
.action(initCommand);
|
|
19
|
+
program
|
|
20
|
+
.command('dev')
|
|
21
|
+
.description('Start development server with hot reload')
|
|
22
|
+
.option('--port <port>', 'Port for Studio', '3000')
|
|
23
|
+
.option('--no-open', 'Don\'t open browser automatically')
|
|
24
|
+
.action(devCommand);
|
|
25
|
+
program
|
|
26
|
+
.command('build')
|
|
27
|
+
.description('Build the project for production')
|
|
28
|
+
.option('--output <path>', 'Output directory', 'dist')
|
|
29
|
+
.action(buildCommand);
|
|
30
|
+
program
|
|
31
|
+
.command('start')
|
|
32
|
+
.description('Start the production server')
|
|
33
|
+
.option('--port <port>', 'Port for server', '3000')
|
|
34
|
+
.action(startCommand);
|
|
35
|
+
program
|
|
36
|
+
.command('generate')
|
|
37
|
+
.alias('g')
|
|
38
|
+
.description('Generate boilerplate code or types')
|
|
39
|
+
.argument('<type>', 'Type of component (middleware, interceptor, pipe, filter, service, guard, health, module, tools, resources, prompts, types)')
|
|
40
|
+
.argument('[name]', 'Name of the component (optional for "types")')
|
|
41
|
+
.option('--module <module>', 'Module name (for module-specific generation)')
|
|
42
|
+
.option('--output <path>', 'Output path (for types generation)')
|
|
43
|
+
.option('--force', 'Overwrite existing files')
|
|
44
|
+
.option('--skip-related', 'Skip generating related files (for modules)')
|
|
45
|
+
.action(generate);
|
|
46
|
+
program.parse();
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,0CAA0C,CAAC;KACvD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,qCAAqC,CAAC;KAClD,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;KACjD,MAAM,CAAC,uBAAuB,EAAE,+CAA+C,EAAE,YAAY,CAAC;KAC9F,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,eAAe,EAAE,iBAAiB,EAAE,MAAM,CAAC;KAClD,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;KACxD,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,CAAC;KACrD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,eAAe,EAAE,iBAAiB,EAAE,MAAM,CAAC;KAClD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,oCAAoC,CAAC;KACjD,QAAQ,CAAC,QAAQ,EAAE,6HAA6H,CAAC;KACjJ,QAAQ,CAAC,QAAQ,EAAE,8CAA8C,CAAC;KAClE,MAAM,CAAC,mBAAmB,EAAE,8CAA8C,CAAC;KAC3E,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;KAC/D,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC;KAC7C,MAAM,CAAC,gBAAgB,EAAE,6CAA6C,CAAC;KACvE,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEpB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-dev-wrapper.d.ts","sourceRoot":"","sources":["../../src/cli/mcp-dev-wrapper.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from 'child_process';
|
|
3
|
+
import chokidar from 'chokidar';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = path.dirname(__filename);
|
|
8
|
+
/**
|
|
9
|
+
* MCP Server Hot Reload Wrapper
|
|
10
|
+
*
|
|
11
|
+
* This wrapper:
|
|
12
|
+
* 1. Starts the MCP server as a child process
|
|
13
|
+
* 2. Watches for changes in the dist/ directory
|
|
14
|
+
* 3. Restarts the server when changes are detected
|
|
15
|
+
* 4. Maintains stdio connection for Studio
|
|
16
|
+
*
|
|
17
|
+
* IMPORTANT: All logs go to stderr to avoid corrupting MCP JSON-RPC on stdout
|
|
18
|
+
*/
|
|
19
|
+
const distPath = process.argv[2];
|
|
20
|
+
if (!distPath) {
|
|
21
|
+
console.error('Usage: mcp-dev-wrapper <path-to-dist/index.js>');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const projectRoot = path.resolve(distPath, '../..');
|
|
25
|
+
const watchPath = path.join(projectRoot, 'dist');
|
|
26
|
+
let mcpProcess = null;
|
|
27
|
+
let isRestarting = false;
|
|
28
|
+
let consecutiveFailures = 0;
|
|
29
|
+
const maxConsecutiveFailures = 3;
|
|
30
|
+
function startMCPServer() {
|
|
31
|
+
if (isRestarting)
|
|
32
|
+
return;
|
|
33
|
+
// Start the MCP server - inherit stdin/stdout for MCP protocol
|
|
34
|
+
mcpProcess = spawn('node', [distPath], {
|
|
35
|
+
stdio: ['inherit', 'inherit', 'inherit'],
|
|
36
|
+
env: process.env,
|
|
37
|
+
});
|
|
38
|
+
mcpProcess.on('exit', (code) => {
|
|
39
|
+
if (!isRestarting) {
|
|
40
|
+
if (code !== 0) {
|
|
41
|
+
consecutiveFailures++;
|
|
42
|
+
if (consecutiveFailures >= maxConsecutiveFailures) {
|
|
43
|
+
console.error(`[NitroStack Hot Reload] Server failed ${maxConsecutiveFailures} times in a row. Giving up.`);
|
|
44
|
+
console.error('[NitroStack Hot Reload] Check your configuration and try again.');
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
console.error(`[NitroStack Hot Reload] Server exited with code ${code} (attempt ${consecutiveFailures}/${maxConsecutiveFailures}), restarting...`);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
consecutiveFailures = 0; // Reset on successful exit
|
|
51
|
+
console.error(`[NitroStack Hot Reload] Server exited with code ${code}, restarting...`);
|
|
52
|
+
}
|
|
53
|
+
mcpProcess = null;
|
|
54
|
+
setTimeout(startMCPServer, 1000);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
mcpProcess.on('error', (err) => {
|
|
58
|
+
console.error('[NitroStack Hot Reload] Server error:', err);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function restartMCPServer() {
|
|
62
|
+
if (isRestarting)
|
|
63
|
+
return;
|
|
64
|
+
isRestarting = true;
|
|
65
|
+
if (mcpProcess) {
|
|
66
|
+
console.error('[NitroStack Hot Reload] Changes detected, restarting server...');
|
|
67
|
+
mcpProcess.kill('SIGTERM');
|
|
68
|
+
// Wait for the process to exit and ports to be released (especially for HTTP transport)
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
mcpProcess = null;
|
|
71
|
+
isRestarting = false;
|
|
72
|
+
startMCPServer();
|
|
73
|
+
console.error('[NitroStack Hot Reload] Server restarted successfully');
|
|
74
|
+
}, 1000); // Increased from 500ms to 1000ms for HTTP server cleanup
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
isRestarting = false;
|
|
78
|
+
startMCPServer();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Start the server initially
|
|
82
|
+
startMCPServer();
|
|
83
|
+
// Watch for changes in dist directory
|
|
84
|
+
const watcher = chokidar.watch(watchPath, {
|
|
85
|
+
ignoreInitial: true,
|
|
86
|
+
persistent: true,
|
|
87
|
+
awaitWriteFinish: {
|
|
88
|
+
stabilityThreshold: 100,
|
|
89
|
+
pollInterval: 50,
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
watcher.on('change', (filepath) => {
|
|
93
|
+
console.error(`[NitroStack Hot Reload] File changed: ${path.relative(projectRoot, filepath)}`);
|
|
94
|
+
restartMCPServer();
|
|
95
|
+
});
|
|
96
|
+
watcher.on('add', (filepath) => {
|
|
97
|
+
console.error(`[NitroStack Hot Reload] File added: ${path.relative(projectRoot, filepath)}`);
|
|
98
|
+
restartMCPServer();
|
|
99
|
+
});
|
|
100
|
+
// Handle graceful shutdown
|
|
101
|
+
process.on('SIGINT', () => {
|
|
102
|
+
console.error('[NitroStack Hot Reload] Shutting down...');
|
|
103
|
+
watcher.close();
|
|
104
|
+
if (mcpProcess) {
|
|
105
|
+
mcpProcess.kill('SIGTERM');
|
|
106
|
+
}
|
|
107
|
+
process.exit(0);
|
|
108
|
+
});
|
|
109
|
+
process.on('SIGTERM', () => {
|
|
110
|
+
watcher.close();
|
|
111
|
+
if (mcpProcess) {
|
|
112
|
+
mcpProcess.kill('SIGTERM');
|
|
113
|
+
}
|
|
114
|
+
process.exit(0);
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=mcp-dev-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-dev-wrapper.js","sourceRoot":"","sources":["../../src/cli/mcp-dev-wrapper.ts"],"names":[],"mappings":"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"}
|