UNPKG

@sigyl-dev/cli

Version:

Official Sigyl CLI for installing and managing MCP packages. Zero-config installation for public packages, secure API-based authentication.

301 lines 14 kB
#!/usr/bin/env node "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); require("dotenv/config"); const commander_1 = require("commander"); const chalk_1 = __importDefault(require("chalk")); const scan_1 = require("./commands/scan"); const init_1 = require("./commands/init"); const dev_1 = require("./commands/dev"); const install_1 = require("./commands/install"); const run_1 = require("./commands/run"); const inspect_1 = __importDefault(require("./commands/inspect")); const integrate_1 = require("./commands/integrate"); const config_1 = require("./commands/config"); const node_fs_1 = require("node:fs"); const node_path_1 = require("node:path"); const wizard_1 = require("./wizard"); // Read version from package.json const packageJson = require('../package.json'); const program = new commander_1.Command(); program .name("sigyl/cli") .description("Sigyl/CLI: Add Model Context Protocol (MCP) endpoints to your Express/Node.js applications. Zero-config AI tool integration for REST APIs.") .version(packageJson.version); // ============================================================================ // CONFIG Command - Configure CLI settings // ============================================================================ program.addCommand(config_1.configCommand); // ============================================================================ // INTEGRATE Command - Recommended developer flow // ============================================================================ program .command("integrate") .description("Integrate MCP endpoints into your existing Express app (recommended)") .option("--out <directory>", "Output directory for integration code", ".sigyl-mcp") .option("--endpoint <path>", "MCP endpoint path", "/mcp") .option("--auto-add", "(Coming soon) Automatically add integration to your app") .option("-l, --language <language>", "Server language (typescript|javascript)", "typescript") .argument("[directory]", "Directory containing Express app", ".") .action(async (directory, options) => { try { console.log(chalk_1.default.blue("🔗 Sigyl MCP Integration")); console.log(chalk_1.default.gray("Integrating MCP endpoints into your Express app...\n")); await (0, integrate_1.integrateWithExpress)({ directory, outDir: options.out, serverLanguage: options.language, autoAdd: options.autoAdd, endpoint: options.endpoint }); } catch (error) { console.error(chalk_1.default.red("❌ Integration failed:"), error); process.exit(1); } }); // ============================================================================ // SCAN Command - Legacy/advanced // ============================================================================ program .command("scan") .description("Scan Express application and generate standalone MCP server (legacy)") .argument("[directory]", "Directory to scan (default: current directory)", ".") .option("-o, --out <directory>", "Output directory for generated server", ".mcp-generated") .option("-p, --port <port>", "Port where your Express app runs", "3000") .option("-l, --language <language>", "Server language (typescript|javascript)", "typescript") .option("--framework <framework>", "Web framework (express)", "express") .action(async (directory, options) => { try { console.log(chalk_1.default.blue("🔍 Sigyl MCP Server Generator")); console.log(chalk_1.default.gray("Scanning Express application and generating MCP server...\n")); await (0, scan_1.scanAndGenerate)(directory, { outDir: options.out, serverLanguage: options.language, port: options.port, framework: options.framework }); } catch (error) { console.error(chalk_1.default.red("❌ Scan failed:"), error); process.exit(1); } }); // ============================================================================ // INIT Command - Create template server (legacy) // ============================================================================ program .command("init") .description("Create a template MCP server with sample tools (legacy)") .option("-o, --out <directory>", "Output directory", ".mcp-generated") .option("-l, --language <language>", "Server language (typescript|javascript)", "typescript") .option("-n, --name <name>", "Server name", "my-mcp-server") .action(async (options) => { try { console.log(chalk_1.default.blue("🔧 Sigyl MCP Template Generator")); console.log(chalk_1.default.gray("Creating template MCP server...\n")); await (0, init_1.initTemplate)({ outDir: options.out, serverLanguage: options.language, name: options.name }); } catch (error) { console.error(chalk_1.default.red("❌ Template creation failed:"), error); process.exit(1); } }); // ============================================================================ // DEV Command - Development mode (legacy) // ============================================================================ program .command("dev") .description("Start development mode with hot reload (legacy)") .argument("[directory]", "Directory containing Express app", ".") .option("-p, --port <port>", "MCP server port", "8181") .option("--app-port <port>", "Express app port", "3000") .option("-l, --language <language>", "Server language (typescript|javascript)", "typescript") .option("--no-open", "Don't open MCP Inspector automatically") .action(async (directory, options) => { try { console.log(chalk_1.default.blue("🚀 Sigyl MCP Development Mode")); console.log(chalk_1.default.gray("Starting development server with hot reload...\n")); await (0, dev_1.dev)({ directory, port: options.port, appPort: options.appPort, serverLanguage: options.language, open: options.open }); } catch (error) { console.error(chalk_1.default.red("❌ Development mode failed:"), error); process.exit(1); } }); // ============================================================================ // INSPECT Command - Launch MCP Inspector // ============================================================================ program .command("inspect") .description("Launch MCP Inspector to test your server or endpoint") .argument("[server-path]", "Path or URL to MCP server (default: .sigyl-mcp/integration or .mcp-generated/server.js)", ".sigyl-mcp/integration") .option("--server-port <port>", "Port for MCP server (default: 8080)") .option("--playground-port <port>", "Port for Inspector Playground UI (default: 3001)") .option("--playground-dir <dir>", "Path to Inspector Playground directory (default: playground)") .option("--auto-build-playground", "Auto-build playground UI if missing") .option("--inspector-mode <mode>", "Inspector mode: local (default) or remote", "local") .action(async (serverPath, options) => { try { console.log(chalk_1.default.blue("🕵️ Sigyl MCP Inspector")); console.log(chalk_1.default.gray("Launching MCP Inspector UI...\n")); await (0, inspect_1.default)([], serverPath, { serverPort: options.serverPort ? parseInt(options.serverPort, 10) : undefined, playgroundPort: options.playgroundPort ? parseInt(options.playgroundPort, 10) : undefined, playgroundDir: options.playgroundDir, autoBuildPlayground: !!options.autoBuildPlayground, inspectorMode: options.inspectorMode, }); } catch (error) { console.error(chalk_1.default.red("❌ Inspector launch failed:"), error); process.exit(1); } }); // ============================================================================ // INSTALL Command - Install in Claude Desktop (legacy) // ============================================================================ program.addCommand((0, install_1.createInstallCommand)()); // ============================================================================ // RUN Command - Run MCP server // ============================================================================ program.addCommand((0, run_1.createRunCommand)()); // ============================================================================ // CLEAN Command - Clean generated files (legacy) // ============================================================================ program .command("clean") .description("Clean generated MCP server files (legacy)") .option("-o, --out <directory>", "Output directory to clean", ".mcp-generated") .action((options) => { try { const outDir = options.out; if ((0, node_fs_1.existsSync)(outDir)) { (0, node_fs_1.rmSync)(outDir, { recursive: true, force: true }); console.log(chalk_1.default.green(`✅ Cleaned ${outDir} directory`)); } else { console.log(chalk_1.default.yellow(`⚠️ Directory ${outDir} not found`)); } } catch (error) { console.error(chalk_1.default.red("❌ Clean failed:"), error); process.exit(1); } }); // ============================================================================ // BUILD Command - Build MCP server (legacy) // ============================================================================ program .command("build") .description("Build MCP server from TypeScript to JavaScript (legacy)") .argument("[directory]", "Directory containing MCP server", ".mcp-generated") .action(async (directory) => { try { console.log(chalk_1.default.blue("🔨 Building Sigyl MCP Server")); console.log(chalk_1.default.gray("Compiling TypeScript to JavaScript...\n")); const packageJsonPath = (0, node_path_1.join)(directory, "package.json"); const tsconfigPath = (0, node_path_1.join)(directory, "tsconfig.json"); if (!(0, node_fs_1.existsSync)(packageJsonPath)) { console.error(chalk_1.default.red(`❌ No package.json found in ${directory}`)); console.log(chalk_1.default.blue("💡 Generate a server first with:")); console.log(chalk_1.default.gray(" sigyl scan")); process.exit(1); } if (!(0, node_fs_1.existsSync)(tsconfigPath)) { console.error(chalk_1.default.red(`❌ No tsconfig.json found in ${directory}`)); process.exit(1); } const { spawn } = await Promise.resolve().then(() => __importStar(require("node:child_process"))); const tscProcess = spawn("npx", ["tsc"], { cwd: directory, stdio: "inherit" }); tscProcess.on("exit", (code) => { if (code === 0) { console.log(chalk_1.default.green("✅ Build completed successfully")); } else { console.error(chalk_1.default.red("❌ Build failed")); process.exit(1); } }); } catch (error) { console.error(chalk_1.default.red("❌ Build failed:"), error); process.exit(1); } }); // ============================================================================ // WIZARD Command - Launch interactive setup wizard // ============================================================================ program .command("wizard") .description("Launch interactive setup wizard") .action(wizard_1.runWizard); // ============================================================================ // ERROR HANDLING // ============================================================================ program.configureOutput({ writeErr: (str) => process.stderr.write(chalk_1.default.red(str)), writeOut: (str) => process.stdout.write(str), }); process.on("unhandledRejection", (reason, promise) => { console.error(chalk_1.default.red("❌ Unhandled Rejection at:"), promise, chalk_1.default.red("reason:"), reason); process.exit(1); }); process.on("uncaughtException", (error) => { console.error(chalk_1.default.red("❌ Uncaught Exception:"), error); process.exit(1); }); if (require.main === module) { program.parse(); } exports.default = program; //# sourceMappingURL=index.js.map