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.
Files changed (290) hide show
  1. package/CHANGELOG.md +227 -0
  2. package/CONTRIBUTING.md +182 -0
  3. package/LICENSE +201 -0
  4. package/LICENSE_URLS_UPDATE_COMPLETE.md +388 -0
  5. package/NOTICE +153 -0
  6. package/README.md +571 -0
  7. package/dist/auth/api-key.d.ts +118 -0
  8. package/dist/auth/api-key.d.ts.map +1 -0
  9. package/dist/auth/api-key.js +168 -0
  10. package/dist/auth/api-key.js.map +1 -0
  11. package/dist/auth/client.d.ts +151 -0
  12. package/dist/auth/client.d.ts.map +1 -0
  13. package/dist/auth/client.js +330 -0
  14. package/dist/auth/client.js.map +1 -0
  15. package/dist/auth/index.d.ts +30 -0
  16. package/dist/auth/index.d.ts.map +1 -0
  17. package/dist/auth/index.js +43 -0
  18. package/dist/auth/index.js.map +1 -0
  19. package/dist/auth/middleware.d.ts +95 -0
  20. package/dist/auth/middleware.d.ts.map +1 -0
  21. package/dist/auth/middleware.js +260 -0
  22. package/dist/auth/middleware.js.map +1 -0
  23. package/dist/auth/pkce.d.ts +53 -0
  24. package/dist/auth/pkce.d.ts.map +1 -0
  25. package/dist/auth/pkce.js +105 -0
  26. package/dist/auth/pkce.js.map +1 -0
  27. package/dist/auth/quick-setup.d.ts +94 -0
  28. package/dist/auth/quick-setup.d.ts.map +1 -0
  29. package/dist/auth/quick-setup.js +210 -0
  30. package/dist/auth/quick-setup.js.map +1 -0
  31. package/dist/auth/server-integration.d.ts +97 -0
  32. package/dist/auth/server-integration.d.ts.map +1 -0
  33. package/dist/auth/server-integration.js +182 -0
  34. package/dist/auth/server-integration.js.map +1 -0
  35. package/dist/auth/server-metadata.d.ts +51 -0
  36. package/dist/auth/server-metadata.d.ts.map +1 -0
  37. package/dist/auth/server-metadata.js +106 -0
  38. package/dist/auth/server-metadata.js.map +1 -0
  39. package/dist/auth/simple-jwt.d.ts +88 -0
  40. package/dist/auth/simple-jwt.d.ts.map +1 -0
  41. package/dist/auth/simple-jwt.js +152 -0
  42. package/dist/auth/simple-jwt.js.map +1 -0
  43. package/dist/auth/token-store.d.ts +104 -0
  44. package/dist/auth/token-store.d.ts.map +1 -0
  45. package/dist/auth/token-store.js +205 -0
  46. package/dist/auth/token-store.js.map +1 -0
  47. package/dist/auth/token-validation.d.ts +47 -0
  48. package/dist/auth/token-validation.d.ts.map +1 -0
  49. package/dist/auth/token-validation.js +237 -0
  50. package/dist/auth/token-validation.js.map +1 -0
  51. package/dist/auth/types.d.ts +215 -0
  52. package/dist/auth/types.d.ts.map +1 -0
  53. package/dist/auth/types.js +6 -0
  54. package/dist/auth/types.js.map +1 -0
  55. package/dist/cli/commands/build.d.ts +6 -0
  56. package/dist/cli/commands/build.d.ts.map +1 -0
  57. package/dist/cli/commands/build.js +104 -0
  58. package/dist/cli/commands/build.js.map +1 -0
  59. package/dist/cli/commands/dev.d.ts +7 -0
  60. package/dist/cli/commands/dev.d.ts.map +1 -0
  61. package/dist/cli/commands/dev.js +312 -0
  62. package/dist/cli/commands/dev.js.map +1 -0
  63. package/dist/cli/commands/generate-types.d.ts +8 -0
  64. package/dist/cli/commands/generate-types.d.ts.map +1 -0
  65. package/dist/cli/commands/generate-types.js +220 -0
  66. package/dist/cli/commands/generate-types.js.map +1 -0
  67. package/dist/cli/commands/generate.d.ts +5 -0
  68. package/dist/cli/commands/generate.d.ts.map +1 -0
  69. package/dist/cli/commands/generate.js +365 -0
  70. package/dist/cli/commands/generate.js.map +1 -0
  71. package/dist/cli/commands/init.d.ts +7 -0
  72. package/dist/cli/commands/init.d.ts.map +1 -0
  73. package/dist/cli/commands/init.js +365 -0
  74. package/dist/cli/commands/init.js.map +1 -0
  75. package/dist/cli/commands/start.d.ts +6 -0
  76. package/dist/cli/commands/start.d.ts.map +1 -0
  77. package/dist/cli/commands/start.js +61 -0
  78. package/dist/cli/commands/start.js.map +1 -0
  79. package/dist/cli/index.d.ts +3 -0
  80. package/dist/cli/index.d.ts.map +1 -0
  81. package/dist/cli/index.js +47 -0
  82. package/dist/cli/index.js.map +1 -0
  83. package/dist/cli/mcp-dev-wrapper.d.ts +3 -0
  84. package/dist/cli/mcp-dev-wrapper.d.ts.map +1 -0
  85. package/dist/cli/mcp-dev-wrapper.js +116 -0
  86. package/dist/cli/mcp-dev-wrapper.js.map +1 -0
  87. package/dist/core/apikey-module.d.ts +69 -0
  88. package/dist/core/apikey-module.d.ts.map +1 -0
  89. package/dist/core/apikey-module.js +114 -0
  90. package/dist/core/apikey-module.js.map +1 -0
  91. package/dist/core/app-decorator.d.ts +58 -0
  92. package/dist/core/app-decorator.d.ts.map +1 -0
  93. package/dist/core/app-decorator.js +261 -0
  94. package/dist/core/app-decorator.js.map +1 -0
  95. package/dist/core/builders.d.ts +38 -0
  96. package/dist/core/builders.d.ts.map +1 -0
  97. package/dist/core/builders.js +129 -0
  98. package/dist/core/builders.js.map +1 -0
  99. package/dist/core/component.d.ts +105 -0
  100. package/dist/core/component.d.ts.map +1 -0
  101. package/dist/core/component.js +182 -0
  102. package/dist/core/component.js.map +1 -0
  103. package/dist/core/config-module.d.ts +55 -0
  104. package/dist/core/config-module.d.ts.map +1 -0
  105. package/dist/core/config-module.js +94 -0
  106. package/dist/core/config-module.js.map +1 -0
  107. package/dist/core/decorators/cache.decorator.d.ts +61 -0
  108. package/dist/core/decorators/cache.decorator.d.ts.map +1 -0
  109. package/dist/core/decorators/cache.decorator.js +115 -0
  110. package/dist/core/decorators/cache.decorator.js.map +1 -0
  111. package/dist/core/decorators/health-check.decorator.d.ts +80 -0
  112. package/dist/core/decorators/health-check.decorator.d.ts.map +1 -0
  113. package/dist/core/decorators/health-check.decorator.js +153 -0
  114. package/dist/core/decorators/health-check.decorator.js.map +1 -0
  115. package/dist/core/decorators/rate-limit.decorator.d.ts +62 -0
  116. package/dist/core/decorators/rate-limit.decorator.d.ts.map +1 -0
  117. package/dist/core/decorators/rate-limit.decorator.js +129 -0
  118. package/dist/core/decorators/rate-limit.decorator.js.map +1 -0
  119. package/dist/core/decorators.d.ts +151 -0
  120. package/dist/core/decorators.d.ts.map +1 -0
  121. package/dist/core/decorators.js +142 -0
  122. package/dist/core/decorators.js.map +1 -0
  123. package/dist/core/di/container.d.ts +42 -0
  124. package/dist/core/di/container.d.ts.map +1 -0
  125. package/dist/core/di/container.js +76 -0
  126. package/dist/core/di/container.js.map +1 -0
  127. package/dist/core/di/injectable.decorator.d.ts +35 -0
  128. package/dist/core/di/injectable.decorator.d.ts.map +1 -0
  129. package/dist/core/di/injectable.decorator.js +57 -0
  130. package/dist/core/di/injectable.decorator.js.map +1 -0
  131. package/dist/core/errors.d.ts +54 -0
  132. package/dist/core/errors.d.ts.map +1 -0
  133. package/dist/core/errors.js +87 -0
  134. package/dist/core/errors.js.map +1 -0
  135. package/dist/core/events/event-emitter.d.ts +50 -0
  136. package/dist/core/events/event-emitter.d.ts.map +1 -0
  137. package/dist/core/events/event-emitter.js +94 -0
  138. package/dist/core/events/event-emitter.js.map +1 -0
  139. package/dist/core/events/event.decorator.d.ts +48 -0
  140. package/dist/core/events/event.decorator.d.ts.map +1 -0
  141. package/dist/core/events/event.decorator.js +68 -0
  142. package/dist/core/events/event.decorator.js.map +1 -0
  143. package/dist/core/filters/exception-filter.decorator.d.ts +40 -0
  144. package/dist/core/filters/exception-filter.decorator.d.ts.map +1 -0
  145. package/dist/core/filters/exception-filter.decorator.js +54 -0
  146. package/dist/core/filters/exception-filter.decorator.js.map +1 -0
  147. package/dist/core/filters/exception-filter.interface.d.ts +30 -0
  148. package/dist/core/filters/exception-filter.interface.d.ts.map +1 -0
  149. package/dist/core/filters/exception-filter.interface.js +2 -0
  150. package/dist/core/filters/exception-filter.interface.js.map +1 -0
  151. package/dist/core/guards/apikey.guard.d.ts +22 -0
  152. package/dist/core/guards/apikey.guard.d.ts.map +1 -0
  153. package/dist/core/guards/apikey.guard.js +11 -0
  154. package/dist/core/guards/apikey.guard.js.map +1 -0
  155. package/dist/core/guards/guard.interface.d.ts +18 -0
  156. package/dist/core/guards/guard.interface.d.ts.map +1 -0
  157. package/dist/core/guards/guard.interface.js +2 -0
  158. package/dist/core/guards/guard.interface.js.map +1 -0
  159. package/dist/core/guards/jwt.guard.d.ts +18 -0
  160. package/dist/core/guards/jwt.guard.d.ts.map +1 -0
  161. package/dist/core/guards/jwt.guard.js +2 -0
  162. package/dist/core/guards/jwt.guard.js.map +1 -0
  163. package/dist/core/guards/oauth.guard.d.ts +35 -0
  164. package/dist/core/guards/oauth.guard.d.ts.map +1 -0
  165. package/dist/core/guards/oauth.guard.js +2 -0
  166. package/dist/core/guards/oauth.guard.js.map +1 -0
  167. package/dist/core/guards/use-guards.decorator.d.ts +25 -0
  168. package/dist/core/guards/use-guards.decorator.d.ts.map +1 -0
  169. package/dist/core/guards/use-guards.decorator.js +32 -0
  170. package/dist/core/guards/use-guards.decorator.js.map +1 -0
  171. package/dist/core/health/health-checks.resource.d.ts +14 -0
  172. package/dist/core/health/health-checks.resource.d.ts.map +1 -0
  173. package/dist/core/health/health-checks.resource.js +29 -0
  174. package/dist/core/health/health-checks.resource.js.map +1 -0
  175. package/dist/core/index.d.ts +55 -0
  176. package/dist/core/index.d.ts.map +1 -0
  177. package/dist/core/index.js +57 -0
  178. package/dist/core/index.js.map +1 -0
  179. package/dist/core/interceptors/interceptor.decorator.d.ts +37 -0
  180. package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -0
  181. package/dist/core/interceptors/interceptor.decorator.js +51 -0
  182. package/dist/core/interceptors/interceptor.decorator.js.map +1 -0
  183. package/dist/core/interceptors/interceptor.interface.d.ts +31 -0
  184. package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -0
  185. package/dist/core/interceptors/interceptor.interface.js +2 -0
  186. package/dist/core/interceptors/interceptor.interface.js.map +1 -0
  187. package/dist/core/jwt-module.d.ts +51 -0
  188. package/dist/core/jwt-module.d.ts.map +1 -0
  189. package/dist/core/jwt-module.js +52 -0
  190. package/dist/core/jwt-module.js.map +1 -0
  191. package/dist/core/logger.d.ts +18 -0
  192. package/dist/core/logger.d.ts.map +1 -0
  193. package/dist/core/logger.js +51 -0
  194. package/dist/core/logger.js.map +1 -0
  195. package/dist/core/middleware/middleware.decorator.d.ts +39 -0
  196. package/dist/core/middleware/middleware.decorator.d.ts.map +1 -0
  197. package/dist/core/middleware/middleware.decorator.js +53 -0
  198. package/dist/core/middleware/middleware.decorator.js.map +1 -0
  199. package/dist/core/middleware/middleware.interface.d.ts +29 -0
  200. package/dist/core/middleware/middleware.interface.d.ts.map +1 -0
  201. package/dist/core/middleware/middleware.interface.js +2 -0
  202. package/dist/core/middleware/middleware.interface.js.map +1 -0
  203. package/dist/core/module.d.ts +74 -0
  204. package/dist/core/module.d.ts.map +1 -0
  205. package/dist/core/module.js +82 -0
  206. package/dist/core/module.js.map +1 -0
  207. package/dist/core/oauth-module.d.ts +144 -0
  208. package/dist/core/oauth-module.d.ts.map +1 -0
  209. package/dist/core/oauth-module.js +190 -0
  210. package/dist/core/oauth-module.js.map +1 -0
  211. package/dist/core/pipes/pipe.decorator.d.ts +55 -0
  212. package/dist/core/pipes/pipe.decorator.d.ts.map +1 -0
  213. package/dist/core/pipes/pipe.decorator.js +85 -0
  214. package/dist/core/pipes/pipe.decorator.js.map +1 -0
  215. package/dist/core/pipes/pipe.interface.d.ts +36 -0
  216. package/dist/core/pipes/pipe.interface.d.ts.map +1 -0
  217. package/dist/core/pipes/pipe.interface.js +2 -0
  218. package/dist/core/pipes/pipe.interface.js.map +1 -0
  219. package/dist/core/prompt.d.ts +37 -0
  220. package/dist/core/prompt.d.ts.map +1 -0
  221. package/dist/core/prompt.js +76 -0
  222. package/dist/core/prompt.js.map +1 -0
  223. package/dist/core/resource.d.ts +42 -0
  224. package/dist/core/resource.d.ts.map +1 -0
  225. package/dist/core/resource.js +90 -0
  226. package/dist/core/resource.js.map +1 -0
  227. package/dist/core/server.d.ts +72 -0
  228. package/dist/core/server.d.ts.map +1 -0
  229. package/dist/core/server.js +406 -0
  230. package/dist/core/server.js.map +1 -0
  231. package/dist/core/tool.d.ts +78 -0
  232. package/dist/core/tool.d.ts.map +1 -0
  233. package/dist/core/tool.js +190 -0
  234. package/dist/core/tool.js.map +1 -0
  235. package/dist/core/transports/http-server.d.ts +102 -0
  236. package/dist/core/transports/http-server.d.ts.map +1 -0
  237. package/dist/core/transports/http-server.js +265 -0
  238. package/dist/core/transports/http-server.js.map +1 -0
  239. package/dist/core/types.d.ts +123 -0
  240. package/dist/core/types.d.ts.map +1 -0
  241. package/dist/core/types.js +2 -0
  242. package/dist/core/types.js.map +1 -0
  243. package/dist/core/widgets/widget-examples.resource.d.ts +17 -0
  244. package/dist/core/widgets/widget-examples.resource.d.ts.map +1 -0
  245. package/dist/core/widgets/widget-examples.resource.js +28 -0
  246. package/dist/core/widgets/widget-examples.resource.js.map +1 -0
  247. package/dist/core/widgets/widget-registry.d.ts +56 -0
  248. package/dist/core/widgets/widget-registry.d.ts.map +1 -0
  249. package/dist/core/widgets/widget-registry.js +75 -0
  250. package/dist/core/widgets/widget-registry.js.map +1 -0
  251. package/dist/testing/index.d.ts +82 -0
  252. package/dist/testing/index.d.ts.map +1 -0
  253. package/dist/testing/index.js +164 -0
  254. package/dist/testing/index.js.map +1 -0
  255. package/dist/ui-next/index.d.ts +31 -0
  256. package/dist/ui-next/index.d.ts.map +1 -0
  257. package/dist/ui-next/index.js +687 -0
  258. package/dist/ui-next/index.js.map +1 -0
  259. package/dist/widgets/index.d.ts +9 -0
  260. package/dist/widgets/index.d.ts.map +1 -0
  261. package/dist/widgets/index.js +9 -0
  262. package/dist/widgets/index.js.map +1 -0
  263. package/dist/widgets/metadata.d.ts +53 -0
  264. package/dist/widgets/metadata.d.ts.map +1 -0
  265. package/dist/widgets/metadata.js +29 -0
  266. package/dist/widgets/metadata.js.map +1 -0
  267. package/dist/widgets/withToolData.d.ts +19 -0
  268. package/dist/widgets/withToolData.d.ts.map +1 -0
  269. package/dist/widgets/withToolData.js +240 -0
  270. package/dist/widgets/withToolData.js.map +1 -0
  271. package/jest.config.js +21 -0
  272. package/package.json +108 -0
  273. package/templates/typescript-auth/AI_AGENT_CLI_REFERENCE.md +702 -0
  274. package/templates/typescript-auth/AI_AGENT_SDK_REFERENCE.md +1260 -0
  275. package/templates/typescript-auth/README.md +400 -0
  276. package/templates/typescript-auth/package.json +44 -0
  277. package/templates/typescript-auth-api-key/AI_AGENT_CLI_REFERENCE.md +701 -0
  278. package/templates/typescript-auth-api-key/AI_AGENT_SDK_REFERENCE.md +1260 -0
  279. package/templates/typescript-auth-api-key/README.md +483 -0
  280. package/templates/typescript-auth-api-key/package-lock.json +124 -0
  281. package/templates/typescript-auth-api-key/package.json +29 -0
  282. package/templates/typescript-oauth/AI_AGENT_CLI_REFERENCE.md +701 -0
  283. package/templates/typescript-oauth/AI_AGENT_SDK_REFERENCE.md +1260 -0
  284. package/templates/typescript-oauth/OAUTH_SETUP.md +406 -0
  285. package/templates/typescript-oauth/README.md +350 -0
  286. package/templates/typescript-oauth/package.json +30 -0
  287. package/templates/typescript-starter/AI_AGENT_CLI_REFERENCE.md +701 -0
  288. package/templates/typescript-starter/AI_AGENT_SDK_REFERENCE.md +1260 -0
  289. package/templates/typescript-starter/README.md +312 -0
  290. 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,6 @@
1
+ interface StartOptions {
2
+ port?: string;
3
+ }
4
+ export declare function startCommand(options: StartOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=start.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=mcp-dev-wrapper.d.ts.map
@@ -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":";AACA,OAAO,EAAE,KAAK,EAAgB,MAAM,eAAe,CAAC;AACpD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;;;;;;;;;GAUG;AAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;IACd,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACpD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAEjD,IAAI,UAAU,GAAwB,IAAI,CAAC;AAC3C,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,IAAI,mBAAmB,GAAG,CAAC,CAAC;AAC5B,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,SAAS,cAAc;IACrB,IAAI,YAAY;QAAE,OAAO;IAEzB,+DAA+D;IAC/D,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;QACrC,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,mBAAmB,EAAE,CAAC;gBACtB,IAAI,mBAAmB,IAAI,sBAAsB,EAAE,CAAC;oBAClD,OAAO,CAAC,KAAK,CAAC,yCAAyC,sBAAsB,6BAA6B,CAAC,CAAC;oBAC5G,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;oBACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,OAAO,CAAC,KAAK,CAAC,mDAAmD,IAAI,aAAa,mBAAmB,IAAI,sBAAsB,kBAAkB,CAAC,CAAC;YACrJ,CAAC;iBAAM,CAAC;gBACN,mBAAmB,GAAG,CAAC,CAAC,CAAC,2BAA2B;gBACpD,OAAO,CAAC,KAAK,CAAC,mDAAmD,IAAI,iBAAiB,CAAC,CAAC;YAC1F,CAAC;YACD,UAAU,GAAG,IAAI,CAAC;YAClB,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QAC7B,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB;IACvB,IAAI,YAAY;QAAE,OAAO;IAEzB,YAAY,GAAG,IAAI,CAAC;IAEpB,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAEhF,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE3B,wFAAwF;QACxF,UAAU,CAAC,GAAG,EAAE;YACd,UAAU,GAAG,IAAI,CAAC;YAClB,YAAY,GAAG,KAAK,CAAC;YACrB,cAAc,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACzE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,yDAAyD;IACrE,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,KAAK,CAAC;QACrB,cAAc,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,6BAA6B;AAC7B,cAAc,EAAE,CAAC;AAEjB,sCAAsC;AACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE;IACxC,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,IAAI;IAChB,gBAAgB,EAAE;QAChB,kBAAkB,EAAE,GAAG;QACvB,YAAY,EAAE,EAAE;KACjB;CACF,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;IAChC,OAAO,CAAC,KAAK,CAAC,yCAAyC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/F,gBAAgB,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE;IAC7B,OAAO,CAAC,KAAK,CAAC,uCAAuC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7F,gBAAgB,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,2BAA2B;AAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC1D,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}