@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
JavaScript
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
;