frontmcp 0.12.2 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/README.md +1 -1
  2. package/package.json +6 -5
  3. package/src/commands/build/bundler.js +1 -1
  4. package/src/commands/build/bundler.js.map +1 -1
  5. package/src/commands/build/exec/cli-runtime/cli-bundler.d.ts +17 -0
  6. package/src/commands/build/exec/cli-runtime/cli-bundler.js +75 -0
  7. package/src/commands/build/exec/cli-runtime/cli-bundler.js.map +1 -0
  8. package/src/commands/build/exec/cli-runtime/credential-store.d.ts +22 -0
  9. package/src/commands/build/exec/cli-runtime/credential-store.js +140 -0
  10. package/src/commands/build/exec/cli-runtime/credential-store.js.map +1 -0
  11. package/src/commands/build/exec/cli-runtime/daemon-client.d.ts +16 -0
  12. package/src/commands/build/exec/cli-runtime/daemon-client.js +169 -0
  13. package/src/commands/build/exec/cli-runtime/daemon-client.js.map +1 -0
  14. package/src/commands/build/exec/cli-runtime/generate-cli-entry.d.ts +37 -0
  15. package/src/commands/build/exec/cli-runtime/generate-cli-entry.js +1287 -0
  16. package/src/commands/build/exec/cli-runtime/generate-cli-entry.js.map +1 -0
  17. package/src/commands/build/exec/cli-runtime/index.d.ts +9 -0
  18. package/src/commands/build/exec/cli-runtime/index.js +32 -0
  19. package/src/commands/build/exec/cli-runtime/index.js.map +1 -0
  20. package/src/commands/build/exec/cli-runtime/oauth-helper.d.ts +9 -0
  21. package/src/commands/build/exec/cli-runtime/oauth-helper.js +224 -0
  22. package/src/commands/build/exec/cli-runtime/oauth-helper.js.map +1 -0
  23. package/src/commands/build/exec/cli-runtime/output-formatter.d.ts +46 -0
  24. package/src/commands/build/exec/cli-runtime/output-formatter.js +168 -0
  25. package/src/commands/build/exec/cli-runtime/output-formatter.js.map +1 -0
  26. package/src/commands/build/exec/cli-runtime/schema-extractor.d.ts +57 -0
  27. package/src/commands/build/exec/cli-runtime/schema-extractor.js +129 -0
  28. package/src/commands/build/exec/cli-runtime/schema-extractor.js.map +1 -0
  29. package/src/commands/build/exec/cli-runtime/schema-to-commander.d.ts +38 -0
  30. package/src/commands/build/exec/cli-runtime/schema-to-commander.js +172 -0
  31. package/src/commands/build/exec/cli-runtime/schema-to-commander.js.map +1 -0
  32. package/src/commands/build/exec/cli-runtime/session-manager.d.ts +16 -0
  33. package/src/commands/build/exec/cli-runtime/session-manager.js +122 -0
  34. package/src/commands/build/exec/cli-runtime/session-manager.js.map +1 -0
  35. package/src/commands/build/exec/config.d.ts +25 -0
  36. package/src/commands/build/exec/config.js +0 -1
  37. package/src/commands/build/exec/config.js.map +1 -1
  38. package/src/commands/build/exec/esbuild-bundler.d.ts +4 -1
  39. package/src/commands/build/exec/esbuild-bundler.js +28 -9
  40. package/src/commands/build/exec/esbuild-bundler.js.map +1 -1
  41. package/src/commands/build/exec/index.d.ts +7 -2
  42. package/src/commands/build/exec/index.js +159 -9
  43. package/src/commands/build/exec/index.js.map +1 -1
  44. package/src/commands/build/exec/manifest.d.ts +14 -0
  45. package/src/commands/build/exec/manifest.js.map +1 -1
  46. package/src/commands/build/exec/runner-script.d.ts +1 -1
  47. package/src/commands/build/exec/runner-script.js +48 -5
  48. package/src/commands/build/exec/runner-script.js.map +1 -1
  49. package/src/commands/build/exec/sea-builder.d.ts +18 -0
  50. package/src/commands/build/exec/sea-builder.js +81 -0
  51. package/src/commands/build/exec/sea-builder.js.map +1 -0
  52. package/src/commands/build/exec/setup.js +0 -2
  53. package/src/commands/build/exec/setup.js.map +1 -1
  54. package/src/commands/build/index.d.ts +1 -1
  55. package/src/commands/build/index.js +3 -3
  56. package/src/commands/build/index.js.map +1 -1
  57. package/src/commands/build/register.d.ts +2 -0
  58. package/src/commands/build/register.js +21 -0
  59. package/src/commands/build/register.js.map +1 -0
  60. package/src/commands/{dev.d.ts → dev/dev.d.ts} +1 -1
  61. package/src/commands/{dev.js → dev/dev.js} +3 -3
  62. package/src/commands/dev/dev.js.map +1 -0
  63. package/src/commands/{doctor.js → dev/doctor.js} +5 -4
  64. package/src/commands/dev/doctor.js.map +1 -0
  65. package/src/commands/{inspector.js → dev/inspector.js} +1 -1
  66. package/src/commands/dev/inspector.js.map +1 -0
  67. package/src/commands/dev/register.d.ts +2 -0
  68. package/src/commands/dev/register.js +49 -0
  69. package/src/commands/dev/register.js.map +1 -0
  70. package/src/commands/{test.d.ts → dev/test.d.ts} +1 -1
  71. package/src/commands/{test.js → dev/test.js} +5 -5
  72. package/src/commands/dev/test.js.map +1 -0
  73. package/src/commands/{configure.d.ts → package/configure.d.ts} +1 -1
  74. package/src/commands/{configure.js → package/configure.js} +3 -3
  75. package/src/commands/package/configure.js.map +1 -0
  76. package/src/commands/package/esm-update.d.ts +19 -0
  77. package/src/commands/package/esm-update.js +93 -0
  78. package/src/commands/package/esm-update.js.map +1 -0
  79. package/src/commands/{install/index.d.ts → package/install.d.ts} +1 -1
  80. package/src/commands/{install/index.js → package/install.js} +8 -5
  81. package/src/commands/package/install.js.map +1 -0
  82. package/src/commands/{install → package}/questionnaire.js +2 -2
  83. package/src/commands/{install → package}/questionnaire.js.map +1 -1
  84. package/src/commands/package/register.d.ts +2 -0
  85. package/src/commands/package/register.js +35 -0
  86. package/src/commands/package/register.js.map +1 -0
  87. package/src/commands/{install → package}/registry.js +8 -6
  88. package/src/commands/package/registry.js.map +1 -0
  89. package/src/commands/{install → package}/sources/git.js +8 -1
  90. package/src/commands/package/sources/git.js.map +1 -0
  91. package/src/commands/{install → package}/sources/local.js.map +1 -1
  92. package/src/commands/{install → package}/sources/npm.js.map +1 -1
  93. package/src/commands/{install → package}/types.d.ts +7 -1
  94. package/src/commands/{install → package}/types.js +4 -0
  95. package/src/commands/package/types.js.map +1 -0
  96. package/src/commands/{uninstall.d.ts → package/uninstall.d.ts} +1 -1
  97. package/src/commands/{uninstall.js → package/uninstall.js} +2 -2
  98. package/src/commands/package/uninstall.js.map +1 -0
  99. package/src/{pm/pm.format.d.ts → commands/pm/format.d.ts} +1 -1
  100. package/src/{pm/pm.format.js → commands/pm/format.js} +2 -2
  101. package/src/commands/pm/format.js.map +1 -0
  102. package/src/{pm/pm.health.js → commands/pm/health.js} +1 -1
  103. package/src/commands/pm/health.js.map +1 -0
  104. package/src/commands/pm/index.d.ts +9 -0
  105. package/src/{pm → commands/pm}/index.js +32 -32
  106. package/src/commands/pm/index.js.map +1 -0
  107. package/src/commands/{list.d.ts → pm/list.d.ts} +1 -1
  108. package/src/commands/{list.js → pm/list.js} +3 -3
  109. package/src/commands/pm/list.js.map +1 -0
  110. package/src/{pm/pm.logs.js → commands/pm/log-utils.js} +9 -9
  111. package/src/commands/pm/log-utils.js.map +1 -0
  112. package/src/commands/{logs.d.ts → pm/logs.d.ts} +1 -1
  113. package/src/commands/{logs.js → pm/logs.js} +6 -6
  114. package/src/commands/pm/logs.js.map +1 -0
  115. package/src/{pm/pm.manager.d.ts → commands/pm/manager.d.ts} +1 -1
  116. package/src/{pm/pm.manager.js → commands/pm/manager.js} +21 -21
  117. package/src/commands/pm/manager.js.map +1 -0
  118. package/src/{pm/pm.paths.d.ts → commands/pm/paths.d.ts} +1 -0
  119. package/src/{pm/pm.paths.js → commands/pm/paths.js} +2 -1
  120. package/src/commands/pm/paths.js.map +1 -0
  121. package/src/{pm/pm.pidfile.d.ts → commands/pm/pidfile.d.ts} +1 -1
  122. package/src/{pm/pm.pidfile.js → commands/pm/pidfile.js} +8 -8
  123. package/src/commands/pm/pidfile.js.map +1 -0
  124. package/src/commands/pm/register.d.ts +2 -0
  125. package/src/commands/pm/register.js +83 -0
  126. package/src/commands/pm/register.js.map +1 -0
  127. package/src/commands/{restart.d.ts → pm/restart.d.ts} +1 -1
  128. package/src/commands/{restart.js → pm/restart.js} +4 -4
  129. package/src/commands/pm/restart.js.map +1 -0
  130. package/src/{pm/pm.service.d.ts → commands/pm/service-gen.d.ts} +1 -1
  131. package/src/{pm/pm.service.js → commands/pm/service-gen.js} +5 -5
  132. package/src/commands/pm/service-gen.js.map +1 -0
  133. package/src/commands/{service.d.ts → pm/service.d.ts} +1 -1
  134. package/src/commands/{service.js → pm/service.js} +6 -6
  135. package/src/commands/pm/service.js.map +1 -0
  136. package/src/commands/{socket.d.ts → pm/socket.d.ts} +1 -1
  137. package/src/commands/{socket.js → pm/socket.js} +3 -3
  138. package/src/commands/pm/socket.js.map +1 -0
  139. package/src/{pm/pm.spawn.d.ts → commands/pm/spawn.d.ts} +1 -1
  140. package/src/{pm/pm.spawn.js → commands/pm/spawn.js} +15 -15
  141. package/src/commands/pm/spawn.js.map +1 -0
  142. package/src/commands/{start.d.ts → pm/start.d.ts} +1 -1
  143. package/src/commands/{start.js → pm/start.js} +6 -6
  144. package/src/commands/pm/start.js.map +1 -0
  145. package/src/commands/{status.d.ts → pm/status.d.ts} +1 -1
  146. package/src/commands/{status.js → pm/status.js} +5 -5
  147. package/src/commands/pm/status.js.map +1 -0
  148. package/src/commands/{stop.d.ts → pm/stop.d.ts} +1 -1
  149. package/src/commands/{stop.js → pm/stop.js} +3 -3
  150. package/src/commands/pm/stop.js.map +1 -0
  151. package/src/{pm/pm.types.js → commands/pm/types.js} +1 -1
  152. package/src/commands/pm/types.js.map +1 -0
  153. package/src/commands/{create.js → scaffold/create.js} +91 -20
  154. package/src/commands/scaffold/create.js.map +1 -0
  155. package/src/commands/scaffold/register.d.ts +2 -0
  156. package/src/commands/scaffold/register.js +28 -0
  157. package/src/commands/scaffold/register.js.map +1 -0
  158. package/src/{args.d.ts → core/args.d.ts} +7 -1
  159. package/src/{args.js → core/args.js} +8 -0
  160. package/src/core/args.js.map +1 -0
  161. package/src/core/bridge.d.ts +9 -0
  162. package/src/core/bridge.js +75 -0
  163. package/src/core/bridge.js.map +1 -0
  164. package/src/core/cli.d.ts +8 -0
  165. package/src/core/cli.js +23 -0
  166. package/src/core/cli.js.map +1 -0
  167. package/src/core/colors.js.map +1 -0
  168. package/src/core/help.d.ts +7 -0
  169. package/src/core/help.js +83 -0
  170. package/src/core/help.js.map +1 -0
  171. package/src/core/index.d.ts +7 -0
  172. package/src/core/index.js +22 -0
  173. package/src/core/index.js.map +1 -0
  174. package/src/core/program.d.ts +2 -0
  175. package/src/core/program.js +23 -0
  176. package/src/core/program.js.map +1 -0
  177. package/src/core/tsconfig.js.map +1 -0
  178. package/src/{version.js → core/version.js} +1 -1
  179. package/src/core/version.js.map +1 -0
  180. package/src/index.d.ts +1 -1
  181. package/src/index.js +2 -5
  182. package/src/index.js.map +1 -1
  183. package/src/{utils → shared}/env.js +2 -2
  184. package/src/shared/env.js.map +1 -0
  185. package/src/{utils → shared}/fs.js +2 -2
  186. package/src/shared/fs.js.map +1 -0
  187. package/src/shared/index.d.ts +3 -0
  188. package/src/shared/index.js +14 -0
  189. package/src/shared/index.js.map +1 -0
  190. package/src/shared/prompts.js.map +1 -0
  191. package/src/args.js.map +0 -1
  192. package/src/cli.d.ts +0 -5
  193. package/src/cli.js +0 -241
  194. package/src/cli.js.map +0 -1
  195. package/src/colors.js.map +0 -1
  196. package/src/commands/configure.js.map +0 -1
  197. package/src/commands/create.js.map +0 -1
  198. package/src/commands/dev.js.map +0 -1
  199. package/src/commands/doctor.js.map +0 -1
  200. package/src/commands/inspector.js.map +0 -1
  201. package/src/commands/install/index.js.map +0 -1
  202. package/src/commands/install/registry.js.map +0 -1
  203. package/src/commands/install/sources/git.js.map +0 -1
  204. package/src/commands/install/types.js.map +0 -1
  205. package/src/commands/list.js.map +0 -1
  206. package/src/commands/logs.js.map +0 -1
  207. package/src/commands/restart.js.map +0 -1
  208. package/src/commands/service.js.map +0 -1
  209. package/src/commands/socket.js.map +0 -1
  210. package/src/commands/start.js.map +0 -1
  211. package/src/commands/status.js.map +0 -1
  212. package/src/commands/stop.js.map +0 -1
  213. package/src/commands/template.d.ts +0 -13
  214. package/src/commands/template.js +0 -193
  215. package/src/commands/template.js.map +0 -1
  216. package/src/commands/test.js.map +0 -1
  217. package/src/commands/uninstall.js.map +0 -1
  218. package/src/pm/index.d.ts +0 -9
  219. package/src/pm/index.js.map +0 -1
  220. package/src/pm/pm.format.js.map +0 -1
  221. package/src/pm/pm.health.js.map +0 -1
  222. package/src/pm/pm.logs.js.map +0 -1
  223. package/src/pm/pm.manager.js.map +0 -1
  224. package/src/pm/pm.paths.js.map +0 -1
  225. package/src/pm/pm.pidfile.js.map +0 -1
  226. package/src/pm/pm.service.js.map +0 -1
  227. package/src/pm/pm.spawn.js.map +0 -1
  228. package/src/pm/pm.types.js.map +0 -1
  229. package/src/templates/3rd-party-integration/src/http-client.d.ts +0 -20
  230. package/src/templates/3rd-party-integration/src/http-client.js +0 -105
  231. package/src/templates/3rd-party-integration/src/http-client.js.map +0 -1
  232. package/src/templates/3rd-party-integration/src/mcp-http-types.d.ts +0 -63
  233. package/src/templates/3rd-party-integration/src/mcp-http-types.js +0 -52
  234. package/src/templates/3rd-party-integration/src/mcp-http-types.js.map +0 -1
  235. package/src/templates/3rd-party-integration/src/tools/example.list.d.ts +0 -45
  236. package/src/templates/3rd-party-integration/src/tools/example.list.js +0 -85
  237. package/src/templates/3rd-party-integration/src/tools/example.list.js.map +0 -1
  238. package/src/tsconfig.js.map +0 -1
  239. package/src/utils/env.js.map +0 -1
  240. package/src/utils/fs.js.map +0 -1
  241. package/src/utils/prompts.js.map +0 -1
  242. package/src/version.js.map +0 -1
  243. /package/src/commands/{doctor.d.ts → dev/doctor.d.ts} +0 -0
  244. /package/src/commands/{inspector.d.ts → dev/inspector.d.ts} +0 -0
  245. /package/src/commands/{install → package}/questionnaire.d.ts +0 -0
  246. /package/src/commands/{install → package}/registry.d.ts +0 -0
  247. /package/src/commands/{install → package}/sources/git.d.ts +0 -0
  248. /package/src/commands/{install → package}/sources/local.d.ts +0 -0
  249. /package/src/commands/{install → package}/sources/local.js +0 -0
  250. /package/src/commands/{install → package}/sources/npm.d.ts +0 -0
  251. /package/src/commands/{install → package}/sources/npm.js +0 -0
  252. /package/src/{pm/pm.health.d.ts → commands/pm/health.d.ts} +0 -0
  253. /package/src/{pm/pm.logs.d.ts → commands/pm/log-utils.d.ts} +0 -0
  254. /package/src/{pm/pm.types.d.ts → commands/pm/types.d.ts} +0 -0
  255. /package/src/commands/{create.d.ts → scaffold/create.d.ts} +0 -0
  256. /package/src/{colors.d.ts → core/colors.d.ts} +0 -0
  257. /package/src/{colors.js → core/colors.js} +0 -0
  258. /package/src/{tsconfig.d.ts → core/tsconfig.d.ts} +0 -0
  259. /package/src/{tsconfig.js → core/tsconfig.js} +0 -0
  260. /package/src/{version.d.ts → core/version.d.ts} +0 -0
  261. /package/src/{utils → shared}/env.d.ts +0 -0
  262. /package/src/{utils → shared}/fs.d.ts +0 -0
  263. /package/src/{utils → shared}/prompts.d.ts +0 -0
  264. /package/src/{utils → shared}/prompts.js +0 -0
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ /**
3
+ * Output formatting for MCP tool/resource results in CLI context.
4
+ * This module is embedded in the generated CLI bundle.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.formatToolResult = formatToolResult;
8
+ exports.formatResourceResult = formatResourceResult;
9
+ exports.formatPromptResult = formatPromptResult;
10
+ exports.formatSubscriptionEvent = formatSubscriptionEvent;
11
+ exports.generateOutputFormatterSource = generateOutputFormatterSource;
12
+ /**
13
+ * Format a tool call result for terminal output.
14
+ */
15
+ function formatToolResult(result, mode) {
16
+ if (mode === 'json') {
17
+ return JSON.stringify(result, null, 2);
18
+ }
19
+ return formatTextOutput(result);
20
+ }
21
+ /**
22
+ * Format a resource read result for terminal output.
23
+ */
24
+ function formatResourceResult(result, mode) {
25
+ if (mode === 'json') {
26
+ return JSON.stringify(result, null, 2);
27
+ }
28
+ const contents = result.contents;
29
+ if (!contents || contents.length === 0) {
30
+ return '(empty resource)';
31
+ }
32
+ return contents
33
+ .map((c) => {
34
+ if (c.text)
35
+ return c.text;
36
+ if (c.uri)
37
+ return `[Resource: ${c.uri}]`;
38
+ if (c.data && c.mimeType)
39
+ return `[Binary: ${c.mimeType}, ${c.data.length} chars base64]`;
40
+ return JSON.stringify(c, null, 2);
41
+ })
42
+ .join('\n');
43
+ }
44
+ /**
45
+ * Format a prompt result for terminal output.
46
+ */
47
+ function formatPromptResult(result, mode) {
48
+ if (mode === 'json') {
49
+ return JSON.stringify(result, null, 2);
50
+ }
51
+ const messages = result.messages;
52
+ if (!messages || messages.length === 0) {
53
+ return '(empty prompt)';
54
+ }
55
+ return messages
56
+ .map((m) => {
57
+ const role = m.role || 'unknown';
58
+ const text = m.content?.text || JSON.stringify(m.content);
59
+ return `[${role}] ${text}`;
60
+ })
61
+ .join('\n\n');
62
+ }
63
+ /**
64
+ * Format a subscription event for terminal output.
65
+ */
66
+ function formatSubscriptionEvent(event, mode) {
67
+ if (mode === 'json') {
68
+ return JSON.stringify(event, null, 2);
69
+ }
70
+ const ts = event.timestamp ? `[${event.timestamp}] ` : '';
71
+ if (event.type === 'resource_updated') {
72
+ return `${ts}Resource updated: ${event.uri || 'unknown'}`;
73
+ }
74
+ if (event.type === 'notification') {
75
+ const detail = event.params ? ' ' + JSON.stringify(event.params) : '';
76
+ return `${ts}Notification: ${event.method || 'unknown'}${detail}`;
77
+ }
78
+ return `${ts}${event.type}: ${JSON.stringify(event)}`;
79
+ }
80
+ function formatTextOutput(result) {
81
+ if (!result.content || result.content.length === 0) {
82
+ return result.isError ? '(error: no content)' : '(no output)';
83
+ }
84
+ const blocks = result.content.map((block) => {
85
+ switch (block.type) {
86
+ case 'text':
87
+ return block.text || '';
88
+ case 'image':
89
+ return `[Image: ${block.mimeType || 'unknown'}, ${(block.data?.length || 0)} chars base64]`;
90
+ case 'resource':
91
+ return `[Resource: ${block.uri || 'unknown'}]`;
92
+ case 'audio':
93
+ return `[Audio: ${block.mimeType || 'unknown'}]`;
94
+ default:
95
+ return `[${block.type}: ${JSON.stringify(block)}]`;
96
+ }
97
+ });
98
+ const output = blocks.join('\n');
99
+ if (result.isError) {
100
+ return `Error: ${output}`;
101
+ }
102
+ return output;
103
+ }
104
+ /**
105
+ * Generate the output-formatter module source code for embedding in CLI bundle.
106
+ */
107
+ function generateOutputFormatterSource() {
108
+ return `
109
+ 'use strict';
110
+
111
+ function formatToolResult(result, mode) {
112
+ if (mode === 'json') return JSON.stringify(result, null, 2);
113
+ if (!result.content || result.content.length === 0) {
114
+ return result.isError ? '(error: no content)' : '(no output)';
115
+ }
116
+ const blocks = result.content.map(function(block) {
117
+ switch (block.type) {
118
+ case 'text': return block.text || '';
119
+ case 'image': return '[Image: ' + (block.mimeType || 'unknown') + ']';
120
+ case 'resource': return '[Resource: ' + (block.uri || 'unknown') + ']';
121
+ case 'audio': return '[Audio: ' + (block.mimeType || 'unknown') + ']';
122
+ default: return '[' + block.type + ']';
123
+ }
124
+ });
125
+ var output = blocks.join('\\n');
126
+ return result.isError ? 'Error: ' + output : output;
127
+ }
128
+
129
+ function formatResourceResult(result, mode) {
130
+ if (mode === 'json') return JSON.stringify(result, null, 2);
131
+ var contents = result.contents;
132
+ if (!contents || contents.length === 0) return '(empty resource)';
133
+ return contents.map(function(c) {
134
+ if (c.text) return c.text;
135
+ if (c.uri) return '[Resource: ' + c.uri + ']';
136
+ if (c.data && c.mimeType) return '[Binary: ' + c.mimeType + ']';
137
+ return JSON.stringify(c, null, 2);
138
+ }).join('\\n');
139
+ }
140
+
141
+ function formatPromptResult(result, mode) {
142
+ if (mode === 'json') return JSON.stringify(result, null, 2);
143
+ var messages = result.messages;
144
+ if (!messages || messages.length === 0) return '(empty prompt)';
145
+ return messages.map(function(m) {
146
+ var role = m.role || 'unknown';
147
+ var text = m.content && m.content.text ? m.content.text : JSON.stringify(m.content);
148
+ return '[' + role + '] ' + text;
149
+ }).join('\\n\\n');
150
+ }
151
+
152
+ function formatSubscriptionEvent(event, mode) {
153
+ if (mode === 'json') return JSON.stringify(event, null, 2);
154
+ var ts = event.timestamp ? '[' + event.timestamp + '] ' : '';
155
+ if (event.type === 'resource_updated') {
156
+ return ts + 'Resource updated: ' + (event.uri || 'unknown');
157
+ }
158
+ if (event.type === 'notification') {
159
+ var detail = event.params ? ' ' + JSON.stringify(event.params) : '';
160
+ return ts + 'Notification: ' + (event.method || 'unknown') + detail;
161
+ }
162
+ return ts + event.type + ': ' + JSON.stringify(event);
163
+ }
164
+
165
+ module.exports = { formatToolResult, formatResourceResult, formatPromptResult, formatSubscriptionEvent };
166
+ `.trim();
167
+ }
168
+ //# sourceMappingURL=output-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-formatter.js","sourceRoot":"","sources":["../../../../../../src/commands/build/exec/cli-runtime/output-formatter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Output formatting for MCP tool/resource results in CLI context.\n * This module is embedded in the generated CLI bundle.\n */\n\nexport type OutputMode = 'text' | 'json';\n\nexport interface ContentBlock {\n type: string;\n text?: string;\n mimeType?: string;\n data?: string;\n uri?: string;\n [key: string]: unknown;\n}\n\nexport interface CallToolResult {\n content?: ContentBlock[];\n isError?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Format a tool call result for terminal output.\n */\nexport function formatToolResult(result: CallToolResult, mode: OutputMode): string {\n if (mode === 'json') {\n return JSON.stringify(result, null, 2);\n }\n\n return formatTextOutput(result);\n}\n\n/**\n * Format a resource read result for terminal output.\n */\nexport function formatResourceResult(result: Record<string, unknown>, mode: OutputMode): string {\n if (mode === 'json') {\n return JSON.stringify(result, null, 2);\n }\n\n const contents = result.contents as ContentBlock[] | undefined;\n if (!contents || contents.length === 0) {\n return '(empty resource)';\n }\n\n return contents\n .map((c) => {\n if (c.text) return c.text;\n if (c.uri) return `[Resource: ${c.uri}]`;\n if (c.data && c.mimeType) return `[Binary: ${c.mimeType}, ${c.data.length} chars base64]`;\n return JSON.stringify(c, null, 2);\n })\n .join('\\n');\n}\n\n/**\n * Format a prompt result for terminal output.\n */\nexport function formatPromptResult(result: Record<string, unknown>, mode: OutputMode): string {\n if (mode === 'json') {\n return JSON.stringify(result, null, 2);\n }\n\n const messages = result.messages as Array<{ role?: string; content?: ContentBlock }> | undefined;\n if (!messages || messages.length === 0) {\n return '(empty prompt)';\n }\n\n return messages\n .map((m) => {\n const role = m.role || 'unknown';\n const text = m.content?.text || JSON.stringify(m.content);\n return `[${role}] ${text}`;\n })\n .join('\\n\\n');\n}\n\nexport interface SubscriptionEvent {\n type: string;\n uri?: string;\n method?: string;\n params?: unknown;\n timestamp?: string;\n [key: string]: unknown;\n}\n\n/**\n * Format a subscription event for terminal output.\n */\nexport function formatSubscriptionEvent(event: SubscriptionEvent, mode: OutputMode): string {\n if (mode === 'json') {\n return JSON.stringify(event, null, 2);\n }\n\n const ts = event.timestamp ? `[${event.timestamp}] ` : '';\n if (event.type === 'resource_updated') {\n return `${ts}Resource updated: ${event.uri || 'unknown'}`;\n }\n if (event.type === 'notification') {\n const detail = event.params ? ' ' + JSON.stringify(event.params) : '';\n return `${ts}Notification: ${event.method || 'unknown'}${detail}`;\n }\n return `${ts}${event.type}: ${JSON.stringify(event)}`;\n}\n\nfunction formatTextOutput(result: CallToolResult): string {\n if (!result.content || result.content.length === 0) {\n return result.isError ? '(error: no content)' : '(no output)';\n }\n\n const blocks = result.content.map((block) => {\n switch (block.type) {\n case 'text':\n return block.text || '';\n case 'image':\n return `[Image: ${block.mimeType || 'unknown'}, ${(block.data?.length || 0)} chars base64]`;\n case 'resource':\n return `[Resource: ${block.uri || 'unknown'}]`;\n case 'audio':\n return `[Audio: ${block.mimeType || 'unknown'}]`;\n default:\n return `[${block.type}: ${JSON.stringify(block)}]`;\n }\n });\n\n const output = blocks.join('\\n');\n\n if (result.isError) {\n return `Error: ${output}`;\n }\n\n return output;\n}\n\n/**\n * Generate the output-formatter module source code for embedding in CLI bundle.\n */\nexport function generateOutputFormatterSource(): string {\n return `\n'use strict';\n\nfunction formatToolResult(result, mode) {\n if (mode === 'json') return JSON.stringify(result, null, 2);\n if (!result.content || result.content.length === 0) {\n return result.isError ? '(error: no content)' : '(no output)';\n }\n const blocks = result.content.map(function(block) {\n switch (block.type) {\n case 'text': return block.text || '';\n case 'image': return '[Image: ' + (block.mimeType || 'unknown') + ']';\n case 'resource': return '[Resource: ' + (block.uri || 'unknown') + ']';\n case 'audio': return '[Audio: ' + (block.mimeType || 'unknown') + ']';\n default: return '[' + block.type + ']';\n }\n });\n var output = blocks.join('\\\\n');\n return result.isError ? 'Error: ' + output : output;\n}\n\nfunction formatResourceResult(result, mode) {\n if (mode === 'json') return JSON.stringify(result, null, 2);\n var contents = result.contents;\n if (!contents || contents.length === 0) return '(empty resource)';\n return contents.map(function(c) {\n if (c.text) return c.text;\n if (c.uri) return '[Resource: ' + c.uri + ']';\n if (c.data && c.mimeType) return '[Binary: ' + c.mimeType + ']';\n return JSON.stringify(c, null, 2);\n }).join('\\\\n');\n}\n\nfunction formatPromptResult(result, mode) {\n if (mode === 'json') return JSON.stringify(result, null, 2);\n var messages = result.messages;\n if (!messages || messages.length === 0) return '(empty prompt)';\n return messages.map(function(m) {\n var role = m.role || 'unknown';\n var text = m.content && m.content.text ? m.content.text : JSON.stringify(m.content);\n return '[' + role + '] ' + text;\n }).join('\\\\n\\\\n');\n}\n\nfunction formatSubscriptionEvent(event, mode) {\n if (mode === 'json') return JSON.stringify(event, null, 2);\n var ts = event.timestamp ? '[' + event.timestamp + '] ' : '';\n if (event.type === 'resource_updated') {\n return ts + 'Resource updated: ' + (event.uri || 'unknown');\n }\n if (event.type === 'notification') {\n var detail = event.params ? ' ' + JSON.stringify(event.params) : '';\n return ts + 'Notification: ' + (event.method || 'unknown') + detail;\n }\n return ts + event.type + ': ' + JSON.stringify(event);\n}\n\nmodule.exports = { formatToolResult, formatResourceResult, formatPromptResult, formatSubscriptionEvent };\n`.trim();\n}\n"]}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Build-time schema extraction.
3
+ * After the server bundle is produced, boots a DirectClient via connect(),
4
+ * extracts tool/resource/prompt schemas, and serializes them for CLI code generation.
5
+ */
6
+ export interface ExtractedTool {
7
+ name: string;
8
+ description: string;
9
+ inputSchema: Record<string, unknown>;
10
+ }
11
+ export interface ExtractedResource {
12
+ uri: string;
13
+ name: string;
14
+ description?: string;
15
+ mimeType?: string;
16
+ }
17
+ export interface ExtractedResourceTemplate {
18
+ uriTemplate: string;
19
+ name: string;
20
+ description?: string;
21
+ }
22
+ export interface ExtractedPrompt {
23
+ name: string;
24
+ description?: string;
25
+ arguments?: Array<{
26
+ name: string;
27
+ description?: string;
28
+ required?: boolean;
29
+ }>;
30
+ }
31
+ export interface ExtractedJob {
32
+ name: string;
33
+ description?: string;
34
+ inputSchema?: Record<string, unknown>;
35
+ tags?: string[];
36
+ }
37
+ export interface ExtractedCapabilities {
38
+ skills: boolean;
39
+ jobs: boolean;
40
+ workflows: boolean;
41
+ }
42
+ export interface ExtractedSchema {
43
+ tools: ExtractedTool[];
44
+ resources: ExtractedResource[];
45
+ resourceTemplates: ExtractedResourceTemplate[];
46
+ prompts: ExtractedPrompt[];
47
+ jobs: ExtractedJob[];
48
+ capabilities: ExtractedCapabilities;
49
+ }
50
+ /** Known system tool names injected by SDK features (skills, jobs, workflows). */
51
+ export declare const SYSTEM_TOOL_NAMES: Set<string>;
52
+ /**
53
+ * Extract schemas from a compiled server bundle.
54
+ * Requires the bundle to export a FrontMcp-decorated class as default export
55
+ * or a config object usable by connect().
56
+ */
57
+ export declare function extractSchemas(bundlePath: string): Promise<ExtractedSchema>;
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ /**
3
+ * Build-time schema extraction.
4
+ * After the server bundle is produced, boots a DirectClient via connect(),
5
+ * extracts tool/resource/prompt schemas, and serializes them for CLI code generation.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.SYSTEM_TOOL_NAMES = void 0;
9
+ exports.extractSchemas = extractSchemas;
10
+ /** Known system tool names injected by SDK features (skills, jobs, workflows). */
11
+ exports.SYSTEM_TOOL_NAMES = new Set([
12
+ 'searchSkills',
13
+ 'loadSkills',
14
+ 'list-jobs',
15
+ 'execute-job',
16
+ 'get-job-status',
17
+ 'register-job',
18
+ 'remove-job',
19
+ 'list-workflows',
20
+ 'execute-workflow',
21
+ 'get-workflow-status',
22
+ 'register-workflow',
23
+ 'remove-workflow',
24
+ ]);
25
+ /**
26
+ * Extract schemas from a compiled server bundle.
27
+ * Requires the bundle to export a FrontMcp-decorated class as default export
28
+ * or a config object usable by connect().
29
+ */
30
+ async function extractSchemas(bundlePath) {
31
+ // Suppress @FrontMcp() decorator bootstrap — we only need metadata, not a running server
32
+ const prev = process.env['FRONTMCP_SCHEMA_EXTRACT'];
33
+ process.env['FRONTMCP_SCHEMA_EXTRACT'] = '1';
34
+ let mod;
35
+ try {
36
+ mod = require(bundlePath);
37
+ }
38
+ finally {
39
+ if (prev === undefined) {
40
+ delete process.env['FRONTMCP_SCHEMA_EXTRACT'];
41
+ }
42
+ else {
43
+ process.env['FRONTMCP_SCHEMA_EXTRACT'] = prev;
44
+ }
45
+ }
46
+ const configOrClass = mod.default || mod;
47
+ // Use @frontmcp/sdk connect() to boot in-memory client
48
+ let connect;
49
+ try {
50
+ const sdk = require('@frontmcp/sdk');
51
+ connect = sdk.connect || sdk.direct?.connect;
52
+ if (!connect) {
53
+ throw new Error('connect() not found in @frontmcp/sdk');
54
+ }
55
+ }
56
+ catch {
57
+ throw new Error('@frontmcp/sdk is required for CLI schema extraction. Ensure it is installed.');
58
+ }
59
+ const client = await connect(configOrClass, { mode: 'cli' });
60
+ try {
61
+ const [toolsRaw, resourcesResult, promptsResult] = await Promise.all([
62
+ client.listTools().catch(() => []),
63
+ client.listResources().catch(() => ({ resources: [] })),
64
+ client.listPrompts().catch(() => ({ prompts: [] })),
65
+ ]);
66
+ let resourceTemplates = [];
67
+ if (client.listResourceTemplates) {
68
+ try {
69
+ const templatesResult = await client.listResourceTemplates();
70
+ resourceTemplates = (templatesResult.resourceTemplates || []).map((t) => ({
71
+ uriTemplate: t.uriTemplate,
72
+ name: t.name || t.uriTemplate,
73
+ description: t.description,
74
+ }));
75
+ }
76
+ catch {
77
+ // Resource templates not supported
78
+ }
79
+ }
80
+ // DirectClient.listTools() returns FormattedTools (array) directly,
81
+ // not { tools: [...] } like the raw MCP client
82
+ const toolsList = Array.isArray(toolsRaw)
83
+ ? toolsRaw
84
+ : (toolsRaw?.tools || []);
85
+ const tools = toolsList.map((t) => ({
86
+ name: t.name,
87
+ description: t.description || '',
88
+ inputSchema: t.inputSchema || { type: 'object', properties: {} },
89
+ }));
90
+ const resources = (resourcesResult.resources || []).map((r) => ({
91
+ uri: r.uri,
92
+ name: r.name || r.uri,
93
+ description: r.description,
94
+ mimeType: r.mimeType,
95
+ }));
96
+ const prompts = (promptsResult.prompts || []).map((p) => ({
97
+ name: p.name,
98
+ description: p.description,
99
+ arguments: p.arguments,
100
+ }));
101
+ const toolNameSet = new Set(tools.map((t) => t.name));
102
+ const capabilities = {
103
+ skills: toolNameSet.has('searchSkills') || toolNameSet.has('loadSkills'),
104
+ jobs: toolNameSet.has('execute-job') || toolNameSet.has('get-job-status'),
105
+ workflows: toolNameSet.has('execute-workflow') || toolNameSet.has('get-workflow-status'),
106
+ };
107
+ // Extract job schemas if jobs capability is available
108
+ let jobs = [];
109
+ if (capabilities.jobs && client.listJobs) {
110
+ try {
111
+ const jobsResult = await client.listJobs();
112
+ jobs = (jobsResult.jobs || []).map((j) => ({
113
+ name: j.name,
114
+ description: j.description,
115
+ inputSchema: j.inputSchema,
116
+ tags: j.tags,
117
+ }));
118
+ }
119
+ catch {
120
+ // Jobs listing not available at build time
121
+ }
122
+ }
123
+ return { tools, resources, resourceTemplates, prompts, jobs, capabilities };
124
+ }
125
+ finally {
126
+ await client.close().catch(() => { });
127
+ }
128
+ }
129
+ //# sourceMappingURL=schema-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-extractor.js","sourceRoot":"","sources":["../../../../../../src/commands/build/exec/cli-runtime/schema-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Build-time schema extraction.\n * After the server bundle is produced, boots a DirectClient via connect(),\n * extracts tool/resource/prompt schemas, and serializes them for CLI code generation.\n */\n\nexport interface ExtractedTool {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport interface ExtractedResource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface ExtractedResourceTemplate {\n uriTemplate: string;\n name: string;\n description?: string;\n}\n\nexport interface ExtractedPrompt {\n name: string;\n description?: string;\n arguments?: Array<{\n name: string;\n description?: string;\n required?: boolean;\n }>;\n}\n\nexport interface ExtractedJob {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n tags?: string[];\n}\n\nexport interface ExtractedCapabilities {\n skills: boolean;\n jobs: boolean;\n workflows: boolean;\n}\n\nexport interface ExtractedSchema {\n tools: ExtractedTool[];\n resources: ExtractedResource[];\n resourceTemplates: ExtractedResourceTemplate[];\n prompts: ExtractedPrompt[];\n jobs: ExtractedJob[];\n capabilities: ExtractedCapabilities;\n}\n\n/** Known system tool names injected by SDK features (skills, jobs, workflows). */\nexport const SYSTEM_TOOL_NAMES = new Set([\n 'searchSkills',\n 'loadSkills',\n 'list-jobs',\n 'execute-job',\n 'get-job-status',\n 'register-job',\n 'remove-job',\n 'list-workflows',\n 'execute-workflow',\n 'get-workflow-status',\n 'register-workflow',\n 'remove-workflow',\n]);\n\n/**\n * Extract schemas from a compiled server bundle.\n * Requires the bundle to export a FrontMcp-decorated class as default export\n * or a config object usable by connect().\n */\nexport async function extractSchemas(bundlePath: string): Promise<ExtractedSchema> {\n // Suppress @FrontMcp() decorator bootstrap — we only need metadata, not a running server\n const prev = process.env['FRONTMCP_SCHEMA_EXTRACT'];\n process.env['FRONTMCP_SCHEMA_EXTRACT'] = '1';\n\n let mod: Record<string, unknown>;\n try {\n mod = require(bundlePath);\n } finally {\n if (prev === undefined) {\n delete process.env['FRONTMCP_SCHEMA_EXTRACT'];\n } else {\n process.env['FRONTMCP_SCHEMA_EXTRACT'] = prev;\n }\n }\n\n const configOrClass = mod.default || mod;\n\n // Use @frontmcp/sdk connect() to boot in-memory client\n let connect: (config: unknown, options?: { mode?: string }) => Promise<unknown>;\n try {\n const sdk = require('@frontmcp/sdk');\n connect = sdk.connect || sdk.direct?.connect;\n if (!connect) {\n throw new Error('connect() not found in @frontmcp/sdk');\n }\n } catch {\n throw new Error(\n '@frontmcp/sdk is required for CLI schema extraction. Ensure it is installed.',\n );\n }\n\n const client = await connect(configOrClass, { mode: 'cli' }) as {\n listTools(): Promise<unknown>;\n listResources(): Promise<{ resources: Array<{ uri: string; name?: string; description?: string; mimeType?: string }> }>;\n listResourceTemplates?(): Promise<{ resourceTemplates: Array<{ uriTemplate: string; name?: string; description?: string }> }>;\n listPrompts(): Promise<{ prompts: Array<{ name: string; description?: string; arguments?: unknown[] }> }>;\n listJobs?(): Promise<{ jobs: Array<{ name: string; description?: string; inputSchema?: Record<string, unknown>; tags?: string[] }>; count: number }>;\n close(): Promise<void>;\n };\n\n try {\n const [toolsRaw, resourcesResult, promptsResult] = await Promise.all([\n client.listTools().catch(() => []),\n client.listResources().catch(() => ({ resources: [] })),\n client.listPrompts().catch(() => ({ prompts: [] })),\n ]);\n\n let resourceTemplates: ExtractedResourceTemplate[] = [];\n if (client.listResourceTemplates) {\n try {\n const templatesResult = await client.listResourceTemplates();\n resourceTemplates = (templatesResult.resourceTemplates || []).map((t) => ({\n uriTemplate: t.uriTemplate,\n name: t.name || t.uriTemplate,\n description: t.description,\n }));\n } catch {\n // Resource templates not supported\n }\n }\n\n // DirectClient.listTools() returns FormattedTools (array) directly,\n // not { tools: [...] } like the raw MCP client\n const toolsList = Array.isArray(toolsRaw)\n ? toolsRaw as Array<{ name: string; description?: string; inputSchema?: unknown }>\n : ((toolsRaw as { tools?: unknown[] })?.tools || []) as Array<{ name: string; description?: string; inputSchema?: unknown }>;\n\n const tools: ExtractedTool[] = toolsList.map((t) => ({\n name: t.name,\n description: t.description || '',\n inputSchema: (t.inputSchema as Record<string, unknown>) || { type: 'object', properties: {} },\n }));\n\n const resources: ExtractedResource[] = (resourcesResult.resources || []).map((r) => ({\n uri: r.uri,\n name: r.name || r.uri,\n description: r.description,\n mimeType: r.mimeType,\n }));\n\n const prompts: ExtractedPrompt[] = (promptsResult.prompts || []).map((p) => ({\n name: p.name,\n description: p.description,\n arguments: p.arguments as ExtractedPrompt['arguments'],\n }));\n\n const toolNameSet = new Set(tools.map((t) => t.name));\n const capabilities: ExtractedCapabilities = {\n skills: toolNameSet.has('searchSkills') || toolNameSet.has('loadSkills'),\n jobs: toolNameSet.has('execute-job') || toolNameSet.has('get-job-status'),\n workflows: toolNameSet.has('execute-workflow') || toolNameSet.has('get-workflow-status'),\n };\n\n // Extract job schemas if jobs capability is available\n let jobs: ExtractedJob[] = [];\n if (capabilities.jobs && client.listJobs) {\n try {\n const jobsResult = await client.listJobs();\n jobs = (jobsResult.jobs || []).map((j) => ({\n name: j.name,\n description: j.description,\n inputSchema: j.inputSchema,\n tags: j.tags,\n }));\n } catch {\n // Jobs listing not available at build time\n }\n }\n\n return { tools, resources, resourceTemplates, prompts, jobs, capabilities };\n } finally {\n await client.close().catch(() => {});\n }\n}\n"]}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Converts JSON Schema properties to commander.js option definitions.
3
+ * Used at code-generation time (not runtime) to map MCP tool input schemas
4
+ * to CLI option strings that commander can parse.
5
+ */
6
+ export interface CommanderOption {
7
+ /** commander flags string, e.g. '--name <value>' */
8
+ flags: string;
9
+ /** description from JSON Schema */
10
+ description: string;
11
+ /** whether this is a required option */
12
+ required: boolean;
13
+ /** for enum types, the allowed choices */
14
+ choices?: string[];
15
+ /** default value if specified in schema */
16
+ defaultValue?: unknown;
17
+ /** coercion function name: 'parseInt', 'parseFloat', or undefined */
18
+ coercion?: 'parseInt' | 'parseFloat';
19
+ /** whether this is a variadic (array) option */
20
+ variadic: boolean;
21
+ }
22
+ export interface SchemaToCommanderResult {
23
+ options: CommanderOption[];
24
+ /** property names that couldn't be mapped */
25
+ skipped: string[];
26
+ }
27
+ /**
28
+ * Convert a JSON Schema `properties` object into commander option definitions.
29
+ */
30
+ export declare function schemaToCommander(schema: Record<string, unknown>): SchemaToCommanderResult;
31
+ /**
32
+ * Convert camelCase or PascalCase to kebab-case.
33
+ */
34
+ export declare function camelToKebab(str: string): string;
35
+ /**
36
+ * Generate commander option code string for embedding in generated CLI entry.
37
+ */
38
+ export declare function generateOptionCode(opt: CommanderOption): string;
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ /**
3
+ * Converts JSON Schema properties to commander.js option definitions.
4
+ * Used at code-generation time (not runtime) to map MCP tool input schemas
5
+ * to CLI option strings that commander can parse.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.schemaToCommander = schemaToCommander;
9
+ exports.camelToKebab = camelToKebab;
10
+ exports.generateOptionCode = generateOptionCode;
11
+ /**
12
+ * Convert a JSON Schema `properties` object into commander option definitions.
13
+ */
14
+ function schemaToCommander(schema) {
15
+ const properties = (schema.properties || {});
16
+ const required = new Set(Array.isArray(schema.required) ? schema.required : []);
17
+ const options = [];
18
+ const skipped = [];
19
+ for (const [propName, propSchema] of Object.entries(properties)) {
20
+ const opt = propertyToOption(propName, propSchema, required.has(propName));
21
+ if (opt) {
22
+ options.push(opt);
23
+ }
24
+ else {
25
+ skipped.push(propName);
26
+ }
27
+ }
28
+ return { options, skipped };
29
+ }
30
+ function propertyToOption(name, schema, isRequired) {
31
+ const kebab = camelToKebab(name);
32
+ const description = schema.description || '';
33
+ const defaultValue = schema.default;
34
+ const enumValues = schema.enum;
35
+ // Resolve type — handle array types like ["string", "null"]
36
+ let type = schema.type;
37
+ if (Array.isArray(type)) {
38
+ type = type.find((t) => t !== 'null') || type[0];
39
+ }
40
+ // Handle enum — always treat as string choices
41
+ if (enumValues && Array.isArray(enumValues)) {
42
+ return {
43
+ flags: `--${kebab} <value>`,
44
+ description,
45
+ required: isRequired,
46
+ choices: enumValues.map(String),
47
+ defaultValue,
48
+ variadic: false,
49
+ };
50
+ }
51
+ switch (type) {
52
+ case 'string':
53
+ return {
54
+ flags: `--${kebab} <value>`,
55
+ description,
56
+ required: isRequired,
57
+ defaultValue,
58
+ variadic: false,
59
+ };
60
+ case 'number':
61
+ return {
62
+ flags: `--${kebab} <number>`,
63
+ description,
64
+ required: isRequired,
65
+ defaultValue,
66
+ coercion: 'parseFloat',
67
+ variadic: false,
68
+ };
69
+ case 'integer':
70
+ return {
71
+ flags: `--${kebab} <number>`,
72
+ description,
73
+ required: isRequired,
74
+ defaultValue,
75
+ coercion: 'parseInt',
76
+ variadic: false,
77
+ };
78
+ case 'boolean':
79
+ return {
80
+ flags: `--${kebab}`,
81
+ description,
82
+ required: false, // boolean flags are never "required" in commander sense
83
+ defaultValue: defaultValue ?? false,
84
+ variadic: false,
85
+ };
86
+ case 'array': {
87
+ const itemType = schema.items?.type;
88
+ const coercion = itemType === 'number'
89
+ ? 'parseFloat'
90
+ : itemType === 'integer'
91
+ ? 'parseInt'
92
+ : undefined;
93
+ return {
94
+ flags: `--${kebab} <items...>`,
95
+ description,
96
+ required: isRequired,
97
+ defaultValue,
98
+ coercion,
99
+ variadic: true,
100
+ };
101
+ }
102
+ case 'object':
103
+ // Complex objects: accept as JSON string
104
+ return {
105
+ flags: `--${kebab} <json>`,
106
+ description: description ? `${description} (JSON string)` : '(JSON string)',
107
+ required: isRequired,
108
+ defaultValue,
109
+ variadic: false,
110
+ };
111
+ default:
112
+ // Unknown type — skip
113
+ return null;
114
+ }
115
+ }
116
+ /**
117
+ * Convert camelCase or PascalCase to kebab-case.
118
+ */
119
+ function camelToKebab(str) {
120
+ return str
121
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
122
+ .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')
123
+ .toLowerCase();
124
+ }
125
+ /**
126
+ * Generate commander option code string for embedding in generated CLI entry.
127
+ */
128
+ function generateOptionCode(opt) {
129
+ // When choices are present, use addOption(new Option(...).choices([...])) pattern
130
+ // because .choices() is a method on Option, not on Command
131
+ if (opt.choices) {
132
+ const parts = [];
133
+ parts.push(`.addOption(new Option('${opt.flags}', '${escapeStr(opt.description)}')`);
134
+ if (opt.coercion === 'parseInt') {
135
+ parts.push(`.argParser((v) => parseInt(v, 10))`);
136
+ }
137
+ else if (opt.coercion === 'parseFloat') {
138
+ parts.push(`.argParser((v) => parseFloat(v))`);
139
+ }
140
+ if (opt.defaultValue !== undefined && !opt.required) {
141
+ parts.push(`.default(${JSON.stringify(opt.defaultValue)})`);
142
+ }
143
+ if (opt.required) {
144
+ parts.push(`.makeOptionMandatory()`);
145
+ }
146
+ parts.push(`.choices(${JSON.stringify(opt.choices)})`);
147
+ parts.push(')');
148
+ return parts.join('');
149
+ }
150
+ const parts = [];
151
+ if (opt.required) {
152
+ parts.push(`.requiredOption('${opt.flags}', '${escapeStr(opt.description)}'`);
153
+ }
154
+ else {
155
+ parts.push(`.option('${opt.flags}', '${escapeStr(opt.description)}'`);
156
+ }
157
+ if (opt.coercion === 'parseInt') {
158
+ parts.push(`, (v) => parseInt(v, 10)`);
159
+ }
160
+ else if (opt.coercion === 'parseFloat') {
161
+ parts.push(`, (v) => parseFloat(v)`);
162
+ }
163
+ if (opt.defaultValue !== undefined && !opt.required) {
164
+ parts.push(`, ${JSON.stringify(opt.defaultValue)}`);
165
+ }
166
+ parts.push(')');
167
+ return parts.join('');
168
+ }
169
+ function escapeStr(s) {
170
+ return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
171
+ }
172
+ //# sourceMappingURL=schema-to-commander.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-to-commander.js","sourceRoot":"","sources":["../../../../../../src/commands/build/exec/cli-runtime/schema-to-commander.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Converts JSON Schema properties to commander.js option definitions.\n * Used at code-generation time (not runtime) to map MCP tool input schemas\n * to CLI option strings that commander can parse.\n */\n\nexport interface CommanderOption {\n /** commander flags string, e.g. '--name <value>' */\n flags: string;\n /** description from JSON Schema */\n description: string;\n /** whether this is a required option */\n required: boolean;\n /** for enum types, the allowed choices */\n choices?: string[];\n /** default value if specified in schema */\n defaultValue?: unknown;\n /** coercion function name: 'parseInt', 'parseFloat', or undefined */\n coercion?: 'parseInt' | 'parseFloat';\n /** whether this is a variadic (array) option */\n variadic: boolean;\n}\n\nexport interface SchemaToCommanderResult {\n options: CommanderOption[];\n /** property names that couldn't be mapped */\n skipped: string[];\n}\n\n/**\n * Convert a JSON Schema `properties` object into commander option definitions.\n */\nexport function schemaToCommander(\n schema: Record<string, unknown>,\n): SchemaToCommanderResult {\n const properties = (schema.properties || {}) as Record<string, Record<string, unknown>>;\n const required = new Set<string>(\n Array.isArray(schema.required) ? (schema.required as string[]) : [],\n );\n\n const options: CommanderOption[] = [];\n const skipped: string[] = [];\n\n for (const [propName, propSchema] of Object.entries(properties)) {\n const opt = propertyToOption(propName, propSchema, required.has(propName));\n if (opt) {\n options.push(opt);\n } else {\n skipped.push(propName);\n }\n }\n\n return { options, skipped };\n}\n\nfunction propertyToOption(\n name: string,\n schema: Record<string, unknown>,\n isRequired: boolean,\n): CommanderOption | null {\n const kebab = camelToKebab(name);\n const description = (schema.description as string) || '';\n const defaultValue = schema.default;\n const enumValues = schema.enum as string[] | undefined;\n\n // Resolve type — handle array types like [\"string\", \"null\"]\n let type = schema.type as string | string[] | undefined;\n if (Array.isArray(type)) {\n type = type.find((t) => t !== 'null') || type[0];\n }\n\n // Handle enum — always treat as string choices\n if (enumValues && Array.isArray(enumValues)) {\n return {\n flags: `--${kebab} <value>`,\n description,\n required: isRequired,\n choices: enumValues.map(String),\n defaultValue,\n variadic: false,\n };\n }\n\n switch (type) {\n case 'string':\n return {\n flags: `--${kebab} <value>`,\n description,\n required: isRequired,\n defaultValue,\n variadic: false,\n };\n\n case 'number':\n return {\n flags: `--${kebab} <number>`,\n description,\n required: isRequired,\n defaultValue,\n coercion: 'parseFloat',\n variadic: false,\n };\n\n case 'integer':\n return {\n flags: `--${kebab} <number>`,\n description,\n required: isRequired,\n defaultValue,\n coercion: 'parseInt',\n variadic: false,\n };\n\n case 'boolean':\n return {\n flags: `--${kebab}`,\n description,\n required: false, // boolean flags are never \"required\" in commander sense\n defaultValue: defaultValue ?? false,\n variadic: false,\n };\n\n case 'array': {\n const itemType = (schema.items as Record<string, unknown>)?.type;\n const coercion = itemType === 'number'\n ? 'parseFloat' as const\n : itemType === 'integer'\n ? 'parseInt' as const\n : undefined;\n return {\n flags: `--${kebab} <items...>`,\n description,\n required: isRequired,\n defaultValue,\n coercion,\n variadic: true,\n };\n }\n\n case 'object':\n // Complex objects: accept as JSON string\n return {\n flags: `--${kebab} <json>`,\n description: description ? `${description} (JSON string)` : '(JSON string)',\n required: isRequired,\n defaultValue,\n variadic: false,\n };\n\n default:\n // Unknown type — skip\n return null;\n }\n}\n\n/**\n * Convert camelCase or PascalCase to kebab-case.\n */\nexport function camelToKebab(str: string): string {\n return str\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase();\n}\n\n/**\n * Generate commander option code string for embedding in generated CLI entry.\n */\nexport function generateOptionCode(opt: CommanderOption): string {\n // When choices are present, use addOption(new Option(...).choices([...])) pattern\n // because .choices() is a method on Option, not on Command\n if (opt.choices) {\n const parts: string[] = [];\n parts.push(`.addOption(new Option('${opt.flags}', '${escapeStr(opt.description)}')`);\n\n if (opt.coercion === 'parseInt') {\n parts.push(`.argParser((v) => parseInt(v, 10))`);\n } else if (opt.coercion === 'parseFloat') {\n parts.push(`.argParser((v) => parseFloat(v))`);\n }\n\n if (opt.defaultValue !== undefined && !opt.required) {\n parts.push(`.default(${JSON.stringify(opt.defaultValue)})`);\n }\n\n if (opt.required) {\n parts.push(`.makeOptionMandatory()`);\n }\n\n parts.push(`.choices(${JSON.stringify(opt.choices)})`);\n parts.push(')');\n return parts.join('');\n }\n\n const parts: string[] = [];\n\n if (opt.required) {\n parts.push(`.requiredOption('${opt.flags}', '${escapeStr(opt.description)}'`);\n } else {\n parts.push(`.option('${opt.flags}', '${escapeStr(opt.description)}'`);\n }\n\n if (opt.coercion === 'parseInt') {\n parts.push(`, (v) => parseInt(v, 10)`);\n } else if (opt.coercion === 'parseFloat') {\n parts.push(`, (v) => parseFloat(v)`);\n }\n\n if (opt.defaultValue !== undefined && !opt.required) {\n parts.push(`, ${JSON.stringify(opt.defaultValue)}`);\n }\n\n parts.push(')');\n\n return parts.join('');\n}\n\nfunction escapeStr(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n"]}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Session manager for CLI executables.
3
+ * Generates runtime module code for managing named sessions
4
+ * stored in ~/.frontmcp/apps/{appName}/sessions/.
5
+ */
6
+ export interface SessionInfo {
7
+ name: string;
8
+ user?: string;
9
+ createdAt: string;
10
+ lastUsedAt: string;
11
+ isActive: boolean;
12
+ }
13
+ /**
14
+ * Generate the session-manager runtime module source for embedding in CLI bundle.
15
+ */
16
+ export declare function generateSessionManagerSource(appName: string): string;