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
package/src/cli.js DELETED
@@ -1,241 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- /**
4
- * frontmcp - FrontMCP command line interface
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const colors_1 = require("./colors");
8
- const args_1 = require("./args");
9
- const dev_1 = require("./commands/dev");
10
- const build_1 = require("./commands/build");
11
- const tsconfig_1 = require("./tsconfig");
12
- const doctor_1 = require("./commands/doctor");
13
- const inspector_1 = require("./commands/inspector");
14
- const create_1 = require("./commands/create");
15
- const template_1 = require("./commands/template");
16
- const test_1 = require("./commands/test");
17
- const socket_1 = require("./commands/socket");
18
- function showHelp() {
19
- console.log(`
20
- ${(0, colors_1.c)('bold', 'frontmcp')} — FrontMCP command line interface
21
-
22
- ${(0, colors_1.c)('bold', 'Usage')}
23
- frontmcp <command> [options]
24
-
25
- ${(0, colors_1.c)('bold', 'Development')}
26
- dev Start in development mode (tsx --watch <entry> + async type-check)
27
- build Compile entry with TypeScript (tsc)
28
- build --exec Build distributable executable bundle (esbuild)
29
- test Run E2E tests with auto-injected Jest configuration
30
- init Create or fix a tsconfig.json suitable for FrontMCP
31
- doctor Check Node/npm versions and tsconfig requirements
32
- inspector Launch MCP Inspector (npx @modelcontextprotocol/inspector)
33
- create [name] Scaffold a new FrontMCP project (interactive if name omitted)
34
- template <type> Scaffold a template by type (e.g., "3rd-party-integration")
35
- socket <entry> Start Unix socket daemon for local MCP server
36
-
37
- ${(0, colors_1.c)('bold', 'Process Manager')}
38
- start <name> Start a named MCP server with supervisor
39
- stop <name> Stop a managed server (graceful by default)
40
- restart <name> Restart a managed server
41
- status [name] Show process status (detail if name given, table if omitted)
42
- list List all managed processes
43
- logs <name> Tail log output for a managed server
44
- service <action> Install/uninstall systemd/launchd service
45
-
46
- ${(0, colors_1.c)('bold', 'Package Manager')}
47
- install <source> Install an MCP app from npm, local path, or git
48
- uninstall <name> Remove an installed MCP app
49
- configure <name> Re-run setup questionnaire for an installed app
50
-
51
- ${(0, colors_1.c)('bold', 'General Options')}
52
- -h, --help Show this help message
53
- -o, --out-dir <dir> Output directory (default: ./dist)
54
- -e, --entry <path> Manually specify entry file path
55
-
56
- ${(0, colors_1.c)('bold', 'Build Options')}
57
- --exec Build distributable executable bundle
58
- -a, --adapter <name> Deployment adapter: node, vercel, lambda, cloudflare
59
-
60
- ${(0, colors_1.c)('bold', 'Start Options')}
61
- -e, --entry <path> Entry file for the server
62
- -p, --port <N> Port number for the server
63
- -s, --socket <path> Unix socket path
64
- --db <path> SQLite database path
65
- --max-restarts <N> Maximum auto-restart attempts (default: 5)
66
-
67
- ${(0, colors_1.c)('bold', 'Stop Options')}
68
- -f, --force Force kill (SIGKILL instead of SIGTERM)
69
-
70
- ${(0, colors_1.c)('bold', 'Logs Options')}
71
- -F, --follow Follow log output (like tail -f)
72
- -n, --lines <N> Number of lines to show (default: 50)
73
-
74
- ${(0, colors_1.c)('bold', 'Install Options')}
75
- --registry <url> npm registry URL for private packages
76
- -y, --yes Silent mode (use defaults, skip questionnaire)
77
- -p, --port <N> Override default port
78
-
79
- ${(0, colors_1.c)('bold', 'Create Options')}
80
- -y, --yes Use defaults (non-interactive mode)
81
- --target <target> Deployment target: node, vercel, lambda, cloudflare
82
- --redis <setup> Redis setup: docker, existing, none (node target only)
83
- --pm <pm> Package manager: npm, yarn, pnpm
84
- --cicd Enable GitHub Actions CI/CD
85
- --no-cicd Disable GitHub Actions CI/CD
86
- --nx Scaffold an Nx monorepo instead of standalone project
87
-
88
- ${(0, colors_1.c)('bold', 'Socket Options')}
89
- -s, --socket <path> Unix socket path (default: ~/.frontmcp/sockets/{app}.sock)
90
- --db <path> SQLite database path for persistence
91
- -b, --background Run as background daemon (detached process)
92
-
93
- ${(0, colors_1.c)('bold', 'Test Options')}
94
- -i, --runInBand Run tests sequentially (recommended for E2E)
95
- -w, --watch Run tests in watch mode
96
- -v, --verbose Show verbose test output
97
- -t, --timeout <ms> Set test timeout (default: 60000ms)
98
- -c, --coverage Collect test coverage
99
-
100
- ${(0, colors_1.c)('bold', 'Examples')}
101
- frontmcp dev
102
- frontmcp build --out-dir build
103
- frontmcp build --exec
104
- frontmcp test --runInBand
105
- frontmcp init
106
- frontmcp doctor
107
- frontmcp inspector
108
- npx frontmcp create # Interactive mode
109
- npx frontmcp create my-mcp --yes # Use defaults
110
- npx frontmcp create my-mcp --target vercel # Vercel deployment
111
- npx frontmcp template marketplace-3rd-tools
112
- frontmcp socket ./src/main.ts --socket /tmp/my-app.sock
113
- frontmcp socket ./src/main.ts --socket /tmp/my-app.sock --db ~/.frontmcp/data/app.sqlite
114
- frontmcp start my-app --entry ./src/main.ts --port 3005
115
- frontmcp stop my-app
116
- frontmcp logs my-app --follow
117
- frontmcp service install my-app
118
- frontmcp install @company/my-mcp --registry https://npm.company.com
119
- frontmcp install ./my-local-app
120
- frontmcp install github:user/repo
121
- frontmcp configure my-app
122
- frontmcp uninstall my-app
123
- `);
124
- }
125
- async function main() {
126
- const argv = process.argv.slice(2);
127
- const parsed = (0, args_1.parseArgs)(argv);
128
- const cmd = parsed._[0];
129
- if (parsed.help || !cmd) {
130
- showHelp();
131
- process.exit(0);
132
- }
133
- try {
134
- switch (cmd) {
135
- case 'dev':
136
- await (0, dev_1.runDev)(parsed);
137
- break;
138
- case 'build':
139
- parsed.outDir = parsed.outDir || 'dist';
140
- await (0, build_1.runBuild)(parsed);
141
- break;
142
- case 'init':
143
- await (0, tsconfig_1.runInit)();
144
- break;
145
- case 'doctor':
146
- await (0, doctor_1.runDoctor)();
147
- break;
148
- case 'inspector':
149
- await (0, inspector_1.runInspector)();
150
- break;
151
- case 'create': {
152
- const projectName = parsed._[1];
153
- await (0, create_1.runCreate)(projectName, {
154
- yes: parsed.yes,
155
- target: parsed.target,
156
- redis: parsed.redis,
157
- cicd: parsed.cicd,
158
- pm: parsed.pm,
159
- nx: parsed.nx,
160
- });
161
- break;
162
- }
163
- case 'template': {
164
- const type = parsed._[1]; // e.g. "3rd-party-integration"
165
- await (0, template_1.runTemplate)(type);
166
- break;
167
- }
168
- case 'test':
169
- await (0, test_1.runTest)(parsed);
170
- break;
171
- case 'socket':
172
- await (0, socket_1.runSocket)(parsed);
173
- break;
174
- // Process Manager commands (dynamic imports)
175
- case 'start': {
176
- const { runStart } = await import('./commands/start.js');
177
- await runStart(parsed);
178
- break;
179
- }
180
- case 'stop': {
181
- const { runStop } = await import('./commands/stop.js');
182
- await runStop(parsed);
183
- break;
184
- }
185
- case 'restart': {
186
- const { runRestart } = await import('./commands/restart.js');
187
- await runRestart(parsed);
188
- break;
189
- }
190
- case 'status': {
191
- const { runStatus } = await import('./commands/status.js');
192
- await runStatus(parsed);
193
- break;
194
- }
195
- case 'list': {
196
- const { runList } = await import('./commands/list.js');
197
- await runList(parsed);
198
- break;
199
- }
200
- case 'logs': {
201
- const { runLogs } = await import('./commands/logs.js');
202
- await runLogs(parsed);
203
- break;
204
- }
205
- case 'service': {
206
- const { runService } = await import('./commands/service.js');
207
- await runService(parsed);
208
- break;
209
- }
210
- // Package Manager commands (dynamic imports)
211
- case 'install': {
212
- const { runInstall } = await import('./commands/install/index.js');
213
- await runInstall(parsed);
214
- break;
215
- }
216
- case 'uninstall': {
217
- const { runUninstall } = await import('./commands/uninstall.js');
218
- await runUninstall(parsed);
219
- break;
220
- }
221
- case 'configure': {
222
- const { runConfigure } = await import('./commands/configure.js');
223
- await runConfigure(parsed);
224
- break;
225
- }
226
- case 'help':
227
- showHelp();
228
- break;
229
- default:
230
- console.error((0, colors_1.c)('red', `Unknown command: ${cmd}`));
231
- showHelp();
232
- process.exitCode = 1;
233
- }
234
- }
235
- catch (err) {
236
- console.error('\n' + (0, colors_1.c)('red', err instanceof Error ? err.stack || err.message : String(err)));
237
- process.exit(1);
238
- }
239
- }
240
- main();
241
- //# sourceMappingURL=cli.js.map
package/src/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";;AACA;;GAEG;;AAEH,qCAA6B;AAC7B,iCAAwD;AACxD,wCAAwC;AACxC,4CAA4C;AAC5C,yCAAqC;AACrC,8CAA8C;AAC9C,oDAAoD;AACpD,8CAA8C;AAC9C,kDAAkD;AAClD,0CAA0C;AAC1C,8CAA8C;AAE9C,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;EACZ,IAAA,UAAC,EAAC,MAAM,EAAE,UAAU,CAAC;;EAErB,IAAA,UAAC,EAAC,MAAM,EAAE,OAAO,CAAC;;;EAGlB,IAAA,UAAC,EAAC,MAAM,EAAE,aAAa,CAAC;;;;;;;;;;;;EAYxB,IAAA,UAAC,EAAC,MAAM,EAAE,iBAAiB,CAAC;;;;;;;;;EAS5B,IAAA,UAAC,EAAC,MAAM,EAAE,iBAAiB,CAAC;;;;;EAK5B,IAAA,UAAC,EAAC,MAAM,EAAE,iBAAiB,CAAC;;;;;EAK5B,IAAA,UAAC,EAAC,MAAM,EAAE,eAAe,CAAC;;;;EAI1B,IAAA,UAAC,EAAC,MAAM,EAAE,eAAe,CAAC;;;;;;;EAO1B,IAAA,UAAC,EAAC,MAAM,EAAE,cAAc,CAAC;;;EAGzB,IAAA,UAAC,EAAC,MAAM,EAAE,cAAc,CAAC;;;;EAIzB,IAAA,UAAC,EAAC,MAAM,EAAE,iBAAiB,CAAC;;;;;EAK5B,IAAA,UAAC,EAAC,MAAM,EAAE,gBAAgB,CAAC;;;;;;;;;EAS3B,IAAA,UAAC,EAAC,MAAM,EAAE,gBAAgB,CAAC;;;;;EAK3B,IAAA,UAAC,EAAC,MAAM,EAAE,cAAc,CAAC;;;;;;;EAOzB,IAAA,UAAC,EAAC,MAAM,EAAE,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBtB,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAAe,IAAA,gBAAS,EAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAwB,CAAC;IAE/C,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,KAAK;gBACR,MAAM,IAAA,YAAM,EAAC,MAAM,CAAC,CAAC;gBACrB,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;gBACxC,MAAM,IAAA,gBAAQ,EAAC,MAAM,CAAC,CAAC;gBACvB,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,IAAA,kBAAO,GAAE,CAAC;gBAChB,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,IAAA,kBAAS,GAAE,CAAC;gBAClB,MAAM;YACR,KAAK,WAAW;gBACd,MAAM,IAAA,wBAAY,GAAE,CAAC;gBACrB,MAAM;YACR,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,IAAA,kBAAS,EAAC,WAAW,EAAE;oBAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,EAAE,EAAE,MAAM,CAAC,EAAE;oBACb,EAAE,EAAE,MAAM,CAAC,EAAE;iBACd,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;gBACzD,MAAM,IAAA,sBAAW,EAAC,IAAI,CAAC,CAAC;gBACxB,MAAM;YACR,CAAC;YACD,KAAK,MAAM;gBACT,MAAM,IAAA,cAAO,EAAC,MAAM,CAAC,CAAC;gBACtB,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,IAAA,kBAAS,EAAC,MAAM,CAAC,CAAC;gBACxB,MAAM;YAER,6CAA6C;YAC7C,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;gBACzD,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACvB,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACvD,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtB,MAAM;YACR,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;gBAC7D,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;gBACzB,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;gBAC3D,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;gBACxB,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACvD,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtB,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACvD,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtB,MAAM;YACR,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;gBAC7D,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;gBACzB,MAAM;YACR,CAAC;YAED,6CAA6C;YAC7C,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;gBACnE,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;gBACzB,MAAM;YACR,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;gBACjE,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM;YACR,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;gBACjE,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM;YACR,CAAC;YAED,KAAK,MAAM;gBACT,QAAQ,EAAE,CAAC;gBACX,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,oBAAoB,GAAG,EAAE,CAAC,CAAC,CAAC;gBACnD,QAAQ,EAAE,CAAC;gBACX,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,IAAA,UAAC,EAAC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\n/**\n * frontmcp - FrontMCP command line interface\n */\n\nimport { c } from './colors';\nimport { Command, ParsedArgs, parseArgs } from './args';\nimport { runDev } from './commands/dev';\nimport { runBuild } from './commands/build';\nimport { runInit } from './tsconfig';\nimport { runDoctor } from './commands/doctor';\nimport { runInspector } from './commands/inspector';\nimport { runCreate } from './commands/create';\nimport { runTemplate } from './commands/template';\nimport { runTest } from './commands/test';\nimport { runSocket } from './commands/socket';\n\nfunction showHelp(): void {\n console.log(`\n${c('bold', 'frontmcp')} — FrontMCP command line interface\n\n${c('bold', 'Usage')}\n frontmcp <command> [options]\n\n${c('bold', 'Development')}\n dev Start in development mode (tsx --watch <entry> + async type-check)\n build Compile entry with TypeScript (tsc)\n build --exec Build distributable executable bundle (esbuild)\n test Run E2E tests with auto-injected Jest configuration\n init Create or fix a tsconfig.json suitable for FrontMCP\n doctor Check Node/npm versions and tsconfig requirements\n inspector Launch MCP Inspector (npx @modelcontextprotocol/inspector)\n create [name] Scaffold a new FrontMCP project (interactive if name omitted)\n template <type> Scaffold a template by type (e.g., \"3rd-party-integration\")\n socket <entry> Start Unix socket daemon for local MCP server\n\n${c('bold', 'Process Manager')}\n start <name> Start a named MCP server with supervisor\n stop <name> Stop a managed server (graceful by default)\n restart <name> Restart a managed server\n status [name] Show process status (detail if name given, table if omitted)\n list List all managed processes\n logs <name> Tail log output for a managed server\n service <action> Install/uninstall systemd/launchd service\n\n${c('bold', 'Package Manager')}\n install <source> Install an MCP app from npm, local path, or git\n uninstall <name> Remove an installed MCP app\n configure <name> Re-run setup questionnaire for an installed app\n\n${c('bold', 'General Options')}\n -h, --help Show this help message\n -o, --out-dir <dir> Output directory (default: ./dist)\n -e, --entry <path> Manually specify entry file path\n\n${c('bold', 'Build Options')}\n --exec Build distributable executable bundle\n -a, --adapter <name> Deployment adapter: node, vercel, lambda, cloudflare\n\n${c('bold', 'Start Options')}\n -e, --entry <path> Entry file for the server\n -p, --port <N> Port number for the server\n -s, --socket <path> Unix socket path\n --db <path> SQLite database path\n --max-restarts <N> Maximum auto-restart attempts (default: 5)\n\n${c('bold', 'Stop Options')}\n -f, --force Force kill (SIGKILL instead of SIGTERM)\n\n${c('bold', 'Logs Options')}\n -F, --follow Follow log output (like tail -f)\n -n, --lines <N> Number of lines to show (default: 50)\n\n${c('bold', 'Install Options')}\n --registry <url> npm registry URL for private packages\n -y, --yes Silent mode (use defaults, skip questionnaire)\n -p, --port <N> Override default port\n\n${c('bold', 'Create Options')}\n -y, --yes Use defaults (non-interactive mode)\n --target <target> Deployment target: node, vercel, lambda, cloudflare\n --redis <setup> Redis setup: docker, existing, none (node target only)\n --pm <pm> Package manager: npm, yarn, pnpm\n --cicd Enable GitHub Actions CI/CD\n --no-cicd Disable GitHub Actions CI/CD\n --nx Scaffold an Nx monorepo instead of standalone project\n\n${c('bold', 'Socket Options')}\n -s, --socket <path> Unix socket path (default: ~/.frontmcp/sockets/{app}.sock)\n --db <path> SQLite database path for persistence\n -b, --background Run as background daemon (detached process)\n\n${c('bold', 'Test Options')}\n -i, --runInBand Run tests sequentially (recommended for E2E)\n -w, --watch Run tests in watch mode\n -v, --verbose Show verbose test output\n -t, --timeout <ms> Set test timeout (default: 60000ms)\n -c, --coverage Collect test coverage\n\n${c('bold', 'Examples')}\n frontmcp dev\n frontmcp build --out-dir build\n frontmcp build --exec\n frontmcp test --runInBand\n frontmcp init\n frontmcp doctor\n frontmcp inspector\n npx frontmcp create # Interactive mode\n npx frontmcp create my-mcp --yes # Use defaults\n npx frontmcp create my-mcp --target vercel # Vercel deployment\n npx frontmcp template marketplace-3rd-tools\n frontmcp socket ./src/main.ts --socket /tmp/my-app.sock\n frontmcp socket ./src/main.ts --socket /tmp/my-app.sock --db ~/.frontmcp/data/app.sqlite\n frontmcp start my-app --entry ./src/main.ts --port 3005\n frontmcp stop my-app\n frontmcp logs my-app --follow\n frontmcp service install my-app\n frontmcp install @company/my-mcp --registry https://npm.company.com\n frontmcp install ./my-local-app\n frontmcp install github:user/repo\n frontmcp configure my-app\n frontmcp uninstall my-app\n`);\n}\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const parsed: ParsedArgs = parseArgs(argv);\n const cmd = parsed._[0] as Command | undefined;\n\n if (parsed.help || !cmd) {\n showHelp();\n process.exit(0);\n }\n\n try {\n switch (cmd) {\n case 'dev':\n await runDev(parsed);\n break;\n case 'build':\n parsed.outDir = parsed.outDir || 'dist';\n await runBuild(parsed);\n break;\n case 'init':\n await runInit();\n break;\n case 'doctor':\n await runDoctor();\n break;\n case 'inspector':\n await runInspector();\n break;\n case 'create': {\n const projectName = parsed._[1];\n await runCreate(projectName, {\n yes: parsed.yes,\n target: parsed.target,\n redis: parsed.redis,\n cicd: parsed.cicd,\n pm: parsed.pm,\n nx: parsed.nx,\n });\n break;\n }\n case 'template': {\n const type = parsed._[1]; // e.g. \"3rd-party-integration\"\n await runTemplate(type);\n break;\n }\n case 'test':\n await runTest(parsed);\n break;\n case 'socket':\n await runSocket(parsed);\n break;\n\n // Process Manager commands (dynamic imports)\n case 'start': {\n const { runStart } = await import('./commands/start.js');\n await runStart(parsed);\n break;\n }\n case 'stop': {\n const { runStop } = await import('./commands/stop.js');\n await runStop(parsed);\n break;\n }\n case 'restart': {\n const { runRestart } = await import('./commands/restart.js');\n await runRestart(parsed);\n break;\n }\n case 'status': {\n const { runStatus } = await import('./commands/status.js');\n await runStatus(parsed);\n break;\n }\n case 'list': {\n const { runList } = await import('./commands/list.js');\n await runList(parsed);\n break;\n }\n case 'logs': {\n const { runLogs } = await import('./commands/logs.js');\n await runLogs(parsed);\n break;\n }\n case 'service': {\n const { runService } = await import('./commands/service.js');\n await runService(parsed);\n break;\n }\n\n // Package Manager commands (dynamic imports)\n case 'install': {\n const { runInstall } = await import('./commands/install/index.js');\n await runInstall(parsed);\n break;\n }\n case 'uninstall': {\n const { runUninstall } = await import('./commands/uninstall.js');\n await runUninstall(parsed);\n break;\n }\n case 'configure': {\n const { runConfigure } = await import('./commands/configure.js');\n await runConfigure(parsed);\n break;\n }\n\n case 'help':\n showHelp();\n break;\n default:\n console.error(c('red', `Unknown command: ${cmd}`));\n showHelp();\n process.exitCode = 1;\n }\n } catch (err: unknown) {\n console.error('\\n' + c('red', err instanceof Error ? err.stack || err.message : String(err)));\n process.exit(1);\n }\n}\n\nmain();\n"]}
package/src/colors.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/colors.ts"],"names":[],"mappings":";;;AAAa,QAAA,MAAM,GAAG;IACpB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;CACR,CAAC;AAEJ,MAAM,CAAC,GAAG,CAAC,KAA0B,EAAE,CAAS,EAAE,EAAE,CAAC,cAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,cAAM,CAAC,KAAK,CAAC;AAAhF,QAAA,CAAC,KAA+E","sourcesContent":["export const COLORS = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n} as const;\n\nexport const c = (color: keyof typeof COLORS, s: string) => COLORS[color] + s + COLORS.reset;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../src/commands/configure.ts"],"names":[],"mappings":";;AAQA,oCAkCC;;AA1CD,+CAAyB;AACzB,mDAA6B;AAE7B,sCAA8B;AAC9B,iDAAsD;AACtD,2DAAyE;AAGlE,KAAK,UAAU,YAAY,CAAC,IAAgB;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,qBAAqB,CAAC,CAAC;IACrD,CAAC;IAED,qCAAqC;IACrC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,IAAI,gBAAgB,CAAC,CAAC;IACxE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAiB,CAAC;IAEpF,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,QAAQ,EAAE,QAAQ,IAAI,+BAA+B,CAAC,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,kBAAkB,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAgB,EAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE;QAC1D,MAAM,EAAE,IAAI,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,IAAA,4BAAY,EAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAEhD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAC,EAAC,OAAO,EAAE,sBAAsB,CAAC,8CAA8C,CAAC,CAAC;IACnG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport { ParsedArgs } from '../args';\nimport { c } from '../colors';\nimport { getRegisteredApp } from './install/registry';\nimport { runQuestionnaire, writeEnvFile } from './install/questionnaire';\nimport { ExecManifest } from './build/exec/manifest';\n\nexport async function runConfigure(opts: ParsedArgs): Promise<void> {\n const name = opts._[1];\n if (!name) {\n throw new Error('Missing app name. Usage: frontmcp configure <name>');\n }\n\n const app = getRegisteredApp(name);\n if (!app) {\n throw new Error(`App \"${name}\" is not installed.`);\n }\n\n // Find manifest in install directory\n const manifestPath = path.join(app.installDir, `${name}.manifest.json`);\n if (!fs.existsSync(manifestPath)) {\n throw new Error(`Manifest not found at ${manifestPath}`);\n }\n\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')) as ExecManifest;\n\n if (!manifest.setup?.steps || manifest.setup.steps.length === 0) {\n console.log(c('yellow', `App \"${name}\" has no setup questionnaire.`));\n return;\n }\n\n console.log(`${c('bold', `Reconfiguring \"${name}\"`)}\\n`);\n\n const result = await runQuestionnaire(manifest.setup.steps, {\n silent: opts.yes,\n });\n\n writeEnvFile(app.installDir, result.envContent);\n\n console.log(`\\n${c('green', 'Configuration saved.')} Restart the app for changes to take effect:`);\n console.log(` frontmcp restart ${name}`);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/create.ts"],"names":[],"mappings":";;AAunDA,8BAoCC;;AA3pDD,mDAA6B;AAC7B,2BAAqC;AACrC,sCAA8B;AAC9B,2CAAyF;AACzF,0CAAsC;AACtC,wCAA4C;AAC5C,8CAAyC;AAuCzC,MAAM,SAAS,GAAqC;IAClD,GAAG,EAAE;QACH,YAAY,EAAE,0CAA0C;QACxD,UAAU,EAAE,YAAY;QACxB,YAAY,EAAE,0BAA0B;QACxC,GAAG,EAAE,SAAS;QACd,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,KAAK;QACd,YAAY,EAAE,QAAQ;QACtB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;KACvC;IACD,IAAI,EAAE;QACJ,YAAY,EAAE,iCAAiC;QAC/C,UAAU,EAAE,oCAAoC;QAChD,YAAY,EAAE,iDAAiD;QAC/D,GAAG,EAAE,MAAM;QACX,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,MAAM;QACf,YAAY,EAAE,gCAAgC;QAC9C,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAC1B;IACD,IAAI,EAAE;QACJ,YAAY,EAAE,sCAAsC;QACpD,UAAU,EAAE,oCAAoC;QAChD,YAAY,EAAE,uBAAuB;QACrC,GAAG,EAAE,UAAU;QACf,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,MAAM;QACf,YAAY,EAAE,gCAAgC;QAC9C,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAC1B;CACF,CAAC;AAeF,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;AACtC,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnF,OAAO,CACL,GAAG;SACA,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;SAChC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,WAAW,EAAE,IAAI,cAAc,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1D,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,cAAc,CAAC;AAC7E,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,CACL,IAAI;SACD,QAAQ,CAAC,GAAG,CAAC;SACb,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;SAChC,WAAW,EAAE,IAAI,cAAc,CACnC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,OAAe,EAAE,CAAS,EAAE,OAAe;IAC9E,IAAI,MAAM,IAAA,kBAAU,EAAC,CAAC,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,SAAS,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IACD,MAAM,IAAA,iBAAS,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,aAAG,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,OAAO,EAAE,aAAa,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,gBAAgB,GAAG;;;;;;;;;;CAUxB,CAAC;AAEF,MAAM,oBAAoB,GAAG;;;;;;;;;;CAU5B,CAAC;AAEF,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;CAiB5B,CAAC;AAEF,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwB5B,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC1B,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsB7B,CAAC;AAEF,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsChC,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;CAQ7B,CAAC;AAEF,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;CAc5B,CAAC;AAEF,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;CAe3B,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiGvB,CAAC;AAEF,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAEhF,yCAAyC;AACzC,SAAS,kBAAkB,CAAC,EAAkB;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,OAAO;;;;;EAKP,QAAQ;;EAER,GAAG,CAAC,YAAY;EAChB,GAAG,CAAC,UAAU;;;;MAIV,GAAG,CAAC,GAAG;;;EAGX,GAAG,CAAC,YAAY;;;;;;;;;;;;;;;CAejB,CAAC;AACF,CAAC;AAED,SAAS,8BAA8B;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCR,CAAC;AACF,CAAC;AAED,SAAS,4BAA4B;IACnC,OAAO;;;;;;;;;;;CAWR,CAAC;AACF,CAAC;AAED,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;CAe9B,CAAC;AAEF,kBAAkB;AAClB,MAAM,oBAAoB,GAAG,CAAC,WAAmB,EAAE,EAAE,CACnD,IAAI,CAAC,SAAS,CACZ;IACE,OAAO,EAAE,uCAAuC;IAChD,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,CAAC;IACV,MAAM,EAAE;QACN;YACE,GAAG,EAAE,cAAc;YACnB,GAAG,EAAE,cAAc;SACpB;KACF;IACD,MAAM,EAAE;QACN;YACE,GAAG,EAAE,OAAO;YACZ,IAAI,EAAE,eAAe;SACtB;KACF;IACD,GAAG,EAAE;QACH,QAAQ,EAAE,YAAY;KACvB;CACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AAEJ,0BAA0B;AAC1B,MAAM,iBAAiB,GAAG,CAAC,WAAmB,EAAE,EAAE,CAAC;;;eAGpC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;CAyBzB,CAAC;AAEF,8BAA8B;AAC9B,MAAM,sBAAsB,GAAG,CAAC,WAAmB,EAAE,EAAE,CAAC;UAC9C,WAAW;;;;;;;;;;;CAWpB,CAAC;AAEF,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF,SAAS,oBAAoB,CAAC,EAAkB;IAC9C,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1B,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;QAClB,OAAO;;;;;;;;oBAQS,GAAG,CAAC,OAAO;;;eAGhB,GAAG,CAAC,YAAY,EAAE,CAAC;IAChC,CAAC;IACD,OAAO;;;;;oBAKW,GAAG,CAAC,OAAO;;;eAGhB,GAAG,CAAC,YAAY,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,EAAkB;IACtC,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1B,OAAO;;;;;;;;;;;;;;;EAeP,oBAAoB,CAAC,EAAE,CAAC;;;;;;eAMX,GAAG,CAAC,GAAG;CACrB,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,EAAkB;IACvC,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1B,OAAO;;;;;;;;;;;;;;;EAeP,oBAAoB,CAAC,EAAE,CAAC;;;eAGX,GAAG,CAAC,GAAG;;;eAGP,GAAG,CAAC,GAAG;CACrB,CAAC;AACF,CAAC;AAED,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CjC,CAAC;AAEF,SAAS,sBAAsB,CAAC,EAAkB;IAChD,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1B,OAAO;;;;;;;;;;;;;EAaP,oBAAoB,CAAC,EAAE,CAAC;;;eAGX,GAAG,CAAC,GAAG;;;;;;;;;CASrB,CAAC;AACF,CAAC;AAED,SAAS,sBAAsB,CAAC,EAAkB;IAChD,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1B,OAAO;;;;;;;;;;;;;EAaP,oBAAoB,CAAC,EAAE,CAAC;;;eAGX,GAAG,CAAC,GAAG;;;;;;;;;;;;;;;;;CAiBrB,CAAC;AACF,CAAC;AAED,SAAS,0BAA0B,CAAC,EAAkB;IACpD,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1B,OAAO;;;;;;;;;;;;;EAaP,oBAAoB,CAAC,EAAE,CAAC;;;eAGX,GAAG,CAAC,GAAG;;;;;;CAMrB,CAAC;AACF,CAAC;AAED,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF,SAAS,cAAc,CAAC,OAAsB;IAC5C,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IACnG,MAAM,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;IAEtC,IAAI,MAAM,GAAG,KAAK,WAAW;;;CAG9B,CAAC;IAEA,yCAAyC;IACzC,IAAI,mBAAmB,EAAE,CAAC;QACxB,MAAM,IAAI;yCAC2B,WAAW;CACnD,CAAC;IACA,CAAC;IAED,MAAM,IAAI;;;;;EAKV,GAAG,CAAC,WAAW;;;EAGf,GAAG,CAAC,GAAG;;;EAGP,GAAG,CAAC,GAAG;;CAER,CAAC;IAEA,+BAA+B;IAC/B,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI;;;;sBAIQ,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE;EACtE,GAAG,CAAC,GAAG;;;EAGP,GAAG,CAAC,GAAG;;;EAGP,GAAG,CAAC,GAAG;;CAER,CAAC;QAEE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI;;;;;;;;;CASf,CAAC;QACE,CAAC;QAED,MAAM,IAAI;;;;;;mCAMqB,WAAW;4BAClB,WAAW;;CAEtC,CAAC;IACA,CAAC;IAED,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI;;;;;EAKZ,GAAG,CAAC,GAAG;;;;;;;CAOR,CAAC;IACA,CAAC;IAED,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI;;;;;EAKZ,GAAG,CAAC,GAAG;;;EAGP,GAAG,CAAC,GAAG;;;;;;;CAOR,CAAC;IACA,CAAC;IAED,IAAI,gBAAgB,KAAK,YAAY,EAAE,CAAC;QACtC,MAAM,IAAI;;;;;EAKZ,GAAG,CAAC,GAAG;;;EAGP,GAAG,CAAC,GAAG;;;;;;;CAOR,CAAC;IACA,CAAC;IAED,gCAAgC;IAChC,MAAM,IAAI;;;;;;;CAOX,CAAC;IAEA,IAAI,gBAAgB,KAAK,MAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACzD,MAAM,IAAI;;;CAGb,CAAC;IACA,CAAC;IAED,yBAAyB;IACzB,IAAI,mBAAmB,EAAE,CAAC;QACxB,MAAM,IAAI;;;;;;;+BAQR,gBAAgB,KAAK,MAAM;YACzB,CAAC,CAAC,2BAA2B;YAC7B,CAAC,CAAC,gBAAgB,KAAK,QAAQ;gBAC7B,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,gBAAgB,KAAK,QAAQ;oBAC7B,CAAC,CAAC,YAAY;oBACd,CAAC,CAAC,oBACV;;;CAGH,CAAC;QAEE,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI;;;;CAIf,CAAC;QACE,CAAC;aAAM,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,IAAI;;;;CAIf,CAAC;QACE,CAAC;aAAM,IAAI,gBAAgB,KAAK,YAAY,EAAE,CAAC;YAC7C,MAAM,IAAI;;CAEf,CAAC;QACE,CAAC;aAAM,CAAC;YACN,MAAM,IAAI;;CAEf,CAAC;QACE,CAAC;IACH,CAAC;IAED,MAAM,IAAI;;;;;MAKN,GAAG,CAAC,GAAG;MACP,GAAG,CAAC,GAAG;MACP,GAAG,CAAC,GAAG;MACP,GAAG,CAAC,GAAG;MACP,GAAG,CAAC,GAAG;MACP,GAAG,CAAC,GAAG;CACZ,CAAC;IAEA,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,OAAO,GAAG,CAAC,GAAG;MACtB,GAAG,CAAC,GAAG;MACP,GAAG,CAAC,GAAG;CACZ,CAAC;IACA,CAAC;IAED,IAAI,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,KAAK,YAAY,EAAE,CAAC;QACvE,MAAM,IAAI,OAAO,GAAG,CAAC,GAAG,yBAAyB,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,oBAAoB;CACvH,CAAC;IACA,CAAC;IAED,MAAM,IAAI;;;;CAIX,CAAC;IAEA,6CAA6C;IAC7C,MAAM,IAAI;;CAEX,CAAC;IAEA,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI;;;;;CAKb,CAAC;IACA,CAAC;IAED,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI;CACb,CAAC;IACA,CAAC;IAED,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI;;CAEb,CAAC;IACA,CAAC;IAED,IAAI,gBAAgB,KAAK,YAAY,EAAE,CAAC;QACtC,MAAM,IAAI;CACb,CAAC;IACA,CAAC;IAED,IAAI,mBAAmB,EAAE,CAAC;QACxB,MAAM,IAAI;;;;CAIb,CAAC;IACA,CAAC;IAED,MAAM,IAAI;;;;;;;;;;;;;;;;CAgBX,CAAC;IAEA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,SAAS,WAAW,CAAC,UAAmB;IACtC,OAAO;QACL,WAAW,EAAE,UAAU,IAAI,cAAc;QACzC,gBAAgB,EAAE,MAAM;QACxB,UAAU,EAAE,QAAQ;QACpB,mBAAmB,EAAE,IAAI;QACzB,cAAc,EAAE,KAAK;KACtB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,KAAmB;IACzE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC7D,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAEnE,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,8BAA8B,WAAW,OAAO,CAAC,CAAC,CAAC;QAEzE,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE;YAC9C,IAAI,EAAE,WAAW;YACjB,cAAc,EAAE,KAAK,EAAE,EAAE,IAAI,KAAK;YAClC,WAAW,EAAE,KAAK;YAClB,OAAO,EAAE,KAAK;YACd,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAE5C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,EAAE,CAAC;QACnB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,OAAO,EAAE,gCAAgC,WAAW,IAAI,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,QAAQ,WAAW,EAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,kDAAkD,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,sDAAsD,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,6DAA6D,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,yDAAyD,CAAC,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACnF,OAAO,CAAC,KAAK,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,kCAAkC,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,6CAA6C,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,qBAAqB,WAAW,OAAO,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,sCAAsC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,UAAmB,EAAE,KAAmB;IACpE,MAAM,CAAC,GAAG,MAAM,IAAA,eAAK,GAAE,CAAC;IAExB,eAAe;IACf,IAAI,WAAW,GAAG,UAAU,CAAC;IAC7B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;YAC1B,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;gBAChB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;oBAAE,OAAO,0BAA0B,CAAC;gBACnD,OAAO,SAAS,CAAC;YACnB,CAAC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,WAAW,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;YACjC,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,kCAAkC,EAAE,KAAK,EAAE,YAAqB,EAAE;gBAC3E,EAAE,KAAK,EAAE,wBAAwB,EAAE,KAAK,EAAE,IAAa,EAAE;aAC1D;YACD,YAAY,EAAE,YAAqB;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,mBAAmB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO;gBACL,WAAW;gBACX,gBAAgB,EAAE,MAAM;gBACxB,UAAU,EAAE,MAAM;gBAClB,mBAAmB,EAAE,KAAK;gBAC1B,cAAc,EAAE,KAAK,EAAE,EAAE,IAAI,KAAK;gBAClC,YAAY,EAAE,IAAI;aACnB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,gBAAgB,GAAG,KAAK,EAAE,MAAM,CAAC;IACrC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;YAC5B,OAAO,EAAE,0BAA0B;YACnC,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,+CAA+C,EAAE,KAAK,EAAE,MAA0B,EAAE;gBAC7F,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,QAA4B,EAAE;gBACrE,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,QAA4B,EAAE;gBAC5D,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAgC,EAAE;aACzE;YACD,YAAY,EAAE,MAA0B;SACzC,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,gBAAgB,GAAG,MAAM,CAAC;IAC5B,CAAC;IAED,wCAAwC;IACxC,IAAI,UAAU,GAAe,MAAM,CAAC;IACpC,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAChC,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;YACjB,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;gBAC5B,OAAO,EAAE,aAAa;gBACtB,OAAO,EAAE;oBACP,EAAE,KAAK,EAAE,8CAA8C,EAAE,KAAK,EAAE,QAAsB,EAAE;oBACxF,EAAE,KAAK,EAAE,sCAAsC,EAAE,KAAK,EAAE,UAAwB,EAAE;oBAClF,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAoB,EAAE;iBAC5D;gBACD,YAAY,EAAE,QAAsB;aACrC,CAAC,CAAC;YACH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,cAAc,GAAG,KAAK,EAAE,EAAE,CAAC;IAC/B,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;YAC5B,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAuB,EAAE;gBAC1D,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAwB,EAAE;gBAClD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAwB,EAAE;aACnD;YACD,YAAY,EAAE,KAAuB;SACtC,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,cAAc,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,iBAAiB;IACjB,IAAI,mBAAmB,GAAG,KAAK,EAAE,IAAI,CAAC;IACtC,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;YAC7B,OAAO,EAAE,8BAA8B;YACvC,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,mBAAmB,GAAG,MAAM,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,WAAW;QACX,gBAAgB;QAChB,UAAU;QACV,mBAAmB;QACnB,cAAc;KACf,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,SAAiB,EAAE,OAAsB;IAC9E,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAE9D,QAAQ,gBAAgB,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,IAAA,iBAAS,EAAC,KAAK,CAAC,CAAC;YACvB,MAAM,qBAAqB,CACzB,SAAS,EACT,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,EAC9B,kBAAkB,CAAC,OAAO,CAAC,cAAc,CAAC,CAC3C,CAAC;YAEF,MAAM,aAAa,GAAG,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC,4BAA4B,EAAE,CAAC;YAClH,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,oBAAoB,CAAC,EAAE,aAAa,CAAC,CAAC;YAC9F,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,sBAAsB,CAAC,CAAC;YAChG,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,qBAAqB,CAAC,CAAC;YACrG,MAAM;QACR,CAAC;QAED,KAAK,QAAQ;YACX,MAAM,qBAAqB,CACzB,SAAS,EACT,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EACnC,oBAAoB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CACrD,CAAC;YACF,MAAM;QAER,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,IAAA,iBAAS,EAAC,KAAK,CAAC,CAAC;YACvB,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC1G,MAAM;QACR,CAAC;QAED,KAAK,YAAY;YACf,MAAM,qBAAqB,CACzB,SAAS,EACT,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EACrC,sBAAsB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CACvD,CAAC;YACF,MAAM;IACV,CAAC;IAED,qCAAqC;IACrC,MAAM,UAAU,GACd,gBAAgB,KAAK,MAAM,IAAI,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,0BAA0B,CAAC;IAC3G,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;AAC3F,CAAC;AAED,mCAAmC;AACnC,MAAM,0BAA0B,GAAG;;;;CAIlC,CAAC;AAEF,KAAK,UAAU,qBAAqB,CAClC,SAAiB,EACjB,gBAAkC,EAClC,EAAkB;IAElB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACjE,MAAM,IAAA,iBAAS,EAAC,WAAW,CAAC,CAAC;IAE7B,qCAAqC;IACrC,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7F,6CAA6C;IAC7C,MAAM,cAAc,GAAG,yBAAyB,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,cAAc,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAwB,EAAE,EAAkB;IAC7E,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,yBAAyB,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACpC,KAAK,QAAQ;YACX,OAAO,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACpC,KAAK,YAAY;YACf,OAAO,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAsB;IACnD,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAEnG,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IAEtD,qBAAqB;IACrB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,aAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CACX,IAAA,UAAC,EAAC,KAAK,EAAE,iDAAiD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CACrG,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,mEAAmE,CAAC,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,IAAA,kBAAU,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CACX,IAAA,UAAC,EAAC,KAAK,EAAE,kDAAkD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CACtG,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,sDAAsD,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrE,MAAM,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAC,EAAC,MAAM,EAAE,UAAU,CAAC,wBAAwB,IAAA,UAAC,EAAC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,iBAAiB,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAC5D,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,YAAY,UAAU,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,sBAAsB,cAAc,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,qBAAqB,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEzB,sBAAsB;IACtB,MAAM,IAAA,kBAAO,EAAC,SAAS,CAAC,CAAC;IAEzB,uDAAuD;IACvD,MAAM,WAAW,GAAG,IAAA,wBAAc,GAAE,CAAC;IACrC,MAAM,2BAA2B,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAErG,sBAAsB;IACtB,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACjG,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACzG,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAElH,kBAAkB;IAClB,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,oBAAoB,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAChH,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC7G,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAEzG,oBAAoB;IACpB,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAE/F,4BAA4B;IAC5B,MAAM,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAElD,iBAAiB;IACjB,IAAI,mBAAmB,EAAE,CAAC;QACxB,MAAM,qBAAqB,CAAC,SAAS,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAC3E,CAAC;IAED,iBAAiB;IACjB,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAEnG,mBAAmB;IACnB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,cAAc,CACrB,MAAc,EACd,gBAAkC,EAClC,UAAsB,EACtB,mBAA4B,EAC5B,EAAkB;IAElB,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,YAAY,EAAE,IAAA,UAAC,EAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,YAAY,EAAE,IAAA,UAAC,EAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,YAAY,EAAE,IAAA,UAAC,EAAC,MAAM,EAAE,uCAAuC,CAAC,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,YAAY,EAAE,IAAA,UAAC,EAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEvE,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CACT,KAAK,GAAG,CAAC,GAAG,eAAe,EAC3B,IAAA,UAAC,EAAC,MAAM,EAAE,UAAU,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAC/E,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,eAAe,EAAE,IAAA,UAAC,EAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAA,UAAC,EAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,eAAe,EAAE,IAAA,UAAC,EAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,gBAAgB,KAAK,YAAY,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,eAAe,EAAE,IAAA,UAAC,EAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAA,UAAC,EAAC,MAAM,EAAE,uCAAuC,CAAC,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,4CAA4C;AAC5C,gFAAgF;AAEhF,KAAK,UAAU,2BAA2B,CACxC,GAAW,EACX,YAAgC,EAChC,WAAmB,EACnB,gBAAkC,EAClC,KAAqB,KAAK;IAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,IAAA,gBAAQ,EAAc,OAAO,CAAC,CAAC;IAEtD,MAAM,gBAAgB,GAAG,IAAI,WAAW,EAAE,CAAC;IAE3C,MAAM,WAAW,GAA2B;QAC1C,GAAG,EAAE,cAAc;QACnB,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,oBAAoB;QAC7B,MAAM,EAAE,iBAAiB;QACzB,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,8CAA8C;KAC3D,CAAC;IAEF,8BAA8B;IAC9B,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAChC,WAAW,CAAC,WAAW,CAAC,GAAG,4CAA4C,CAAC;QACxE,WAAW,CAAC,aAAa,CAAC,GAAG,8CAA8C,CAAC;QAC5E,WAAW,CAAC,cAAc,CAAC,GAAG,+CAA+C,CAAC;IAChF,CAAC;IAED,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAClC,WAAW,CAAC,QAAQ,CAAC,GAAG,kCAAkC,CAAC;IAC7D,CAAC;IAED,IAAI,gBAAgB,KAAK,YAAY,EAAE,CAAC;QACtC,WAAW,CAAC,QAAQ,CAAC,GAAG,iBAAiB,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,YAAY,IAAI,cAAc,CAAC,GAAG,CAAC;QACzC,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO;QAC9B,YAAY,EAAE;YACZ,eAAe,EAAE,gBAAgB;YACjC,mBAAmB,EAAE,gBAAgB;YACrC,oBAAoB,EAAE,gBAAgB;YACtC,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE,QAAQ;YACb,kBAAkB,EAAE,QAAQ;SAC7B;QACD,eAAe,EAAE;YACf,mBAAmB,EAAE,gBAAgB;YACrC,WAAW,EAAE,UAAU;YACvB,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,UAAU;YACzB,GAAG,EAAE,SAAS;YACd,aAAa,EAAE,SAAS;YACxB,UAAU,EAAE,QAAQ;SACrB;KACF,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAA,iBAAS,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,OAAO,EAAE,gFAAgF,CAAC,CAAC,CAAC;QAC1G,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAgB,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;IAErD,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;IACzC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;IACzC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;IAEzC,0DAA0D;IAC1D,MAAM,CAAC,OAAO,GAAG;QACf,GAAG,WAAW;QACd,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;KAC5B,CAAC;IAEF,MAAM,CAAC,OAAO,GAAG;QACf,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;QAC3B,GAAG,IAAI,CAAC,OAAO;KAChB,CAAC;IAEF,MAAM,CAAC,YAAY,GAAG;QACpB,GAAG,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC;QAChC,GAAG,IAAI,CAAC,YAAY;KACrB,CAAC;IAEF,MAAM,CAAC,eAAe,GAAG;QACvB,GAAG,CAAC,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAC;QACnC,GAAG,IAAI,CAAC,eAAe;KACxB,CAAC;IAEF,MAAM,IAAA,iBAAS,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,OAAO,EAAE,kFAAkF,CAAC,CAAC,CAAC;AAC9G,CAAC;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEzE,KAAK,UAAU,SAAS,CAAC,UAAmB,EAAE,KAAmB;IACtE,oDAAoD;IACpD,IAAI,KAAK,EAAE,EAAE,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,UAAU,IAAI,cAAc,CAAC;QAC1C,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,8DAA8D;IAC9D,IAAI,KAAK,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACxC,4CAA4C;QAC5C,IAAI,KAAK,EAAE,MAAM;YAAE,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3D,IAAI,KAAK,EAAE,KAAK;YAAE,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;QACnD,IAAI,KAAK,EAAE,IAAI,KAAK,SAAS;YAAE,OAAO,CAAC,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC;QACxE,IAAI,KAAK,EAAE,EAAE;YAAE,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,UAAU;YAAE,OAAO,CAAC,WAAW,GAAG,UAAU,CAAC;QAEjD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,4DAA4D,CAAC,CAAC,CAAC;YACtF,OAAO,CAAC,GAAG,CAAC,UAAU,IAAA,UAAC,EAAC,MAAM,EAAE,0CAA0C,CAAC,EAAE,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,mBAAmB;IACnB,MAAM,CAAC,GAAG,MAAM,IAAA,eAAK,GAAE,CAAC;IACxB,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO,CAAC,YAAY;QAAE,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAE1D,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC","sourcesContent":["import * as path from 'path';\nimport { promises as fsp } from 'fs';\nimport { c } from '../colors';\nimport { ensureDir, fileExists, isDirEmpty, writeJSON, readJSON } from '@frontmcp/utils';\nimport { runInit } from '../tsconfig';\nimport { getSelfVersion } from '../version';\nimport { clack } from '../utils/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.test.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## 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\nasync function scaffoldNxWorkspace(projectName: string, flags?: CreateFlags): Promise<void> {\n try {\n const { FsTree } = await import('nx/src/generators/tree.js');\n const { workspaceGenerator } = await import('@frontmcp/nx');\n const { flushChanges } = await import('nx/src/generators/tree.js');\n\n console.log(c('cyan', `\\nScaffolding Nx monorepo: ${projectName}...\\n`));\n\n const tree = new FsTree(process.cwd(), false);\n const callback = await workspaceGenerator(tree, {\n name: projectName,\n packageManager: flags?.pm ?? 'npm',\n skipInstall: false,\n skipGit: false,\n createSampleApp: true,\n });\n\n flushChanges(tree.root, tree.listChanges());\n\n if (callback) {\n await callback();\n }\n\n console.log(c('green', `\\n✅ Nx monorepo created at ./${projectName}\\n`));\n console.log(c('dim', 'Next steps:'));\n console.log(c('dim', ` cd ${projectName}`));\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 (message.includes('Cannot find module') || message.includes('MODULE_NOT_FOUND')) {\n console.error(c('red', '\\n@frontmcp/nx is not installed.'));\n console.log(c('dim', 'Install it first:'));\n console.log(c('bold', ' npm install -D @frontmcp/nx nx @nx/devkit'));\n console.log(c('dim', '\\nThen retry:'));\n console.log(c('bold', ` frontmcp create ${projectName} --nx`));\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.test.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 // 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"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/commands/dev.ts"],"names":[],"mappings":";;AAiBA,wBA+CC;;AAhED,mDAA6B;AAC7B,iDAAoD;AAEpD,sCAA8B;AAC9B,oCAA2C;AAC3C,sCAA0C;AAE1C,SAAS,SAAS,CAAC,IAAmB;IACpC,IAAI,CAAC;QACH,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,MAAM,CAAC,IAAgB;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,IAAA,iBAAY,EAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAElD,4DAA4D;IAC5D,IAAA,gBAAU,EAAC,GAAG,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CACT,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,OAAO,CAAC,aAAa,IAAA,UAAC,EAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,IAAA,UAAC,EACjE,MAAM,EACN,sBAAsB,CACvB,uBAAuB,CACzB,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAE1D,mEAAmE;IACnE,mEAAmE;IACnE,MAAM,GAAG,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE;QAChF,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE;QAC7E,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,SAAS,CAAC,OAAO,CAAC,CAAC;QACnB,SAAS,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACtB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import * as path from 'path';\nimport { spawn, ChildProcess } from 'child_process';\nimport { ParsedArgs } from '../args';\nimport { c } from '../colors';\nimport { resolveEntry } from '../utils/fs';\nimport { loadDevEnv } from '../utils/env';\n\nfunction killQuiet(proc?: ChildProcess) {\n try {\n if (proc) {\n proc.kill('SIGINT');\n }\n } catch {\n // ignore\n }\n}\n\nexport async function runDev(opts: ParsedArgs): Promise<void> {\n const cwd = process.cwd();\n const entry = await resolveEntry(cwd, opts.entry);\n\n // Load .env and .env.local files before starting the server\n loadDevEnv(cwd);\n\n console.log(`${c('cyan', '[dev]')} using entry: ${path.relative(cwd, entry)}`);\n console.log(\n `${c('gray', '[dev]')} starting ${c('bold', 'tsx --watch')} and ${c(\n 'bold',\n 'tsc --noEmit --watch',\n )} (async type-checker)`,\n );\n console.log(`${c('gray', 'hint:')} press Ctrl+C to stop`);\n\n // Use --conditions node to ensure proper Node.js module resolution\n // This helps with dynamic require() calls in packages like ioredis\n const app = spawn('npx', ['-y', 'tsx', '--conditions', 'node', '--watch', entry], {\n stdio: 'inherit',\n shell: true,\n });\n const checker = spawn('npx', ['-y', 'tsc', '--noEmit', '--pretty', '--watch'], {\n stdio: 'inherit',\n shell: true,\n });\n\n const cleanup = () => {\n killQuiet(checker);\n killQuiet(app);\n };\n\n process.on('SIGINT', () => {\n cleanup();\n process.exit(0);\n });\n\n await new Promise<void>((resolve, reject) => {\n app.on('close', () => {\n cleanup();\n resolve();\n });\n app.on('error', (err) => {\n cleanup();\n reject(err);\n });\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/commands/doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'path';\nimport { spawn } from 'child_process';\nimport { c } from '../colors';\nimport { fileExists, readJSON } from '@frontmcp/utils';\nimport { checkRequiredTsOptions } from '../tsconfig';\nimport { resolveEntry } from '../utils/fs';\n\nfunction cmpSemver(a: string, b: string): number {\n const pa = a.split('.').map((n) => parseInt(n, 10) || 0);\n const pb = b.split('.').map((n) => parseInt(n, 10) || 0);\n for (let i = 0; i < 3; i++) {\n if ((pa[i] || 0) > (pb[i] || 0)) return 1;\n if ((pa[i] || 0) < (pb[i] || 0)) return -1;\n }\n return 0;\n}\n\nexport async function runDoctor(): Promise<void> {\n const MIN_NODE = '22.0.0';\n const MIN_NPM = '10.0.0';\n const cwd = process.cwd();\n\n let ok = true;\n\n const nodeVer = process.versions.node;\n if (cmpSemver(nodeVer, MIN_NODE) >= 0) {\n console.log(`✅ Node ${nodeVer} (min ${MIN_NODE})`);\n } else {\n ok = false;\n console.log(`❌ Node ${nodeVer} — please upgrade to >= ${MIN_NODE}`);\n }\n\n let npmVer = 'unknown';\n try {\n npmVer = await new Promise<string>((resolve, reject) => {\n const child = spawn('npm', ['-v'], { shell: true });\n let out = '';\n child.stdout?.on('data', (d) => (out += String(d)));\n child.on('close', () => resolve(out.trim()));\n child.on('error', reject);\n });\n if (cmpSemver(npmVer, MIN_NPM) >= 0) {\n console.log(`✅ npm ${npmVer} (min ${MIN_NPM})`);\n } else {\n ok = false;\n console.log(`❌ npm ${npmVer} — please upgrade to >= ${MIN_NPM}`);\n }\n } catch {\n ok = false;\n console.log('❌ npm not found in PATH');\n }\n\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n if (await fileExists(tsconfigPath)) {\n console.log(`✅ tsconfig.json found`);\n const tsconfig = await readJSON<Record<string, any>>(tsconfigPath);\n const { ok: oks, issues } = checkRequiredTsOptions(tsconfig?.compilerOptions);\n for (const line of oks) console.log(c('green', ` ✓ ${line}`));\n if (issues.length) {\n ok = false;\n for (const line of issues) console.log(c('yellow', ` • ${line}`));\n console.log(c('cyan', ` -> Run \"frontmcp init\" to apply the required settings.`));\n }\n } else {\n ok = false;\n console.log(`❌ tsconfig.json not found — run ${c('cyan', 'frontmcp init')}`);\n }\n\n try {\n const entry = await resolveEntry(cwd);\n console.log(`✅ entry detected: ${path.relative(cwd, entry)}`);\n } catch (e: any) {\n const firstLine = (e?.message as string | undefined)?.split('\\n')?.[0] ?? 'entry not found';\n console.log(`❌ entry not detected — ${firstLine}`);\n }\n\n if (ok) console.log(c('green', '\\nAll checks passed. You are ready to go!'));\n else console.log(c('yellow', '\\nSome checks failed. See above for fixes.'));\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"inspector.js","sourceRoot":"","sources":["../../../src/commands/inspector.ts"],"names":[],"mappings":";;AAGA,oCAGC;AAND,sCAA8B;AAC9B,2CAAyC;AAElC,KAAK,UAAU,YAAY;IAChC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,aAAa,CAAC,6BAA6B,CAAC,CAAC;IACtE,MAAM,IAAA,cAAM,EAAC,KAAK,EAAE,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC,CAAC;AACjE,CAAC","sourcesContent":["import { c } from '../colors';\nimport { runCmd } from '@frontmcp/utils';\n\nexport async function runInspector(): Promise<void> {\n console.log(`${c('cyan', '[inspector]')} launching MCP Inspector...`);\n await runCmd('npx', ['-y', '@modelcontextprotocol/inspector']);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/install/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * runInstall() orchestrator — installs an MCP app from npm, local, or git source.\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport { ParsedArgs } from '../../args';\nimport { c } from '../../colors';\nimport { appDir, ensurePmDirs } from '../../pm/pm.paths';\nimport { parseInstallSource } from './types';\nimport { registerApp } from './registry';\nimport { runQuestionnaire, writeEnvFile } from './questionnaire';\nimport { fetchFromNpm } from './sources/npm';\nimport { fetchFromLocal } from './sources/local';\nimport { fetchFromGit } from './sources/git';\nimport { ExecManifest } from '../build/exec/manifest';\nimport { runCmd } from '@frontmcp/utils';\n\nexport async function runInstall(opts: ParsedArgs): Promise<void> {\n const sourceStr = opts._[1];\n if (!sourceStr) {\n throw new Error('Missing install source. Usage: frontmcp install <npm-package|./local-path|github:user/repo>');\n }\n\n const source = parseInstallSource(sourceStr);\n console.log(`${c('cyan', '[install]')} source: ${source.type} → ${source.ref}`);\n\n // Create temp directory\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'frontmcp-install-'));\n\n try {\n // 1. Fetch to temp directory\n console.log(`${c('cyan', '[install]')} fetching...`);\n let packageDir: string;\n\n switch (source.type) {\n case 'npm':\n packageDir = await fetchFromNpm(source.ref, tmpDir, opts.registry);\n break;\n case 'local':\n packageDir = await fetchFromLocal(source.ref, tmpDir);\n break;\n case 'git':\n packageDir = await fetchFromGit(source.ref, tmpDir);\n break;\n }\n\n // 2. Look for manifest\n let manifest = findManifest(packageDir);\n\n // 3. If no manifest, check for frontmcp.config.js and build\n if (!manifest) {\n const configPath = path.join(packageDir, 'frontmcp.config.js');\n const configJsonPath = path.join(packageDir, 'frontmcp.config.json');\n\n if (fs.existsSync(configPath) || fs.existsSync(configJsonPath)) {\n console.log(`${c('cyan', '[install]')} no manifest found, building from config...`);\n await runCmd('npx', ['frontmcp', 'build', '--exec'], {\n cwd: packageDir,\n });\n manifest = findManifest(path.join(packageDir, 'dist')) || findManifest(packageDir);\n }\n }\n\n if (!manifest) {\n throw new Error(\n 'Could not find or generate a manifest. Ensure the package has a ' +\n 'frontmcp.config.js or was built with \"frontmcp build --exec\".',\n );\n }\n\n const { data: manifestData, dir: manifestDir } = manifest;\n\n // 4. Install to ~/.frontmcp/apps/{name}/\n const installDir = appDir(manifestData.name);\n ensurePmDirs();\n fs.mkdirSync(installDir, { recursive: true });\n\n console.log(`${c('cyan', '[install]')} installing \"${manifestData.name}\" to ${installDir}`);\n\n // Copy bundle + manifest + runner\n copyIfExists(manifestDir, installDir, manifestData.bundle);\n copyIfExists(manifestDir, installDir, `${manifestData.name}.manifest.json`);\n copyIfExists(manifestDir, installDir, manifestData.name);\n\n // Make runner executable\n const runnerPath = path.join(installDir, manifestData.name);\n if (fs.existsSync(runnerPath)) {\n fs.chmodSync(runnerPath, 0o755);\n }\n\n // 5. Install native addons\n if (manifestData.dependencies.nativeAddons.length > 0) {\n console.log(`${c('cyan', '[install]')} installing native dependencies...`);\n await runCmd('npm', ['init', '-y', '--silent'], { cwd: installDir });\n await runCmd('npm', ['install', ...manifestData.dependencies.nativeAddons, '--save', '--silent'], {\n cwd: installDir,\n });\n }\n\n // 6. Set up SQLite data dir if needed\n if (manifestData.storage.type === 'sqlite') {\n const dataDir = path.join(os.homedir(), '.frontmcp', 'data', manifestData.name);\n fs.mkdirSync(dataDir, { recursive: true });\n }\n\n // 7. Run setup questionnaire\n if (manifestData.setup?.steps && manifestData.setup.steps.length > 0) {\n console.log(`\\n${c('bold', 'Setup Configuration')}`);\n const result = await runQuestionnaire(manifestData.setup.steps, {\n silent: opts.yes,\n });\n writeEnvFile(installDir, result.envContent);\n console.log(`${c('green', '[install]')} configuration saved to .env`);\n }\n\n // 8. Register in registry\n const port = opts.port || manifestData.network.defaultPort;\n registerApp(manifestData.name, {\n version: manifestData.version,\n installDir,\n installedAt: new Date().toISOString(),\n runner: path.join(installDir, manifestData.name),\n bundle: path.join(installDir, manifestData.bundle),\n storage: manifestData.storage.type,\n port,\n source: { type: source.type, ref: source.ref },\n });\n\n console.log(`\\n${c('green', `Installed \"${manifestData.name}\" successfully.`)}`);\n console.log(`\\n${c('bold', 'Start with:')}`);\n console.log(` frontmcp start ${manifestData.name}`);\n console.log(`\\n${c('bold', 'Reconfigure:')}`);\n console.log(` frontmcp configure ${manifestData.name}`);\n } finally {\n // Clean up temp directory\n try {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n } catch {\n // ignore cleanup errors\n }\n }\n}\n\nfunction findManifest(dir: string): { data: ExecManifest; dir: string } | null {\n if (!fs.existsSync(dir)) return null;\n\n const files = fs.readdirSync(dir);\n const manifestFile = files.find((f: string) => f.endsWith('.manifest.json'));\n\n if (manifestFile) {\n const manifestPath = path.join(dir, manifestFile);\n const data = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')) as ExecManifest;\n return { data, dir };\n }\n\n // Check dist/ subdirectory\n const distDir = path.join(dir, 'dist');\n if (fs.existsSync(distDir)) {\n return findManifest(distDir);\n }\n\n return null;\n}\n\nfunction copyIfExists(fromDir: string, toDir: string, filename: string): void {\n const src = path.join(fromDir, filename);\n if (fs.existsSync(src)) {\n fs.copyFileSync(src, path.join(toDir, filename));\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/commands/install/registry.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAUH,oCASC;AAED,sCAIC;AAED,kCAIC;AAED,sCAMC;AAED,4CAGC;AAED,gDASC;;AArDD,+CAAyB;AACzB,gDAA+D;AAG/D,SAAS,aAAa;IACpB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAClC,CAAC;AAED,SAAgB,YAAY;IAC1B,MAAM,QAAQ,GAAG,IAAA,uBAAY,GAAE,CAAC;IAChC,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,aAAa,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAqB,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,QAA0B;IACtD,IAAA,uBAAY,GAAE,CAAC;IACf,MAAM,QAAQ,GAAG,IAAA,uBAAY,GAAE,CAAC;IAChC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,SAAgB,WAAW,CAAC,IAAY,EAAE,IAAsC;IAC9E,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3B,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY;IACxC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACrC,CAAC;AAED,SAAgB,kBAAkB;IAIhC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI;QACJ,IAAI;KACL,CAAC,CAAC,CAAC;AACN,CAAC","sourcesContent":["/**\n * ~/.frontmcp/registry.json CRUD operations.\n */\n\nimport * as fs from 'fs';\nimport { registryPath, ensurePmDirs } from '../../pm/pm.paths';\nimport { FrontmcpRegistry } from './types';\n\nfunction emptyRegistry(): FrontmcpRegistry {\n return { version: 1, apps: {} };\n}\n\nexport function readRegistry(): FrontmcpRegistry {\n const filePath = registryPath();\n try {\n if (!fs.existsSync(filePath)) return emptyRegistry();\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as FrontmcpRegistry;\n } catch {\n return emptyRegistry();\n }\n}\n\nexport function writeRegistry(registry: FrontmcpRegistry): void {\n ensurePmDirs();\n const filePath = registryPath();\n fs.writeFileSync(filePath, JSON.stringify(registry, null, 2), 'utf-8');\n}\n\nexport function registerApp(name: string, data: FrontmcpRegistry['apps'][string]): void {\n const registry = readRegistry();\n registry.apps[name] = data;\n writeRegistry(registry);\n}\n\nexport function unregisterApp(name: string): boolean {\n const registry = readRegistry();\n if (!registry.apps[name]) return false;\n delete registry.apps[name];\n writeRegistry(registry);\n return true;\n}\n\nexport function getRegisteredApp(name: string): FrontmcpRegistry['apps'][string] | null {\n const registry = readRegistry();\n return registry.apps[name] ?? null;\n}\n\nexport function listRegisteredApps(): Array<{\n name: string;\n data: FrontmcpRegistry['apps'][string];\n}> {\n const registry = readRegistry();\n return Object.entries(registry.apps).map(([name, data]) => ({\n name,\n data,\n }));\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../../../src/commands/install/sources/git.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAKH,oCAeC;;AAlBD,mDAA6B;AAC7B,2CAAyC;AAElC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,MAAc;IAC5D,gBAAgB;IAChB,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,GAAG,sBAAsB,IAAI,MAAM,CAAC;IAC5C,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,IAAA,cAAM,EAAC,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjE,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["/**\n * Git source: clone repo to temp directory.\n */\n\nimport * as path from 'path';\nimport { runCmd } from '@frontmcp/utils';\n\nexport async function fetchFromGit(url: string, tmpDir: string): Promise<string> {\n // Normalize URL\n let gitUrl = url;\n if (gitUrl.startsWith('github:')) {\n const slug = gitUrl.slice('github:'.length).replace(/\\.git$/i, '');\n gitUrl = `https://github.com/${slug}.git`;\n }\n if (gitUrl.startsWith('git+')) {\n gitUrl = gitUrl.slice(4);\n }\n\n const cloneDir = path.join(tmpDir, 'package');\n await runCmd('git', ['clone', '--depth', '1', gitUrl, cloneDir]);\n\n return cloneDir;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/commands/install/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAiCH,gDAUC;AAjBD;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,MAAc;IAC/C,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACzF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC","sourcesContent":["/**\n * Install source parsing and types.\n */\n\nexport type InstallSourceType = 'npm' | 'local' | 'git';\n\nexport interface InstallSource {\n type: InstallSourceType;\n ref: string;\n}\n\nexport interface FrontmcpRegistry {\n version: 1;\n apps: Record<\n string,\n {\n version: string;\n installDir: string;\n installedAt: string;\n runner: string;\n bundle: string;\n storage: 'sqlite' | 'redis' | 'none';\n port: number;\n source?: { type: InstallSourceType; ref: string };\n }\n >;\n}\n\n/**\n * Parse an install source string into a typed source object.\n *\n * - Starts with `./ | ../ | /` → local\n * - Starts with `github:` or `git+` or ends with `.git` → git\n * - Everything else → npm\n */\nexport function parseInstallSource(source: string): InstallSource {\n if (source.startsWith('./') || source.startsWith('../') || source.startsWith('/')) {\n return { type: 'local', ref: source };\n }\n\n if (source.startsWith('github:') || source.startsWith('git+') || source.endsWith('.git')) {\n return { type: 'git', ref: source };\n }\n\n return { type: 'npm', ref: source };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":";;AAGA,0BAIC;AAND,8BAA2D;AAEpD,KAAK,UAAU,OAAO,CAAC,KAAiB;IAC7C,MAAM,EAAE,GAAG,IAAI,mBAAc,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,IAAA,uBAAkB,EAAC,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC","sourcesContent":["import { ParsedArgs } from '../args';\nimport { ProcessManager, formatProcessTable } from '../pm';\n\nexport async function runList(_opts: ParsedArgs): Promise<void> {\n const pm = new ProcessManager();\n const all = pm.listAll();\n console.log(formatProcessTable(all));\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/commands/logs.ts"],"names":[],"mappings":";;AAIA,0BA+CC;AAlDD,sCAA8B;AAC9B,8BAAwD;AAEjD,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,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,gBAAW,EAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,QAAQ,EAAE,+BAA+B,IAAI,uBAAuB,CAAC,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAE/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,0BAA0B;QAC1B,MAAM,MAAM,GAAG,IAAA,YAAO,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,2BAA2B,IAAI,wBAAwB,CAAC,CAAC,CAAC;QAEhF,MAAM,IAAI,GAAG,IAAA,cAAS,EAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;gBAC1B,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;gBAC3B,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,IAAA,YAAO,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,sBAAsB,IAAI,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { ParsedArgs } from '../args';\nimport { c } from '../colors';\nimport { tailLog, followLog, readPidFile } from '../pm';\n\nexport async function runLogs(opts: ParsedArgs): Promise<void> {\n const name = opts._[1];\n if (!name) {\n throw new Error('Missing process name. Usage: frontmcp logs <name> [--follow] [--lines N]');\n }\n\n const pidData = readPidFile(name);\n if (!pidData) {\n console.log(c('yellow', `No process found with name \"${name}\". No logs available.`));\n return;\n }\n\n const lines = opts.lines ?? 50;\n\n if (opts.follow) {\n // Show recent lines first\n const recent = tailLog(name, lines);\n for (const line of recent) {\n console.log(line);\n }\n\n console.log(c('gray', `--- following logs for \"${name}\" (Ctrl+C to stop) ---`));\n\n const stop = followLog(name, (line) => {\n console.log(line);\n });\n\n await new Promise<void>((resolve) => {\n process.once('SIGINT', () => {\n stop();\n resolve();\n });\n process.once('SIGTERM', () => {\n stop();\n resolve();\n });\n });\n } else {\n const logLines = tailLog(name, lines);\n if (logLines.length === 0) {\n console.log(c('gray', `No log output for \"${name}\".`));\n } else {\n for (const line of logLines) {\n console.log(line);\n }\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/commands/restart.ts"],"names":[],"mappings":";;AAIA,gCAYC;AAfD,sCAA8B;AAC9B,8BAA4D;AAErD,KAAK,UAAU,UAAU,CAAC,IAAgB;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,mBAAc,EAAE,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAC,EAAC,OAAO,EAAE,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,IAAA,wBAAmB,EAAC,IAAI,CAAC,CAAC,CAAC;AACzC,CAAC","sourcesContent":["import { ParsedArgs } from '../args';\nimport { c } from '../colors';\nimport { ProcessManager, formatProcessDetail } from '../pm';\n\nexport async function runRestart(opts: ParsedArgs): Promise<void> {\n const name = opts._[1];\n if (!name) {\n throw new Error('Missing process name. Usage: frontmcp restart <name>');\n }\n\n const pm = new ProcessManager();\n\n console.log(`${c('cyan', '[pm]')} restarting \"${name}\"...`);\n const info = await pm.restart(name);\n console.log(`\\n${c('green', 'Restarted successfully:')}\\n`);\n console.log(formatProcessDetail(info));\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/commands/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { ParsedArgs } from '../args';\nimport { c } from '../colors';\nimport { installService, uninstallService, detectPlatform, getServicePath } from '../pm';\n\nexport async function runService(opts: ParsedArgs): Promise<void> {\n const action = opts._[1]; // 'install' or 'uninstall'\n const name = opts._[2];\n\n if (!action || !name) {\n throw new Error('Usage: frontmcp service <install|uninstall> <name>');\n }\n\n const platform = detectPlatform();\n\n switch (action) {\n case 'install': {\n console.log(`${c('cyan', '[service]')} generating ${platform} service for \"${name}\"...`);\n const filePath = installService(name);\n console.log(`${c('green', '[service]')} service file created: ${filePath}`);\n\n if (platform === 'launchd') {\n console.log(`\\n${c('bold', 'To load the service:')}`);\n console.log(` launchctl load ${filePath}`);\n console.log(`\\n${c('bold', 'To start:')}`);\n console.log(` launchctl start dev.agentfront.frontmcp.${name}`);\n } else {\n console.log(`\\n${c('bold', 'To enable and start:')}`);\n console.log(` systemctl --user daemon-reload`);\n console.log(` systemctl --user enable frontmcp-${name}`);\n console.log(` systemctl --user start frontmcp-${name}`);\n }\n break;\n }\n\n case 'uninstall': {\n console.log(`${c('cyan', '[service]')} removing service for \"${name}\"...`);\n\n if (platform === 'launchd') {\n const servicePath = getServicePath(name);\n console.log(c('yellow', `hint: run 'launchctl unload ${servicePath}' first if the service is loaded`));\n } else {\n console.log(c('yellow', `hint: run 'systemctl --user stop frontmcp-${name}' first if the service is running`));\n }\n\n const removed = uninstallService(name);\n if (removed) {\n console.log(`${c('green', '[service]')} service file removed: ${removed}`);\n } else {\n console.log(`${c('yellow', '[service]')} no service file found for \"${name}\".`);\n }\n break;\n }\n\n default:\n throw new Error(`Unknown service action: \"${action}\". Use \"install\" or \"uninstall\".`);\n }\n}\n"]}