frontmcp 0.12.2 → 1.0.0-beta.2

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 (264) hide show
  1. package/README.md +1 -1
  2. package/package.json +6 -5
  3. package/src/commands/build/bundler.js +1 -1
  4. package/src/commands/build/bundler.js.map +1 -1
  5. package/src/commands/build/exec/cli-runtime/cli-bundler.d.ts +17 -0
  6. package/src/commands/build/exec/cli-runtime/cli-bundler.js +75 -0
  7. package/src/commands/build/exec/cli-runtime/cli-bundler.js.map +1 -0
  8. package/src/commands/build/exec/cli-runtime/credential-store.d.ts +22 -0
  9. package/src/commands/build/exec/cli-runtime/credential-store.js +140 -0
  10. package/src/commands/build/exec/cli-runtime/credential-store.js.map +1 -0
  11. package/src/commands/build/exec/cli-runtime/daemon-client.d.ts +16 -0
  12. package/src/commands/build/exec/cli-runtime/daemon-client.js +169 -0
  13. package/src/commands/build/exec/cli-runtime/daemon-client.js.map +1 -0
  14. package/src/commands/build/exec/cli-runtime/generate-cli-entry.d.ts +37 -0
  15. package/src/commands/build/exec/cli-runtime/generate-cli-entry.js +1287 -0
  16. package/src/commands/build/exec/cli-runtime/generate-cli-entry.js.map +1 -0
  17. package/src/commands/build/exec/cli-runtime/index.d.ts +9 -0
  18. package/src/commands/build/exec/cli-runtime/index.js +32 -0
  19. package/src/commands/build/exec/cli-runtime/index.js.map +1 -0
  20. package/src/commands/build/exec/cli-runtime/oauth-helper.d.ts +9 -0
  21. package/src/commands/build/exec/cli-runtime/oauth-helper.js +224 -0
  22. package/src/commands/build/exec/cli-runtime/oauth-helper.js.map +1 -0
  23. package/src/commands/build/exec/cli-runtime/output-formatter.d.ts +46 -0
  24. package/src/commands/build/exec/cli-runtime/output-formatter.js +168 -0
  25. package/src/commands/build/exec/cli-runtime/output-formatter.js.map +1 -0
  26. package/src/commands/build/exec/cli-runtime/schema-extractor.d.ts +57 -0
  27. package/src/commands/build/exec/cli-runtime/schema-extractor.js +129 -0
  28. package/src/commands/build/exec/cli-runtime/schema-extractor.js.map +1 -0
  29. package/src/commands/build/exec/cli-runtime/schema-to-commander.d.ts +38 -0
  30. package/src/commands/build/exec/cli-runtime/schema-to-commander.js +172 -0
  31. package/src/commands/build/exec/cli-runtime/schema-to-commander.js.map +1 -0
  32. package/src/commands/build/exec/cli-runtime/session-manager.d.ts +16 -0
  33. package/src/commands/build/exec/cli-runtime/session-manager.js +122 -0
  34. package/src/commands/build/exec/cli-runtime/session-manager.js.map +1 -0
  35. package/src/commands/build/exec/config.d.ts +25 -0
  36. package/src/commands/build/exec/config.js +0 -1
  37. package/src/commands/build/exec/config.js.map +1 -1
  38. package/src/commands/build/exec/esbuild-bundler.d.ts +4 -1
  39. package/src/commands/build/exec/esbuild-bundler.js +28 -9
  40. package/src/commands/build/exec/esbuild-bundler.js.map +1 -1
  41. package/src/commands/build/exec/index.d.ts +7 -2
  42. package/src/commands/build/exec/index.js +159 -9
  43. package/src/commands/build/exec/index.js.map +1 -1
  44. package/src/commands/build/exec/manifest.d.ts +14 -0
  45. package/src/commands/build/exec/manifest.js.map +1 -1
  46. package/src/commands/build/exec/runner-script.d.ts +1 -1
  47. package/src/commands/build/exec/runner-script.js +48 -5
  48. package/src/commands/build/exec/runner-script.js.map +1 -1
  49. package/src/commands/build/exec/sea-builder.d.ts +18 -0
  50. package/src/commands/build/exec/sea-builder.js +81 -0
  51. package/src/commands/build/exec/sea-builder.js.map +1 -0
  52. package/src/commands/build/exec/setup.js +0 -2
  53. package/src/commands/build/exec/setup.js.map +1 -1
  54. package/src/commands/build/index.d.ts +1 -1
  55. package/src/commands/build/index.js +3 -3
  56. package/src/commands/build/index.js.map +1 -1
  57. package/src/commands/build/register.d.ts +2 -0
  58. package/src/commands/build/register.js +21 -0
  59. package/src/commands/build/register.js.map +1 -0
  60. package/src/commands/{dev.d.ts → dev/dev.d.ts} +1 -1
  61. package/src/commands/{dev.js → dev/dev.js} +3 -3
  62. package/src/commands/dev/dev.js.map +1 -0
  63. package/src/commands/{doctor.js → dev/doctor.js} +5 -4
  64. package/src/commands/dev/doctor.js.map +1 -0
  65. package/src/commands/{inspector.js → dev/inspector.js} +1 -1
  66. package/src/commands/dev/inspector.js.map +1 -0
  67. package/src/commands/dev/register.d.ts +2 -0
  68. package/src/commands/dev/register.js +49 -0
  69. package/src/commands/dev/register.js.map +1 -0
  70. package/src/commands/{test.d.ts → dev/test.d.ts} +1 -1
  71. package/src/commands/{test.js → dev/test.js} +5 -5
  72. package/src/commands/dev/test.js.map +1 -0
  73. package/src/commands/{configure.d.ts → package/configure.d.ts} +1 -1
  74. package/src/commands/{configure.js → package/configure.js} +3 -3
  75. package/src/commands/package/configure.js.map +1 -0
  76. package/src/commands/package/esm-update.d.ts +19 -0
  77. package/src/commands/package/esm-update.js +93 -0
  78. package/src/commands/package/esm-update.js.map +1 -0
  79. package/src/commands/{install/index.d.ts → package/install.d.ts} +1 -1
  80. package/src/commands/{install/index.js → package/install.js} +8 -5
  81. package/src/commands/package/install.js.map +1 -0
  82. package/src/commands/{install → package}/questionnaire.js +2 -2
  83. package/src/commands/{install → package}/questionnaire.js.map +1 -1
  84. package/src/commands/package/register.d.ts +2 -0
  85. package/src/commands/package/register.js +35 -0
  86. package/src/commands/package/register.js.map +1 -0
  87. package/src/commands/{install → package}/registry.js +8 -6
  88. package/src/commands/package/registry.js.map +1 -0
  89. package/src/commands/{install → package}/sources/git.js +8 -1
  90. package/src/commands/package/sources/git.js.map +1 -0
  91. package/src/commands/{install → package}/sources/local.js.map +1 -1
  92. package/src/commands/{install → package}/sources/npm.js.map +1 -1
  93. package/src/commands/{install → package}/types.d.ts +7 -1
  94. package/src/commands/{install → package}/types.js +4 -0
  95. package/src/commands/package/types.js.map +1 -0
  96. package/src/commands/{uninstall.d.ts → package/uninstall.d.ts} +1 -1
  97. package/src/commands/{uninstall.js → package/uninstall.js} +2 -2
  98. package/src/commands/package/uninstall.js.map +1 -0
  99. package/src/{pm/pm.format.d.ts → commands/pm/format.d.ts} +1 -1
  100. package/src/{pm/pm.format.js → commands/pm/format.js} +2 -2
  101. package/src/commands/pm/format.js.map +1 -0
  102. package/src/{pm/pm.health.js → commands/pm/health.js} +1 -1
  103. package/src/commands/pm/health.js.map +1 -0
  104. package/src/commands/pm/index.d.ts +9 -0
  105. package/src/{pm → commands/pm}/index.js +32 -32
  106. package/src/commands/pm/index.js.map +1 -0
  107. package/src/commands/{list.d.ts → pm/list.d.ts} +1 -1
  108. package/src/commands/{list.js → pm/list.js} +3 -3
  109. package/src/commands/pm/list.js.map +1 -0
  110. package/src/{pm/pm.logs.js → commands/pm/log-utils.js} +9 -9
  111. package/src/commands/pm/log-utils.js.map +1 -0
  112. package/src/commands/{logs.d.ts → pm/logs.d.ts} +1 -1
  113. package/src/commands/{logs.js → pm/logs.js} +6 -6
  114. package/src/commands/pm/logs.js.map +1 -0
  115. package/src/{pm/pm.manager.d.ts → commands/pm/manager.d.ts} +1 -1
  116. package/src/{pm/pm.manager.js → commands/pm/manager.js} +21 -21
  117. package/src/commands/pm/manager.js.map +1 -0
  118. package/src/{pm/pm.paths.d.ts → commands/pm/paths.d.ts} +1 -0
  119. package/src/{pm/pm.paths.js → commands/pm/paths.js} +2 -1
  120. package/src/commands/pm/paths.js.map +1 -0
  121. package/src/{pm/pm.pidfile.d.ts → commands/pm/pidfile.d.ts} +1 -1
  122. package/src/{pm/pm.pidfile.js → commands/pm/pidfile.js} +8 -8
  123. package/src/commands/pm/pidfile.js.map +1 -0
  124. package/src/commands/pm/register.d.ts +2 -0
  125. package/src/commands/pm/register.js +83 -0
  126. package/src/commands/pm/register.js.map +1 -0
  127. package/src/commands/{restart.d.ts → pm/restart.d.ts} +1 -1
  128. package/src/commands/{restart.js → pm/restart.js} +4 -4
  129. package/src/commands/pm/restart.js.map +1 -0
  130. package/src/{pm/pm.service.d.ts → commands/pm/service-gen.d.ts} +1 -1
  131. package/src/{pm/pm.service.js → commands/pm/service-gen.js} +5 -5
  132. package/src/commands/pm/service-gen.js.map +1 -0
  133. package/src/commands/{service.d.ts → pm/service.d.ts} +1 -1
  134. package/src/commands/{service.js → pm/service.js} +6 -6
  135. package/src/commands/pm/service.js.map +1 -0
  136. package/src/commands/{socket.d.ts → pm/socket.d.ts} +1 -1
  137. package/src/commands/{socket.js → pm/socket.js} +3 -3
  138. package/src/commands/pm/socket.js.map +1 -0
  139. package/src/{pm/pm.spawn.d.ts → commands/pm/spawn.d.ts} +1 -1
  140. package/src/{pm/pm.spawn.js → commands/pm/spawn.js} +15 -15
  141. package/src/commands/pm/spawn.js.map +1 -0
  142. package/src/commands/{start.d.ts → pm/start.d.ts} +1 -1
  143. package/src/commands/{start.js → pm/start.js} +6 -6
  144. package/src/commands/pm/start.js.map +1 -0
  145. package/src/commands/{status.d.ts → pm/status.d.ts} +1 -1
  146. package/src/commands/{status.js → pm/status.js} +5 -5
  147. package/src/commands/pm/status.js.map +1 -0
  148. package/src/commands/{stop.d.ts → pm/stop.d.ts} +1 -1
  149. package/src/commands/{stop.js → pm/stop.js} +3 -3
  150. package/src/commands/pm/stop.js.map +1 -0
  151. package/src/{pm/pm.types.js → commands/pm/types.js} +1 -1
  152. package/src/commands/pm/types.js.map +1 -0
  153. package/src/commands/{create.js → scaffold/create.js} +91 -20
  154. package/src/commands/scaffold/create.js.map +1 -0
  155. package/src/commands/scaffold/register.d.ts +2 -0
  156. package/src/commands/scaffold/register.js +28 -0
  157. package/src/commands/scaffold/register.js.map +1 -0
  158. package/src/{args.d.ts → core/args.d.ts} +7 -1
  159. package/src/{args.js → core/args.js} +8 -0
  160. package/src/core/args.js.map +1 -0
  161. package/src/core/bridge.d.ts +9 -0
  162. package/src/core/bridge.js +75 -0
  163. package/src/core/bridge.js.map +1 -0
  164. package/src/core/cli.d.ts +8 -0
  165. package/src/core/cli.js +23 -0
  166. package/src/core/cli.js.map +1 -0
  167. package/src/core/colors.js.map +1 -0
  168. package/src/core/help.d.ts +7 -0
  169. package/src/core/help.js +83 -0
  170. package/src/core/help.js.map +1 -0
  171. package/src/core/index.d.ts +7 -0
  172. package/src/core/index.js +22 -0
  173. package/src/core/index.js.map +1 -0
  174. package/src/core/program.d.ts +2 -0
  175. package/src/core/program.js +23 -0
  176. package/src/core/program.js.map +1 -0
  177. package/src/core/tsconfig.js.map +1 -0
  178. package/src/{version.js → core/version.js} +1 -1
  179. package/src/core/version.js.map +1 -0
  180. package/src/index.d.ts +1 -1
  181. package/src/index.js +2 -5
  182. package/src/index.js.map +1 -1
  183. package/src/{utils → shared}/env.js +2 -2
  184. package/src/shared/env.js.map +1 -0
  185. package/src/{utils → shared}/fs.js +2 -2
  186. package/src/shared/fs.js.map +1 -0
  187. package/src/shared/index.d.ts +3 -0
  188. package/src/shared/index.js +14 -0
  189. package/src/shared/index.js.map +1 -0
  190. package/src/shared/prompts.js.map +1 -0
  191. package/src/args.js.map +0 -1
  192. package/src/cli.d.ts +0 -5
  193. package/src/cli.js +0 -241
  194. package/src/cli.js.map +0 -1
  195. package/src/colors.js.map +0 -1
  196. package/src/commands/configure.js.map +0 -1
  197. package/src/commands/create.js.map +0 -1
  198. package/src/commands/dev.js.map +0 -1
  199. package/src/commands/doctor.js.map +0 -1
  200. package/src/commands/inspector.js.map +0 -1
  201. package/src/commands/install/index.js.map +0 -1
  202. package/src/commands/install/registry.js.map +0 -1
  203. package/src/commands/install/sources/git.js.map +0 -1
  204. package/src/commands/install/types.js.map +0 -1
  205. package/src/commands/list.js.map +0 -1
  206. package/src/commands/logs.js.map +0 -1
  207. package/src/commands/restart.js.map +0 -1
  208. package/src/commands/service.js.map +0 -1
  209. package/src/commands/socket.js.map +0 -1
  210. package/src/commands/start.js.map +0 -1
  211. package/src/commands/status.js.map +0 -1
  212. package/src/commands/stop.js.map +0 -1
  213. package/src/commands/template.d.ts +0 -13
  214. package/src/commands/template.js +0 -193
  215. package/src/commands/template.js.map +0 -1
  216. package/src/commands/test.js.map +0 -1
  217. package/src/commands/uninstall.js.map +0 -1
  218. package/src/pm/index.d.ts +0 -9
  219. package/src/pm/index.js.map +0 -1
  220. package/src/pm/pm.format.js.map +0 -1
  221. package/src/pm/pm.health.js.map +0 -1
  222. package/src/pm/pm.logs.js.map +0 -1
  223. package/src/pm/pm.manager.js.map +0 -1
  224. package/src/pm/pm.paths.js.map +0 -1
  225. package/src/pm/pm.pidfile.js.map +0 -1
  226. package/src/pm/pm.service.js.map +0 -1
  227. package/src/pm/pm.spawn.js.map +0 -1
  228. package/src/pm/pm.types.js.map +0 -1
  229. package/src/templates/3rd-party-integration/src/http-client.d.ts +0 -20
  230. package/src/templates/3rd-party-integration/src/http-client.js +0 -105
  231. package/src/templates/3rd-party-integration/src/http-client.js.map +0 -1
  232. package/src/templates/3rd-party-integration/src/mcp-http-types.d.ts +0 -63
  233. package/src/templates/3rd-party-integration/src/mcp-http-types.js +0 -52
  234. package/src/templates/3rd-party-integration/src/mcp-http-types.js.map +0 -1
  235. package/src/templates/3rd-party-integration/src/tools/example.list.d.ts +0 -45
  236. package/src/templates/3rd-party-integration/src/tools/example.list.js +0 -85
  237. package/src/templates/3rd-party-integration/src/tools/example.list.js.map +0 -1
  238. package/src/tsconfig.js.map +0 -1
  239. package/src/utils/env.js.map +0 -1
  240. package/src/utils/fs.js.map +0 -1
  241. package/src/utils/prompts.js.map +0 -1
  242. package/src/version.js.map +0 -1
  243. /package/src/commands/{doctor.d.ts → dev/doctor.d.ts} +0 -0
  244. /package/src/commands/{inspector.d.ts → dev/inspector.d.ts} +0 -0
  245. /package/src/commands/{install → package}/questionnaire.d.ts +0 -0
  246. /package/src/commands/{install → package}/registry.d.ts +0 -0
  247. /package/src/commands/{install → package}/sources/git.d.ts +0 -0
  248. /package/src/commands/{install → package}/sources/local.d.ts +0 -0
  249. /package/src/commands/{install → package}/sources/local.js +0 -0
  250. /package/src/commands/{install → package}/sources/npm.d.ts +0 -0
  251. /package/src/commands/{install → package}/sources/npm.js +0 -0
  252. /package/src/{pm/pm.health.d.ts → commands/pm/health.d.ts} +0 -0
  253. /package/src/{pm/pm.logs.d.ts → commands/pm/log-utils.d.ts} +0 -0
  254. /package/src/{pm/pm.types.d.ts → commands/pm/types.d.ts} +0 -0
  255. /package/src/commands/{create.d.ts → scaffold/create.d.ts} +0 -0
  256. /package/src/{colors.d.ts → core/colors.d.ts} +0 -0
  257. /package/src/{colors.js → core/colors.js} +0 -0
  258. /package/src/{tsconfig.d.ts → core/tsconfig.d.ts} +0 -0
  259. /package/src/{tsconfig.js → core/tsconfig.js} +0 -0
  260. /package/src/{version.d.ts → core/version.d.ts} +0 -0
  261. /package/src/{utils → shared}/env.d.ts +0 -0
  262. /package/src/{utils → shared}/fs.d.ts +0 -0
  263. /package/src/{utils → shared}/prompts.d.ts +0 -0
  264. /package/src/{utils → shared}/prompts.js +0 -0
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runStatus = runStatus;
4
- const colors_1 = require("../colors");
5
- const pm_1 = require("../pm");
4
+ const colors_1 = require("../../core/colors");
5
+ const _1 = require(".");
6
6
  async function runStatus(opts) {
7
7
  const name = opts._[1];
8
- const pm = new pm_1.ProcessManager();
8
+ const pm = new _1.ProcessManager();
9
9
  if (name) {
10
10
  // Show detail for a single process
11
11
  const info = pm.getProcessInfo(name);
@@ -13,12 +13,12 @@ async function runStatus(opts) {
13
13
  console.log((0, colors_1.c)('yellow', `No process found with name "${name}".`));
14
14
  return;
15
15
  }
16
- console.log((0, pm_1.formatProcessDetail)(info));
16
+ console.log((0, _1.formatProcessDetail)(info));
17
17
  }
18
18
  else {
19
19
  // Show summary of all processes
20
20
  const all = pm.listAll();
21
- console.log((0, pm_1.formatProcessTable)(all));
21
+ console.log((0, _1.formatProcessTable)(all));
22
22
  }
23
23
  }
24
24
  //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/commands/pm/status.ts"],"names":[],"mappings":";;AAIA,8BAiBC;AApBD,8CAAsC;AACtC,wBAA4E;AAErE,KAAK,UAAU,SAAS,CAAC,IAAgB;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,iBAAc,EAAE,CAAC;IAEhC,IAAI,IAAI,EAAE,CAAC;QACT,mCAAmC;QACnC,MAAM,IAAI,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,QAAQ,EAAE,+BAA+B,IAAI,IAAI,CAAC,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,IAAA,sBAAmB,EAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,gCAAgC;QAChC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,IAAA,qBAAkB,EAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;AACH,CAAC","sourcesContent":["import { ParsedArgs } from '../../core/args';\nimport { c } from '../../core/colors';\nimport { ProcessManager, formatProcessDetail, formatProcessTable } from '.';\n\nexport async function runStatus(opts: ParsedArgs): Promise<void> {\n const name = opts._[1];\n const pm = new ProcessManager();\n\n if (name) {\n // Show detail for a single process\n const info = pm.getProcessInfo(name);\n if (!info) {\n console.log(c('yellow', `No process found with name \"${name}\".`));\n return;\n }\n console.log(formatProcessDetail(info));\n } else {\n // Show summary of all processes\n const all = pm.listAll();\n console.log(formatProcessTable(all));\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
- import { ParsedArgs } from '../args';
1
+ import { ParsedArgs } from '../../core/args';
2
2
  export declare function runStop(opts: ParsedArgs): Promise<void>;
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runStop = runStop;
4
- const colors_1 = require("../colors");
5
- const pm_1 = require("../pm");
4
+ const colors_1 = require("../../core/colors");
5
+ const _1 = require(".");
6
6
  async function runStop(opts) {
7
7
  const name = opts._[1];
8
8
  if (!name) {
9
9
  throw new Error('Missing process name. Usage: frontmcp stop <name>');
10
10
  }
11
- const pm = new pm_1.ProcessManager();
11
+ const pm = new _1.ProcessManager();
12
12
  console.log(`${(0, colors_1.c)('cyan', '[pm]')} stopping "${name}"...`);
13
13
  await pm.stop(name, { force: opts.force });
14
14
  console.log(`${(0, colors_1.c)('green', '[pm]')} "${name}" stopped.`);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../../src/commands/pm/stop.ts"],"names":[],"mappings":";;AAIA,0BAWC;AAdD,8CAAsC;AACtC,wBAAmC;AAE5B,KAAK,UAAU,OAAO,CAAC,IAAgB;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,iBAAc,EAAE,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC;AAC1D,CAAC","sourcesContent":["import { ParsedArgs } from '../../core/args';\nimport { c } from '../../core/colors';\nimport { ProcessManager } from '.';\n\nexport async function runStop(opts: ParsedArgs): Promise<void> {\n const name = opts._[1];\n if (!name) {\n throw new Error('Missing process name. Usage: frontmcp stop <name>');\n }\n\n const pm = new ProcessManager();\n\n console.log(`${c('cyan', '[pm]')} stopping \"${name}\"...`);\n await pm.stop(name, { force: opts.force });\n console.log(`${c('green', '[pm]')} \"${name}\" stopped.`);\n}\n"]}
@@ -3,4 +3,4 @@
3
3
  * Process Manager types for FrontMCP CLI.
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- //# sourceMappingURL=pm.types.js.map
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/commands/pm/types.ts"],"names":[],"mappings":";AAAA;;GAEG","sourcesContent":["/**\n * Process Manager types for FrontMCP CLI.\n */\n\nexport interface PidFileData {\n pid: number;\n name: string;\n entry: string;\n port?: number;\n socketPath?: string;\n dbPath?: string;\n startedAt: string; // ISO 8601\n restartCount: number;\n supervisorPid: number;\n cliVersion: string;\n}\n\nexport interface StartOptions {\n name: string;\n entry: string;\n port?: number;\n socket?: boolean;\n socketPath?: string;\n dbPath?: string;\n maxRestarts?: number;\n env?: Record<string, string>;\n}\n\nexport interface ProcessInfo {\n name: string;\n pid: number;\n supervisorPid: number;\n status: 'running' | 'stopped' | 'dead';\n entry: string;\n port?: number;\n socketPath?: string;\n dbPath?: string;\n startedAt: string;\n restartCount: number;\n uptime: string;\n cliVersion: string;\n}\n\nexport interface StopOptions {\n force?: boolean;\n timeout?: number;\n}\n\nexport interface LogsOptions {\n follow?: boolean;\n lines?: number;\n}\n\nexport type ServicePlatform = 'launchd' | 'systemd';\n"]}
@@ -3,12 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runCreate = runCreate;
4
4
  const tslib_1 = require("tslib");
5
5
  const path = tslib_1.__importStar(require("path"));
6
+ const module_1 = require("module");
6
7
  const fs_1 = require("fs");
7
- const colors_1 = require("../colors");
8
+ const colors_1 = require("../../core/colors");
8
9
  const utils_1 = require("@frontmcp/utils");
9
- const tsconfig_1 = require("../tsconfig");
10
- const version_1 = require("../version");
11
- const prompts_1 = require("../utils/prompts");
10
+ const tsconfig_1 = require("../../core/tsconfig");
11
+ const version_1 = require("../../core/version");
12
+ const prompts_1 = require("../../shared/prompts");
12
13
  const PM_CONFIG = {
13
14
  npm: {
14
15
  lockfileCopy: 'COPY package*.json package-lock.json* ./',
@@ -207,7 +208,7 @@ const TEMPLATE_JEST_E2E_CONFIG = `
207
208
  export default {
208
209
  displayName: 'e2e',
209
210
  testEnvironment: 'node',
210
- testMatch: ['<rootDir>/e2e/**/*.e2e.test.ts'],
211
+ testMatch: ['<rootDir>/e2e/**/*.e2e.spec.ts'],
211
212
  testTimeout: 60000,
212
213
  setupFilesAfterEnv: ['@frontmcp/testing/setup'],
213
214
  transform: {
@@ -1015,6 +1016,17 @@ No additional secrets required - uses \`GITHUB_TOKEN\` for GHCR.
1015
1016
  └── tsconfig.e2e.json # TypeScript config for E2E tests
1016
1017
  \`\`\`
1017
1018
 
1019
+ ## Scaling to a Monorepo
1020
+
1021
+ To migrate to an Nx monorepo with multiple apps and shared libraries:
1022
+
1023
+ \`\`\`bash
1024
+ npx frontmcp create my-workspace --nx
1025
+ \`\`\`
1026
+
1027
+ This scaffolds an Nx workspace with generators for tools, resources, prompts, and more.
1028
+ See the [FrontMCP Nx Plugin docs](https://docs.agentfront.dev) for details.
1029
+
1018
1030
  ## Learn More
1019
1031
 
1020
1032
  - [FrontMCP Documentation](https://docs.agentfront.dev)
@@ -1034,17 +1046,70 @@ function getDefaults(projectArg) {
1034
1046
  packageManager: 'npm',
1035
1047
  };
1036
1048
  }
1049
+ function getInstallCommand(pm) {
1050
+ switch (pm) {
1051
+ case 'npm':
1052
+ return { cmd: 'npm', args: ['install'] };
1053
+ case 'yarn':
1054
+ return { cmd: 'yarn', args: ['install'] };
1055
+ case 'pnpm':
1056
+ return { cmd: 'pnpm', args: ['install'] };
1057
+ }
1058
+ }
1037
1059
  async function scaffoldNxWorkspace(projectName, flags) {
1060
+ const pm = flags?.pm ?? 'npm';
1061
+ const folder = sanitizeForFolder(projectName);
1062
+ const projectDir = path.resolve(process.cwd(), folder);
1063
+ // Validate target directory
1064
+ try {
1065
+ const s = await (0, utils_1.stat)(projectDir);
1066
+ if (!s.isDirectory()) {
1067
+ console.error((0, colors_1.c)('red', `Refusing to scaffold into non-directory path: ${path.relative(process.cwd(), projectDir)}`));
1068
+ console.log((0, colors_1.c)('gray', 'Pick a different project name or remove/rename the existing file.'));
1069
+ process.exit(1);
1070
+ }
1071
+ if (!(await (0, utils_1.isDirEmpty)(projectDir))) {
1072
+ console.error((0, colors_1.c)('red', `Refusing to scaffold into non-empty directory: ${path.relative(process.cwd(), projectDir)}`));
1073
+ console.log((0, colors_1.c)('gray', 'Pick a different name or start with an empty folder.'));
1074
+ process.exit(1);
1075
+ }
1076
+ }
1077
+ catch (e) {
1078
+ if (e && typeof e === 'object' && 'code' in e && e.code === 'ENOENT') {
1079
+ await (0, utils_1.ensureDir)(projectDir);
1080
+ }
1081
+ else {
1082
+ throw e;
1083
+ }
1084
+ }
1038
1085
  try {
1039
- const { FsTree } = await import('nx/src/generators/tree.js');
1040
- const { workspaceGenerator } = await import('@frontmcp/nx');
1041
- const { flushChanges } = await import('nx/src/generators/tree.js');
1086
+ // Step 1: Write bootstrap package.json with nx tooling
1087
+ const selfVersion = (0, version_1.getSelfVersion)();
1088
+ await (0, utils_1.writeJSON)(path.join(projectDir, 'package.json'), {
1089
+ name: folder,
1090
+ version: '0.0.1',
1091
+ private: true,
1092
+ devDependencies: {
1093
+ nx: '22.3.3',
1094
+ '@nx/devkit': '22.3.3',
1095
+ '@frontmcp/nx': `~${selfVersion}`,
1096
+ },
1097
+ });
1098
+ // Step 2: Install nx tooling
1099
+ console.log((0, colors_1.c)('cyan', `\nInstalling Nx tooling in ./${folder}...\n`));
1100
+ const install = getInstallCommand(pm);
1101
+ await (0, utils_1.runCmd)(install.cmd, install.args, { cwd: projectDir });
1102
+ // Step 3: Load nx and @frontmcp/nx from the installed location
1103
+ const localRequire = (0, module_1.createRequire)(path.join(projectDir, 'package.json'));
1104
+ const { FsTree, flushChanges } = localRequire('nx/src/generators/tree.js');
1105
+ const { workspaceGenerator } = localRequire('@frontmcp/nx');
1106
+ // Step 4: Run the workspace generator
1042
1107
  console.log((0, colors_1.c)('cyan', `\nScaffolding Nx monorepo: ${projectName}...\n`));
1043
1108
  const tree = new FsTree(process.cwd(), false);
1044
1109
  const callback = await workspaceGenerator(tree, {
1045
- name: projectName,
1046
- packageManager: flags?.pm ?? 'npm',
1047
- skipInstall: false,
1110
+ name: folder,
1111
+ packageManager: pm,
1112
+ skipInstall: true,
1048
1113
  skipGit: false,
1049
1114
  createSampleApp: true,
1050
1115
  });
@@ -1052,9 +1117,12 @@ async function scaffoldNxWorkspace(projectName, flags) {
1052
1117
  if (callback) {
1053
1118
  await callback();
1054
1119
  }
1055
- console.log((0, colors_1.c)('green', `\n✅ Nx monorepo created at ./${projectName}\n`));
1120
+ // Step 5: Install full project dependencies
1121
+ console.log((0, colors_1.c)('cyan', '\nInstalling project dependencies...\n'));
1122
+ await (0, utils_1.runCmd)(install.cmd, install.args, { cwd: projectDir });
1123
+ console.log((0, colors_1.c)('green', `\n✅ Nx monorepo created at ./${folder}\n`));
1056
1124
  console.log((0, colors_1.c)('dim', 'Next steps:'));
1057
- console.log((0, colors_1.c)('dim', ` cd ${projectName}`));
1125
+ console.log((0, colors_1.c)('dim', ` cd ${folder}`));
1058
1126
  console.log((0, colors_1.c)('dim', ' nx g @frontmcp/nx:app my-app # Add an app'));
1059
1127
  console.log((0, colors_1.c)('dim', ' nx g @frontmcp/nx:lib my-lib # Add a library'));
1060
1128
  console.log((0, colors_1.c)('dim', ' nx g @frontmcp/nx:tool my-tool # Add a tool to an app'));
@@ -1062,12 +1130,13 @@ async function scaffoldNxWorkspace(projectName, flags) {
1062
1130
  }
1063
1131
  catch (err) {
1064
1132
  const message = err instanceof Error ? err.message : String(err);
1065
- if (message.includes('Cannot find module') || message.includes('MODULE_NOT_FOUND')) {
1066
- console.error((0, colors_1.c)('red', '\n@frontmcp/nx is not installed.'));
1067
- console.log((0, colors_1.c)('dim', 'Install it first:'));
1068
- console.log((0, colors_1.c)('bold', ' npm install -D @frontmcp/nx nx @nx/devkit'));
1069
- console.log((0, colors_1.c)('dim', '\nThen retry:'));
1070
- console.log((0, colors_1.c)('bold', ` frontmcp create ${projectName} --nx`));
1133
+ if (message.includes('Cannot find module') ||
1134
+ message.includes('Cannot find package') ||
1135
+ message.includes('MODULE_NOT_FOUND')) {
1136
+ console.error((0, colors_1.c)('red', '\nFailed to install Nx tooling.'));
1137
+ console.log((0, colors_1.c)('dim', 'Check your network connection and try again.'));
1138
+ console.log((0, colors_1.c)('dim', 'You can also install manually:'));
1139
+ console.log((0, colors_1.c)('bold', ` cd ${folder} && ${pm} install`));
1071
1140
  }
1072
1141
  else {
1073
1142
  console.error((0, colors_1.c)('red', `\nFailed to scaffold Nx workspace: ${message}`));
@@ -1304,11 +1373,13 @@ async function scaffoldProject(options) {
1304
1373
  await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'src', 'calc.app.ts'), TEMPLATE_CALC_APP_TS);
1305
1374
  await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'src', 'tools', 'add.tool.ts'), TEMPLATE_ADD_TOOL_TS);
1306
1375
  // E2E scaffolding
1307
- await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'e2e', 'server.e2e.test.ts'), TEMPLATE_E2E_TEST_TS);
1376
+ await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'e2e', 'server.e2e.spec.ts'), TEMPLATE_E2E_TEST_TS);
1308
1377
  await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'jest.e2e.config.ts'), TEMPLATE_JEST_E2E_CONFIG);
1309
1378
  await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'tsconfig.e2e.json'), TEMPLATE_TSCONFIG_E2E);
1310
1379
  // Git configuration
1311
1380
  await scaffoldFileIfMissing(targetDir, path.join(targetDir, '.gitignore'), TEMPLATE_GITIGNORE);
1381
+ // Node version
1382
+ await scaffoldFileIfMissing(targetDir, path.join(targetDir, '.nvmrc'), '24\n');
1312
1383
  // Deployment-specific files
1313
1384
  await scaffoldDeploymentFiles(targetDir, options);
1314
1385
  // GitHub Actions
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/commands/scaffold/create.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'path';\nimport { createRequire } from 'module';\nimport { promises as fsp } from 'fs';\nimport { c } from '../../core/colors';\nimport { ensureDir, fileExists, isDirEmpty, writeJSON, readJSON, runCmd, stat } from '@frontmcp/utils';\nimport { runInit } from '../../core/tsconfig';\nimport { getSelfVersion } from '../../core/version';\nimport { clack } from '../../shared/prompts';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type DeploymentTarget = 'node' | 'vercel' | 'lambda' | 'cloudflare';\nexport type RedisSetup = 'docker' | 'existing' | 'none';\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm';\n\nexport interface CreateOptions {\n projectName: string;\n deploymentTarget: DeploymentTarget;\n redisSetup: RedisSetup;\n enableGitHubActions: boolean;\n packageManager: PackageManager;\n nxScaffolded?: boolean;\n}\n\nexport interface CreateFlags {\n yes?: boolean;\n target?: DeploymentTarget;\n redis?: RedisSetup;\n cicd?: boolean;\n pm?: PackageManager;\n nx?: boolean;\n}\n\ninterface PmConfig {\n lockfileCopy: string;\n installAll: string;\n pruneDevDeps: string;\n run: string;\n userInstall: string;\n ghCache: string;\n ghInstallCmd: string;\n engines: { node: string; npm?: string };\n}\n\nconst PM_CONFIG: Record<PackageManager, PmConfig> = {\n npm: {\n lockfileCopy: 'COPY package*.json package-lock.json* ./',\n installAll: 'RUN npm ci',\n pruneDevDeps: 'RUN npm prune --omit=dev',\n run: 'npm run',\n userInstall: 'npm install',\n ghCache: 'npm',\n ghInstallCmd: 'npm ci',\n engines: { node: '>=22', npm: '>=10' },\n },\n yarn: {\n lockfileCopy: 'COPY package.json yarn.lock* ./',\n installAll: 'RUN yarn install --frozen-lockfile',\n pruneDevDeps: 'RUN yarn install --frozen-lockfile --production',\n run: 'yarn',\n userInstall: 'yarn install',\n ghCache: 'yarn',\n ghInstallCmd: 'yarn install --frozen-lockfile',\n engines: { node: '>=22' },\n },\n pnpm: {\n lockfileCopy: 'COPY package.json pnpm-lock.yaml* ./',\n installAll: 'RUN pnpm install --frozen-lockfile',\n pruneDevDeps: 'RUN pnpm prune --prod',\n run: 'pnpm run',\n userInstall: 'pnpm install',\n ghCache: 'pnpm',\n ghInstallCmd: 'pnpm install --frozen-lockfile',\n engines: { node: '>=22' },\n },\n};\n\ninterface PackageJson {\n name?: string;\n version?: string;\n private?: boolean;\n type?: string;\n main?: string;\n scripts?: Record<string, string>;\n engines?: { node?: string; npm?: string };\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY === true;\n}\n\nfunction sanitizeForFolder(name: string): string {\n const seg = name.startsWith('@') && name.includes('/') ? name.split('/')[1] : name;\n return (\n seg\n .replace(/[^a-zA-Z0-9._-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase() || 'frontmcp-app'\n );\n}\n\nfunction sanitizeForNpm(name: string): string {\n if (name.startsWith('@') && name.includes('/')) {\n const [scope, pkg] = name.split('/');\n const s = scope.replace(/[^a-z0-9-]/gi, '').toLowerCase();\n const p = pkg.replace(/[^a-z0-9._-]/gi, '-').toLowerCase();\n return `@${s}/${p || 'frontmcp-app'}`;\n }\n return name.replace(/[^a-z0-9._-]/gi, '-').toLowerCase() || 'frontmcp-app';\n}\n\nfunction pkgNameFromCwd(cwd: string) {\n return (\n path\n .basename(cwd)\n .replace(/[^a-zA-Z0-9._-]/g, '-')\n .toLowerCase() || 'frontmcp-app'\n );\n}\n\nasync function scaffoldFileIfMissing(baseDir: string, p: string, content: string) {\n if (await fileExists(p)) {\n console.log(c('gray', `skip: ${path.relative(baseDir, p)} already exists`));\n return;\n }\n await ensureDir(path.dirname(p));\n await fsp.writeFile(p, content.replace(/^\\n/, ''), 'utf8');\n console.log(c('green', `✓ created ${path.relative(baseDir, p)}`));\n}\n\nconst TEMPLATE_MAIN_TS = `\nimport 'reflect-metadata';\nimport { FrontMcp } from '@frontmcp/sdk';\nimport { CalcApp } from './calc.app';\n\n@FrontMcp({\n info: { name: 'Demo 🚀', version: '0.1.0' },\n apps: [CalcApp],\n})\nexport default class Server {}\n`;\n\nconst TEMPLATE_CALC_APP_TS = `\nimport { App } from '@frontmcp/sdk';\nimport AddTool from './tools/add.tool';\n\n@App({\n id: 'calc',\n name: 'Calculator',\n tools: [AddTool],\n})\nexport class CalcApp {}\n`;\n\nconst TEMPLATE_ADD_TOOL_TS = `\nimport {Tool, ToolContext} from \"@frontmcp/sdk\";\nimport {z} from \"zod\";\n\n@Tool({\n name: 'add',\n description: 'Add two numbers',\n inputSchema: {a: z.number(), b: z.number()},\n outputSchema: {result: z.number()}\n})\nexport default class AddTool extends ToolContext {\n async execute(input: { a: number, b: number }) {\n return {\n result: input.a + input.b,\n };\n }\n}\n`;\n\nconst TEMPLATE_E2E_TEST_TS = `\nimport { test, expect } from '@frontmcp/testing';\n\ntest.describe('Server E2E', () => {\n test.use({\n server: './src/main.ts',\n port: 3100,\n });\n\n test('should connect and initialize', async ({ mcp }) => {\n expect(mcp.isConnected()).toBe(true);\n expect(mcp.serverInfo.name).toBeDefined();\n });\n\n test('should list tools', async ({ mcp }) => {\n const tools = await mcp.tools.list();\n expect(tools.length).toBeGreaterThanOrEqual(0);\n });\n\n test('should call add tool', async ({ mcp }) => {\n const result = await mcp.tools.call('add', { a: 2, b: 3 });\n expect(result).toBeSuccessful();\n });\n});\n`;\n\nconst TEMPLATE_GITIGNORE = `\n# Dependencies\nnode_modules/\n\n# Build output\ndist/\n*.tsbuildinfo\n\n# IDE\n.idea/\n.vscode/\n*.swp\n*.swo\n\n# OS files\n.DS_Store\nThumbs.db\n\n# Logs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Environment variables\n.env\n.env.local\n.env.*.local\n\n# FrontMCP development keys (contains private keys - never commit!)\n.frontmcp/\n\n# Coverage\ncoverage/\n\n# Test output\ntest-output/\n`;\n\nconst TEMPLATE_DOCKERIGNORE = `\nnode_modules\ndist\n.git\ncoverage\ntest-output\n*.tsbuildinfo\n.idea\n.vscode\n.DS_Store\nThumbs.db\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.env\n.env.local\n.env.*.local\n.frontmcp\ne2e\n*.md\nLICENSE\n`;\n\nconst TEMPLATE_JEST_E2E_CONFIG = `\n/* eslint-disable */\nexport default {\n displayName: 'e2e',\n testEnvironment: 'node',\n testMatch: ['<rootDir>/e2e/**/*.e2e.spec.ts'],\n testTimeout: 60000,\n setupFilesAfterEnv: ['@frontmcp/testing/setup'],\n transform: {\n '^.+\\\\\\\\.[tj]s$': [\n '@swc/jest',\n {\n jsc: {\n target: 'es2022',\n parser: {\n syntax: 'typescript',\n decorators: true,\n dynamicImport: true,\n },\n transform: {\n decoratorMetadata: true,\n legacyDecorator: true,\n },\n keepClassNames: true,\n externalHelpers: true,\n loose: true,\n },\n module: {\n type: 'es6',\n },\n sourceMaps: true,\n swcrc: false,\n },\n ],\n },\n moduleFileExtensions: ['ts', 'js', 'html'],\n transformIgnorePatterns: ['node_modules/(?!(jose)/)'],\n};\n`;\n\nconst TEMPLATE_TSCONFIG_E2E = `\n{\n \"extends\": \"./tsconfig.json\",\n \"compilerOptions\": {\n \"types\": [\"node\", \"jest\"]\n },\n \"include\": [\"e2e/**/*.ts\", \"jest.e2e.config.ts\"]\n}\n`;\n\nconst TEMPLATE_ENV_EXAMPLE = `\n# Application\nPORT=3000\nNODE_ENV=development\n\n# Redis (recommended for development, required for production)\nREDIS_HOST=localhost\nREDIS_PORT=6379\n# SECURITY: Set a strong password in production\nREDIS_PASSWORD=\nREDIS_DB=0\n\n# Optional: Redis TLS (enable for production)\nREDIS_TLS=false\n`;\n\nconst TEMPLATE_ENV_DOCKER = `\n# Docker-specific environment\n# Copy this to .env when running with docker compose\n\n# Application\nPORT=3000\nNODE_ENV=development\n\n# Redis - use 'redis' (service name) as host inside Docker network\nREDIS_HOST=redis\nREDIS_PORT=6379\n# SECURITY: Set a strong password in production\nREDIS_PASSWORD=\nREDIS_DB=0\nREDIS_TLS=false\n`;\n\nconst TEMPLATE_README = `\n# FrontMCP Server\n\nA TypeScript MCP server built with [FrontMCP](https://github.com/agentfront/frontmcp).\n\n## Quick Start\n\n\\`\\`\\`bash\n# Install dependencies\nnpm install\n\n# Start development server\nnpm run dev\n\n# Run MCP Inspector\nnpm run inspect\n\\`\\`\\`\n\n## Development with Docker\n\n### Prerequisites\n- Docker & Docker Compose installed\n\n### Quick Start\n\n\\`\\`\\`bash\n# Start Redis and app in development mode\ndocker compose up\n\n# Start only Redis (for local development)\ndocker compose up redis -d\n\n# Stop all services\ndocker compose down\n\\`\\`\\`\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| \\`PORT\\` | 3000 | Application port |\n| \\`NODE_ENV\\` | development | Environment mode |\n| \\`REDIS_HOST\\` | localhost | Redis host (use \\`redis\\` in Docker) |\n| \\`REDIS_PORT\\` | 6379 | Redis port |\n\n## Redis Configuration\n\n### Development\nRedis is **recommended** for development to enable caching and session persistence.\nUse the included \\`docker-compose.yml\\` to run Redis locally:\n\n\\`\\`\\`bash\ndocker compose up redis -d\n\\`\\`\\`\n\n### Production\nRedis is **required** in production for:\n- Session storage (multi-instance deployments)\n- Caching (performance optimization)\n- Rate limiting (if enabled)\n\nSee the [Redis Setup Guide](https://docs.agentfront.dev/docs/deployment/redis-setup) for production configuration.\n\n## Scripts\n\n| Script | Description |\n|--------|-------------|\n| \\`npm run dev\\` | Start development server with hot reload |\n| \\`npm run build\\` | Build for production |\n| \\`npm run inspect\\` | Launch MCP Inspector |\n| \\`npm run doctor\\` | Check project configuration |\n| \\`npm run test\\` | Run unit tests |\n| \\`npm run test:e2e\\` | Run E2E tests |\n\n## Project Structure\n\n\\`\\`\\`\n├── .env.example # Environment variables template\n├── .gitignore # Git ignore rules\n├── docker-compose.yml # Docker services config\n├── Dockerfile # Container build config\n├── e2e/ # E2E tests\n├── jest.e2e.config.ts # Jest E2E configuration\n├── package.json # Dependencies and scripts\n├── src/\n│ ├── main.ts # Server entry point\n│ ├── calc.app.ts # Example app\n│ └── tools/\n│ └── add.tool.ts # Example tool\n├── tsconfig.json # TypeScript config\n└── tsconfig.e2e.json # TypeScript config for E2E tests\n\\`\\`\\`\n\n## Learn More\n\n- [FrontMCP Documentation](https://docs.agentfront.dev)\n- [MCP Specification](https://modelcontextprotocol.io)\n`;\n\n// =============================================================================\n// Deployment Target Templates\n// =============================================================================\n\n// Docker templates (moved to ci/ folder)\nfunction generateDockerfile(pm: PackageManager): string {\n const cfg = PM_CONFIG[pm];\n const corepack = pm !== 'npm' ? '\\nRUN corepack enable\\n' : '';\n return `\n# Build stage\nFROM node:24-slim AS builder\n\nWORKDIR /app\n${corepack}\n# Install all dependencies (including devDependencies for build)\n${cfg.lockfileCopy}\n${cfg.installAll}\n\n# Copy source and build\nCOPY . .\nRUN ${cfg.run} build\n\n# Prune devDependencies so only production deps remain\n${cfg.pruneDevDeps}\n\n# Production stage\nFROM node:24-slim AS runner\n\nWORKDIR /app\nENV NODE_ENV=production\n\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/package.json ./\n\nEXPOSE 3000\n\nCMD [\"node\", \"dist/main.js\"]\n`;\n}\n\nfunction generateDockerComposeWithRedis(): string {\n return `\nservices:\n redis:\n image: redis:7-alpine\n ports:\n - '6379:6379'\n volumes:\n - redis-data:/data\n command: redis-server --appendonly yes\n healthcheck:\n test: ['CMD', 'redis-cli', 'ping']\n interval: 3s\n timeout: 5s\n retries: 3\n\n app:\n build:\n context: ..\n dockerfile: ci/Dockerfile\n ports:\n - '\\${PORT:-3000}:3000'\n environment:\n - NODE_ENV=\\${NODE_ENV:-development}\n - PORT=\\${PORT:-3000}\n - REDIS_HOST=redis\n - REDIS_PORT=6379\n depends_on:\n redis:\n condition: service_healthy\n\nvolumes:\n redis-data:\n`;\n}\n\nfunction generateDockerComposeNoRedis(): string {\n return `\nservices:\n app:\n build:\n context: ..\n dockerfile: ci/Dockerfile\n ports:\n - '\\${PORT:-3000}:3000'\n environment:\n - NODE_ENV=\\${NODE_ENV:-development}\n - PORT=\\${PORT:-3000}\n`;\n}\n\nconst TEMPLATE_ENV_DOCKER_CI = `\n# Docker-specific environment\n# Use with: docker compose -f ci/docker-compose.yml --env-file ci/.env.docker up\n\n# Application\nPORT=3000\nNODE_ENV=development\n\n# Redis - use 'redis' (service name) as host inside Docker network\nREDIS_HOST=redis\nREDIS_PORT=6379\n# SECURITY: Set a strong password in production\nREDIS_PASSWORD=\nREDIS_DB=0\nREDIS_TLS=false\n`;\n\n// Vercel template\nconst TEMPLATE_VERCEL_JSON = (projectName: string) =>\n JSON.stringify(\n {\n $schema: 'https://openapi.vercel.sh/vercel.json',\n name: projectName,\n version: 2,\n builds: [\n {\n src: 'dist/main.js',\n use: '@vercel/node',\n },\n ],\n routes: [\n {\n src: '/(.*)',\n dest: '/dist/main.js',\n },\n ],\n env: {\n NODE_ENV: 'production',\n },\n },\n null,\n 2,\n );\n\n// AWS Lambda SAM template\nconst TEMPLATE_SAM_YAML = (projectName: string) => `\nAWSTemplateFormatVersion: '2010-09-09'\nTransform: AWS::Serverless-2016-10-31\nDescription: ${projectName} - FrontMCP Lambda Function\n\nGlobals:\n Function:\n Timeout: 30\n Runtime: nodejs22.x\n MemorySize: 256\n\nResources:\n FrontMCPFunction:\n Type: AWS::Serverless::Function\n Properties:\n CodeUri: ../dist/\n Handler: main.handler\n Events:\n ApiEvent:\n Type: HttpApi\n Properties:\n Path: /{proxy+}\n Method: ANY\n\nOutputs:\n ApiEndpoint:\n Description: API Gateway endpoint URL\n Value: !Sub \"https://\\${ServerlessHttpApi}.execute-api.\\${AWS::Region}.amazonaws.com\"\n`;\n\n// Cloudflare Workers template\nconst TEMPLATE_WRANGLER_TOML = (projectName: string) => `\nname = \"${projectName}\"\nmain = \"dist/main.js\"\ncompatibility_date = \"2024-01-01\"\n\n[vars]\nNODE_ENV = \"production\"\n\n# Uncomment to enable KV namespace for caching\n# [[kv_namespaces]]\n# binding = \"CACHE\"\n# id = \"your-kv-namespace-id\"\n`;\n\n// =============================================================================\n// GitHub Actions Templates\n// =============================================================================\n\nfunction generatePmSetupSteps(pm: PackageManager): string {\n const cfg = PM_CONFIG[pm];\n if (pm === 'pnpm') {\n return `\n - name: Setup pnpm\n uses: pnpm/action-setup@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '24'\n cache: '${cfg.ghCache}'\n\n - name: Install dependencies\n run: ${cfg.ghInstallCmd}`;\n }\n return `\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '24'\n cache: '${cfg.ghCache}'\n\n - name: Install dependencies\n run: ${cfg.ghInstallCmd}`;\n}\n\nfunction generateGhCi(pm: PackageManager): string {\n const cfg = PM_CONFIG[pm];\n return `\nname: CI\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\njobs:\n lint-and-test:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v4\n${generatePmSetupSteps(pm)}\n\n - name: Type check\n run: npx tsc --noEmit\n\n - name: Run tests\n run: ${cfg.run} test\n`;\n}\n\nfunction generateGhE2e(pm: PackageManager): string {\n const cfg = PM_CONFIG[pm];\n return `\nname: E2E Tests\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\njobs:\n e2e:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v4\n${generatePmSetupSteps(pm)}\n\n - name: Build\n run: ${cfg.run} build\n\n - name: Run E2E tests\n run: ${cfg.run} test:e2e\n`;\n}\n\nconst TEMPLATE_GH_DEPLOY_DOCKER = `\nname: Build and Push Docker Image\n\non:\n push:\n branches: [main]\n tags: ['v*']\n\nenv:\n REGISTRY: ghcr.io\n IMAGE_NAME: \\${{ github.repository }}\n\njobs:\n build-and-push:\n runs-on: ubuntu-latest\n permissions:\n contents: read\n packages: write\n\n steps:\n - uses: actions/checkout@v4\n\n - name: Log in to Container Registry\n uses: docker/login-action@v3\n with:\n registry: \\${{ env.REGISTRY }}\n username: \\${{ github.actor }}\n password: \\${{ secrets.GITHUB_TOKEN }}\n\n - name: Extract metadata\n id: meta\n uses: docker/metadata-action@v5\n with:\n images: \\${{ env.REGISTRY }}/\\${{ env.IMAGE_NAME }}\n\n - name: Build and push\n uses: docker/build-push-action@v5\n with:\n context: .\n file: ./ci/Dockerfile\n push: true\n tags: \\${{ steps.meta.outputs.tags }}\n labels: \\${{ steps.meta.outputs.labels }}\n`;\n\nfunction generateGhDeployVercel(pm: PackageManager): string {\n const cfg = PM_CONFIG[pm];\n return `\nname: Deploy to Vercel\n\non:\n push:\n branches: [main]\n\njobs:\n deploy:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v4\n${generatePmSetupSteps(pm)}\n\n - name: Build\n run: ${cfg.run} build\n\n - name: Deploy to Vercel\n uses: amondnet/vercel-action@v25\n with:\n vercel-token: \\${{ secrets.VERCEL_TOKEN }}\n vercel-org-id: \\${{ secrets.VERCEL_ORG_ID }}\n vercel-project-id: \\${{ secrets.VERCEL_PROJECT_ID }}\n vercel-args: '--prod'\n`;\n}\n\nfunction generateGhDeployLambda(pm: PackageManager): string {\n const cfg = PM_CONFIG[pm];\n return `\nname: Deploy to AWS Lambda\n\non:\n push:\n branches: [main]\n\njobs:\n deploy:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v4\n${generatePmSetupSteps(pm)}\n\n - name: Build\n run: ${cfg.run} build\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n aws-access-key-id: \\${{ secrets.AWS_ACCESS_KEY_ID }}\n aws-secret-access-key: \\${{ secrets.AWS_SECRET_ACCESS_KEY }}\n aws-region: \\${{ secrets.AWS_REGION }}\n\n - name: Setup SAM\n uses: aws-actions/setup-sam@v2\n\n - name: Deploy with SAM\n run: |\n cd ci\n sam build\n sam deploy --no-confirm-changeset --no-fail-on-empty-changeset\n`;\n}\n\nfunction generateGhDeployCloudflare(pm: PackageManager): string {\n const cfg = PM_CONFIG[pm];\n return `\nname: Deploy to Cloudflare Workers\n\non:\n push:\n branches: [main]\n\njobs:\n deploy:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v4\n${generatePmSetupSteps(pm)}\n\n - name: Build\n run: ${cfg.run} build\n\n - name: Deploy to Cloudflare\n uses: cloudflare/wrangler-action@v3\n with:\n apiToken: \\${{ secrets.CLOUDFLARE_API_TOKEN }}\n`;\n}\n\n// =============================================================================\n// Dynamic README Templates\n// =============================================================================\n\nfunction generateReadme(options: CreateOptions): string {\n const { projectName, deploymentTarget, redisSetup, enableGitHubActions, packageManager } = options;\n const cfg = PM_CONFIG[packageManager];\n\n let readme = `# ${projectName}\n\nA TypeScript MCP server built with [FrontMCP](https://github.com/agentfront/frontmcp).\n`;\n\n // Add CI badge if GitHub Actions enabled\n if (enableGitHubActions) {\n readme += `\n![CI](https://github.com/YOUR_USERNAME/${projectName}/actions/workflows/ci.yml/badge.svg)\n`;\n }\n\n readme += `\n## Quick Start\n\n\\`\\`\\`bash\n# Install dependencies\n${cfg.userInstall}\n\n# Start development server\n${cfg.run} dev\n\n# Run MCP Inspector\n${cfg.run} inspect\n\\`\\`\\`\n`;\n\n // Deployment-specific sections\n if (deploymentTarget === 'node') {\n readme += `\n## Docker Development\n\n\\`\\`\\`bash\n# Start all services${redisSetup === 'docker' ? ' (includes Redis)' : ''}\n${cfg.run} docker:up\n\n# Stop all services\n${cfg.run} docker:down\n\n# Rebuild Docker image\n${cfg.run} docker:build\n\\`\\`\\`\n`;\n\n if (redisSetup === 'docker') {\n readme += `\n### Redis\n\nRedis is included in the Docker Compose setup. For local development without Docker:\n\n\\`\\`\\`bash\n# Start only Redis\ndocker compose -f ci/docker-compose.yml up redis -d\n\\`\\`\\`\n`;\n }\n\n readme += `\n## Production Deployment\n\nBuild and push the Docker image:\n\n\\`\\`\\`bash\ndocker build -f ci/Dockerfile -t ${projectName}:latest .\ndocker push your-registry/${projectName}:latest\n\\`\\`\\`\n`;\n }\n\n if (deploymentTarget === 'vercel') {\n readme += `\n## Deploy to Vercel\n\n\\`\\`\\`bash\n# Build for production\n${cfg.run} build\n\n# Deploy using Vercel CLI\nnpx vercel --prod\n\\`\\`\\`\n\nOr connect your repository to Vercel for automatic deployments.\n`;\n }\n\n if (deploymentTarget === 'lambda') {\n readme += `\n## Deploy to AWS Lambda\n\n\\`\\`\\`bash\n# Build the project\n${cfg.run} build\n\n# Deploy using AWS SAM\n${cfg.run} deploy\n\\`\\`\\`\n\n### Prerequisites\n\n- AWS CLI configured with appropriate credentials\n- AWS SAM CLI installed (\\`brew install aws-sam-cli\\` or \\`pip install aws-sam-cli\\`)\n`;\n }\n\n if (deploymentTarget === 'cloudflare') {\n readme += `\n## Deploy to Cloudflare Workers\n\n\\`\\`\\`bash\n# Build the project\n${cfg.run} build\n\n# Deploy using Wrangler\n${cfg.run} deploy\n\\`\\`\\`\n\n### Prerequisites\n\n- Wrangler CLI installed (\\`npm install -g wrangler\\`)\n- Cloudflare account configured (\\`wrangler login\\`)\n`;\n }\n\n // Environment variables section\n readme += `\n## Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| \\`PORT\\` | 3000 | Application port |\n| \\`NODE_ENV\\` | development | Environment mode |\n`;\n\n if (deploymentTarget === 'node' && redisSetup !== 'none') {\n readme += `| \\`REDIS_HOST\\` | localhost | Redis host (use \\`redis\\` in Docker) |\n| \\`REDIS_PORT\\` | 6379 | Redis port |\n| \\`REDIS_PASSWORD\\` | - | Redis password (set in production) |\n`;\n }\n\n // GitHub Actions section\n if (enableGitHubActions) {\n readme += `\n## CI/CD\n\nThis project includes GitHub Actions workflows:\n\n- **ci.yml**: Runs on every push/PR - type checking and tests\n- **e2e.yml**: Runs E2E tests\n- **deploy.yml**: Deploys to ${\n deploymentTarget === 'node'\n ? 'GitHub Container Registry'\n : deploymentTarget === 'vercel'\n ? 'Vercel'\n : deploymentTarget === 'lambda'\n ? 'AWS Lambda'\n : 'Cloudflare Workers'\n }\n\n### Required Secrets\n`;\n\n if (deploymentTarget === 'vercel') {\n readme += `\n- \\`VERCEL_TOKEN\\`: Vercel API token\n- \\`VERCEL_ORG_ID\\`: Vercel organization ID\n- \\`VERCEL_PROJECT_ID\\`: Vercel project ID\n`;\n } else if (deploymentTarget === 'lambda') {\n readme += `\n- \\`AWS_ACCESS_KEY_ID\\`: AWS access key\n- \\`AWS_SECRET_ACCESS_KEY\\`: AWS secret key\n- \\`AWS_REGION\\`: AWS region (e.g., us-east-1)\n`;\n } else if (deploymentTarget === 'cloudflare') {\n readme += `\n- \\`CLOUDFLARE_API_TOKEN\\`: Cloudflare API token with Workers permissions\n`;\n } else {\n readme += `\nNo additional secrets required - uses \\`GITHUB_TOKEN\\` for GHCR.\n`;\n }\n }\n\n readme += `\n## Scripts\n\n| Script | Description |\n|--------|-------------|\n| \\`${cfg.run} dev\\` | Start development server with hot reload |\n| \\`${cfg.run} build\\` | Build for production |\n| \\`${cfg.run} inspect\\` | Launch MCP Inspector |\n| \\`${cfg.run} doctor\\` | Check project configuration |\n| \\`${cfg.run} test\\` | Run unit tests |\n| \\`${cfg.run} test:e2e\\` | Run E2E tests |\n`;\n\n if (deploymentTarget === 'node') {\n readme += `| \\`${cfg.run} docker:up\\` | Start Docker services |\n| \\`${cfg.run} docker:down\\` | Stop Docker services |\n| \\`${cfg.run} docker:build\\` | Rebuild Docker image |\n`;\n }\n\n if (deploymentTarget === 'lambda' || deploymentTarget === 'cloudflare') {\n readme += `| \\`${cfg.run} deploy\\` | Deploy to ${deploymentTarget === 'lambda' ? 'AWS Lambda' : 'Cloudflare Workers'} |\n`;\n }\n\n readme += `\n## Project Structure\n\n\\`\\`\\`\n`;\n\n // Dynamic project structure based on options\n readme += `├── .env.example # Environment variables template\n├── .gitignore # Git ignore rules\n`;\n\n if (deploymentTarget === 'node') {\n readme += `├── .dockerignore # Docker build context exclusions\n├── ci/\n│ ├── Dockerfile # Container build config\n│ ├── docker-compose.yml # Docker services config\n│ └── .env.docker # Docker-specific env vars\n`;\n }\n\n if (deploymentTarget === 'vercel') {\n readme += `├── vercel.json # Vercel deployment config\n`;\n }\n\n if (deploymentTarget === 'lambda') {\n readme += `├── ci/\n│ └── template.yaml # AWS SAM template\n`;\n }\n\n if (deploymentTarget === 'cloudflare') {\n readme += `├── wrangler.toml # Cloudflare Workers config\n`;\n }\n\n if (enableGitHubActions) {\n readme += `├── .github/workflows/\n│ ├── ci.yml # CI workflow\n│ ├── e2e.yml # E2E test workflow\n│ └── deploy.yml # Deployment workflow\n`;\n }\n\n readme += `├── e2e/ # E2E tests\n├── jest.e2e.config.ts # Jest E2E configuration\n├── package.json # Dependencies and scripts\n├── src/\n│ ├── main.ts # Server entry point\n│ ├── calc.app.ts # Example app\n│ └── tools/\n│ └── add.tool.ts # Example tool\n├── tsconfig.json # TypeScript config\n└── tsconfig.e2e.json # TypeScript config for E2E tests\n\\`\\`\\`\n\n## Scaling to a Monorepo\n\nTo migrate to an Nx monorepo with multiple apps and shared libraries:\n\n\\`\\`\\`bash\nnpx frontmcp create my-workspace --nx\n\\`\\`\\`\n\nThis scaffolds an Nx workspace with generators for tools, resources, prompts, and more.\nSee the [FrontMCP Nx Plugin docs](https://docs.agentfront.dev) for details.\n\n## Learn More\n\n- [FrontMCP Documentation](https://docs.agentfront.dev)\n- [MCP Specification](https://modelcontextprotocol.io)\n`;\n\n return readme;\n}\n\n// =============================================================================\n// Scaffolding Functions\n// =============================================================================\n\nfunction getDefaults(projectArg?: string): CreateOptions {\n return {\n projectName: projectArg || 'frontmcp-app',\n deploymentTarget: 'node',\n redisSetup: 'docker',\n enableGitHubActions: true,\n packageManager: 'npm',\n };\n}\n\nfunction getInstallCommand(pm: PackageManager): { cmd: string; args: string[] } {\n switch (pm) {\n case 'npm':\n return { cmd: 'npm', args: ['install'] };\n case 'yarn':\n return { cmd: 'yarn', args: ['install'] };\n case 'pnpm':\n return { cmd: 'pnpm', args: ['install'] };\n }\n}\n\nasync function scaffoldNxWorkspace(projectName: string, flags?: CreateFlags): Promise<void> {\n const pm = flags?.pm ?? 'npm';\n const folder = sanitizeForFolder(projectName);\n const projectDir = path.resolve(process.cwd(), folder);\n\n // Validate target directory\n try {\n const s = await stat(projectDir);\n if (!s.isDirectory()) {\n console.error(\n c('red', `Refusing to scaffold into non-directory path: ${path.relative(process.cwd(), projectDir)}`),\n );\n console.log(c('gray', 'Pick a different project name or remove/rename the existing file.'));\n process.exit(1);\n }\n if (!(await isDirEmpty(projectDir))) {\n console.error(\n c('red', `Refusing to scaffold into non-empty directory: ${path.relative(process.cwd(), projectDir)}`),\n );\n console.log(c('gray', 'Pick a different name or start with an empty folder.'));\n process.exit(1);\n }\n } catch (e: unknown) {\n if (e && typeof e === 'object' && 'code' in e && e.code === 'ENOENT') {\n await ensureDir(projectDir);\n } else {\n throw e;\n }\n }\n\n try {\n // Step 1: Write bootstrap package.json with nx tooling\n const selfVersion = getSelfVersion();\n await writeJSON(path.join(projectDir, 'package.json'), {\n name: folder,\n version: '0.0.1',\n private: true,\n devDependencies: {\n nx: '22.3.3',\n '@nx/devkit': '22.3.3',\n '@frontmcp/nx': `~${selfVersion}`,\n },\n });\n\n // Step 2: Install nx tooling\n console.log(c('cyan', `\\nInstalling Nx tooling in ./${folder}...\\n`));\n const install = getInstallCommand(pm);\n await runCmd(install.cmd, install.args, { cwd: projectDir });\n\n // Step 3: Load nx and @frontmcp/nx from the installed location\n const localRequire = createRequire(path.join(projectDir, 'package.json'));\n const { FsTree, flushChanges } = localRequire('nx/src/generators/tree.js');\n const { workspaceGenerator } = localRequire('@frontmcp/nx');\n\n // Step 4: Run the workspace generator\n console.log(c('cyan', `\\nScaffolding Nx monorepo: ${projectName}...\\n`));\n const tree = new FsTree(process.cwd(), false);\n const callback = await workspaceGenerator(tree, {\n name: folder,\n packageManager: pm,\n skipInstall: true,\n skipGit: false,\n createSampleApp: true,\n });\n\n flushChanges(tree.root, tree.listChanges());\n\n if (callback) {\n await callback();\n }\n\n // Step 5: Install full project dependencies\n console.log(c('cyan', '\\nInstalling project dependencies...\\n'));\n await runCmd(install.cmd, install.args, { cwd: projectDir });\n\n console.log(c('green', `\\n✅ Nx monorepo created at ./${folder}\\n`));\n console.log(c('dim', 'Next steps:'));\n console.log(c('dim', ` cd ${folder}`));\n console.log(c('dim', ' nx g @frontmcp/nx:app my-app # Add an app'));\n console.log(c('dim', ' nx g @frontmcp/nx:lib my-lib # Add a library'));\n console.log(c('dim', ' nx g @frontmcp/nx:tool my-tool # Add a tool to an app'));\n console.log(c('dim', ' nx dev demo # Start dev server'));\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n if (\n message.includes('Cannot find module') ||\n message.includes('Cannot find package') ||\n message.includes('MODULE_NOT_FOUND')\n ) {\n console.error(c('red', '\\nFailed to install Nx tooling.'));\n console.log(c('dim', 'Check your network connection and try again.'));\n console.log(c('dim', 'You can also install manually:'));\n console.log(c('bold', ` cd ${folder} && ${pm} install`));\n } else {\n console.error(c('red', `\\nFailed to scaffold Nx workspace: ${message}`));\n }\n process.exit(1);\n }\n}\n\nasync function collectOptions(projectArg?: string, flags?: CreateFlags): Promise<CreateOptions> {\n const p = await clack();\n\n // Project name\n let projectName = projectArg;\n if (!projectName) {\n const result = await p.text({\n message: 'Project name',\n validate: (val) => {\n if (!val.trim()) return 'Project name is required';\n return undefined;\n },\n });\n if (p.isCancel(result)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n projectName = result;\n }\n\n if (!flags?.yes) {\n const projectType = await p.select({\n message: 'Project type',\n options: [\n { label: 'Standalone project (recommended)', value: 'standalone' as const },\n { label: 'Nx monorepo (advanced)', value: 'nx' as const },\n ],\n initialValue: 'standalone' as const,\n });\n if (p.isCancel(projectType)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n if (projectType === 'nx') {\n await scaffoldNxWorkspace(projectName, flags);\n return {\n projectName,\n deploymentTarget: 'node',\n redisSetup: 'none',\n enableGitHubActions: false,\n packageManager: flags?.pm ?? 'npm',\n nxScaffolded: true,\n };\n }\n }\n\n // Deployment target\n let deploymentTarget = flags?.target;\n if (!deploymentTarget) {\n const result = await p.select({\n message: 'Select deployment target',\n options: [\n { label: 'Node.js (Docker) - Recommended for production', value: 'node' as DeploymentTarget },\n { label: 'Vercel (Serverless)', value: 'vercel' as DeploymentTarget },\n { label: 'AWS Lambda', value: 'lambda' as DeploymentTarget },\n { label: 'Cloudflare Workers', value: 'cloudflare' as DeploymentTarget },\n ],\n initialValue: 'node' as DeploymentTarget,\n });\n if (p.isCancel(result)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n deploymentTarget = result;\n }\n\n // Redis setup (only for Node.js/Docker)\n let redisSetup: RedisSetup = 'none';\n if (deploymentTarget === 'node') {\n if (flags?.redis) {\n redisSetup = flags.redis;\n } else {\n const result = await p.select({\n message: 'Redis setup',\n options: [\n { label: 'Docker Compose (recommended for development)', value: 'docker' as RedisSetup },\n { label: 'Existing Redis (I have my own Redis)', value: 'existing' as RedisSetup },\n { label: 'None (skip Redis)', value: 'none' as RedisSetup },\n ],\n initialValue: 'docker' as RedisSetup,\n });\n if (p.isCancel(result)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n redisSetup = result;\n }\n }\n\n // Package manager\n let packageManager = flags?.pm;\n if (!packageManager) {\n const result = await p.select({\n message: 'Package manager',\n options: [\n { label: 'npm (default)', value: 'npm' as PackageManager },\n { label: 'yarn', value: 'yarn' as PackageManager },\n { label: 'pnpm', value: 'pnpm' as PackageManager },\n ],\n initialValue: 'npm' as PackageManager,\n });\n if (p.isCancel(result)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n packageManager = result;\n }\n\n // GitHub Actions\n let enableGitHubActions = flags?.cicd;\n if (enableGitHubActions === undefined) {\n const result = await p.confirm({\n message: 'Set up GitHub Actions CI/CD?',\n initialValue: true,\n });\n if (p.isCancel(result)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n enableGitHubActions = result;\n }\n\n return {\n projectName,\n deploymentTarget,\n redisSetup,\n enableGitHubActions,\n packageManager,\n };\n}\n\nasync function scaffoldDeploymentFiles(targetDir: string, options: CreateOptions): Promise<void> {\n const { deploymentTarget, redisSetup, projectName } = options;\n\n switch (deploymentTarget) {\n case 'node': {\n const ciDir = path.join(targetDir, 'ci');\n await ensureDir(ciDir);\n await scaffoldFileIfMissing(\n targetDir,\n path.join(ciDir, 'Dockerfile'),\n generateDockerfile(options.packageManager),\n );\n\n const dockerCompose = redisSetup === 'docker' ? generateDockerComposeWithRedis() : generateDockerComposeNoRedis();\n await scaffoldFileIfMissing(targetDir, path.join(ciDir, 'docker-compose.yml'), dockerCompose);\n await scaffoldFileIfMissing(targetDir, path.join(ciDir, '.env.docker'), TEMPLATE_ENV_DOCKER_CI);\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, '.dockerignore'), TEMPLATE_DOCKERIGNORE);\n break;\n }\n\n case 'vercel':\n await scaffoldFileIfMissing(\n targetDir,\n path.join(targetDir, 'vercel.json'),\n TEMPLATE_VERCEL_JSON(sanitizeForFolder(projectName)),\n );\n break;\n\n case 'lambda': {\n const ciDir = path.join(targetDir, 'ci');\n await ensureDir(ciDir);\n await scaffoldFileIfMissing(targetDir, path.join(ciDir, 'template.yaml'), TEMPLATE_SAM_YAML(projectName));\n break;\n }\n\n case 'cloudflare':\n await scaffoldFileIfMissing(\n targetDir,\n path.join(targetDir, 'wrangler.toml'),\n TEMPLATE_WRANGLER_TOML(sanitizeForFolder(projectName)),\n );\n break;\n }\n\n // Always create .env.example at root\n const envExample =\n deploymentTarget === 'node' && redisSetup !== 'none' ? TEMPLATE_ENV_EXAMPLE : TEMPLATE_ENV_EXAMPLE_BASIC;\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, '.env.example'), envExample);\n}\n\n// Basic .env.example without Redis\nconst TEMPLATE_ENV_EXAMPLE_BASIC = `\n# Application\nPORT=3000\nNODE_ENV=development\n`;\n\nasync function scaffoldGitHubActions(\n targetDir: string,\n deploymentTarget: DeploymentTarget,\n pm: PackageManager,\n): Promise<void> {\n const workflowDir = path.join(targetDir, '.github', 'workflows');\n await ensureDir(workflowDir);\n\n // Always create CI and E2E workflows\n await scaffoldFileIfMissing(targetDir, path.join(workflowDir, 'ci.yml'), generateGhCi(pm));\n await scaffoldFileIfMissing(targetDir, path.join(workflowDir, 'e2e.yml'), generateGhE2e(pm));\n\n // Create deployment workflow based on target\n const deployTemplate = getDeployWorkflowTemplate(deploymentTarget, pm);\n await scaffoldFileIfMissing(targetDir, path.join(workflowDir, 'deploy.yml'), deployTemplate);\n}\n\nfunction getDeployWorkflowTemplate(target: DeploymentTarget, pm: PackageManager): string {\n switch (target) {\n case 'node':\n return TEMPLATE_GH_DEPLOY_DOCKER;\n case 'vercel':\n return generateGhDeployVercel(pm);\n case 'lambda':\n return generateGhDeployLambda(pm);\n case 'cloudflare':\n return generateGhDeployCloudflare(pm);\n }\n}\n\nasync function scaffoldProject(options: CreateOptions): Promise<void> {\n const { projectName, deploymentTarget, redisSetup, enableGitHubActions, packageManager } = options;\n\n const folder = sanitizeForFolder(projectName);\n const pkgName = sanitizeForNpm(projectName);\n const targetDir = path.resolve(process.cwd(), folder);\n\n // Validate directory\n try {\n const stat = await fsp.stat(targetDir);\n if (!stat.isDirectory()) {\n console.error(\n c('red', `Refusing to scaffold into non-directory path: ${path.relative(process.cwd(), targetDir)}`),\n );\n console.log(c('gray', 'Pick a different project name or remove/rename the existing file.'));\n process.exit(1);\n }\n if (!(await isDirEmpty(targetDir))) {\n console.error(\n c('red', `Refusing to scaffold into non-empty directory: ${path.relative(process.cwd(), targetDir)}`),\n );\n console.log(c('gray', 'Pick a different name or start with an empty folder.'));\n process.exit(1);\n }\n } catch (e: unknown) {\n if (e && typeof e === 'object' && 'code' in e && e.code === 'ENOENT') {\n await ensureDir(targetDir);\n } else {\n throw e;\n }\n }\n\n console.log(`\\n${c('cyan', '[create]')} Creating project in ${c('bold', './' + folder)}`);\n console.log(c('gray', ` Deployment: ${deploymentTarget}`));\n if (deploymentTarget === 'node') {\n console.log(c('gray', ` Redis: ${redisSetup}`));\n }\n console.log(c('gray', ` Package manager: ${packageManager}`));\n console.log(c('gray', ` GitHub Actions: ${enableGitHubActions ? 'Yes' : 'No'}`));\n console.log('');\n\n process.chdir(targetDir);\n\n // Initialize tsconfig\n await runInit(targetDir);\n\n // Create package.json with deployment-specific scripts\n const selfVersion = getSelfVersion();\n await upsertPackageJsonWithTarget(targetDir, pkgName, selfVersion, deploymentTarget, packageManager);\n\n // Scaffold base files\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'src', 'main.ts'), TEMPLATE_MAIN_TS);\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'src', 'calc.app.ts'), TEMPLATE_CALC_APP_TS);\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'src', 'tools', 'add.tool.ts'), TEMPLATE_ADD_TOOL_TS);\n\n // E2E scaffolding\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'e2e', 'server.e2e.spec.ts'), TEMPLATE_E2E_TEST_TS);\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'jest.e2e.config.ts'), TEMPLATE_JEST_E2E_CONFIG);\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'tsconfig.e2e.json'), TEMPLATE_TSCONFIG_E2E);\n\n // Git configuration\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, '.gitignore'), TEMPLATE_GITIGNORE);\n\n // Node version\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, '.nvmrc'), '24\\n');\n\n // Deployment-specific files\n await scaffoldDeploymentFiles(targetDir, options);\n\n // GitHub Actions\n if (enableGitHubActions) {\n await scaffoldGitHubActions(targetDir, deploymentTarget, packageManager);\n }\n\n // Dynamic README\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'README.md'), generateReadme(options));\n\n // Print next steps\n printNextSteps(folder, deploymentTarget, redisSetup, enableGitHubActions, packageManager);\n}\n\nfunction printNextSteps(\n folder: string,\n deploymentTarget: DeploymentTarget,\n redisSetup: RedisSetup,\n enableGitHubActions: boolean,\n pm: PackageManager,\n): void {\n const cfg = PM_CONFIG[pm];\n console.log('\\nNext steps:');\n console.log(` 1) cd ${folder}`);\n console.log(` 2) ${cfg.userInstall}`);\n console.log(` 3) ${cfg.run} dev `, c('gray', '# tsx watcher + async tsc type-check'));\n console.log(` 4) ${cfg.run} inspect `, c('gray', '# launch MCP Inspector'));\n console.log(` 5) ${cfg.run} build `, c('gray', '# compile with tsc via frontmcp build'));\n console.log(` 6) ${cfg.run} test:e2e `, c('gray', '# run E2E tests'));\n\n if (deploymentTarget === 'node') {\n console.log('');\n console.log(c('cyan', 'Docker:'));\n console.log(\n ` ${cfg.run} docker:up `,\n c('gray', `# start${redisSetup === 'docker' ? ' Redis +' : ''} app in Docker`),\n );\n console.log(` ${cfg.run} docker:down `, c('gray', '# stop Docker services'));\n }\n\n if (deploymentTarget === 'vercel') {\n console.log('');\n console.log(c('cyan', 'Deploy to Vercel:'));\n console.log(' npx vercel ', c('gray', '# deploy to Vercel'));\n }\n\n if (deploymentTarget === 'lambda') {\n console.log('');\n console.log(c('cyan', 'Deploy to AWS Lambda:'));\n console.log(` ${cfg.run} deploy `, c('gray', '# deploy with SAM'));\n }\n\n if (deploymentTarget === 'cloudflare') {\n console.log('');\n console.log(c('cyan', 'Deploy to Cloudflare:'));\n console.log(` ${cfg.run} deploy `, c('gray', '# deploy with Wrangler'));\n }\n\n if (enableGitHubActions) {\n console.log('');\n console.log(c('cyan', 'GitHub Actions:'));\n console.log(' .github/workflows/ ', c('gray', '# CI, E2E, and deploy workflows ready'));\n }\n}\n\n// =============================================================================\n// Package.json with Target-Specific Scripts\n// =============================================================================\n\nasync function upsertPackageJsonWithTarget(\n cwd: string,\n nameOverride: string | undefined,\n selfVersion: string,\n deploymentTarget: DeploymentTarget,\n pm: PackageManager = 'npm',\n) {\n const pkgPath = path.join(cwd, 'package.json');\n const existing = await readJSON<PackageJson>(pkgPath);\n\n const frontmcpLibRange = `~${selfVersion}`;\n\n const baseScripts: Record<string, string> = {\n dev: 'frontmcp dev',\n build: 'frontmcp build',\n inspect: 'frontmcp inspector',\n doctor: 'frontmcp doctor',\n test: 'frontmcp test',\n 'test:e2e': 'jest --config jest.e2e.config.ts --runInBand',\n };\n\n // Add target-specific scripts\n if (deploymentTarget === 'node') {\n baseScripts['docker:up'] = 'docker compose -f ci/docker-compose.yml up';\n baseScripts['docker:down'] = 'docker compose -f ci/docker-compose.yml down';\n baseScripts['docker:build'] = 'docker compose -f ci/docker-compose.yml build';\n }\n\n if (deploymentTarget === 'lambda') {\n baseScripts['deploy'] = 'cd ci && sam build && sam deploy';\n }\n\n if (deploymentTarget === 'cloudflare') {\n baseScripts['deploy'] = 'wrangler deploy';\n }\n\n const base = {\n name: nameOverride ?? pkgNameFromCwd(cwd),\n version: '0.1.0',\n private: true,\n type: 'commonjs',\n main: 'src/main.ts',\n scripts: baseScripts,\n engines: PM_CONFIG[pm].engines,\n dependencies: {\n '@frontmcp/sdk': frontmcpLibRange,\n '@frontmcp/plugins': frontmcpLibRange,\n '@frontmcp/adapters': frontmcpLibRange,\n frontmcp: selfVersion,\n tslib: '^2.5.0',\n zod: '^4.0.0',\n 'reflect-metadata': '^0.2.2',\n },\n devDependencies: {\n '@frontmcp/testing': frontmcpLibRange,\n '@swc/core': '^1.11.29',\n '@swc/jest': '^0.2.37',\n jest: '^29.7.0',\n '@types/jest': '^29.5.14',\n tsx: '^4.20.6',\n '@types/node': '^24.0.0',\n typescript: '^5.5.3',\n },\n };\n\n if (!existing) {\n await writeJSON(pkgPath, base);\n console.log(c('green', '✅ Created package.json (synced @frontmcp libs to CLI version + exact frontmcp)'));\n return;\n }\n\n const merged: PackageJson = { ...base, ...existing };\n\n merged.name = existing.name || base.name;\n merged.main = existing.main || base.main;\n merged.type = existing.type || base.type;\n\n // Preserve user scripts, add base scripts only if missing\n merged.scripts = {\n ...baseScripts,\n ...(existing.scripts || {}),\n };\n\n merged.engines = {\n ...(existing.engines || {}),\n ...base.engines,\n };\n\n merged.dependencies = {\n ...(existing.dependencies || {}),\n ...base.dependencies,\n };\n\n merged.devDependencies = {\n ...(existing.devDependencies || {}),\n ...base.devDependencies,\n };\n\n await writeJSON(pkgPath, merged);\n console.log(c('green', '✅ Updated package.json (synced @frontmcp libs + frontmcp to current CLI version)'));\n}\n\n// =============================================================================\n// Main Entry Point\n// =============================================================================\n\nexport async function runCreate(projectArg?: string, flags?: CreateFlags): Promise<void> {\n // Nx monorepo mode (non-interactive with --nx flag)\n if (flags?.nx) {\n const name = projectArg || 'frontmcp-app';\n await scaffoldNxWorkspace(name, flags);\n return;\n }\n\n // Non-interactive mode: use --yes flag or non-TTY environment\n if (flags?.yes || !isInteractive()) {\n const options = getDefaults(projectArg);\n // Override defaults with any provided flags\n if (flags?.target) options.deploymentTarget = flags.target;\n if (flags?.redis) options.redisSetup = flags.redis;\n if (flags?.cicd !== undefined) options.enableGitHubActions = flags.cicd;\n if (flags?.pm) options.packageManager = flags.pm;\n if (projectArg) options.projectName = projectArg;\n\n if (!options.projectName) {\n console.error(c('red', 'Error: project name is required in non-interactive mode.\\n'));\n console.log(`Usage: ${c('bold', 'npx frontmcp create <project-name> --yes')}`);\n process.exit(1);\n }\n\n await scaffoldProject(options);\n return;\n }\n\n // Interactive mode\n const p = await clack();\n p.intro('Create a new FrontMCP project');\n\n const options = await collectOptions(projectArg, flags);\n if (!options.nxScaffolded) await scaffoldProject(options);\n\n p.outro('Done!');\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerScaffoldCommands(program: Command): void;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerScaffoldCommands = registerScaffoldCommands;
4
+ function registerScaffoldCommands(program) {
5
+ program
6
+ .command('create')
7
+ .description('Scaffold a new FrontMCP project (interactive if name omitted)')
8
+ .argument('[name]', 'Project name')
9
+ .option('-y, --yes', 'Use defaults (non-interactive mode)')
10
+ .option('--target <target>', 'Deployment target: node, vercel, lambda, cloudflare')
11
+ .option('--redis <setup>', 'Redis setup: docker, existing, none (node target only)')
12
+ .option('--pm <pm>', 'Package manager: npm, yarn, pnpm')
13
+ .option('--cicd', 'Enable GitHub Actions CI/CD')
14
+ .option('--no-cicd', 'Disable GitHub Actions CI/CD')
15
+ .option('--nx', 'Scaffold an Nx monorepo instead of standalone project')
16
+ .action(async (name, options) => {
17
+ const { runCreate } = await import('./create.js');
18
+ await runCreate(name, {
19
+ yes: options.yes,
20
+ target: options.target,
21
+ redis: options.redis,
22
+ cicd: options.cicd,
23
+ pm: options.pm,
24
+ nx: options.nx,
25
+ });
26
+ });
27
+ }
28
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../../../src/commands/scaffold/register.ts"],"names":[],"mappings":";;AAGA,4DA4BC;AA5BD,SAAgB,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,WAAW,EAAE,qCAAqC,CAAC;SAC1D,MAAM,CAAC,mBAAmB,EAAE,qDAAqD,CAAC;SAClF,MAAM,CAAC,iBAAiB,EAAE,wDAAwD,CAAC;SACnF,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;SACvD,MAAM,CAAC,QAAQ,EAAE,6BAA6B,CAAC;SAC/C,MAAM,CAAC,WAAW,EAAE,8BAA8B,CAAC;SACnD,MAAM,CAAC,MAAM,EAAE,uDAAuD,CAAC;SACvE,MAAM,CACL,KAAK,EACH,IAAwB,EACxB,OAAsG,EACtG,EAAE;QACF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,IAAI,EAAE;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,OAAO,CAAC,MAAsC;YACtD,KAAK,EAAE,OAAO,CAAC,KAA+B;YAC9C,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,EAAE,EAAE,OAAO,CAAC,EAAgC;YAC5C,EAAE,EAAE,OAAO,CAAC,EAAE;SACf,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACN,CAAC","sourcesContent":["import { Command } from 'commander';\nimport type { DeploymentTarget, RedisSetup, PackageManager } from './create.js';\n\nexport function registerScaffoldCommands(program: Command): void {\n program\n .command('create')\n .description('Scaffold a new FrontMCP project (interactive if name omitted)')\n .argument('[name]', 'Project name')\n .option('-y, --yes', 'Use defaults (non-interactive mode)')\n .option('--target <target>', 'Deployment target: node, vercel, lambda, cloudflare')\n .option('--redis <setup>', 'Redis setup: docker, existing, none (node target only)')\n .option('--pm <pm>', 'Package manager: npm, yarn, pnpm')\n .option('--cicd', 'Enable GitHub Actions CI/CD')\n .option('--no-cicd', 'Disable GitHub Actions CI/CD')\n .option('--nx', 'Scaffold an Nx monorepo instead of standalone project')\n .action(\n async (\n name: string | undefined,\n options: { yes?: boolean; target?: string; redis?: string; pm?: string; cicd?: boolean; nx?: boolean },\n ) => {\n const { runCreate } = await import('./create.js');\n await runCreate(name, {\n yes: options.yes,\n target: options.target as DeploymentTarget | undefined,\n redis: options.redis as RedisSetup | undefined,\n cicd: options.cicd,\n pm: options.pm as PackageManager | undefined,\n nx: options.nx,\n });\n },\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- export type Command = 'dev' | 'build' | 'init' | 'doctor' | 'inspector' | 'create' | 'help' | 'template' | 'version' | 'test' | 'socket' | 'start' | 'stop' | 'restart' | 'status' | 'list' | 'logs' | 'service' | 'install' | 'uninstall' | 'configure';
1
+ export type Command = 'dev' | 'build' | 'init' | 'doctor' | 'inspector' | 'create' | 'help' | 'version' | 'test' | 'socket' | 'start' | 'stop' | 'restart' | 'status' | 'list' | 'logs' | 'service' | 'install' | 'uninstall' | 'configure';
2
2
  export type DeploymentAdapter = 'node' | 'vercel' | 'lambda' | 'cloudflare';
3
3
  export type RedisSetupOption = 'docker' | 'existing' | 'none';
4
4
  export type PackageManagerOption = 'npm' | 'yarn' | 'pnpm';
@@ -22,6 +22,8 @@ export interface ParsedArgs {
22
22
  db?: string;
23
23
  background?: boolean;
24
24
  exec?: boolean;
25
+ cli?: boolean;
26
+ sea?: boolean;
25
27
  port?: number;
26
28
  force?: boolean;
27
29
  maxRestarts?: number;
@@ -30,4 +32,8 @@ export interface ParsedArgs {
30
32
  registry?: string;
31
33
  nx?: boolean;
32
34
  }
35
+ /**
36
+ * @deprecated Use commander-based parsing via {@link createProgram} instead.
37
+ * Kept for backward compatibility and existing test coverage.
38
+ */
33
39
  export declare function parseArgs(argv: string[]): ParsedArgs;
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseArgs = parseArgs;
4
+ /**
5
+ * @deprecated Use commander-based parsing via {@link createProgram} instead.
6
+ * Kept for backward compatibility and existing test coverage.
7
+ */
4
8
  function parseArgs(argv) {
5
9
  const out = { _: [] };
6
10
  for (let i = 0; i < argv.length; i++) {
@@ -48,6 +52,10 @@ function parseArgs(argv) {
48
52
  // Build --exec flag
49
53
  else if (a === '--exec')
50
54
  out.exec = true;
55
+ else if (a === '--cli')
56
+ out.cli = true;
57
+ else if (a === '--sea')
58
+ out.sea = true;
51
59
  // Process Manager flags
52
60
  else if (a === '--port' || a === '-p') {
53
61
  const parsed = parseInt(argv[++i], 10);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/core/args.ts"],"names":[],"mappings":";;AAuEA,8BAkDC;AAtDD;;;GAGG;AACH,SAAgB,SAAS,CAAC,IAAc;IACtC,MAAM,GAAG,GAAe,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACvD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACzD,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAsB,CAAC;aAClF,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;aAClD,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;aAC5D,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;aACpD,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;aACxD,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1D,CAAC;aAAM,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;QACjE,uBAAuB;aAClB,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC;aAChD,IAAI,CAAC,KAAK,UAAU;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAsB,CAAC;aAClE,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAqB,CAAC;aAC/D,IAAI,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;aACpC,IAAI,CAAC,KAAK,WAAW;YAAE,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;aACxC,IAAI,CAAC,KAAK,MAAM;YAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAyB,CAAC;QAClE,uBAAuB;aAClB,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3D,IAAI,CAAC,KAAK,MAAM;YAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACrC,IAAI,CAAC,KAAK,cAAc,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;QACnE,oBAAoB;aACf,IAAI,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;aACpC,IAAI,CAAC,KAAK,OAAO;YAAE,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC;aAClC,IAAI,CAAC,KAAK,OAAO;YAAE,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC;QACvC,wBAAwB;aACnB,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QACvD,CAAC;aAAM,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;aACtD,IAAI,CAAC,KAAK,gBAAgB,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9D,CAAC;aAAM,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;aACxD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QACxD,CAAC;QACD,mBAAmB;aACd,IAAI,CAAC,KAAK,MAAM;YAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;QACrC,gBAAgB;aACX,IAAI,CAAC,KAAK,YAAY;YAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;;YACjD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["export type Command =\n | 'dev'\n | 'build'\n | 'init'\n | 'doctor'\n | 'inspector'\n | 'create'\n | 'help'\n | 'version'\n | 'test'\n | 'socket'\n // Process Manager commands\n | 'start'\n | 'stop'\n | 'restart'\n | 'status'\n | 'list'\n | 'logs'\n | 'service'\n // Package Manager commands\n | 'install'\n | 'uninstall'\n | 'configure';\n\nexport type DeploymentAdapter = 'node' | 'vercel' | 'lambda' | 'cloudflare';\nexport type RedisSetupOption = 'docker' | 'existing' | 'none';\nexport type PackageManagerOption = 'npm' | 'yarn' | 'pnpm';\n\nexport interface ParsedArgs {\n _: string[];\n outDir?: string;\n entry?: string;\n help?: boolean;\n runInBand?: boolean;\n watch?: boolean;\n verbose?: boolean;\n timeout?: number;\n coverage?: boolean;\n adapter?: DeploymentAdapter;\n // Create command flags\n yes?: boolean;\n target?: DeploymentAdapter;\n redis?: RedisSetupOption;\n cicd?: boolean;\n pm?: PackageManagerOption;\n // Socket command flags\n socket?: string;\n db?: string;\n background?: boolean;\n // Build --exec flag\n exec?: boolean;\n // Build --exec --cli flag\n cli?: boolean;\n // Build --exec --sea flag\n sea?: boolean;\n // Process Manager flags\n port?: number;\n force?: boolean;\n maxRestarts?: number;\n follow?: boolean;\n lines?: number;\n // Install flags\n registry?: string;\n // Create --nx flag\n nx?: boolean;\n}\n\n/**\n * @deprecated Use commander-based parsing via {@link createProgram} instead.\n * Kept for backward compatibility and existing test coverage.\n */\nexport function parseArgs(argv: string[]): ParsedArgs {\n const out: ParsedArgs = { _: [] };\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a === '--out-dir' || a === '-o') out.outDir = argv[++i];\n else if (a === '--entry' || a === '-e') out.entry = argv[++i];\n else if (a === '--adapter' || a === '-a') out.adapter = argv[++i] as DeploymentAdapter;\n else if (a === '--help' || a === '-h') out.help = true;\n else if (a === '--runInBand' || a === '-i') out.runInBand = true;\n else if (a === '--watch' || a === '-w') out.watch = true;\n else if (a === '--verbose' || a === '-v') out.verbose = true;\n else if (a === '--timeout' || a === '-t') {\n const parsed = parseInt(argv[++i], 10);\n out.timeout = Number.isNaN(parsed) ? undefined : parsed;\n } else if (a === '--coverage' || a === '-c') out.coverage = true;\n // Create command flags\n else if (a === '--yes' || a === '-y') out.yes = true;\n else if (a === '--target') out.target = argv[++i] as DeploymentAdapter;\n else if (a === '--redis') out.redis = argv[++i] as RedisSetupOption;\n else if (a === '--cicd') out.cicd = true;\n else if (a === '--no-cicd') out.cicd = false;\n else if (a === '--pm') out.pm = argv[++i] as PackageManagerOption;\n // Socket command flags\n else if (a === '--socket' || a === '-s') out.socket = argv[++i];\n else if (a === '--db') out.db = argv[++i];\n else if (a === '--background' || a === '-b') out.background = true;\n // Build --exec flag\n else if (a === '--exec') out.exec = true;\n else if (a === '--cli') out.cli = true;\n else if (a === '--sea') out.sea = true;\n // Process Manager flags\n else if (a === '--port' || a === '-p') {\n const parsed = parseInt(argv[++i], 10);\n out.port = Number.isNaN(parsed) ? undefined : parsed;\n } else if (a === '--force' || a === '-f') out.force = true;\n else if (a === '--max-restarts') {\n const parsed = parseInt(argv[++i], 10);\n out.maxRestarts = Number.isNaN(parsed) ? undefined : parsed;\n } else if (a === '--follow' || a === '-F') out.follow = true;\n else if (a === '--lines' || a === '-n') {\n const parsed = parseInt(argv[++i], 10);\n out.lines = Number.isNaN(parsed) ? undefined : parsed;\n }\n // Create --nx flag\n else if (a === '--nx') out.nx = true;\n // Install flags\n else if (a === '--registry') out.registry = argv[++i];\n else out._.push(a);\n }\n return out;\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { ParsedArgs } from './args';
2
+ /**
3
+ * Convert commander's parsed command name, positional arguments, and options
4
+ * into the legacy {@link ParsedArgs} shape expected by existing handlers.
5
+ *
6
+ * This is a Phase-1 bridge — it will be removed once each handler accepts
7
+ * its own typed options interface (Phase 2).
8
+ */
9
+ export declare function toParsedArgs(commandName: string, positionalArgs: string[], options: Record<string, unknown>): ParsedArgs;