@husar.ai/cli 0.2.13 → 0.2.14
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/dist/mcp.js +32 -21
- package/dist/mcp.js.map +1 -1
- package/dist/scripts/mcp-generate-test.d.ts +1 -0
- package/dist/scripts/mcp-generate-test.js +28 -0
- package/dist/scripts/mcp-generate-test.js.map +1 -0
- package/package.json +2 -2
- package/src/mcp.ts +35 -28
- package/src/scripts/mcp-generate-test.ts +34 -0
package/dist/mcp.js
CHANGED
|
@@ -5,8 +5,7 @@ import * as fs from 'node:fs/promises';
|
|
|
5
5
|
import * as path from 'node:path';
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { ConfigMaker } from 'config-maker';
|
|
8
|
-
import {
|
|
9
|
-
import { generateCms } from './functions/generate.js';
|
|
8
|
+
import { spawn } from 'node:child_process';
|
|
10
9
|
const server = new McpServer({ name: 'mcp-husar', version: '1.0.0' });
|
|
11
10
|
let config;
|
|
12
11
|
const getWorkspaceRoot = async () => {
|
|
@@ -124,18 +123,35 @@ const redirectConsoleToStderr = () => {
|
|
|
124
123
|
console.dir = original.dir;
|
|
125
124
|
};
|
|
126
125
|
};
|
|
126
|
+
const runCli = async (args, workspaceCwd) => {
|
|
127
|
+
const npxBin = process.platform === 'win32' ? 'npx.cmd' : 'npx';
|
|
128
|
+
return await new Promise((resolve) => {
|
|
129
|
+
const child = spawn(npxBin, ['-y', '@husar.ai/cli', ...args], {
|
|
130
|
+
cwd: workspaceCwd,
|
|
131
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
132
|
+
env: { ...process.env },
|
|
133
|
+
shell: false,
|
|
134
|
+
});
|
|
135
|
+
let stdout = '';
|
|
136
|
+
let stderr = '';
|
|
137
|
+
child.stdout.on('data', (d) => (stdout += String(d)));
|
|
138
|
+
child.stderr.on('data', (d) => (stderr += String(d)));
|
|
139
|
+
child.on('close', (code) => resolve({ code: code ?? 1, stdout, stderr }));
|
|
140
|
+
});
|
|
141
|
+
};
|
|
127
142
|
const createCmsParseFileHandler = ({ timeoutMs = 30_000 }) => {
|
|
128
143
|
return async ({ path: file, type, name: passed }) => {
|
|
129
144
|
const restoreConsole = redirectConsoleToStderr();
|
|
130
145
|
try {
|
|
131
|
-
|
|
146
|
+
await getAuth();
|
|
132
147
|
const absPath = await resolveWorkspacePath(file);
|
|
148
|
+
const root = await getWorkspaceRoot();
|
|
133
149
|
const name = (passed ?? (absPath.replace(/^.*\/(.*?)(\.[^.]+)?$/, '$1') || 'untitled')).toLowerCase();
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
return { content: [{ type: 'text', text:
|
|
150
|
+
const res = await withTimeout(runCli(['copy', absPath, name, '-t', type ?? 'shape'], root), timeoutMs);
|
|
151
|
+
if (res.code !== 0) {
|
|
152
|
+
throw new Error(`CLI exited with code ${res.code}.\nSTDOUT:\n${res.stdout}\nSTDERR:\n${res.stderr}`);
|
|
153
|
+
}
|
|
154
|
+
return { content: [{ type: 'text', text: res.stdout || 'ok' }] };
|
|
139
155
|
}
|
|
140
156
|
catch (err) {
|
|
141
157
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -165,20 +181,15 @@ export const startMcpServer = async () => {
|
|
|
165
181
|
try {
|
|
166
182
|
const { folderPath } = husarGenerateSchema.parse(args ?? {});
|
|
167
183
|
const root = await getWorkspaceRoot();
|
|
168
|
-
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
184
|
+
await getAuth();
|
|
185
|
+
const argsList = ['generate'];
|
|
186
|
+
if (folderPath)
|
|
187
|
+
argsList.push(folderPath);
|
|
188
|
+
const res = await runCli(argsList, root);
|
|
189
|
+
if (res.code !== 0) {
|
|
190
|
+
throw new Error(`CLI exited with code ${res.code}.\nSTDOUT:\n${res.stdout}\nSTDERR:\n${res.stderr}`);
|
|
173
191
|
}
|
|
174
|
-
|
|
175
|
-
const cmsPath = await generateCms({
|
|
176
|
-
baseFolder: base,
|
|
177
|
-
host,
|
|
178
|
-
hostEnvironmentVariable: raw.hostEnvironmentVariable,
|
|
179
|
-
authenticationEnvironmentVariable: raw.authenticationEnvironmentVariable,
|
|
180
|
-
});
|
|
181
|
-
return { content: [{ type: 'text', text: JSON.stringify({ status: 'ok', folder: cmsPath }, null, 2) }] };
|
|
192
|
+
return { content: [{ type: 'text', text: res.stdout || 'ok' }] };
|
|
182
193
|
}
|
|
183
194
|
catch (err) {
|
|
184
195
|
const message = err instanceof Error ? err.message : String(err);
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
4
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
5
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const repoRoot = path.resolve(here, '../../../..');
|
|
7
|
+
const cliDist = path.resolve(repoRoot, 'packages/cli/dist/mcp.js');
|
|
8
|
+
const landing = path.resolve(repoRoot, 'packages/landing');
|
|
9
|
+
async function main() {
|
|
10
|
+
const transport = new StdioClientTransport({
|
|
11
|
+
command: 'node',
|
|
12
|
+
args: [cliDist],
|
|
13
|
+
cwd: landing,
|
|
14
|
+
env: {
|
|
15
|
+
...process.env,
|
|
16
|
+
WORKSPACE_ROOT: landing,
|
|
17
|
+
},
|
|
18
|
+
stderr: 'pipe',
|
|
19
|
+
});
|
|
20
|
+
const client = new Client({ name: 'husar-mcp-smoke', version: '0.0.0' });
|
|
21
|
+
await client.connect(transport);
|
|
22
|
+
const res = await client.callTool({ name: 'husar_generate', arguments: {} });
|
|
23
|
+
const text = res?.content?.[0]?.text || '';
|
|
24
|
+
console.log('husar_generate result:', text);
|
|
25
|
+
await client.close();
|
|
26
|
+
}
|
|
27
|
+
void main();
|
|
28
|
+
//# sourceMappingURL=mcp-generate-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-generate-test.js","sourceRoot":"","sources":["../../src/scripts/mcp-generate-test.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC;AACnE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AAE3D,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;QACzC,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,OAAO,CAAC;QACf,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,cAAc,EAAE,OAAO;SACxB;QACD,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAI,GAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAGD,KAAK,IAAI,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@husar.ai/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.14",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli.js",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"watch": "tspc --watch"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@husar.ai/ssr": "^0.2.
|
|
19
|
+
"@husar.ai/ssr": "^0.2.14",
|
|
20
20
|
"@modelcontextprotocol/sdk": "^1.17.4",
|
|
21
21
|
"commander": "^11.0.0",
|
|
22
22
|
"config-maker": "^0.0.6",
|
package/src/mcp.ts
CHANGED
|
@@ -6,8 +6,7 @@ import * as fs from 'node:fs/promises';
|
|
|
6
6
|
import * as path from 'node:path';
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { ConfigMaker } from 'config-maker';
|
|
9
|
-
import {
|
|
10
|
-
import { generateCms } from './functions/generate.js';
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
11
10
|
|
|
12
11
|
const server = new McpServer({ name: 'mcp-husar', version: '1.0.0' });
|
|
13
12
|
|
|
@@ -136,25 +135,37 @@ const redirectConsoleToStderr = () => {
|
|
|
136
135
|
};
|
|
137
136
|
};
|
|
138
137
|
|
|
138
|
+
const runCli = async (args: string[], workspaceCwd: string) => {
|
|
139
|
+
const npxBin = process.platform === 'win32' ? 'npx.cmd' : 'npx';
|
|
140
|
+
return await new Promise<{ code: number; stdout: string; stderr: string }>((resolve) => {
|
|
141
|
+
const child = spawn(npxBin, ['-y', '@husar.ai/cli', ...args], {
|
|
142
|
+
cwd: workspaceCwd,
|
|
143
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
144
|
+
env: { ...process.env },
|
|
145
|
+
shell: false,
|
|
146
|
+
});
|
|
147
|
+
let stdout = '';
|
|
148
|
+
let stderr = '';
|
|
149
|
+
child.stdout.on('data', (d) => (stdout += String(d)));
|
|
150
|
+
child.stderr.on('data', (d) => (stderr += String(d)));
|
|
151
|
+
child.on('close', (code) => resolve({ code: code ?? 1, stdout, stderr }));
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
|
|
139
155
|
const createCmsParseFileHandler = ({ timeoutMs = 30_000 }: { timeoutMs?: number }) => {
|
|
140
156
|
return async ({ path: file, type, name: passed }: CmsParseFileInput) => {
|
|
141
157
|
const restoreConsole = redirectConsoleToStderr();
|
|
142
158
|
try {
|
|
143
|
-
|
|
159
|
+
// Ensure config exists or env is set; if missing, CLI will error
|
|
160
|
+
await getAuth();
|
|
144
161
|
const absPath = await resolveWorkspacePath(file);
|
|
162
|
+
const root = await getWorkspaceRoot();
|
|
145
163
|
const name = (passed ?? (absPath.replace(/^.*\/(.*?)(\.[^.]+)?$/, '$1') || 'untitled')).toLowerCase();
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
HUSAR_MCP_HOST: host,
|
|
152
|
-
HUSAR_MCP_ADMIN_TOKEN: adminToken,
|
|
153
|
-
},
|
|
154
|
-
),
|
|
155
|
-
timeoutMs,
|
|
156
|
-
);
|
|
157
|
-
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
164
|
+
const res = await withTimeout(runCli(['copy', absPath, name, '-t', type ?? 'shape'], root), timeoutMs);
|
|
165
|
+
if (res.code !== 0) {
|
|
166
|
+
throw new Error(`CLI exited with code ${res.code}.\nSTDOUT:\n${res.stdout}\nSTDERR:\n${res.stderr}`);
|
|
167
|
+
}
|
|
168
|
+
return { content: [{ type: 'text', text: res.stdout || 'ok' }] };
|
|
158
169
|
} catch (err) {
|
|
159
170
|
const message = err instanceof Error ? err.message : String(err);
|
|
160
171
|
const stack = err instanceof Error && err.stack ? `\nStack: ${err.stack}` : '';
|
|
@@ -200,20 +211,16 @@ export const startMcpServer = async () => {
|
|
|
200
211
|
try {
|
|
201
212
|
const { folderPath } = husarGenerateSchema.parse(args ?? {});
|
|
202
213
|
const root = await getWorkspaceRoot();
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
const
|
|
206
|
-
if (
|
|
207
|
-
|
|
214
|
+
// Ensure config exists; if missing, CLI will error
|
|
215
|
+
await getAuth();
|
|
216
|
+
const argsList = ['generate'];
|
|
217
|
+
if (folderPath) argsList.push(folderPath);
|
|
218
|
+
const res = await runCli(argsList, root);
|
|
219
|
+
if (res.code !== 0) {
|
|
220
|
+
throw new Error(`CLI exited with code ${res.code}.\nSTDOUT:\n${res.stdout}\nSTDERR:\n${res.stderr}`);
|
|
208
221
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
baseFolder: base,
|
|
212
|
-
host,
|
|
213
|
-
hostEnvironmentVariable: (raw as any).hostEnvironmentVariable,
|
|
214
|
-
authenticationEnvironmentVariable: (raw as any).authenticationEnvironmentVariable,
|
|
215
|
-
});
|
|
216
|
-
return { content: [{ type: 'text', text: JSON.stringify({ status: 'ok', folder: cmsPath }, null, 2) }] };
|
|
222
|
+
// The CLI doesn't print a JSON payload; return a simple ok message
|
|
223
|
+
return { content: [{ type: 'text', text: res.stdout || 'ok' }] };
|
|
217
224
|
} catch (err) {
|
|
218
225
|
const message = err instanceof Error ? err.message : String(err);
|
|
219
226
|
const stack = err instanceof Error && err.stack ? `\nStack: ${err.stack}` : '';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
5
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
6
|
+
|
|
7
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const repoRoot = path.resolve(here, '../../../..');
|
|
9
|
+
const cliDist = path.resolve(repoRoot, 'packages/cli/dist/mcp.js');
|
|
10
|
+
const landing = path.resolve(repoRoot, 'packages/landing');
|
|
11
|
+
|
|
12
|
+
async function main() {
|
|
13
|
+
const transport = new StdioClientTransport({
|
|
14
|
+
command: 'node',
|
|
15
|
+
args: [cliDist],
|
|
16
|
+
cwd: landing,
|
|
17
|
+
env: {
|
|
18
|
+
...process.env,
|
|
19
|
+
WORKSPACE_ROOT: landing,
|
|
20
|
+
},
|
|
21
|
+
stderr: 'pipe',
|
|
22
|
+
});
|
|
23
|
+
const client = new Client({ name: 'husar-mcp-smoke', version: '0.0.0' });
|
|
24
|
+
await client.connect(transport);
|
|
25
|
+
|
|
26
|
+
const res = await client.callTool({ name: 'husar_generate', arguments: {} });
|
|
27
|
+
const text = (res as any)?.content?.[0]?.text || '';
|
|
28
|
+
console.log('husar_generate result:', text);
|
|
29
|
+
await client.close();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// eslint-disable-next-line no-void
|
|
33
|
+
void main();
|
|
34
|
+
|