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
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 });
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;
}
}
;