@fnet/cli 0.133.0 → 0.133.1

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 (182) hide show
  1. package/dist/fbin/index.js +14 -1
  2. package/dist/fnet/index.0jcm9pn5.js +1 -0
  3. package/dist/fnet/index.2084z2ed.js +2 -0
  4. package/dist/fnet/index.33f1ggpr.js +1 -0
  5. package/dist/fnet/index.3exge2js.js +1 -0
  6. package/dist/fnet/index.3kfx538h.js +1 -0
  7. package/dist/fnet/index.490y87nc.js +1 -0
  8. package/dist/fnet/index.4g9yezkq.js +1 -0
  9. package/dist/fnet/index.4jkat7r4.js +1 -0
  10. package/dist/fnet/index.7crx8ky1.js +1 -0
  11. package/dist/fnet/index.7vw06nrn.js +1 -0
  12. package/dist/fnet/index.9567fa9x.js +1 -0
  13. package/dist/fnet/index.gh75wt1m.js +1 -0
  14. package/dist/fnet/index.hzsfswvp.js +1 -0
  15. package/dist/fnet/index.jgpc3grc.js +1 -0
  16. package/dist/fnet/index.js +19 -1
  17. package/dist/fnet/index.p0zb7e1b.js +1 -0
  18. package/dist/fnet/index.r19p3bpa.js +2 -0
  19. package/dist/fnet/index.r82rtnmz.js +1 -0
  20. package/dist/fnet/index.s662t98v.js +1 -0
  21. package/dist/fnet/index.w74dpnpn.js +1 -0
  22. package/dist/fnet/index.xeaw5xa9.js +1 -0
  23. package/dist/fnet/index.zm4kesg6.js +1 -0
  24. package/dist/fnode/index.05n3mvs9.js +2 -0
  25. package/dist/fnode/index.2hc9tbyx.js +1 -0
  26. package/dist/fnode/index.2pnjg6dc.js +1 -0
  27. package/dist/fnode/index.9qgtmxq3.js +2 -0
  28. package/dist/fnode/index.b1q7y05p.js +1 -0
  29. package/dist/fnode/index.bhapgrs7.js +1 -0
  30. package/dist/fnode/index.cvxrf34y.js +2 -0
  31. package/dist/fnode/index.dp9wyahp.js +1 -0
  32. package/dist/fnode/index.eqxmcpdc.js +1 -0
  33. package/dist/fnode/index.f2tb0x3t.js +1 -0
  34. package/dist/fnode/index.fbzv6wwf.js +1 -0
  35. package/dist/fnode/index.gazd9raq.js +1 -0
  36. package/dist/fnode/index.hv4s25f0.js +3 -0
  37. package/dist/fnode/index.j5z7dtsx.js +1 -0
  38. package/dist/fnode/index.js +9 -1
  39. package/dist/fnode/index.kb4e4bxf.js +1 -0
  40. package/dist/fnode/index.qn0schqp.js +1 -0
  41. package/dist/fnode/index.rht29phd.js +1 -0
  42. package/dist/fnode/index.rzsfmek6.js +3 -0
  43. package/dist/fnode/index.s0nk6cv8.js +4 -0
  44. package/dist/fnode/index.s66v6wt4.js +1 -0
  45. package/dist/fnode/index.sv7v0y60.js +1 -0
  46. package/dist/fnode/index.tgkhgnrp.js +1 -0
  47. package/dist/fnode/index.vq706f75.js +1 -0
  48. package/dist/fnode/index.y8pvdcny.js +1 -0
  49. package/dist/fnode/index.z4vz93ww.js +1 -0
  50. package/dist/frun/index.js +1 -1
  51. package/dist/fservice/index.js +18 -1
  52. package/dist/fservice/index.q01yvaz0.js +2 -0
  53. package/package.json +21 -18
  54. package/readme.md +62 -15
  55. package/template/fnet/core/object.js +10 -10
  56. package/template/fnet/node/package.json.njk +6 -3
  57. package/template/fnet/node/src/cli/index.js.njk +5 -315
  58. package/template/fnet/node/src/cli/index.js.v1.njk +318 -0
  59. package/template/fnet/node/src/cli/v2/core/args-parser.njk +10 -0
  60. package/template/fnet/node/src/cli/v2/core/imports.njk +31 -0
  61. package/template/fnet/node/src/cli/v2/core/run-wrapper.njk +25 -0
  62. package/template/fnet/node/src/cli/v2/index.js.njk +184 -0
  63. package/template/fnet/node/src/cli/v2/modes/default/extend.njk +11 -0
  64. package/template/fnet/node/src/cli/v2/modes/default/standard.njk +20 -0
  65. package/template/fnet/node/src/cli/v2/modes/http/builtin.njk +66 -0
  66. package/template/fnet/node/src/cli/v2/modes/http/imports.njk +9 -0
  67. package/template/fnet/node/src/cli/v2/modes/http/index.njk +12 -0
  68. package/template/fnet/node/src/cli/v2/modes/mcp/imports.njk +33 -0
  69. package/template/fnet/node/src/cli/v2/modes/mcp/index.njk +30 -0
  70. package/template/fnet/node/src/cli/v2/modes/mcp/server-setup.njk +15 -0
  71. package/template/fnet/node/src/cli/v2/modes/mcp/tool-handlers.njk +46 -0
  72. package/template/fnet/node/src/cli/v2/modes/mcp/transport-http.njk +222 -0
  73. package/template/fnet/node/src/cli/v2/modes/mcp/transport-stdio.njk +9 -0
  74. package/template/fnet/node/src/cli/v2/modes/pipeline/imports.njk +9 -0
  75. package/template/fnet/node/src/cli/v2/modes/pipeline/index.njk +113 -0
  76. package/template/fnet/node/src/cli/v2/modes/webhook/imports.njk +9 -0
  77. package/template/fnet/node/src/cli/v2/modes/webhook/index.njk +127 -0
  78. package/template/fnet/node/src/cli/v2/modes/websocket/imports.njk +15 -0
  79. package/template/fnet/node/src/cli/v2/modes/websocket/index.njk +104 -0
  80. package/template/fnet/node/src/default/blocks/assign.js.njk +10 -48
  81. package/template/fnet/node/src/default/blocks/call.js.njk +110 -156
  82. package/template/fnet/node/src/default/blocks/for.js.njk +58 -74
  83. package/template/fnet/node/src/default/blocks/form.js.njk +21 -59
  84. package/template/fnet/node/src/default/blocks/http.js.njk +135 -0
  85. package/template/fnet/node/src/default/blocks/modules.js.njk +10 -52
  86. package/template/fnet/node/src/default/blocks/new.js.njk +40 -85
  87. package/template/fnet/node/src/default/blocks/next.js.njk +10 -32
  88. package/template/fnet/node/src/default/blocks/output.js.njk +10 -48
  89. package/template/fnet/node/src/default/blocks/parallel.js.njk +64 -0
  90. package/template/fnet/node/src/default/blocks/pipeline.js.njk +109 -0
  91. package/template/fnet/node/src/default/blocks/raise.js.njk +9 -25
  92. package/template/fnet/node/src/default/blocks/retry.js.njk +70 -0
  93. package/template/fnet/node/src/default/blocks/return.js.njk +13 -25
  94. package/template/fnet/node/src/default/blocks/schedule.js.njk +66 -0
  95. package/template/fnet/node/src/default/blocks/signal.js.njk +10 -32
  96. package/template/fnet/node/src/default/blocks/steps.js.njk +32 -48
  97. package/template/fnet/node/src/default/blocks/switch.js.njk +37 -67
  98. package/template/fnet/node/src/default/blocks/tryexcept.js.njk +58 -52
  99. package/template/fnet/node/src/default/blocks/wait.js.njk +10 -30
  100. package/template/fnet/node/src/default/input.args.js.njk +5 -2
  101. package/template/fnet/node/src/default/macros/block-body-header.js.njk +1 -1
  102. package/template/fnet/node/src/default/macros/block-header.js.njk +0 -3
  103. package/template/fnet/node/src/default/macros/block-next.js.njk +1 -1
  104. package/template/fnet/node/src/default/macros/block-run-footer.js.njk +1 -1
  105. package/template/fnet/node/src/default/macros/block-run-header.js.njk +14 -2
  106. package/template/fnet/node/src/default/macros/page.js.njk +1 -1
  107. package/template/fnet/node/src/default/types/block.js.njk +133 -0
  108. package/template/fnet/node/src/default/workflow.js.njk +8 -6
  109. package/template/fnode/node/package.json.njk +5 -4
  110. package/template/fnode/node/src/cli/index.js.njk +3 -397
  111. package/template/fnode/node/src/cli/index.js.v1.njk +464 -0
  112. package/template/fnode/node/src/cli/v2/core/args-parser.njk +10 -0
  113. package/template/fnode/node/src/cli/v2/core/imports.njk +29 -0
  114. package/template/fnode/node/src/cli/v2/core/run-wrapper.njk +25 -0
  115. package/template/fnode/node/src/cli/v2/index.js.njk +184 -0
  116. package/template/fnode/node/src/cli/v2/modes/default/extend.njk +11 -0
  117. package/template/fnode/node/src/cli/v2/modes/default/standard.njk +19 -0
  118. package/template/fnode/node/src/cli/v2/modes/http/builtin.njk +61 -0
  119. package/template/fnode/node/src/cli/v2/modes/http/imports.njk +9 -0
  120. package/template/fnode/node/src/cli/v2/modes/http/index.njk +12 -0
  121. package/template/fnode/node/src/cli/v2/modes/mcp/imports.njk +33 -0
  122. package/template/fnode/node/src/cli/v2/modes/mcp/index.njk +30 -0
  123. package/template/fnode/node/src/cli/v2/modes/mcp/server-setup.njk +15 -0
  124. package/template/fnode/node/src/cli/v2/modes/mcp/tool-handlers.njk +41 -0
  125. package/template/fnode/node/src/cli/v2/modes/mcp/transport-http.njk +212 -0
  126. package/template/fnode/node/src/cli/v2/modes/mcp/transport-stdio.njk +9 -0
  127. package/template/fnode/node/src/cli/v2/modes/pipeline/imports.njk +9 -0
  128. package/template/fnode/node/src/cli/v2/modes/pipeline/index.njk +103 -0
  129. package/template/fnode/node/src/cli/v2/modes/webhook/imports.njk +9 -0
  130. package/template/fnode/node/src/cli/v2/modes/webhook/index.njk +122 -0
  131. package/template/fnode/node/src/cli/v2/modes/websocket/imports.njk +15 -0
  132. package/template/fnode/node/src/cli/v2/modes/websocket/index.njk +99 -0
  133. package/template/fnode/node/src/default/input.args.js.njk +6 -2
  134. package/dist/fnet/index.-SGbq2cI.js +0 -1
  135. package/dist/fnet/index.B5XE4ChJ.js +0 -1
  136. package/dist/fnet/index.Bft2w7m3.js +0 -1
  137. package/dist/fnet/index.BuYxdKtK.js +0 -1
  138. package/dist/fnet/index.C0YpfQ5j.js +0 -1
  139. package/dist/fnet/index.C2S9JYhS.js +0 -1
  140. package/dist/fnet/index.C7saWH6d.js +0 -1
  141. package/dist/fnet/index.CDct_kkF.js +0 -1
  142. package/dist/fnet/index.CMC8mlye.js +0 -1
  143. package/dist/fnet/index.CmMM-Ek9.js +0 -1
  144. package/dist/fnet/index.CuMyez3E.js +0 -1
  145. package/dist/fnet/index.CzAV0S36.js +0 -1
  146. package/dist/fnet/index.D2N9YZmA.js +0 -1
  147. package/dist/fnet/index.D3p7pncT.js +0 -1
  148. package/dist/fnet/index.DG8TqL-1.js +0 -1
  149. package/dist/fnet/index.DI3yyTtl.js +0 -1
  150. package/dist/fnet/index.DOYkqsYT.js +0 -1
  151. package/dist/fnet/index.DWpw12No.js +0 -1
  152. package/dist/fnet/index.DrwlOzAe.js +0 -1
  153. package/dist/fnet/index.Q-CYRcna.js +0 -1
  154. package/dist/fnet/index.W6RYgypK.js +0 -1
  155. package/dist/fnet/index.xd8c7XMr.js +0 -1
  156. package/dist/fnode/index.-SGbq2cI.js +0 -1
  157. package/dist/fnode/index.B5XE4ChJ.js +0 -1
  158. package/dist/fnode/index.B8gal9up.js +0 -1
  159. package/dist/fnode/index.BU1440aO.js +0 -1
  160. package/dist/fnode/index.BcGYSPne.js +0 -1
  161. package/dist/fnode/index.Bft2w7m3.js +0 -1
  162. package/dist/fnode/index.BuYxdKtK.js +0 -1
  163. package/dist/fnode/index.C2S9JYhS.js +0 -1
  164. package/dist/fnode/index.C7saWH6d.js +0 -1
  165. package/dist/fnode/index.CDct_kkF.js +0 -1
  166. package/dist/fnode/index.CMC8mlye.js +0 -1
  167. package/dist/fnode/index.CmMM-Ek9.js +0 -1
  168. package/dist/fnode/index.CuMyez3E.js +0 -1
  169. package/dist/fnode/index.CzAV0S36.js +0 -1
  170. package/dist/fnode/index.D2N9YZmA.js +0 -1
  171. package/dist/fnode/index.D3p7pncT.js +0 -1
  172. package/dist/fnode/index.DG8TqL-1.js +0 -1
  173. package/dist/fnode/index.DI3yyTtl.js +0 -1
  174. package/dist/fnode/index.DWpw12No.js +0 -1
  175. package/dist/fnode/index.DrwlOzAe.js +0 -1
  176. package/dist/fnode/index.N_a5FdgA.js +0 -1
  177. package/dist/fnode/index.Q-CYRcna.js +0 -1
  178. package/dist/fnode/index.UNoFg95r.js +0 -1
  179. package/dist/fnode/index.W6RYgypK.js +0 -1
  180. package/dist/fnode/index.xd8c7XMr.js +0 -1
  181. package/template/fnet/core/print.js +0 -1
  182. package/template/fnet/node/src/default/macros/workflow-header.js.njk +0 -7
@@ -0,0 +1,464 @@
1
+ {# ============================================================================
2
+ CLI TEMPLATE - NUNJUCKS MACROS & CODE GENERATION
3
+ ============================================================================
4
+
5
+ This template generates CLI code for fnode projects with support for:
6
+ - Default CLI mode (standard command-line execution)
7
+ - MCP mode (Model Context Protocol server)
8
+ - HTTP mode (REST API server)
9
+
10
+ The template is conditional based on fnode.yaml features configuration.
11
+ ============================================================================ #}
12
+
13
+ {% if atom.doc.features.cli.enabled===true %}
14
+
15
+ {# ============================================================================
16
+ MACRO: importMcpDependencies
17
+ ============================================================================
18
+ Imports MCP SDK dependencies for both ESM and CJS formats
19
+ ============================================================================ #}
20
+ {% macro importMcpDependencies(format) %}
21
+ {% if format === 'esm' %}
22
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
23
+ import { ListToolsRequestSchema, CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js";
24
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
25
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
26
+ import express from "express";
27
+ {% else %}
28
+ const { Server } = require("@modelcontextprotocol/sdk/server/index.js");
29
+ const { ListToolsRequestSchema, CallToolRequestSchema } = require("@modelcontextprotocol/sdk/types.js");
30
+ const { StdioServerTransport } = require("@modelcontextprotocol/sdk/server/stdio.js");
31
+ const { StreamableHTTPServerTransport } = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
32
+ const express = require("express");
33
+ {% endif %}
34
+ {% endmacro %}
35
+
36
+ {% macro mcpModeCode(nodeFn) %}
37
+ if (cliMode === 'mcp') {
38
+ // MCP mode code
39
+ const server = new Server({
40
+ name: "{{atom.doc.features.cli.mcp.name or atom.doc.name}}",
41
+ version: "{{atom.doc.version or '0.0.1'}}"
42
+ }, {
43
+ capabilities: {
44
+ tools: {}
45
+ }
46
+ });
47
+
48
+ // Define available tools
49
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
50
+ return {
51
+ tools: [{
52
+ name: "{{atom.doc.features.cli.mcp.tool.name or atom.doc.name}}",
53
+ description: "{{atom.doc.features.cli.mcp.tool.description or atom.doc.description}}",
54
+ inputSchema: inputSchema
55
+ }]
56
+ };
57
+ });
58
+
59
+ // Handle tool execution
60
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
61
+ if (request.params.name === "{{atom.doc.features.cli.mcp.tool.name or atom.doc.name}}") {
62
+ try {
63
+ const result = await {{ nodeFn }}(request.params.arguments);
64
+ return {
65
+ content: [{
66
+ type: "text",
67
+ text: JSON.stringify(result)
68
+ }]
69
+ };
70
+ } catch (error) {
71
+ return {
72
+ content: [{
73
+ type: "text",
74
+ text: `Error: ${error.message}`
75
+ }],
76
+ isError: true
77
+ };
78
+ }
79
+ }
80
+ throw new Error("Tool not found");
81
+ });
82
+
83
+ // Get transport type from arguments
84
+ const transportType = args['mcp-transport'] || args.mcp_transport || 'stdio';
85
+ let transport;
86
+
87
+ if (transportType === 'stdio') {
88
+ // Use stdio transport
89
+ transport = new StdioServerTransport();
90
+ } else if (transportType === 'http') {
91
+ // Use Streamable HTTP transport (official transport as of MCP 2025-03-26)
92
+ const app = express();
93
+ app.use(express.json());
94
+
95
+ const port = args['cli-port'] || args.cli_port || 3000;
96
+ const host = args['cli-host'] || args.cli_host || '0.0.0.0';
97
+ const mcpEndpoint = '/mcp';
98
+ const verbose = args['cli-verbose'] || args.cli_verbose || false;
99
+
100
+ // Verbose logging helper
101
+ const log = (...args) => {
102
+ if (verbose) {
103
+ console.log('[MCP]', new Date().toISOString(), ...args);
104
+ }
105
+ };
106
+
107
+ // Map to store transports by session ID
108
+ const transports = {};
109
+
110
+ // Handle POST requests for client-to-server communication
111
+ app.post(mcpEndpoint, async (req, res) => {
112
+ // Check for existing session ID
113
+ const sessionId = req.get('Mcp-Session-Id');
114
+
115
+ log('POST request received');
116
+ log('Session ID:', sessionId || 'none');
117
+ log('Request body:', JSON.stringify(req.body, null, 2));
118
+
119
+ let transport;
120
+
121
+ if (sessionId && transports[sessionId]) {
122
+ // Reuse existing transport
123
+ log('Reusing existing transport for session:', sessionId);
124
+ transport = transports[sessionId];
125
+ } else if (!sessionId && req.body && (req.body.method === 'initialize' ||
126
+ (Array.isArray(req.body) && req.body.some(item => item.method === 'initialize')))) {
127
+ // New initialization request
128
+ log('Creating new transport for initialization');
129
+ transport = new StreamableHTTPServerTransport({
130
+ sessionIdGenerator: () => {
131
+ // Generate cryptographically secure session ID
132
+ return require('crypto').randomBytes(16).toString('hex');
133
+ },
134
+ onsessioninitialized: (sessionId) => {
135
+ // Store the transport by session ID
136
+ log('Session initialized:', sessionId);
137
+ transports[sessionId] = transport;
138
+ }
139
+ });
140
+
141
+ // Clean up transport when closed
142
+ transport.onclose = () => {
143
+ if (transport.sessionId) {
144
+ log('Transport closed, cleaning up session:', transport.sessionId);
145
+ delete transports[transport.sessionId];
146
+ }
147
+ };
148
+
149
+ // Connect to the MCP server
150
+ await server.connect(transport);
151
+ log('Server connected to transport');
152
+ } else {
153
+ // Invalid request
154
+ log('Invalid request - no valid session ID');
155
+ return res.status(400).json({
156
+ jsonrpc: '2.0',
157
+ error: {
158
+ code: -32000,
159
+ message: 'Bad Request: No valid session ID provided'
160
+ },
161
+ id: null
162
+ });
163
+ }
164
+
165
+ // Handle the request
166
+ log('Handling request with transport');
167
+ await transport.handleRequest(req, res, req.body);
168
+ });
169
+
170
+ // Reusable handler for GET and DELETE requests
171
+ const handleSessionRequest = async (req, res) => {
172
+ const sessionId = req.get('Mcp-Session-Id');
173
+ log(`${req.method} request received for session:`, sessionId || 'none');
174
+
175
+ if (!sessionId || !transports[sessionId]) {
176
+ log('Invalid or missing session ID');
177
+ return res.status(400).send('Invalid or missing session ID');
178
+ }
179
+
180
+ const transport = transports[sessionId];
181
+ log('Handling request with existing transport');
182
+ await transport.handleRequest(req, res);
183
+ };
184
+
185
+ // Handle GET requests for server-to-client notifications via SSE
186
+ app.get(mcpEndpoint, handleSessionRequest);
187
+
188
+ // Handle DELETE requests for session termination
189
+ app.delete(mcpEndpoint, handleSessionRequest);
190
+
191
+ app.listen(port, host, () => {
192
+ console.log(`MCP server started with Streamable HTTP transport`);
193
+ console.log(`Endpoint: http://${host}:${port}${mcpEndpoint}`);
194
+ console.log(`Listening on ${host}:${port}`);
195
+ if (verbose) {
196
+ console.log(`Verbose logging enabled`);
197
+ }
198
+ });
199
+
200
+ return;
201
+ } else {
202
+ console.error(`Unknown MCP transport type: ${transportType}`);
203
+ console.error(`Supported types: stdio, http`);
204
+ process.exit(1);
205
+ }
206
+
207
+ await server.connect(transport);
208
+ return;
209
+ }
210
+ {% endmacro %}
211
+
212
+ {# ============================================================================
213
+ MACRO: httpModeCodeExpress
214
+ ============================================================================
215
+ Generates HTTP REST API server code using Express
216
+ ============================================================================ #}
217
+ {% macro httpModeCodeExpress(nodeFn) %}
218
+ if (cliMode === 'http') {
219
+ // HTTP mode code
220
+ const app = express();
221
+ app.use(express.json());
222
+
223
+ app.post('/{{atom.doc.features.cli.http.path or atom.doc.name}}', async (req, res) => {
224
+ try {
225
+ const result = await {{ nodeFn }}(req.body);
226
+ res.json(result);
227
+ } catch (error) {
228
+ res.status(500).json({ error: error.message });
229
+ }
230
+ });
231
+
232
+ const port = args['cli-port'] || args.cli_port || 3000;
233
+ app.listen(port, () => {
234
+ console.log(`HTTP server started on port ${port}`);
235
+ });
236
+ return;
237
+ }
238
+ {% endmacro %}
239
+
240
+ {# ============================================================================
241
+ MACRO: defaultModeExtend
242
+ ============================================================================
243
+ Default CLI mode for extended Node (returns result directly)
244
+ ============================================================================ #}
245
+ {% macro defaultModeExtend(nodeFn) %}
246
+ if (cliMode === 'default') {
247
+ // Default mode code
248
+ return await {{ nodeFn }}(await argv());
249
+ }
250
+ {% endmacro %}
251
+
252
+ {# ============================================================================
253
+ MACRO: defaultModeStandard
254
+ ============================================================================
255
+ Default CLI mode for standard Node (prints result to stdout)
256
+ ============================================================================ #}
257
+ {% macro defaultModeStandard(nodeFn) %}
258
+ if (cliMode === 'default') {
259
+ // Default mode code
260
+ const result = await {{ nodeFn }}(await argv());
261
+
262
+ if (typeof result !== 'undefined') {
263
+ const stdout_format = args['stdout-format'] || args.stdout_format || null;
264
+
265
+ if (stdout_format === 'json') console.log(JSON.stringify(result, null, 2));
266
+ else console.log(result);
267
+ }
268
+ return;
269
+ }
270
+ {% endmacro %}
271
+
272
+ {# ============================================================================
273
+ MACRO: runWithCatch
274
+ ============================================================================
275
+ Simple error handler for run() function
276
+ ============================================================================ #}
277
+ {% macro runWithCatch() %}
278
+ run()
279
+ .catch((error) => {
280
+ console.error(error.message);
281
+ process.exit(1);
282
+ });
283
+ {% endmacro %}
284
+
285
+ {# ============================================================================
286
+ MACRO: runWithThenCatch
287
+ ============================================================================
288
+ Error handler with then() chain for run() function
289
+ ============================================================================ #}
290
+ {% macro runWithThenCatch() %}
291
+ run()
292
+ .then(() => {
293
+ {# process.exit(0); #}
294
+ })
295
+ .catch((error) => {
296
+ console.error(error.message);
297
+ process.exit(1);
298
+ });
299
+ {% endmacro %}
300
+
301
+ {# ============================================================================
302
+ MAIN TEMPLATE - ESM FORMAT
303
+ ============================================================================ #}
304
+ {% if atom.doc.features.project.format==='esm' %}
305
+
306
+ import argv,{argsParser} from '../default/input.args.js';
307
+ import { schema as inputSchema } from '../default/validate_input.js';
308
+
309
+ {# --------------------------------------------------------------------------
310
+ ESM - EXTEND MODE (import from cli wrapper)
311
+ -------------------------------------------------------------------------- #}
312
+ {% if atom.doc.features.cli.extend===true %}
313
+
314
+ import Node from '../../../cli';
315
+
316
+ {# Import dependencies based on enabled features #}
317
+ {% if atom.doc.features.cli.mcp.enabled === true %}
318
+ {{ importMcpDependencies('esm') }}
319
+ {% elif atom.doc.features.cli.http.enabled===true %}
320
+ // Using express for HTTP mode
321
+ import express from 'express';
322
+ {% endif %}
323
+
324
+ const run = async () => {
325
+ const args = argsParser(process.argv.slice(2));
326
+ const cliMode = args['cli-mode'] || args.cli_mode || 'default';
327
+
328
+ {{ defaultModeExtend('Node') }}
329
+
330
+ {% if atom.doc.features.cli.mcp.enabled === true %}
331
+ {{ mcpModeCode('Node') }}
332
+ {% endif %}
333
+
334
+ {% if atom.doc.features.cli.http.enabled===true %}
335
+ {{ httpModeCodeBuiltIn('Node') }}
336
+ {% endif %}
337
+
338
+ console.error(`Unknown CLI mode: ${cliMode}`);
339
+ process.exit(1);
340
+ };
341
+
342
+ {{ runWithThenCatch() }}
343
+
344
+ {# --------------------------------------------------------------------------
345
+ ESM - STANDARD MODE (import from src)
346
+ -------------------------------------------------------------------------- #}
347
+ {% else %}
348
+ import Node from '../../../src';
349
+
350
+ {# Import dependencies based on enabled features #}
351
+ {% if atom.doc.features.cli.mcp.enabled === true %}
352
+ {{ importMcpDependencies('esm') }}
353
+ {% elif atom.doc.features.cli.http.enabled===true %}
354
+ // Using express for HTTP mode
355
+ import express from 'express';
356
+ {% endif %}
357
+
358
+
359
+ const run = async () => {
360
+ const args = argsParser(process.argv.slice(2));
361
+ const cliMode = args['cli-mode'] || args.cli_mode || 'default';
362
+
363
+ {{ defaultModeStandard('Node') }}
364
+
365
+ {% if atom.doc.features.cli.mcp.enabled === true %}
366
+ {{ mcpModeCode('Node') }}
367
+ {% endif %}
368
+
369
+ {% if atom.doc.features.cli.http.enabled===true %}
370
+ {{ httpModeCodeExpress('Node') }}
371
+ {% endif %}
372
+
373
+ console.error(`Unknown CLI mode: ${cliMode}`);
374
+ process.exit(1);
375
+ };
376
+
377
+ {{ runWithCatch() }}
378
+ {% endif %}
379
+
380
+
381
+ {# ============================================================================
382
+ MAIN TEMPLATE - CJS FORMAT
383
+ ============================================================================ #}
384
+ {% elif atom.doc.features.project.format==='cjs' %}
385
+
386
+ const { default:argv,argsParser } = require('../default/input.args.js');
387
+
388
+ {# --------------------------------------------------------------------------
389
+ CJS - EXTEND MODE (require from cli wrapper)
390
+ -------------------------------------------------------------------------- #}
391
+ {% if atom.doc.features.cli.extend===true %}
392
+
393
+ const Node = require('../../../cli');
394
+
395
+ {# Import dependencies based on enabled features #}
396
+ {% if atom.doc.features.cli.mcp.enabled === true %}
397
+ {{ importMcpDependencies('cjs') }}
398
+ {% elif atom.doc.features.cli.http.enabled===true %}
399
+ // Using express for HTTP mode
400
+ const express = require('express');
401
+ {% endif %}
402
+
403
+
404
+ const run = async () => {
405
+ const args = argsParser(process.argv.slice(2));
406
+ const cliMode = args['cli-mode'] || args.cli_mode || 'default';
407
+
408
+ {{ defaultModeExtend('Node') }}
409
+
410
+ {% if atom.doc.features.cli.mcp.enabled === true %}
411
+ {{ mcpModeCode('Node') }}
412
+ {% endif %}
413
+
414
+ {% if atom.doc.features.cli.http.enabled===true %}
415
+ {{ httpModeCodeBuiltIn('Node') }}
416
+ {% endif %}
417
+
418
+ console.error(`Unknown CLI mode: ${cliMode}`);
419
+ process.exit(1);
420
+ };
421
+
422
+ {{ runWithThenCatch() }}
423
+
424
+ {# --------------------------------------------------------------------------
425
+ CJS - STANDARD MODE (require from src)
426
+ -------------------------------------------------------------------------- #}
427
+ {% else %}
428
+ const Node = require('../../../src');
429
+
430
+ {# Import dependencies based on enabled features #}
431
+ {% if atom.doc.features.cli.mcp.enabled === true %}
432
+ {{ importMcpDependencies('cjs') }}
433
+ {% elif atom.doc.features.cli.http.enabled===true %}
434
+ // Using express for HTTP mode
435
+ const express = require('express');
436
+ {% endif %}
437
+
438
+
439
+ const run = async () => {
440
+ const args = argsParser(process.argv.slice(2));
441
+ const cliMode = args['cli-mode'] || args.cli_mode || 'default';
442
+
443
+ {{ defaultModeStandard('Node') }}
444
+
445
+ {% if atom.doc.features.cli.mcp.enabled === true %}
446
+ {{ mcpModeCode('Node') }}
447
+ {% endif %}
448
+
449
+ {% if atom.doc.features.cli.http.enabled===true %}
450
+ {{ httpModeCodeExpress('Node') }}
451
+ {% endif %}
452
+
453
+ console.error(`Unknown CLI mode: ${cliMode}`);
454
+ process.exit(1);
455
+ };
456
+
457
+ {{ runWithCatch() }}
458
+ {% endif %}
459
+
460
+ {% endif %}
461
+ {# End of project.format check #}
462
+
463
+ {% endif %}
464
+ {# End of cli.enabled check #}
@@ -0,0 +1,10 @@
1
+ {# ============================================================================
2
+ ARGUMENT PARSER
3
+ ============================================================================
4
+ Parses command-line arguments and extracts CLI mode
5
+ ============================================================================ #}
6
+
7
+ const parseArgs = () => {
8
+ return argsParser(process.argv.slice(2));
9
+ };
10
+
@@ -0,0 +1,29 @@
1
+ {# ============================================================================
2
+ CORE IMPORTS
3
+ ============================================================================
4
+ Base imports required for all CLI modes
5
+ Supports both ESM and CJS formats, standard and extend modes
6
+ ============================================================================ #}
7
+
8
+ {% if atom.doc.features.project.format==='esm' %}
9
+ {# ESM Format #}
10
+ import argv,{argsParser} from '../default/input.args.js';
11
+ import { schema as inputSchema } from '../default/validate_input.js';
12
+ {% if atom.doc.features.cli.extend===true %}
13
+ import Node from '../../../cli';
14
+ {% else %}
15
+ import Node from '../../../src';
16
+ {% endif %}
17
+
18
+ {% elif atom.doc.features.project.format==='cjs' %}
19
+ {# CJS Format #}
20
+ const { default:argv,argsParser} = require('../default/input.args.js');
21
+ const { schema: inputSchema } = require('../default/validate_input.js');
22
+ {% if atom.doc.features.cli.extend===true %}
23
+ const Node = require('../../../cli');
24
+ {% else %}
25
+ const Node = require('../../../src');
26
+ {% endif %}
27
+
28
+ {% endif %}
29
+
@@ -0,0 +1,25 @@
1
+ {# ============================================================================
2
+ RUN WRAPPER
3
+ ============================================================================
4
+ Error handling wrapper for the main run function
5
+ Supports both standard and extend modes
6
+ ============================================================================ #}
7
+
8
+ {% if atom.doc.features.cli.extend===true %}
9
+ {# Extend mode - with then() chain #}
10
+ run()
11
+ .then(() => {
12
+ {# process.exit(0); #}
13
+ })
14
+ .catch((error) => {
15
+ console.error(error.message);
16
+ process.exit(1);
17
+ });
18
+ {% else %}
19
+ {# Standard mode - simple catch #}
20
+ run().catch((error) => {
21
+ console.error(error.message);
22
+ process.exit(1);
23
+ });
24
+ {% endif %}
25
+