frontmcp 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/package.json +4 -3
  2. package/src/args.d.ts +11 -1
  3. package/src/args.js +30 -0
  4. package/src/args.js.map +1 -1
  5. package/src/cli.js +115 -3
  6. package/src/cli.js.map +1 -1
  7. package/src/commands/build/exec/config.d.ts +38 -0
  8. package/src/commands/build/exec/config.js +61 -0
  9. package/src/commands/build/exec/config.js.map +1 -0
  10. package/src/commands/build/exec/esbuild-bundler.d.ts +11 -0
  11. package/src/commands/build/exec/esbuild-bundler.js +66 -0
  12. package/src/commands/build/exec/esbuild-bundler.js.map +1 -0
  13. package/src/commands/build/exec/index.d.ts +11 -0
  14. package/src/commands/build/exec/index.js +126 -0
  15. package/src/commands/build/exec/index.js.map +1 -0
  16. package/src/commands/build/exec/installer-script.d.ts +6 -0
  17. package/src/commands/build/exec/installer-script.js +96 -0
  18. package/src/commands/build/exec/installer-script.js.map +1 -0
  19. package/src/commands/build/exec/manifest.d.ts +39 -0
  20. package/src/commands/build/exec/manifest.js +59 -0
  21. package/src/commands/build/exec/manifest.js.map +1 -0
  22. package/src/commands/build/exec/runner-script.d.ts +6 -0
  23. package/src/commands/build/exec/runner-script.js +58 -0
  24. package/src/commands/build/exec/runner-script.js.map +1 -0
  25. package/src/commands/build/exec/setup.d.ts +61 -0
  26. package/src/commands/build/exec/setup.js +144 -0
  27. package/src/commands/build/exec/setup.js.map +1 -0
  28. package/src/commands/build/index.js +5 -0
  29. package/src/commands/build/index.js.map +1 -1
  30. package/src/commands/configure.d.ts +2 -0
  31. package/src/commands/configure.js +37 -0
  32. package/src/commands/configure.js.map +1 -0
  33. package/src/commands/install/index.d.ts +5 -0
  34. package/src/commands/install/index.js +150 -0
  35. package/src/commands/install/index.js.map +1 -0
  36. package/src/commands/install/questionnaire.d.ts +19 -0
  37. package/src/commands/install/questionnaire.js +268 -0
  38. package/src/commands/install/questionnaire.js.map +1 -0
  39. package/src/commands/install/registry.d.ts +13 -0
  40. package/src/commands/install/registry.js +59 -0
  41. package/src/commands/install/registry.js.map +1 -0
  42. package/src/commands/install/sources/git.d.ts +4 -0
  43. package/src/commands/install/sources/git.js +24 -0
  44. package/src/commands/install/sources/git.js.map +1 -0
  45. package/src/commands/install/sources/local.d.ts +4 -0
  46. package/src/commands/install/sources/local.js +28 -0
  47. package/src/commands/install/sources/local.js.map +1 -0
  48. package/src/commands/install/sources/npm.d.ts +5 -0
  49. package/src/commands/install/sources/npm.js +36 -0
  50. package/src/commands/install/sources/npm.js.map +1 -0
  51. package/src/commands/install/types.d.ts +32 -0
  52. package/src/commands/install/types.js +23 -0
  53. package/src/commands/install/types.js.map +1 -0
  54. package/src/commands/list.d.ts +2 -0
  55. package/src/commands/list.js +10 -0
  56. package/src/commands/list.js.map +1 -0
  57. package/src/commands/logs.d.ts +2 -0
  58. package/src/commands/logs.js +50 -0
  59. package/src/commands/logs.js.map +1 -0
  60. package/src/commands/restart.d.ts +2 -0
  61. package/src/commands/restart.js +17 -0
  62. package/src/commands/restart.js.map +1 -0
  63. package/src/commands/service.d.ts +2 -0
  64. package/src/commands/service.js +54 -0
  65. package/src/commands/service.js.map +1 -0
  66. package/src/commands/socket.d.ts +2 -0
  67. package/src/commands/socket.js +128 -0
  68. package/src/commands/socket.js.map +1 -0
  69. package/src/commands/start.d.ts +2 -0
  70. package/src/commands/start.js +52 -0
  71. package/src/commands/start.js.map +1 -0
  72. package/src/commands/status.d.ts +2 -0
  73. package/src/commands/status.js +24 -0
  74. package/src/commands/status.js.map +1 -0
  75. package/src/commands/stop.d.ts +2 -0
  76. package/src/commands/stop.js +16 -0
  77. package/src/commands/stop.js.map +1 -0
  78. package/src/commands/uninstall.d.ts +2 -0
  79. package/src/commands/uninstall.js +40 -0
  80. package/src/commands/uninstall.js.map +1 -0
  81. package/src/pm/index.d.ts +9 -0
  82. package/src/pm/index.js +36 -0
  83. package/src/pm/index.js.map +1 -0
  84. package/src/pm/pm.format.d.ts +7 -0
  85. package/src/pm/pm.format.js +97 -0
  86. package/src/pm/pm.format.js.map +1 -0
  87. package/src/pm/pm.health.d.ts +15 -0
  88. package/src/pm/pm.health.js +61 -0
  89. package/src/pm/pm.health.js.map +1 -0
  90. package/src/pm/pm.logs.d.ts +11 -0
  91. package/src/pm/pm.logs.js +108 -0
  92. package/src/pm/pm.logs.js.map +1 -0
  93. package/src/pm/pm.manager.d.ts +11 -0
  94. package/src/pm/pm.manager.js +153 -0
  95. package/src/pm/pm.manager.js.map +1 -0
  96. package/src/pm/pm.paths.d.ts +20 -0
  97. package/src/pm/pm.paths.js +54 -0
  98. package/src/pm/pm.paths.js.map +1 -0
  99. package/src/pm/pm.pidfile.d.ts +9 -0
  100. package/src/pm/pm.pidfile.js +70 -0
  101. package/src/pm/pm.pidfile.js.map +1 -0
  102. package/src/pm/pm.service.d.ts +8 -0
  103. package/src/pm/pm.service.js +116 -0
  104. package/src/pm/pm.service.js.map +1 -0
  105. package/src/pm/pm.spawn.d.ts +24 -0
  106. package/src/pm/pm.spawn.js +207 -0
  107. package/src/pm/pm.spawn.js.map +1 -0
  108. package/src/pm/pm.types.d.ts +48 -0
  109. package/src/pm/pm.types.js +6 -0
  110. package/src/pm/pm.types.js.map +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frontmcp",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "FrontMCP command line interface",
5
5
  "author": "AgentFront <info@agentfront.dev>",
6
6
  "homepage": "https://docs.agentfront.dev",
@@ -29,9 +29,10 @@
29
29
  "node": ">=22.0.0"
30
30
  },
31
31
  "dependencies": {
32
- "@frontmcp/utils": "0.9.0",
32
+ "@frontmcp/utils": "0.10.0",
33
33
  "tslib": "^2.3.0",
34
- "@rspack/core": "^1.3.12"
34
+ "@rspack/core": "^1.7.6",
35
+ "esbuild": "^0.27.3"
35
36
  },
36
37
  "devDependencies": {
37
38
  "typescript": "^5.5.3",
package/src/args.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type Command = 'dev' | 'build' | 'init' | 'doctor' | 'inspector' | 'create' | 'help' | 'template' | 'version' | 'test';
1
+ export type Command = 'dev' | 'build' | 'init' | 'doctor' | 'inspector' | 'create' | 'help' | 'template' | 'version' | 'test' | 'socket' | 'start' | 'stop' | 'restart' | 'status' | 'list' | 'logs' | 'service' | 'install' | 'uninstall' | 'configure';
2
2
  export type DeploymentAdapter = 'node' | 'vercel' | 'lambda' | 'cloudflare';
3
3
  export type RedisSetupOption = 'docker' | 'existing' | 'none';
4
4
  export interface ParsedArgs {
@@ -16,5 +16,15 @@ export interface ParsedArgs {
16
16
  target?: DeploymentAdapter;
17
17
  redis?: RedisSetupOption;
18
18
  cicd?: boolean;
19
+ socket?: string;
20
+ db?: string;
21
+ background?: boolean;
22
+ exec?: boolean;
23
+ port?: number;
24
+ force?: boolean;
25
+ maxRestarts?: number;
26
+ follow?: boolean;
27
+ lines?: number;
28
+ registry?: string;
19
29
  }
20
30
  export declare function parseArgs(argv: string[]): ParsedArgs;
package/src/args.js CHANGED
@@ -36,6 +36,36 @@ function parseArgs(argv) {
36
36
  out.cicd = true;
37
37
  else if (a === '--no-cicd')
38
38
  out.cicd = false;
39
+ // Socket command flags
40
+ else if (a === '--socket' || a === '-s')
41
+ out.socket = argv[++i];
42
+ else if (a === '--db')
43
+ out.db = argv[++i];
44
+ else if (a === '--background' || a === '-b')
45
+ out.background = true;
46
+ // Build --exec flag
47
+ else if (a === '--exec')
48
+ out.exec = true;
49
+ // Process Manager flags
50
+ else if (a === '--port' || a === '-p') {
51
+ const parsed = parseInt(argv[++i], 10);
52
+ out.port = Number.isNaN(parsed) ? undefined : parsed;
53
+ }
54
+ else if (a === '--force' || a === '-f')
55
+ out.force = true;
56
+ else if (a === '--max-restarts') {
57
+ const parsed = parseInt(argv[++i], 10);
58
+ out.maxRestarts = Number.isNaN(parsed) ? undefined : parsed;
59
+ }
60
+ else if (a === '--follow' || a === '-F')
61
+ out.follow = true;
62
+ else if (a === '--lines' || a === '-n') {
63
+ const parsed = parseInt(argv[++i], 10);
64
+ out.lines = Number.isNaN(parsed) ? undefined : parsed;
65
+ }
66
+ // Install flags
67
+ else if (a === '--registry')
68
+ out.registry = argv[++i];
39
69
  else
40
70
  out._.push(a);
41
71
  }
package/src/args.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/args.ts"],"names":[],"mappings":";;AAiCA,8BAwBC;AAxBD,SAAgB,SAAS,CAAC,IAAc;IACtC,MAAM,GAAG,GAAe,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACvD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACzD,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAsB,CAAC;aAClF,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;aAClD,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;aAC5D,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;aACpD,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;aACxD,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1D,CAAC;aAAM,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;QACjE,uBAAuB;aAClB,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC;aAChD,IAAI,CAAC,KAAK,UAAU;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAsB,CAAC;aAClE,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAqB,CAAC;aAC/D,IAAI,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;aACpC,IAAI,CAAC,KAAK,WAAW;YAAE,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;;YACxC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["export type Command =\n | 'dev'\n | 'build'\n | 'init'\n | 'doctor'\n | 'inspector'\n | 'create'\n | 'help'\n | 'template'\n | 'version'\n | 'test';\n\nexport type DeploymentAdapter = 'node' | 'vercel' | 'lambda' | 'cloudflare';\nexport type RedisSetupOption = 'docker' | 'existing' | 'none';\n\nexport interface ParsedArgs {\n _: string[];\n outDir?: string;\n entry?: string;\n help?: boolean;\n runInBand?: boolean;\n watch?: boolean;\n verbose?: boolean;\n timeout?: number;\n coverage?: boolean;\n adapter?: DeploymentAdapter;\n // Create command flags\n yes?: boolean;\n target?: DeploymentAdapter;\n redis?: RedisSetupOption;\n cicd?: boolean;\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const out: ParsedArgs = { _: [] };\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a === '--out-dir' || a === '-o') out.outDir = argv[++i];\n else if (a === '--entry' || a === '-e') out.entry = argv[++i];\n else if (a === '--adapter' || a === '-a') out.adapter = argv[++i] as DeploymentAdapter;\n else if (a === '--help' || a === '-h') out.help = true;\n else if (a === '--runInBand' || a === '-i') out.runInBand = true;\n else if (a === '--watch' || a === '-w') out.watch = true;\n else if (a === '--verbose' || a === '-v') out.verbose = true;\n else if (a === '--timeout' || a === '-t') {\n const parsed = parseInt(argv[++i], 10);\n out.timeout = Number.isNaN(parsed) ? undefined : parsed;\n } else if (a === '--coverage' || a === '-c') out.coverage = true;\n // Create command flags\n else if (a === '--yes' || a === '-y') out.yes = true;\n else if (a === '--target') out.target = argv[++i] as DeploymentAdapter;\n else if (a === '--redis') out.redis = argv[++i] as RedisSetupOption;\n else if (a === '--cicd') out.cicd = true;\n else if (a === '--no-cicd') out.cicd = false;\n else out._.push(a);\n }\n return out;\n}\n"]}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/args.ts"],"names":[],"mappings":"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","sourcesContent":["export type Command =\n | 'dev'\n | 'build'\n | 'init'\n | 'doctor'\n | 'inspector'\n | 'create'\n | 'help'\n | 'template'\n | 'version'\n | 'test'\n | 'socket'\n // Process Manager commands\n | 'start'\n | 'stop'\n | 'restart'\n | 'status'\n | 'list'\n | 'logs'\n | 'service'\n // Package Manager commands\n | 'install'\n | 'uninstall'\n | 'configure';\n\nexport type DeploymentAdapter = 'node' | 'vercel' | 'lambda' | 'cloudflare';\nexport type RedisSetupOption = 'docker' | 'existing' | 'none';\n\nexport interface ParsedArgs {\n _: string[];\n outDir?: string;\n entry?: string;\n help?: boolean;\n runInBand?: boolean;\n watch?: boolean;\n verbose?: boolean;\n timeout?: number;\n coverage?: boolean;\n adapter?: DeploymentAdapter;\n // Create command flags\n yes?: boolean;\n target?: DeploymentAdapter;\n redis?: RedisSetupOption;\n cicd?: boolean;\n // Socket command flags\n socket?: string;\n db?: string;\n background?: boolean;\n // Build --exec flag\n exec?: boolean;\n // Process Manager flags\n port?: number;\n force?: boolean;\n maxRestarts?: number;\n follow?: boolean;\n lines?: number;\n // Install flags\n registry?: string;\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const out: ParsedArgs = { _: [] };\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a === '--out-dir' || a === '-o') out.outDir = argv[++i];\n else if (a === '--entry' || a === '-e') out.entry = argv[++i];\n else if (a === '--adapter' || a === '-a') out.adapter = argv[++i] as DeploymentAdapter;\n else if (a === '--help' || a === '-h') out.help = true;\n else if (a === '--runInBand' || a === '-i') out.runInBand = true;\n else if (a === '--watch' || a === '-w') out.watch = true;\n else if (a === '--verbose' || a === '-v') out.verbose = true;\n else if (a === '--timeout' || a === '-t') {\n const parsed = parseInt(argv[++i], 10);\n out.timeout = Number.isNaN(parsed) ? undefined : parsed;\n } else if (a === '--coverage' || a === '-c') out.coverage = true;\n // Create command flags\n else if (a === '--yes' || a === '-y') out.yes = true;\n else if (a === '--target') out.target = argv[++i] as DeploymentAdapter;\n else if (a === '--redis') out.redis = argv[++i] as RedisSetupOption;\n else if (a === '--cicd') out.cicd = true;\n else if (a === '--no-cicd') out.cicd = false;\n // Socket command flags\n else if (a === '--socket' || a === '-s') out.socket = argv[++i];\n else if (a === '--db') out.db = argv[++i];\n else if (a === '--background' || a === '-b') out.background = true;\n // Build --exec flag\n else if (a === '--exec') out.exec = true;\n // Process Manager flags\n else if (a === '--port' || a === '-p') {\n const parsed = parseInt(argv[++i], 10);\n out.port = Number.isNaN(parsed) ? undefined : parsed;\n } else if (a === '--force' || a === '-f') out.force = true;\n else if (a === '--max-restarts') {\n const parsed = parseInt(argv[++i], 10);\n out.maxRestarts = Number.isNaN(parsed) ? undefined : parsed;\n } else if (a === '--follow' || a === '-F') out.follow = true;\n else if (a === '--lines' || a === '-n') {\n const parsed = parseInt(argv[++i], 10);\n out.lines = Number.isNaN(parsed) ? undefined : parsed;\n }\n // Install flags\n else if (a === '--registry') out.registry = argv[++i];\n else out._.push(a);\n }\n return out;\n}\n"]}
package/src/cli.js CHANGED
@@ -14,6 +14,7 @@ const inspector_1 = require("./commands/inspector");
14
14
  const create_1 = require("./commands/create");
15
15
  const template_1 = require("./commands/template");
16
16
  const test_1 = require("./commands/test");
17
+ const socket_1 = require("./commands/socket");
17
18
  function showHelp() {
18
19
  console.log(`
19
20
  ${(0, colors_1.c)('bold', 'frontmcp')} — FrontMCP command line interface
@@ -21,21 +22,60 @@ ${(0, colors_1.c)('bold', 'frontmcp')} — FrontMCP command line interface
21
22
  ${(0, colors_1.c)('bold', 'Usage')}
22
23
  frontmcp <command> [options]
23
24
 
24
- ${(0, colors_1.c)('bold', 'Commands')}
25
+ ${(0, colors_1.c)('bold', 'Development')}
25
26
  dev Start in development mode (tsx --watch <entry> + async type-check)
26
27
  build Compile entry with TypeScript (tsc)
28
+ build --exec Build distributable executable bundle (esbuild)
27
29
  test Run E2E tests with auto-injected Jest configuration
28
30
  init Create or fix a tsconfig.json suitable for FrontMCP
29
31
  doctor Check Node/npm versions and tsconfig requirements
30
32
  inspector Launch MCP Inspector (npx @modelcontextprotocol/inspector)
31
33
  create [name] Scaffold a new FrontMCP project (interactive if name omitted)
32
34
  template <type> Scaffold a template by type (e.g., "3rd-party-integration")
33
- help Show this help message
35
+ socket <entry> Start Unix socket daemon for local MCP server
34
36
 
35
- ${(0, colors_1.c)('bold', 'Options')}
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
36
53
  -o, --out-dir <dir> Output directory (default: ./dist)
37
54
  -e, --entry <path> Manually specify entry file path
38
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
+
39
79
  ${(0, colors_1.c)('bold', 'Create Options')}
40
80
  -y, --yes Use defaults (non-interactive mode)
41
81
  --target <target> Deployment target: node, vercel, lambda, cloudflare
@@ -43,6 +83,11 @@ ${(0, colors_1.c)('bold', 'Create Options')}
43
83
  --cicd Enable GitHub Actions CI/CD
44
84
  --no-cicd Disable GitHub Actions CI/CD
45
85
 
86
+ ${(0, colors_1.c)('bold', 'Socket Options')}
87
+ -s, --socket <path> Unix socket path (default: ~/.frontmcp/sockets/{app}.sock)
88
+ --db <path> SQLite database path for persistence
89
+ -b, --background Run as background daemon (detached process)
90
+
46
91
  ${(0, colors_1.c)('bold', 'Test Options')}
47
92
  -i, --runInBand Run tests sequentially (recommended for E2E)
48
93
  -w, --watch Run tests in watch mode
@@ -53,6 +98,7 @@ ${(0, colors_1.c)('bold', 'Test Options')}
53
98
  ${(0, colors_1.c)('bold', 'Examples')}
54
99
  frontmcp dev
55
100
  frontmcp build --out-dir build
101
+ frontmcp build --exec
56
102
  frontmcp test --runInBand
57
103
  frontmcp init
58
104
  frontmcp doctor
@@ -61,6 +107,17 @@ ${(0, colors_1.c)('bold', 'Examples')}
61
107
  npx frontmcp create my-mcp --yes # Use defaults
62
108
  npx frontmcp create my-mcp --target vercel # Vercel deployment
63
109
  npx frontmcp template marketplace-3rd-tools
110
+ frontmcp socket ./src/main.ts --socket /tmp/my-app.sock
111
+ frontmcp socket ./src/main.ts --socket /tmp/my-app.sock --db ~/.frontmcp/data/app.sqlite
112
+ frontmcp start my-app --entry ./src/main.ts --port 3005
113
+ frontmcp stop my-app
114
+ frontmcp logs my-app --follow
115
+ frontmcp service install my-app
116
+ frontmcp install @company/my-mcp --registry https://npm.company.com
117
+ frontmcp install ./my-local-app
118
+ frontmcp install github:user/repo
119
+ frontmcp configure my-app
120
+ frontmcp uninstall my-app
64
121
  `);
65
122
  }
66
123
  async function main() {
@@ -107,6 +164,61 @@ async function main() {
107
164
  case 'test':
108
165
  await (0, test_1.runTest)(parsed);
109
166
  break;
167
+ case 'socket':
168
+ await (0, socket_1.runSocket)(parsed);
169
+ break;
170
+ // Process Manager commands (dynamic imports)
171
+ case 'start': {
172
+ const { runStart } = await import('./commands/start.js');
173
+ await runStart(parsed);
174
+ break;
175
+ }
176
+ case 'stop': {
177
+ const { runStop } = await import('./commands/stop.js');
178
+ await runStop(parsed);
179
+ break;
180
+ }
181
+ case 'restart': {
182
+ const { runRestart } = await import('./commands/restart.js');
183
+ await runRestart(parsed);
184
+ break;
185
+ }
186
+ case 'status': {
187
+ const { runStatus } = await import('./commands/status.js');
188
+ await runStatus(parsed);
189
+ break;
190
+ }
191
+ case 'list': {
192
+ const { runList } = await import('./commands/list.js');
193
+ await runList(parsed);
194
+ break;
195
+ }
196
+ case 'logs': {
197
+ const { runLogs } = await import('./commands/logs.js');
198
+ await runLogs(parsed);
199
+ break;
200
+ }
201
+ case 'service': {
202
+ const { runService } = await import('./commands/service.js');
203
+ await runService(parsed);
204
+ break;
205
+ }
206
+ // Package Manager commands (dynamic imports)
207
+ case 'install': {
208
+ const { runInstall } = await import('./commands/install/index.js');
209
+ await runInstall(parsed);
210
+ break;
211
+ }
212
+ case 'uninstall': {
213
+ const { runUninstall } = await import('./commands/uninstall.js');
214
+ await runUninstall(parsed);
215
+ break;
216
+ }
217
+ case 'configure': {
218
+ const { runConfigure } = await import('./commands/configure.js');
219
+ await runConfigure(parsed);
220
+ break;
221
+ }
110
222
  case 'help':
111
223
  showHelp();
112
224
  break;
package/src/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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","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';\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', 'Commands')}\n dev Start in development mode (tsx --watch <entry> + async type-check)\n build Compile entry with TypeScript (tsc)\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 help Show this help message\n\n${c('bold', 'Options')}\n -o, --out-dir <dir> Output directory (default: ./dist)\n -e, --entry <path> Manually specify entry file path\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 --cicd Enable GitHub Actions CI/CD\n --no-cicd Disable GitHub Actions CI/CD\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 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`);\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 });\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 '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"]}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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","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 --cicd Enable GitHub Actions CI/CD\n --no-cicd Disable GitHub Actions CI/CD\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 });\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"]}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * frontmcp.config.js/json schema and loader.
3
+ */
4
+ import { SetupDefinition } from './setup';
5
+ export interface FrontmcpExecConfig {
6
+ name: string;
7
+ version?: string;
8
+ entry?: string;
9
+ storage?: {
10
+ type: 'sqlite' | 'redis' | 'none';
11
+ required?: boolean;
12
+ };
13
+ network?: {
14
+ defaultPort?: number;
15
+ supportsSocket?: boolean;
16
+ };
17
+ dependencies?: {
18
+ system?: string[];
19
+ nativeAddons?: string[];
20
+ };
21
+ nodeVersion?: string;
22
+ esbuild?: {
23
+ external?: string[];
24
+ define?: Record<string, string>;
25
+ target?: string;
26
+ minify?: boolean;
27
+ };
28
+ setup?: SetupDefinition;
29
+ }
30
+ /**
31
+ * Load frontmcp.config.js/json from the given directory.
32
+ * Falls back to deriving minimal config from package.json.
33
+ */
34
+ export declare function loadExecConfig(cwd: string): Promise<FrontmcpExecConfig>;
35
+ /**
36
+ * Validate config and return normalized version.
37
+ */
38
+ export declare function normalizeConfig(config: FrontmcpExecConfig): Required<Pick<FrontmcpExecConfig, 'name' | 'version' | 'nodeVersion'>> & FrontmcpExecConfig;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * frontmcp.config.js/json schema and loader.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadExecConfig = loadExecConfig;
7
+ exports.normalizeConfig = normalizeConfig;
8
+ const tslib_1 = require("tslib");
9
+ const path = tslib_1.__importStar(require("path"));
10
+ const fs = tslib_1.__importStar(require("fs"));
11
+ const CONFIG_FILENAMES = [
12
+ 'frontmcp.config.js',
13
+ 'frontmcp.config.json',
14
+ 'frontmcp.config.mjs',
15
+ 'frontmcp.config.cjs',
16
+ ];
17
+ /**
18
+ * Load frontmcp.config.js/json from the given directory.
19
+ * Falls back to deriving minimal config from package.json.
20
+ */
21
+ async function loadExecConfig(cwd) {
22
+ for (const filename of CONFIG_FILENAMES) {
23
+ const configPath = path.join(cwd, filename);
24
+ if (fs.existsSync(configPath)) {
25
+ if (filename.endsWith('.json')) {
26
+ const content = fs.readFileSync(configPath, 'utf-8');
27
+ return JSON.parse(content);
28
+ }
29
+ // JS/MJS/CJS config — require it
30
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
31
+ const mod = require(configPath);
32
+ return (mod.default || mod);
33
+ }
34
+ }
35
+ // Fallback: derive from package.json
36
+ const pkgPath = path.join(cwd, 'package.json');
37
+ if (!fs.existsSync(pkgPath)) {
38
+ throw new Error('No frontmcp.config.js/json found and no package.json. Create a frontmcp.config.js to use --exec.');
39
+ }
40
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
41
+ return {
42
+ name: pkg.name?.replace(/^@[^/]+\//, '') || path.basename(cwd),
43
+ version: pkg.version || '1.0.0',
44
+ entry: pkg.main,
45
+ };
46
+ }
47
+ /**
48
+ * Validate config and return normalized version.
49
+ */
50
+ function normalizeConfig(config) {
51
+ if (!config.name || !/^[a-zA-Z0-9._-]+$/.test(config.name)) {
52
+ throw new Error(`Invalid app name: "${config.name}". Must be alphanumeric with .-_ only.`);
53
+ }
54
+ return {
55
+ ...config,
56
+ name: config.name,
57
+ version: config.version || '1.0.0',
58
+ nodeVersion: config.nodeVersion || '>=22.0.0',
59
+ };
60
+ }
61
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../src/commands/build/exec/config.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA2CH,wCA6BC;AAKD,0CAgBC;;AA3FD,mDAA6B;AAC7B,+CAAyB;AA6BzB,MAAM,gBAAgB,GAAG;IACvB,oBAAoB;IACpB,sBAAsB;IACtB,qBAAqB;IACrB,qBAAqB;CACtB,CAAC;AAEF;;;GAGG;AACI,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;YACnD,CAAC;YACD,iCAAiC;YACjC,iEAAiE;YACjE,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAuB,CAAC;QACpD,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC9D,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO;QAC/B,KAAK,EAAE,GAAG,CAAC,IAAI;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,MAA0B;IAIxD,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,sBAAsB,MAAM,CAAC,IAAI,wCAAwC,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,MAAM;QACT,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO;QAClC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,UAAU;KAC9C,CAAC;AACJ,CAAC","sourcesContent":["/**\n * frontmcp.config.js/json schema and loader.\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { SetupDefinition } from './setup';\n\nexport interface FrontmcpExecConfig {\n name: string;\n version?: string;\n entry?: string;\n storage?: {\n type: 'sqlite' | 'redis' | 'none';\n required?: boolean;\n };\n network?: {\n defaultPort?: number;\n supportsSocket?: boolean;\n };\n dependencies?: {\n system?: string[];\n nativeAddons?: string[];\n };\n nodeVersion?: string;\n esbuild?: {\n external?: string[];\n define?: Record<string, string>;\n target?: string;\n minify?: boolean;\n };\n setup?: SetupDefinition;\n}\n\nconst CONFIG_FILENAMES = [\n 'frontmcp.config.js',\n 'frontmcp.config.json',\n 'frontmcp.config.mjs',\n 'frontmcp.config.cjs',\n];\n\n/**\n * Load frontmcp.config.js/json from the given directory.\n * Falls back to deriving minimal config from package.json.\n */\nexport async function loadExecConfig(cwd: string): Promise<FrontmcpExecConfig> {\n for (const filename of CONFIG_FILENAMES) {\n const configPath = path.join(cwd, filename);\n if (fs.existsSync(configPath)) {\n if (filename.endsWith('.json')) {\n const content = fs.readFileSync(configPath, 'utf-8');\n return JSON.parse(content) as FrontmcpExecConfig;\n }\n // JS/MJS/CJS config — require it\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require(configPath);\n return (mod.default || mod) as FrontmcpExecConfig;\n }\n }\n\n // Fallback: derive from package.json\n const pkgPath = path.join(cwd, 'package.json');\n if (!fs.existsSync(pkgPath)) {\n throw new Error(\n 'No frontmcp.config.js/json found and no package.json. Create a frontmcp.config.js to use --exec.',\n );\n }\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n return {\n name: pkg.name?.replace(/^@[^/]+\\//, '') || path.basename(cwd),\n version: pkg.version || '1.0.0',\n entry: pkg.main,\n };\n}\n\n/**\n * Validate config and return normalized version.\n */\nexport function normalizeConfig(config: FrontmcpExecConfig): Required<\n Pick<FrontmcpExecConfig, 'name' | 'version' | 'nodeVersion'>\n> &\n FrontmcpExecConfig {\n if (!config.name || !/^[a-zA-Z0-9._-]+$/.test(config.name)) {\n throw new Error(\n `Invalid app name: \"${config.name}\". Must be alphanumeric with .-_ only.`,\n );\n }\n\n return {\n ...config,\n name: config.name,\n version: config.version || '1.0.0',\n nodeVersion: config.nodeVersion || '>=22.0.0',\n };\n}\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * esbuild bundling for executable builds.
3
+ * Produces a single CJS file for distribution.
4
+ */
5
+ import { FrontmcpExecConfig } from './config';
6
+ export interface BundleResult {
7
+ bundlePath: string;
8
+ bundleSize: number;
9
+ }
10
+ export declare function bundleWithEsbuild(entryPath: string, outDir: string, config: FrontmcpExecConfig): Promise<BundleResult>;
11
+ export declare function formatSize(bytes: number): string;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * esbuild bundling for executable builds.
4
+ * Produces a single CJS file for distribution.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.bundleWithEsbuild = bundleWithEsbuild;
8
+ exports.formatSize = formatSize;
9
+ const tslib_1 = require("tslib");
10
+ const path = tslib_1.__importStar(require("path"));
11
+ // Default native addons that must be kept external
12
+ const DEFAULT_EXTERNALS = [
13
+ 'better-sqlite3',
14
+ 'fsevents',
15
+ '@swc/core',
16
+ 'esbuild',
17
+ ];
18
+ async function bundleWithEsbuild(entryPath, outDir, config) {
19
+ // Lazy-load esbuild
20
+ let esbuild;
21
+ try {
22
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
23
+ esbuild = require('esbuild');
24
+ }
25
+ catch {
26
+ throw new Error('esbuild is required for --exec builds. Install it: npm install -D esbuild');
27
+ }
28
+ const bundleName = `${config.name}.bundle.js`;
29
+ const bundlePath = path.join(outDir, bundleName);
30
+ const external = [
31
+ ...DEFAULT_EXTERNALS,
32
+ ...(config.dependencies?.nativeAddons || []),
33
+ ...(config.esbuild?.external || []),
34
+ ];
35
+ await esbuild.build({
36
+ entryPoints: [entryPath],
37
+ bundle: true,
38
+ platform: 'node',
39
+ format: 'cjs',
40
+ target: config.esbuild?.target || 'node22',
41
+ outfile: bundlePath,
42
+ external,
43
+ keepNames: true, // preserve class names for decorator metadata
44
+ treeShaking: true,
45
+ minify: config.esbuild?.minify ?? false,
46
+ define: config.esbuild?.define,
47
+ sourcemap: false,
48
+ metafile: true,
49
+ logLevel: 'warning',
50
+ });
51
+ // Calculate bundle size
52
+ const fs = require('fs');
53
+ const stat = fs.statSync(bundlePath);
54
+ return {
55
+ bundlePath,
56
+ bundleSize: stat.size,
57
+ };
58
+ }
59
+ function formatSize(bytes) {
60
+ if (bytes < 1024)
61
+ return `${bytes} B`;
62
+ if (bytes < 1024 * 1024)
63
+ return `${(bytes / 1024).toFixed(1)} KB`;
64
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
65
+ }
66
+ //# sourceMappingURL=esbuild-bundler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esbuild-bundler.js","sourceRoot":"","sources":["../../../../../src/commands/build/exec/esbuild-bundler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAkBH,8CAkDC;AAED,gCAIC;;AAxED,mDAA6B;AAG7B,mDAAmD;AACnD,MAAM,iBAAiB,GAAG;IACxB,gBAAgB;IAChB,UAAU;IACV,WAAW;IACX,SAAS;CACV,CAAC;AAOK,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,MAAc,EACd,MAA0B;IAE1B,oBAAoB;IACpB,IAAI,OAAiC,CAAC;IACtC,IAAI,CAAC;QACH,iEAAiE;QACjE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,MAAM,CAAC,IAAI,YAAY,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG;QACf,GAAG,iBAAiB;QACpB,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,IAAI,EAAE,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;KACpC,CAAC;IAEF,MAAM,OAAO,CAAC,KAAK,CAAC;QAClB,WAAW,EAAE,CAAC,SAAS,CAAC;QACxB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,QAAQ;QAC1C,OAAO,EAAE,UAAU;QACnB,QAAQ;QACR,SAAS,EAAE,IAAI,EAAE,8CAA8C;QAC/D,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK;QACvC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM;QAC9B,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,SAAS;KACpB,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAErC,OAAO;QACL,UAAU;QACV,UAAU,EAAE,IAAI,CAAC,IAAI;KACtB,CAAC;AACJ,CAAC;AAED,SAAgB,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC","sourcesContent":["/**\n * esbuild bundling for executable builds.\n * Produces a single CJS file for distribution.\n */\n\nimport * as path from 'path';\nimport { FrontmcpExecConfig } from './config';\n\n// Default native addons that must be kept external\nconst DEFAULT_EXTERNALS = [\n 'better-sqlite3',\n 'fsevents',\n '@swc/core',\n 'esbuild',\n];\n\nexport interface BundleResult {\n bundlePath: string;\n bundleSize: number;\n}\n\nexport async function bundleWithEsbuild(\n entryPath: string,\n outDir: string,\n config: FrontmcpExecConfig,\n): Promise<BundleResult> {\n // Lazy-load esbuild\n let esbuild: typeof import('esbuild');\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n esbuild = require('esbuild');\n } catch {\n throw new Error(\n 'esbuild is required for --exec builds. Install it: npm install -D esbuild',\n );\n }\n\n const bundleName = `${config.name}.bundle.js`;\n const bundlePath = path.join(outDir, bundleName);\n\n const external = [\n ...DEFAULT_EXTERNALS,\n ...(config.dependencies?.nativeAddons || []),\n ...(config.esbuild?.external || []),\n ];\n\n await esbuild.build({\n entryPoints: [entryPath],\n bundle: true,\n platform: 'node',\n format: 'cjs',\n target: config.esbuild?.target || 'node22',\n outfile: bundlePath,\n external,\n keepNames: true, // preserve class names for decorator metadata\n treeShaking: true,\n minify: config.esbuild?.minify ?? false,\n define: config.esbuild?.define,\n sourcemap: false,\n metafile: true,\n logLevel: 'warning',\n });\n\n // Calculate bundle size\n const fs = require('fs');\n const stat = fs.statSync(bundlePath);\n\n return {\n bundlePath,\n bundleSize: stat.size,\n };\n}\n\nexport function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * buildExec() orchestrator — produces a distributable bundle from a FrontMCP app.
3
+ *
4
+ * Output:
5
+ * dist/{name}.bundle.js — esbuild single-file bundle
6
+ * dist/{name}.manifest.json — app metadata (runtime reqs, setup questions)
7
+ * dist/{name} — bash runner script
8
+ * dist/install-{name}.sh — bash installer script
9
+ */
10
+ import { ParsedArgs } from '../../../args';
11
+ export declare function buildExec(opts: ParsedArgs): Promise<void>;