@muggleai/mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +160 -0
  2. package/bin/muggle-mcp.js +2 -0
  3. package/dist/chunk-6DQWAMGJ.js +7626 -0
  4. package/dist/chunk-6DQWAMGJ.js.map +1 -0
  5. package/dist/cli/doctor.d.ts +8 -0
  6. package/dist/cli/doctor.d.ts.map +1 -0
  7. package/dist/cli/index.d.ts +9 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/login.d.ts +26 -0
  10. package/dist/cli/login.d.ts.map +1 -0
  11. package/dist/cli/main.d.ts +6 -0
  12. package/dist/cli/main.d.ts.map +1 -0
  13. package/dist/cli/serve.d.ts +20 -0
  14. package/dist/cli/serve.d.ts.map +1 -0
  15. package/dist/cli/setup.d.ts +16 -0
  16. package/dist/cli/setup.d.ts.map +1 -0
  17. package/dist/cli.js +305 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/index.d.ts +35 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +36 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/local-qa/contracts/auth-schemas.d.ts +35 -0
  24. package/dist/local-qa/contracts/auth-schemas.d.ts.map +1 -0
  25. package/dist/local-qa/contracts/index.d.ts +7 -0
  26. package/dist/local-qa/contracts/index.d.ts.map +1 -0
  27. package/dist/local-qa/contracts/project-schemas.d.ts +1141 -0
  28. package/dist/local-qa/contracts/project-schemas.d.ts.map +1 -0
  29. package/dist/local-qa/contracts/session-schemas.d.ts +27 -0
  30. package/dist/local-qa/contracts/session-schemas.d.ts.map +1 -0
  31. package/dist/local-qa/index.d.ts +27 -0
  32. package/dist/local-qa/index.d.ts.map +1 -0
  33. package/dist/local-qa/services/auth-service.d.ts +79 -0
  34. package/dist/local-qa/services/auth-service.d.ts.map +1 -0
  35. package/dist/local-qa/services/execution-service.d.ts +55 -0
  36. package/dist/local-qa/services/execution-service.d.ts.map +1 -0
  37. package/dist/local-qa/services/index.d.ts +8 -0
  38. package/dist/local-qa/services/index.d.ts.map +1 -0
  39. package/dist/local-qa/services/project-storage-service.d.ts +262 -0
  40. package/dist/local-qa/services/project-storage-service.d.ts.map +1 -0
  41. package/dist/local-qa/services/storage-service.d.ts +166 -0
  42. package/dist/local-qa/services/storage-service.d.ts.map +1 -0
  43. package/dist/local-qa/tools/index.d.ts +5 -0
  44. package/dist/local-qa/tools/index.d.ts.map +1 -0
  45. package/dist/local-qa/tools/tool-registry.d.ts +18 -0
  46. package/dist/local-qa/tools/tool-registry.d.ts.map +1 -0
  47. package/dist/local-qa/types/auth-types.d.ts +97 -0
  48. package/dist/local-qa/types/auth-types.d.ts.map +1 -0
  49. package/dist/local-qa/types/config-types.d.ts +28 -0
  50. package/dist/local-qa/types/config-types.d.ts.map +1 -0
  51. package/dist/local-qa/types/enums.d.ts +141 -0
  52. package/dist/local-qa/types/enums.d.ts.map +1 -0
  53. package/dist/local-qa/types/index.d.ts +10 -0
  54. package/dist/local-qa/types/index.d.ts.map +1 -0
  55. package/dist/local-qa/types/project-types.d.ts +339 -0
  56. package/dist/local-qa/types/project-types.d.ts.map +1 -0
  57. package/dist/local-qa/types/storage-params.d.ts +544 -0
  58. package/dist/local-qa/types/storage-params.d.ts.map +1 -0
  59. package/dist/local-qa/types/tool-types.d.ts +38 -0
  60. package/dist/local-qa/types/tool-types.d.ts.map +1 -0
  61. package/dist/qa/contracts/index.d.ts +716 -0
  62. package/dist/qa/contracts/index.d.ts.map +1 -0
  63. package/dist/qa/index.d.ts +15 -0
  64. package/dist/qa/index.d.ts.map +1 -0
  65. package/dist/qa/tools/index.d.ts +5 -0
  66. package/dist/qa/tools/index.d.ts.map +1 -0
  67. package/dist/qa/tools/tool-registry.d.ts +22 -0
  68. package/dist/qa/tools/tool-registry.d.ts.map +1 -0
  69. package/dist/qa/types.d.ts +101 -0
  70. package/dist/qa/types.d.ts.map +1 -0
  71. package/dist/qa/upstream-client.d.ts +60 -0
  72. package/dist/qa/upstream-client.d.ts.map +1 -0
  73. package/dist/server/index.d.ts +6 -0
  74. package/dist/server/index.d.ts.map +1 -0
  75. package/dist/server/mcp-server.d.ts +34 -0
  76. package/dist/server/mcp-server.d.ts.map +1 -0
  77. package/dist/server/stdio-server.d.ts +11 -0
  78. package/dist/server/stdio-server.d.ts.map +1 -0
  79. package/dist/shared/auth.d.ts +75 -0
  80. package/dist/shared/auth.d.ts.map +1 -0
  81. package/dist/shared/config.d.ts +41 -0
  82. package/dist/shared/config.d.ts.map +1 -0
  83. package/dist/shared/credentials.d.ts +48 -0
  84. package/dist/shared/credentials.d.ts.map +1 -0
  85. package/dist/shared/index.d.ts +10 -0
  86. package/dist/shared/index.d.ts.map +1 -0
  87. package/dist/shared/logger.d.ts +21 -0
  88. package/dist/shared/logger.d.ts.map +1 -0
  89. package/dist/shared/open-browser.d.ts +27 -0
  90. package/dist/shared/open-browser.d.ts.map +1 -0
  91. package/dist/shared/types.d.ts +178 -0
  92. package/dist/shared/types.d.ts.map +1 -0
  93. package/package.json +75 -0
  94. package/scripts/postinstall.mjs +153 -0
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Doctor command - diagnoses installation and configuration issues.
3
+ */
4
+ /**
5
+ * Execute the doctor command.
6
+ */
7
+ export declare function doctorCommand(): Promise<void>;
8
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4HH;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBnD"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI entry point for @muggleai/mcp.
3
+ * Provides commands for serving MCP, setup, diagnostics, and authentication.
4
+ */
5
+ /**
6
+ * Run the CLI.
7
+ */
8
+ export declare function runCli(): Promise<void>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2EH;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAU5C"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Login/logout/status commands for authentication.
3
+ */
4
+ /**
5
+ * Options for the login command.
6
+ */
7
+ export interface ILoginOptions {
8
+ /** Name for the API key. */
9
+ keyName?: string;
10
+ /** API key expiry: 30d, 90d, 1y, never. */
11
+ keyExpiry?: string;
12
+ }
13
+ /**
14
+ * Execute the login command.
15
+ * @param options - Command options.
16
+ */
17
+ export declare function loginCommand(options: ILoginOptions): Promise<void>;
18
+ /**
19
+ * Execute the logout command.
20
+ */
21
+ export declare function logoutCommand(): Promise<void>;
22
+ /**
23
+ * Execute the status command.
24
+ */
25
+ export declare function statusCommand(): Promise<void>;
26
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/cli/login.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCxE;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAOnD;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BnD"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for muggle-mcp.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AACA;;GAEG"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Serve command - starts the MCP server.
3
+ */
4
+ /**
5
+ * Options for the serve command.
6
+ */
7
+ export interface IServeOptions {
8
+ /** Only enable Cloud QA tools. */
9
+ qa?: boolean;
10
+ /** Only enable Local QA tools. */
11
+ local?: boolean;
12
+ /** Use stdio transport. */
13
+ stdio?: boolean;
14
+ }
15
+ /**
16
+ * Execute the serve command.
17
+ * @param options - Command options.
18
+ */
19
+ export declare function serveCommand(options: IServeOptions): Promise<void>;
20
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CxE"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Setup command - downloads/updates the Electron app.
3
+ */
4
+ /**
5
+ * Options for the setup command.
6
+ */
7
+ export interface ISetupOptions {
8
+ /** Force re-download even if already installed. */
9
+ force?: boolean;
10
+ }
11
+ /**
12
+ * Execute the setup command.
13
+ * @param options - Command options.
14
+ */
15
+ export declare function setupCommand(options: ISetupOptions): Promise<void>;
16
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA2DD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DxE"}
package/dist/cli.js ADDED
@@ -0,0 +1,305 @@
1
+ #!/usr/bin/env node
2
+ import { getLogger, getConfig, getQaTools, registerTools, getLocalQaTools, createUnifiedMcpServer, startStdioServer, getElectronAppVersion, getDownloadBaseUrl, getElectronAppDir, isElectronAppInstalled, performLogin, performLogout, getAuthStatus, getDataDir, getCredentialsFilePath } from './chunk-6DQWAMGJ.js';
3
+ import { Command } from 'commander';
4
+ import { existsSync, rmSync, mkdirSync, createWriteStream } from 'fs';
5
+ import { exec } from 'child_process';
6
+ import { platform } from 'os';
7
+ import { pipeline } from 'stream/promises';
8
+
9
+ var logger = getLogger();
10
+ function runDiagnostics() {
11
+ const results = [];
12
+ const config = getConfig();
13
+ const dataDir = getDataDir();
14
+ results.push({
15
+ name: "Data Directory",
16
+ passed: existsSync(dataDir),
17
+ description: existsSync(dataDir) ? `Found at ${dataDir}` : `Not found at ${dataDir}`,
18
+ suggestion: "Run 'muggle-mcp login' to create the data directory"
19
+ });
20
+ const electronInstalled = isElectronAppInstalled();
21
+ const electronVersion = getElectronAppVersion();
22
+ results.push({
23
+ name: "Electron App",
24
+ passed: electronInstalled,
25
+ description: electronInstalled ? `Installed (v${electronVersion})` : `Not installed (expected v${electronVersion})`,
26
+ suggestion: "Run 'muggle-mcp setup' to download the Electron app"
27
+ });
28
+ const authStatus = getAuthStatus();
29
+ results.push({
30
+ name: "Authentication",
31
+ passed: authStatus.authenticated,
32
+ description: authStatus.authenticated ? `Authenticated as ${authStatus.email || "unknown"}` : "Not authenticated",
33
+ suggestion: "Run 'muggle-mcp login' to authenticate"
34
+ });
35
+ results.push({
36
+ name: "API Key",
37
+ passed: authStatus.hasApiKey,
38
+ description: authStatus.hasApiKey ? "API key stored" : "No API key stored",
39
+ suggestion: "Run 'muggle-mcp login' to generate an API key"
40
+ });
41
+ const credentialsPath = getCredentialsFilePath();
42
+ results.push({
43
+ name: "Credentials File",
44
+ passed: existsSync(credentialsPath),
45
+ description: existsSync(credentialsPath) ? `Found at ${credentialsPath}` : `Not found at ${credentialsPath}`,
46
+ suggestion: "Run 'muggle-mcp login' to create credentials"
47
+ });
48
+ results.push({
49
+ name: "Prompt Service URL",
50
+ passed: !!config.qa.promptServiceBaseUrl,
51
+ description: config.qa.promptServiceBaseUrl
52
+ });
53
+ results.push({
54
+ name: "Web Service URL",
55
+ passed: !!config.localQa.webServiceUrl,
56
+ description: config.localQa.webServiceUrl
57
+ });
58
+ return results;
59
+ }
60
+ function formatCheckResult(result) {
61
+ const icon = result.passed ? "\u2713" : "\u2717";
62
+ const color = result.passed ? "\x1B[32m" : "\x1B[31m";
63
+ const reset = "\x1B[0m";
64
+ let output = `${color}${icon}${reset} ${result.name}: ${result.description}`;
65
+ if (!result.passed && result.suggestion) {
66
+ output += `
67
+ \u2514\u2500 ${result.suggestion}`;
68
+ }
69
+ return output;
70
+ }
71
+ async function doctorCommand() {
72
+ console.log("\nMuggle MCP Doctor");
73
+ console.log("=================\n");
74
+ const results = runDiagnostics();
75
+ for (const result of results) {
76
+ console.log(formatCheckResult(result));
77
+ }
78
+ console.log("");
79
+ const failedCount = results.filter((r) => !r.passed).length;
80
+ if (failedCount === 0) {
81
+ console.log("All checks passed! Your installation is ready.");
82
+ } else {
83
+ console.log(`${failedCount} issue(s) found. See suggestions above.`);
84
+ }
85
+ logger.info("Doctor command completed", {
86
+ totalChecks: results.length,
87
+ passed: results.length - failedCount,
88
+ failed: failedCount
89
+ });
90
+ }
91
+
92
+ // src/cli/login.ts
93
+ var logger2 = getLogger();
94
+ async function loginCommand(options) {
95
+ console.log("\nMuggle AI Login");
96
+ console.log("===============\n");
97
+ const expiry = options.keyExpiry || "90d";
98
+ console.log("Starting device code authentication...");
99
+ console.log("A browser window will open for you to complete login.\n");
100
+ const result = await performLogin(options.keyName, expiry);
101
+ if (result.success) {
102
+ console.log("\u2713 Login successful!");
103
+ if (result.credentials?.email) {
104
+ console.log(` Logged in as: ${result.credentials.email}`);
105
+ }
106
+ if (result.credentials?.apiKey) {
107
+ console.log(" API key created and stored for future use.");
108
+ }
109
+ console.log("\nYou can now use Muggle AI MCP tools.");
110
+ } else {
111
+ console.error("\u2717 Login failed");
112
+ if (result.error) {
113
+ console.error(` Error: ${result.error}`);
114
+ }
115
+ if (result.deviceCodeResponse) {
116
+ console.log("\nIf browser didn't open, visit:");
117
+ console.log(` ${result.deviceCodeResponse.verificationUriComplete}`);
118
+ console.log(` Code: ${result.deviceCodeResponse.userCode}`);
119
+ }
120
+ process.exit(1);
121
+ }
122
+ }
123
+ async function logoutCommand() {
124
+ console.log("\nLogging out...");
125
+ performLogout();
126
+ console.log("\u2713 Credentials cleared successfully.");
127
+ logger2.info("Logout completed");
128
+ }
129
+ async function statusCommand() {
130
+ console.log("\nAuthentication Status");
131
+ console.log("=====================\n");
132
+ const status = getAuthStatus();
133
+ if (status.authenticated) {
134
+ console.log("\u2713 Authenticated");
135
+ if (status.email) {
136
+ console.log(` Email: ${status.email}`);
137
+ }
138
+ if (status.userId) {
139
+ console.log(` User ID: ${status.userId}`);
140
+ }
141
+ if (status.expiresAt) {
142
+ const expiresDate = new Date(status.expiresAt);
143
+ console.log(` Token expires: ${expiresDate.toLocaleString()}`);
144
+ }
145
+ console.log(` API Key: ${status.hasApiKey ? "Yes" : "No"}`);
146
+ } else {
147
+ console.log("\u2717 Not authenticated");
148
+ console.log("\nRun 'muggle-mcp login' to authenticate.");
149
+ }
150
+ }
151
+
152
+ // src/cli/serve.ts
153
+ var logger3 = getLogger();
154
+ async function serveCommand(options) {
155
+ const config = getConfig();
156
+ const enableQa = options.local ? false : true;
157
+ const enableLocal = options.qa ? false : true;
158
+ logger3.info("Starting Muggle MCP Server", {
159
+ version: config.serverVersion,
160
+ enableQa,
161
+ enableLocal,
162
+ transport: "stdio"
163
+ });
164
+ try {
165
+ if (enableQa) {
166
+ const qaTools = getQaTools();
167
+ registerTools(qaTools);
168
+ logger3.info("Registered QA tools", { count: qaTools.length });
169
+ }
170
+ if (enableLocal) {
171
+ const localTools = getLocalQaTools();
172
+ registerTools(localTools);
173
+ logger3.info("Registered Local QA tools", { count: localTools.length });
174
+ }
175
+ const mcpServer = createUnifiedMcpServer({
176
+ enableQaTools: enableQa,
177
+ enableLocalTools: enableLocal
178
+ });
179
+ await startStdioServer(mcpServer);
180
+ logger3.info("MCP server started successfully");
181
+ } catch (error) {
182
+ logger3.error("Failed to start MCP server", {
183
+ error: error instanceof Error ? error.message : String(error),
184
+ stack: error instanceof Error ? error.stack : void 0
185
+ });
186
+ process.exit(1);
187
+ }
188
+ }
189
+ var logger4 = getLogger();
190
+ function getBinaryName() {
191
+ const os = platform();
192
+ switch (os) {
193
+ case "darwin":
194
+ return "muggle-test-darwin-arm64.zip";
195
+ case "win32":
196
+ return "muggle-test-win32-x64.zip";
197
+ case "linux":
198
+ return "muggle-test-linux-x64.tar.gz";
199
+ default:
200
+ throw new Error(`Unsupported platform: ${os}`);
201
+ }
202
+ }
203
+ async function extractZip(zipPath, destDir) {
204
+ return new Promise((resolve, reject) => {
205
+ const cmd = platform() === "win32" ? `powershell -command "Expand-Archive -Path '${zipPath}' -DestinationPath '${destDir}' -Force"` : `unzip -o "${zipPath}" -d "${destDir}"`;
206
+ exec(cmd, (error) => {
207
+ if (error) {
208
+ reject(error);
209
+ } else {
210
+ resolve();
211
+ }
212
+ });
213
+ });
214
+ }
215
+ async function extractTarGz(tarPath, destDir) {
216
+ return new Promise((resolve, reject) => {
217
+ exec(`tar -xzf "${tarPath}" -C "${destDir}"`, (error) => {
218
+ if (error) {
219
+ reject(error);
220
+ } else {
221
+ resolve();
222
+ }
223
+ });
224
+ });
225
+ }
226
+ async function setupCommand(options) {
227
+ const version = getElectronAppVersion();
228
+ const baseUrl = getDownloadBaseUrl();
229
+ const versionDir = getElectronAppDir(version);
230
+ if (!options.force && isElectronAppInstalled()) {
231
+ console.log(`Electron app v${version} is already installed at ${versionDir}`);
232
+ console.log("Use --force to re-download.");
233
+ return;
234
+ }
235
+ const binaryName = getBinaryName();
236
+ const downloadUrl = `${baseUrl}/electron-app-v${version}/${binaryName}`;
237
+ console.log(`Downloading Muggle Test Electron app v${version}...`);
238
+ console.log(`URL: ${downloadUrl}`);
239
+ try {
240
+ if (existsSync(versionDir)) {
241
+ rmSync(versionDir, { recursive: true, force: true });
242
+ }
243
+ mkdirSync(versionDir, { recursive: true });
244
+ const response = await fetch(downloadUrl);
245
+ if (!response.ok) {
246
+ throw new Error(`Download failed: ${response.status} ${response.statusText}`);
247
+ }
248
+ const tempFile = `${versionDir}/${binaryName}`;
249
+ const fileStream = createWriteStream(tempFile);
250
+ if (!response.body) {
251
+ throw new Error("No response body");
252
+ }
253
+ await pipeline(response.body, fileStream);
254
+ console.log("Download complete, extracting...");
255
+ if (binaryName.endsWith(".zip")) {
256
+ await extractZip(tempFile, versionDir);
257
+ } else if (binaryName.endsWith(".tar.gz")) {
258
+ await extractTarGz(tempFile, versionDir);
259
+ }
260
+ rmSync(tempFile, { force: true });
261
+ console.log(`Electron app installed to ${versionDir}`);
262
+ logger4.info("Setup complete", { version, path: versionDir });
263
+ } catch (error) {
264
+ const errorMessage = error instanceof Error ? error.message : String(error);
265
+ console.error(`Failed to download Electron app: ${errorMessage}`);
266
+ logger4.error("Setup failed", { error: errorMessage });
267
+ process.exit(1);
268
+ }
269
+ }
270
+
271
+ // src/cli/index.ts
272
+ var logger5 = getLogger();
273
+ function createProgram() {
274
+ const program = new Command();
275
+ program.name("muggle-mcp").description("Unified MCP server for Muggle AI - Cloud QA and Local Testing").version("1.0.0");
276
+ program.command("serve").description("Start the MCP server").option("--qa", "Only enable Cloud QA tools").option("--local", "Only enable Local QA tools").option("--stdio", "Use stdio transport (default)").action(serveCommand);
277
+ program.command("setup").description("Download/update the Electron app for local testing").option("--force", "Force re-download even if already installed").action(setupCommand);
278
+ program.command("doctor").description("Diagnose installation and configuration issues").action(doctorCommand);
279
+ program.command("login").description("Authenticate with Muggle AI (uses device code flow)").option("--key-name <name>", "Name for the API key").option("--key-expiry <expiry>", "API key expiry: 30d, 90d, 1y, never", "90d").action(loginCommand);
280
+ program.command("logout").description("Clear stored credentials").action(logoutCommand);
281
+ program.command("status").description("Show authentication status").action(statusCommand);
282
+ program.action(() => {
283
+ serveCommand({ });
284
+ });
285
+ return program;
286
+ }
287
+ async function runCli() {
288
+ try {
289
+ const program = createProgram();
290
+ await program.parseAsync(process.argv);
291
+ } catch (error) {
292
+ logger5.error("CLI error", {
293
+ error: error instanceof Error ? error.message : String(error)
294
+ });
295
+ process.exit(1);
296
+ }
297
+ }
298
+
299
+ // src/cli/main.ts
300
+ runCli().catch((error) => {
301
+ console.error("Fatal error:", error instanceof Error ? error.message : String(error));
302
+ process.exit(1);
303
+ });
304
+ //# sourceMappingURL=cli.js.map
305
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/doctor.ts","../src/cli/login.ts","../src/cli/serve.ts","../src/cli/setup.ts","../src/cli/index.ts","../src/cli/main.ts"],"names":["logger","existsSync"],"mappings":"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","file":"cli.js","sourcesContent":["/**\r\n * Doctor command - diagnoses installation and configuration issues.\r\n */\r\n\r\nimport { existsSync } from \"fs\";\r\n\r\nimport {\r\n getConfig,\r\n getDataDir,\r\n getElectronAppVersion,\r\n isElectronAppInstalled,\r\n} from \"../shared/config.js\";\r\nimport { getAuthStatus, getCredentialsFilePath } from \"../shared/credentials.js\";\r\nimport { getLogger } from \"../shared/logger.js\";\r\n\r\nconst logger = getLogger();\r\n\r\n/**\r\n * Check result with status indicator.\r\n */\r\ninterface ICheckResult {\r\n /** Check name. */\r\n name: string;\r\n /** Whether check passed. */\r\n passed: boolean;\r\n /** Description of the result. */\r\n description: string;\r\n /** Suggestion to fix (if failed). */\r\n suggestion?: string;\r\n}\r\n\r\n/**\r\n * Run all diagnostic checks.\r\n * @returns Array of check results.\r\n */\r\nfunction runDiagnostics(): ICheckResult[] {\r\n const results: ICheckResult[] = [];\r\n const config = getConfig();\r\n\r\n // Check 1: Data directory exists\r\n const dataDir = getDataDir();\r\n results.push({\r\n name: \"Data Directory\",\r\n passed: existsSync(dataDir),\r\n description: existsSync(dataDir) ? `Found at ${dataDir}` : `Not found at ${dataDir}`,\r\n suggestion: \"Run 'muggle-mcp login' to create the data directory\",\r\n });\r\n\r\n // Check 2: Electron app installed\r\n const electronInstalled = isElectronAppInstalled();\r\n const electronVersion = getElectronAppVersion();\r\n results.push({\r\n name: \"Electron App\",\r\n passed: electronInstalled,\r\n description: electronInstalled\r\n ? `Installed (v${electronVersion})`\r\n : `Not installed (expected v${electronVersion})`,\r\n suggestion: \"Run 'muggle-mcp setup' to download the Electron app\",\r\n });\r\n\r\n // Check 3: Authentication status\r\n const authStatus = getAuthStatus();\r\n results.push({\r\n name: \"Authentication\",\r\n passed: authStatus.authenticated,\r\n description: authStatus.authenticated\r\n ? `Authenticated as ${authStatus.email || \"unknown\"}`\r\n : \"Not authenticated\",\r\n suggestion: \"Run 'muggle-mcp login' to authenticate\",\r\n });\r\n\r\n // Check 4: API key available\r\n results.push({\r\n name: \"API Key\",\r\n passed: authStatus.hasApiKey,\r\n description: authStatus.hasApiKey ? \"API key stored\" : \"No API key stored\",\r\n suggestion: \"Run 'muggle-mcp login' to generate an API key\",\r\n });\r\n\r\n // Check 5: Credentials file\r\n const credentialsPath = getCredentialsFilePath();\r\n results.push({\r\n name: \"Credentials File\",\r\n passed: existsSync(credentialsPath),\r\n description: existsSync(credentialsPath)\r\n ? `Found at ${credentialsPath}`\r\n : `Not found at ${credentialsPath}`,\r\n suggestion: \"Run 'muggle-mcp login' to create credentials\",\r\n });\r\n\r\n // Check 6: Prompt service URL\r\n results.push({\r\n name: \"Prompt Service URL\",\r\n passed: !!config.qa.promptServiceBaseUrl,\r\n description: config.qa.promptServiceBaseUrl,\r\n });\r\n\r\n // Check 7: Web service URL (for local testing)\r\n results.push({\r\n name: \"Web Service URL\",\r\n passed: !!config.localQa.webServiceUrl,\r\n description: config.localQa.webServiceUrl,\r\n });\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Format a check result for display.\r\n * @param result - Check result.\r\n * @returns Formatted string.\r\n */\r\nfunction formatCheckResult(result: ICheckResult): string {\r\n const icon = result.passed ? \"✓\" : \"✗\";\r\n const color = result.passed ? \"\\x1b[32m\" : \"\\x1b[31m\"; // Green or Red\r\n const reset = \"\\x1b[0m\";\r\n\r\n let output = `${color}${icon}${reset} ${result.name}: ${result.description}`;\r\n\r\n if (!result.passed && result.suggestion) {\r\n output += `\\n └─ ${result.suggestion}`;\r\n }\r\n\r\n return output;\r\n}\r\n\r\n/**\r\n * Execute the doctor command.\r\n */\r\nexport async function doctorCommand(): Promise<void> {\r\n console.log(\"\\nMuggle MCP Doctor\");\r\n console.log(\"=================\\n\");\r\n\r\n const results = runDiagnostics();\r\n\r\n for (const result of results) {\r\n console.log(formatCheckResult(result));\r\n }\r\n\r\n console.log(\"\");\r\n\r\n const failedCount = results.filter((r) => !r.passed).length;\r\n\r\n if (failedCount === 0) {\r\n console.log(\"All checks passed! Your installation is ready.\");\r\n } else {\r\n console.log(`${failedCount} issue(s) found. See suggestions above.`);\r\n }\r\n\r\n logger.info(\"Doctor command completed\", {\r\n totalChecks: results.length,\r\n passed: results.length - failedCount,\r\n failed: failedCount,\r\n });\r\n}\r\n","/**\r\n * Login/logout/status commands for authentication.\r\n */\r\n\r\nimport { performLogin, performLogout } from \"../shared/auth.js\";\r\nimport { getAuthStatus } from \"../shared/credentials.js\";\r\nimport { getLogger } from \"../shared/logger.js\";\r\n\r\nconst logger = getLogger();\r\n\r\n/**\r\n * Options for the login command.\r\n */\r\nexport interface ILoginOptions {\r\n /** Name for the API key. */\r\n keyName?: string;\r\n /** API key expiry: 30d, 90d, 1y, never. */\r\n keyExpiry?: string;\r\n}\r\n\r\n/**\r\n * Execute the login command.\r\n * @param options - Command options.\r\n */\r\nexport async function loginCommand(options: ILoginOptions): Promise<void> {\r\n console.log(\"\\nMuggle AI Login\");\r\n console.log(\"===============\\n\");\r\n\r\n const expiry = (options.keyExpiry || \"90d\") as \"30d\" | \"90d\" | \"1y\" | \"never\";\r\n\r\n console.log(\"Starting device code authentication...\");\r\n console.log(\"A browser window will open for you to complete login.\\n\");\r\n\r\n const result = await performLogin(options.keyName, expiry);\r\n\r\n if (result.success) {\r\n console.log(\"✓ Login successful!\");\r\n\r\n if (result.credentials?.email) {\r\n console.log(` Logged in as: ${result.credentials.email}`);\r\n }\r\n\r\n if (result.credentials?.apiKey) {\r\n console.log(\" API key created and stored for future use.\");\r\n }\r\n\r\n console.log(\"\\nYou can now use Muggle AI MCP tools.\");\r\n } else {\r\n console.error(\"✗ Login failed\");\r\n\r\n if (result.error) {\r\n console.error(` Error: ${result.error}`);\r\n }\r\n\r\n if (result.deviceCodeResponse) {\r\n console.log(\"\\nIf browser didn't open, visit:\");\r\n console.log(` ${result.deviceCodeResponse.verificationUriComplete}`);\r\n console.log(` Code: ${result.deviceCodeResponse.userCode}`);\r\n }\r\n\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * Execute the logout command.\r\n */\r\nexport async function logoutCommand(): Promise<void> {\r\n console.log(\"\\nLogging out...\");\r\n\r\n performLogout();\r\n\r\n console.log(\"✓ Credentials cleared successfully.\");\r\n logger.info(\"Logout completed\");\r\n}\r\n\r\n/**\r\n * Execute the status command.\r\n */\r\nexport async function statusCommand(): Promise<void> {\r\n console.log(\"\\nAuthentication Status\");\r\n console.log(\"=====================\\n\");\r\n\r\n const status = getAuthStatus();\r\n\r\n if (status.authenticated) {\r\n console.log(\"✓ Authenticated\");\r\n\r\n if (status.email) {\r\n console.log(` Email: ${status.email}`);\r\n }\r\n\r\n if (status.userId) {\r\n console.log(` User ID: ${status.userId}`);\r\n }\r\n\r\n if (status.expiresAt) {\r\n const expiresDate = new Date(status.expiresAt);\r\n console.log(` Token expires: ${expiresDate.toLocaleString()}`);\r\n }\r\n\r\n console.log(` API Key: ${status.hasApiKey ? \"Yes\" : \"No\"}`);\r\n } else {\r\n console.log(\"✗ Not authenticated\");\r\n console.log(\"\\nRun 'muggle-mcp login' to authenticate.\");\r\n }\r\n}\r\n","/**\r\n * Serve command - starts the MCP server.\r\n */\r\n\r\nimport { getLocalQaTools } from \"../local-qa/index.js\";\r\nimport { getQaTools } from \"../qa/index.js\";\r\nimport { getConfig } from \"../shared/config.js\";\r\nimport { getLogger } from \"../shared/logger.js\";\r\nimport { createUnifiedMcpServer, registerTools, startStdioServer } from \"../server/index.js\";\r\n\r\nconst logger = getLogger();\r\n\r\n/**\r\n * Options for the serve command.\r\n */\r\nexport interface IServeOptions {\r\n /** Only enable Cloud QA tools. */\r\n qa?: boolean;\r\n /** Only enable Local QA tools. */\r\n local?: boolean;\r\n /** Use stdio transport. */\r\n stdio?: boolean;\r\n}\r\n\r\n/**\r\n * Execute the serve command.\r\n * @param options - Command options.\r\n */\r\nexport async function serveCommand(options: IServeOptions): Promise<void> {\r\n const config = getConfig();\r\n\r\n // Determine which tool sets to enable\r\n const enableQa = options.local ? false : true;\r\n const enableLocal = options.qa ? false : true;\r\n\r\n logger.info(\"Starting Muggle MCP Server\", {\r\n version: config.serverVersion,\r\n enableQa: enableQa,\r\n enableLocal: enableLocal,\r\n transport: \"stdio\",\r\n });\r\n\r\n try {\r\n // Register tools based on options\r\n if (enableQa) {\r\n const qaTools = getQaTools();\r\n registerTools(qaTools);\r\n logger.info(\"Registered QA tools\", { count: qaTools.length });\r\n }\r\n\r\n if (enableLocal) {\r\n const localTools = getLocalQaTools();\r\n registerTools(localTools);\r\n logger.info(\"Registered Local QA tools\", { count: localTools.length });\r\n }\r\n\r\n // Create unified MCP server\r\n const mcpServer = createUnifiedMcpServer({\r\n enableQaTools: enableQa,\r\n enableLocalTools: enableLocal,\r\n });\r\n\r\n // Start stdio server (MCP clients communicate via stdin/stdout)\r\n await startStdioServer(mcpServer);\r\n\r\n logger.info(\"MCP server started successfully\");\r\n } catch (error) {\r\n logger.error(\"Failed to start MCP server\", {\r\n error: error instanceof Error ? error.message : String(error),\r\n stack: error instanceof Error ? error.stack : undefined,\r\n });\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Setup command - downloads/updates the Electron app.\r\n */\r\n\r\nimport { exec } from \"child_process\";\r\nimport { createWriteStream, existsSync, mkdirSync, rmSync } from \"fs\";\r\nimport { platform } from \"os\";\r\nimport { pipeline } from \"stream/promises\";\r\n\r\nimport {\r\n getDownloadBaseUrl,\r\n getElectronAppDir,\r\n getElectronAppVersion,\r\n isElectronAppInstalled,\r\n} from \"../shared/config.js\";\r\nimport { getLogger } from \"../shared/logger.js\";\r\n\r\nconst logger = getLogger();\r\n\r\n/**\r\n * Options for the setup command.\r\n */\r\nexport interface ISetupOptions {\r\n /** Force re-download even if already installed. */\r\n force?: boolean;\r\n}\r\n\r\n/**\r\n * Get platform-specific binary name.\r\n * @returns Binary filename.\r\n */\r\nfunction getBinaryName(): string {\r\n const os = platform();\r\n switch (os) {\r\n case \"darwin\":\r\n return \"muggle-test-darwin-arm64.zip\";\r\n case \"win32\":\r\n return \"muggle-test-win32-x64.zip\";\r\n case \"linux\":\r\n return \"muggle-test-linux-x64.tar.gz\";\r\n default:\r\n throw new Error(`Unsupported platform: ${os}`);\r\n }\r\n}\r\n\r\n/**\r\n * Extract a zip file.\r\n * @param zipPath - Path to zip file.\r\n * @param destDir - Destination directory.\r\n */\r\nasync function extractZip(zipPath: string, destDir: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const cmd =\r\n platform() === \"win32\"\r\n ? `powershell -command \"Expand-Archive -Path '${zipPath}' -DestinationPath '${destDir}' -Force\"`\r\n : `unzip -o \"${zipPath}\" -d \"${destDir}\"`;\r\n\r\n exec(cmd, (error) => {\r\n if (error) {\r\n reject(error);\r\n } else {\r\n resolve();\r\n }\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Extract a tar.gz file.\r\n * @param tarPath - Path to tar.gz file.\r\n * @param destDir - Destination directory.\r\n */\r\nasync function extractTarGz(tarPath: string, destDir: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n exec(`tar -xzf \"${tarPath}\" -C \"${destDir}\"`, (error) => {\r\n if (error) {\r\n reject(error);\r\n } else {\r\n resolve();\r\n }\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Execute the setup command.\r\n * @param options - Command options.\r\n */\r\nexport async function setupCommand(options: ISetupOptions): Promise<void> {\r\n const version = getElectronAppVersion();\r\n const baseUrl = getDownloadBaseUrl();\r\n const versionDir = getElectronAppDir(version);\r\n\r\n // Check if already installed\r\n if (!options.force && isElectronAppInstalled()) {\r\n console.log(`Electron app v${version} is already installed at ${versionDir}`);\r\n console.log(\"Use --force to re-download.\");\r\n return;\r\n }\r\n\r\n const binaryName = getBinaryName();\r\n const downloadUrl = `${baseUrl}/electron-app-v${version}/${binaryName}`;\r\n\r\n console.log(`Downloading Muggle Test Electron app v${version}...`);\r\n console.log(`URL: ${downloadUrl}`);\r\n\r\n try {\r\n // Create directory\r\n if (existsSync(versionDir)) {\r\n rmSync(versionDir, { recursive: true, force: true });\r\n }\r\n mkdirSync(versionDir, { recursive: true });\r\n\r\n // Download\r\n const response = await fetch(downloadUrl);\r\n if (!response.ok) {\r\n throw new Error(`Download failed: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const tempFile = `${versionDir}/${binaryName}`;\r\n const fileStream = createWriteStream(tempFile);\r\n\r\n if (!response.body) {\r\n throw new Error(\"No response body\");\r\n }\r\n\r\n await pipeline(response.body as unknown as NodeJS.ReadableStream, fileStream);\r\n\r\n console.log(\"Download complete, extracting...\");\r\n\r\n // Extract based on file type\r\n if (binaryName.endsWith(\".zip\")) {\r\n await extractZip(tempFile, versionDir);\r\n } else if (binaryName.endsWith(\".tar.gz\")) {\r\n await extractTarGz(tempFile, versionDir);\r\n }\r\n\r\n // Clean up temp file\r\n rmSync(tempFile, { force: true });\r\n\r\n console.log(`Electron app installed to ${versionDir}`);\r\n logger.info(\"Setup complete\", { version: version, path: versionDir });\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n console.error(`Failed to download Electron app: ${errorMessage}`);\r\n logger.error(\"Setup failed\", { error: errorMessage });\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * CLI entry point for @muggleai/mcp.\r\n * Provides commands for serving MCP, setup, diagnostics, and authentication.\r\n */\r\n\r\nimport { Command } from \"commander\";\r\n\r\nimport { getLogger } from \"../shared/logger.js\";\r\n\r\nimport { doctorCommand } from \"./doctor.js\";\r\nimport { loginCommand, logoutCommand, statusCommand } from \"./login.js\";\r\nimport { serveCommand } from \"./serve.js\";\r\nimport { setupCommand } from \"./setup.js\";\r\n\r\nconst logger = getLogger();\r\n\r\n/**\r\n * Create and configure the CLI program.\r\n * @returns Configured Commander program.\r\n */\r\nfunction createProgram(): Command {\r\n const program = new Command();\r\n\r\n program\r\n .name(\"muggle-mcp\")\r\n .description(\"Unified MCP server for Muggle AI - Cloud QA and Local Testing\")\r\n .version(\"1.0.0\");\r\n\r\n // Serve command (main command)\r\n program\r\n .command(\"serve\")\r\n .description(\"Start the MCP server\")\r\n .option(\"--qa\", \"Only enable Cloud QA tools\")\r\n .option(\"--local\", \"Only enable Local QA tools\")\r\n .option(\"--stdio\", \"Use stdio transport (default)\")\r\n .action(serveCommand);\r\n\r\n // Setup command\r\n program\r\n .command(\"setup\")\r\n .description(\"Download/update the Electron app for local testing\")\r\n .option(\"--force\", \"Force re-download even if already installed\")\r\n .action(setupCommand);\r\n\r\n // Doctor command\r\n program\r\n .command(\"doctor\")\r\n .description(\"Diagnose installation and configuration issues\")\r\n .action(doctorCommand);\r\n\r\n // Login command\r\n program\r\n .command(\"login\")\r\n .description(\"Authenticate with Muggle AI (uses device code flow)\")\r\n .option(\"--key-name <name>\", \"Name for the API key\")\r\n .option(\"--key-expiry <expiry>\", \"API key expiry: 30d, 90d, 1y, never\", \"90d\")\r\n .action(loginCommand);\r\n\r\n // Logout command\r\n program\r\n .command(\"logout\")\r\n .description(\"Clear stored credentials\")\r\n .action(logoutCommand);\r\n\r\n // Status command\r\n program\r\n .command(\"status\")\r\n .description(\"Show authentication status\")\r\n .action(statusCommand);\r\n\r\n // Default to serve when no command specified\r\n program.action(() => {\r\n serveCommand({ stdio: true });\r\n });\r\n\r\n return program;\r\n}\r\n\r\n/**\r\n * Run the CLI.\r\n */\r\nexport async function runCli(): Promise<void> {\r\n try {\r\n const program = createProgram();\r\n await program.parseAsync(process.argv);\r\n } catch (error) {\r\n logger.error(\"CLI error\", {\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n process.exit(1);\r\n }\r\n}\r\n","#!/usr/bin/env node\r\n/**\r\n * CLI entry point for muggle-mcp.\r\n */\r\n\r\nimport { runCli } from \"./index.js\";\r\n\r\nrunCli().catch((error) => {\r\n console.error(\"Fatal error:\", error instanceof Error ? error.message : String(error));\r\n process.exit(1);\r\n});\r\n"]}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @muggleai/mcp - Unified MCP Server for Muggle AI
3
+ *
4
+ * This package provides a single MCP server that combines:
5
+ * - Cloud QA tools (from mcp-qa-gateway)
6
+ * - Local testing tools (from local-mcp)
7
+ *
8
+ * Usage:
9
+ * # Start MCP server (default - all tools)
10
+ * muggle-mcp serve
11
+ * muggle-mcp
12
+ *
13
+ * # Start with specific tool sets
14
+ * muggle-mcp serve --qa # Cloud QA tools only
15
+ * muggle-mcp serve --local # Local testing tools only
16
+ *
17
+ * # Setup and diagnostics
18
+ * muggle-mcp setup # Download Electron app
19
+ * muggle-mcp doctor # Diagnose installation
20
+ *
21
+ * # Authentication
22
+ * muggle-mcp login # Authenticate with Muggle AI
23
+ * muggle-mcp logout # Clear credentials
24
+ * muggle-mcp status # Show auth status
25
+ */
26
+ export * as shared from "./shared/index.js";
27
+ export * as server from "./server/index.js";
28
+ export * as qa from "./qa/index.js";
29
+ export * as localQa from "./local-qa/index.js";
30
+ export { getConfig } from "./shared/index.js";
31
+ export { getLogger, createChildLogger } from "./shared/index.js";
32
+ export { createUnifiedMcpServer } from "./server/index.js";
33
+ export { getQaTools } from "./qa/index.js";
34
+ export { getLocalQaTools } from "./local-qa/index.js";
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,36 @@
1
+ import { __export, toolRequiresAuth, startDeviceCodeFlow, saveCredentials, resetLogger, resetConfig, pollDeviceCode, performLogout, performLogin, openBrowserUrl, loadCredentials, isElectronAppInstalled, isCredentialsExpired, getValidCredentials, getLogger, getElectronAppVersion, getElectronAppDir, getDownloadBaseUrl, getDataDir, getCredentialsFilePath, getConfig, getCallerCredentials, getAuthStatus, deleteCredentials, createChildLogger, createApiKeyWithToken } from './chunk-6DQWAMGJ.js';
2
+ export { createChildLogger, createUnifiedMcpServer, getConfig, getLocalQaTools, getLogger, getQaTools, local_qa_exports as localQa, qa_exports as qa, server_exports as server } from './chunk-6DQWAMGJ.js';
3
+
4
+ // src/shared/index.ts
5
+ var shared_exports = {};
6
+ __export(shared_exports, {
7
+ createApiKeyWithToken: () => createApiKeyWithToken,
8
+ createChildLogger: () => createChildLogger,
9
+ deleteCredentials: () => deleteCredentials,
10
+ getAuthStatus: () => getAuthStatus,
11
+ getCallerCredentials: () => getCallerCredentials,
12
+ getConfig: () => getConfig,
13
+ getCredentialsFilePath: () => getCredentialsFilePath,
14
+ getDataDir: () => getDataDir,
15
+ getDownloadBaseUrl: () => getDownloadBaseUrl,
16
+ getElectronAppDir: () => getElectronAppDir,
17
+ getElectronAppVersion: () => getElectronAppVersion,
18
+ getLogger: () => getLogger,
19
+ getValidCredentials: () => getValidCredentials,
20
+ isCredentialsExpired: () => isCredentialsExpired,
21
+ isElectronAppInstalled: () => isElectronAppInstalled,
22
+ loadCredentials: () => loadCredentials,
23
+ openBrowserUrl: () => openBrowserUrl,
24
+ performLogin: () => performLogin,
25
+ performLogout: () => performLogout,
26
+ pollDeviceCode: () => pollDeviceCode,
27
+ resetConfig: () => resetConfig,
28
+ resetLogger: () => resetLogger,
29
+ saveCredentials: () => saveCredentials,
30
+ startDeviceCodeFlow: () => startDeviceCodeFlow,
31
+ toolRequiresAuth: () => toolRequiresAuth
32
+ });
33
+
34
+ export { shared_exports as shared };
35
+ //# sourceMappingURL=index.js.map
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/index.ts"],"names":[],"mappings":";;;;AAAA,IAAA,cAAA,GAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA;AAAA,CAAA,CAAA","file":"index.js","sourcesContent":["/**\r\n * Shared module exports for @muggleai/mcp.\r\n */\r\n\r\nexport * from \"./auth.js\";\r\nexport * from \"./config.js\";\r\nexport * from \"./credentials.js\";\r\nexport * from \"./logger.js\";\r\nexport * from \"./open-browser.js\";\r\nexport * from \"./types.js\";\r\n"]}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Zod schemas for auth-related tools.
3
+ */
4
+ import { z } from "zod";
5
+ /**
6
+ * Auth login input schema.
7
+ */
8
+ export declare const AuthLoginInputSchema: z.ZodObject<{
9
+ waitForCompletion: z.ZodOptional<z.ZodBoolean>;
10
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ waitForCompletion?: boolean | undefined;
13
+ timeoutMs?: number | undefined;
14
+ }, {
15
+ waitForCompletion?: boolean | undefined;
16
+ timeoutMs?: number | undefined;
17
+ }>;
18
+ export type AuthLoginInput = z.infer<typeof AuthLoginInputSchema>;
19
+ /**
20
+ * Auth poll input schema.
21
+ */
22
+ export declare const AuthPollInputSchema: z.ZodObject<{
23
+ deviceCode: z.ZodOptional<z.ZodString>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ deviceCode?: string | undefined;
26
+ }, {
27
+ deviceCode?: string | undefined;
28
+ }>;
29
+ export type AuthPollInput = z.infer<typeof AuthPollInputSchema>;
30
+ /**
31
+ * Empty input schema for tools that take no parameters.
32
+ */
33
+ export declare const EmptyInputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
34
+ export type EmptyInput = z.infer<typeof EmptyInputSchema>;
35
+ //# sourceMappingURL=auth-schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-schemas.d.ts","sourceRoot":"","sources":["../../../src/local-qa/contracts/auth-schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;EAG/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;EAE9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,gBAAgB,gDAAe,CAAC;AAE7C,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Re-export all contract schemas.
3
+ */
4
+ export * from "./auth-schemas.js";
5
+ export * from "./project-schemas.js";
6
+ export * from "./session-schemas.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/local-qa/contracts/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC"}