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.
- package/package.json +4 -3
- package/src/args.d.ts +11 -1
- package/src/args.js +30 -0
- package/src/args.js.map +1 -1
- package/src/cli.js +115 -3
- package/src/cli.js.map +1 -1
- package/src/commands/build/exec/config.d.ts +38 -0
- package/src/commands/build/exec/config.js +61 -0
- package/src/commands/build/exec/config.js.map +1 -0
- package/src/commands/build/exec/esbuild-bundler.d.ts +11 -0
- package/src/commands/build/exec/esbuild-bundler.js +66 -0
- package/src/commands/build/exec/esbuild-bundler.js.map +1 -0
- package/src/commands/build/exec/index.d.ts +11 -0
- package/src/commands/build/exec/index.js +126 -0
- package/src/commands/build/exec/index.js.map +1 -0
- package/src/commands/build/exec/installer-script.d.ts +6 -0
- package/src/commands/build/exec/installer-script.js +96 -0
- package/src/commands/build/exec/installer-script.js.map +1 -0
- package/src/commands/build/exec/manifest.d.ts +39 -0
- package/src/commands/build/exec/manifest.js +59 -0
- package/src/commands/build/exec/manifest.js.map +1 -0
- package/src/commands/build/exec/runner-script.d.ts +6 -0
- package/src/commands/build/exec/runner-script.js +58 -0
- package/src/commands/build/exec/runner-script.js.map +1 -0
- package/src/commands/build/exec/setup.d.ts +61 -0
- package/src/commands/build/exec/setup.js +144 -0
- package/src/commands/build/exec/setup.js.map +1 -0
- package/src/commands/build/index.js +5 -0
- package/src/commands/build/index.js.map +1 -1
- package/src/commands/configure.d.ts +2 -0
- package/src/commands/configure.js +37 -0
- package/src/commands/configure.js.map +1 -0
- package/src/commands/install/index.d.ts +5 -0
- package/src/commands/install/index.js +150 -0
- package/src/commands/install/index.js.map +1 -0
- package/src/commands/install/questionnaire.d.ts +19 -0
- package/src/commands/install/questionnaire.js +268 -0
- package/src/commands/install/questionnaire.js.map +1 -0
- package/src/commands/install/registry.d.ts +13 -0
- package/src/commands/install/registry.js +59 -0
- package/src/commands/install/registry.js.map +1 -0
- package/src/commands/install/sources/git.d.ts +4 -0
- package/src/commands/install/sources/git.js +24 -0
- package/src/commands/install/sources/git.js.map +1 -0
- package/src/commands/install/sources/local.d.ts +4 -0
- package/src/commands/install/sources/local.js +28 -0
- package/src/commands/install/sources/local.js.map +1 -0
- package/src/commands/install/sources/npm.d.ts +5 -0
- package/src/commands/install/sources/npm.js +36 -0
- package/src/commands/install/sources/npm.js.map +1 -0
- package/src/commands/install/types.d.ts +32 -0
- package/src/commands/install/types.js +23 -0
- package/src/commands/install/types.js.map +1 -0
- package/src/commands/list.d.ts +2 -0
- package/src/commands/list.js +10 -0
- package/src/commands/list.js.map +1 -0
- package/src/commands/logs.d.ts +2 -0
- package/src/commands/logs.js +50 -0
- package/src/commands/logs.js.map +1 -0
- package/src/commands/restart.d.ts +2 -0
- package/src/commands/restart.js +17 -0
- package/src/commands/restart.js.map +1 -0
- package/src/commands/service.d.ts +2 -0
- package/src/commands/service.js +54 -0
- package/src/commands/service.js.map +1 -0
- package/src/commands/socket.d.ts +2 -0
- package/src/commands/socket.js +128 -0
- package/src/commands/socket.js.map +1 -0
- package/src/commands/start.d.ts +2 -0
- package/src/commands/start.js +52 -0
- package/src/commands/start.js.map +1 -0
- package/src/commands/status.d.ts +2 -0
- package/src/commands/status.js +24 -0
- package/src/commands/status.js.map +1 -0
- package/src/commands/stop.d.ts +2 -0
- package/src/commands/stop.js +16 -0
- package/src/commands/stop.js.map +1 -0
- package/src/commands/uninstall.d.ts +2 -0
- package/src/commands/uninstall.js +40 -0
- package/src/commands/uninstall.js.map +1 -0
- package/src/pm/index.d.ts +9 -0
- package/src/pm/index.js +36 -0
- package/src/pm/index.js.map +1 -0
- package/src/pm/pm.format.d.ts +7 -0
- package/src/pm/pm.format.js +97 -0
- package/src/pm/pm.format.js.map +1 -0
- package/src/pm/pm.health.d.ts +15 -0
- package/src/pm/pm.health.js +61 -0
- package/src/pm/pm.health.js.map +1 -0
- package/src/pm/pm.logs.d.ts +11 -0
- package/src/pm/pm.logs.js +108 -0
- package/src/pm/pm.logs.js.map +1 -0
- package/src/pm/pm.manager.d.ts +11 -0
- package/src/pm/pm.manager.js +153 -0
- package/src/pm/pm.manager.js.map +1 -0
- package/src/pm/pm.paths.d.ts +20 -0
- package/src/pm/pm.paths.js +54 -0
- package/src/pm/pm.paths.js.map +1 -0
- package/src/pm/pm.pidfile.d.ts +9 -0
- package/src/pm/pm.pidfile.js +70 -0
- package/src/pm/pm.pidfile.js.map +1 -0
- package/src/pm/pm.service.d.ts +8 -0
- package/src/pm/pm.service.js +116 -0
- package/src/pm/pm.service.js.map +1 -0
- package/src/pm/pm.spawn.d.ts +24 -0
- package/src/pm/pm.spawn.js +207 -0
- package/src/pm/pm.spawn.js.map +1 -0
- package/src/pm/pm.types.d.ts +48 -0
- package/src/pm/pm.types.js +6 -0
- 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.
|
|
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.
|
|
32
|
+
"@frontmcp/utils": "0.10.0",
|
|
33
33
|
"tslib": "^2.3.0",
|
|
34
|
-
"@rspack/core": "^1.
|
|
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":";;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/args.ts"],"names":[],"mappings":";;AA4DA,8BA6CC;AA7CD,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;QAC7C,uBAAuB;aAClB,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3D,IAAI,CAAC,KAAK,MAAM;YAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACrC,IAAI,CAAC,KAAK,cAAc,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;QACnE,oBAAoB;aACf,IAAI,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QACzC,wBAAwB;aACnB,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QACvD,CAAC;aAAM,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;aACtD,IAAI,CAAC,KAAK,gBAAgB,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9D,CAAC;aAAM,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;aACxD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QACxD,CAAC;QACD,gBAAgB;aACX,IAAI,CAAC,KAAK,YAAY;YAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;;YACjD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["export type Command =\n | 'dev'\n | 'build'\n | 'init'\n | 'doctor'\n | 'inspector'\n | 'create'\n | 'help'\n | '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', '
|
|
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
|
-
|
|
35
|
+
socket <entry> Start Unix socket daemon for local MCP server
|
|
34
36
|
|
|
35
|
-
${(0, colors_1.c)('bold', '
|
|
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>;
|