UNPKG

remcode

Version:

Turn your AI assistant into a codebase expert. Intelligent code analysis, semantic search, and software engineering guidance through MCP integration.

189 lines (188 loc) 8.07 kB
"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 }); const commander_1 = require("commander"); const analyze_1 = require("./commands/analyze"); const vectorize_1 = require("./commands/vectorize"); const update_1 = require("./commands/update"); const serve_1 = require("./commands/serve"); const process_1 = require("./commands/process"); const inspector_1 = require("./commands/inspector"); const chalk_1 = __importDefault(require("chalk")); const dotenv_1 = __importDefault(require("dotenv")); const fs = __importStar(require("fs")); const path = __importStar(require("path")); // Load environment variables dotenv_1.default.config(); // Get version from package.json dynamically function getPackageVersion() { try { const packageJsonPath = path.join(__dirname, '..', 'package.json'); const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); return packageJson.version; } catch (error) { // Fallback version if package.json cannot be read return '0.1.7'; } } // Create the program const program = new commander_1.Command(); // Set program information program .name('remcode') .description('A code vectorization and analysis tool for better understanding of codebases') .version(getPackageVersion()); // Add commands (0, analyze_1.analyzeCommand)(program); (0, vectorize_1.vectorizeCommand)(program); (0, update_1.updateCommand)(program); (0, process_1.processCommand)(program); (0, serve_1.serveCommand)(program); (0, inspector_1.inspectorCommand)(program); // Add help information program.on('--help', () => { console.log(''); console.log('Examples:'); console.log(' $ remcode analyze ./my-project'); console.log(' $ remcode vectorize ./my-project --analysis ./analysis.json'); console.log(' $ remcode process --type auto'); console.log(' $ remcode update --since-commit abc123'); console.log(' $ remcode serve --port 3000'); console.log(' $ remcode inspector # Interactive MCP tool testing'); }); // Error handling program.showHelpAfterError('(add --help for additional information)'); // Handle unknown commands program.on('command:*', (operands) => { console.error(chalk_1.default.red(`error: unknown command '${operands[0]}'`)); const availableCommands = program.commands.map(cmd => cmd.name()); console.error(chalk_1.default.red(`Available commands: ${availableCommands.join(', ')}`)); process.exitCode = 1; }); // Smart auto-routing when no arguments provided if (!process.argv.slice(2).length) { autoRoute(); } else { // Parse arguments normally when commands are provided program.parse(process.argv); } /** * Smart auto-routing based on context detection * Automatically determines the appropriate action based on environment */ function autoRoute() { console.log(chalk_1.default.blue('🔍 Auto-detecting context...')); // 1. Check if called from MCP environment if (isMCPEnvironment()) { console.log(chalk_1.default.green('📡 MCP environment detected - starting server...')); program.parse(['node', 'remcode', 'serve']); return; } // 2. Check if in Git repository if (!isGitRepository()) { console.log(chalk_1.default.yellow('📖 No Git repository found - showing help...')); program.outputHelp(); console.log('\n' + chalk_1.default.cyan('💡 To use Remcode:')); console.log(chalk_1.default.cyan(' 1. Navigate to a Git repository')); console.log(chalk_1.default.cyan(' 2. Add Remcode to your AI assistant (see README.md)')); console.log(chalk_1.default.cyan(' 3. Ask questions about your codebase')); return; } // 3. Check if already configured if (hasRemcodeConfig()) { console.log(chalk_1.default.green('⚙️ Configuration found - starting server...')); program.parse(['node', 'remcode', 'serve']); return; } // 4. First time in Git repo - suggest MCP setup console.log(chalk_1.default.yellow('🚀 First time setup detected')); console.log('\n' + chalk_1.default.cyan('🎯 Quick Setup:')); console.log(chalk_1.default.cyan(' Add this to your AI assistant configuration:')); console.log(chalk_1.default.gray(' {')); console.log(chalk_1.default.gray(' "mcpServers": {')); console.log(chalk_1.default.gray(' "remcode": {')); console.log(chalk_1.default.gray(' "command": "npx",')); console.log(chalk_1.default.gray(' "args": ["remcode"],')); console.log(chalk_1.default.gray(' "env": {')); console.log(chalk_1.default.gray(' "PINECONE_API_KEY": "your_key_here",')); console.log(chalk_1.default.gray(' "HUGGINGFACE_TOKEN": "your_token_here",')); console.log(chalk_1.default.gray(' "GITHUB_TOKEN": "your_github_token"')); console.log(chalk_1.default.gray(' }')); console.log(chalk_1.default.gray(' }')); console.log(chalk_1.default.gray(' }')); console.log(chalk_1.default.gray(' }')); console.log('\n' + chalk_1.default.cyan('📚 Get API keys:')); console.log(chalk_1.default.cyan(' • Pinecone: https://app.pinecone.io/organizations/-/projects/-/keys')); console.log(chalk_1.default.gray(' → Sign up free → Create project → Copy API key')); console.log(chalk_1.default.cyan(' • HuggingFace: https://huggingface.co/settings/tokens')); console.log(chalk_1.default.gray(' → Sign up free → New token → Read permission → Copy')); console.log(chalk_1.default.cyan(' • GitHub: https://github.com/settings/tokens/new?scopes=repo,workflow&description=Remcode%20MCP%20Tools')); console.log(chalk_1.default.gray(' → Generate token → Select repo,workflow scopes → Copy')); console.log('\n' + chalk_1.default.green('💡 Total setup time: ~30 seconds')); } /** * Detect if running in MCP environment */ function isMCPEnvironment() { // Check for MCP-specific environment variables return !!(process.env.PINECONE_API_KEY || process.env.HUGGINGFACE_TOKEN || process.env.GITHUB_TOKEN); } /** * Check if current directory is a Git repository */ function isGitRepository() { try { return fs.existsSync(path.join(process.cwd(), '.git')); } catch { return false; } } /** * Check if Remcode configuration exists */ function hasRemcodeConfig() { try { return fs.existsSync(path.join(process.cwd(), '.remcode')); } catch { return false; } }