@diazpolanco13/context-control-mcp
Version:
🔥 Context Control MCP v5.0 PORTABLE EDITION - Análisis universal de proyectos que funciona en CUALQUIER entorno. Contexto completo automático para IA.
534 lines (440 loc) • 17.4 kB
JavaScript
// 🔥 Context Control MCP - FULL CONTEXT COMMAND
// EL comando definitivo para IA nueva - TODO el contexto necesario automáticamente
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
console.error('🔥 Context Control MCP - FULL CONTEXT GENERATOR');
console.error('==================================================================');
console.error('🤖 Generando contexto COMPLETO para nueva sesión de IA...');
console.error('📚 Incluye: historial, comandos, archivos clave, problemas, roadmap');
console.error('==================================================================');
// 🛡️ UTILIDADES SEGURAS
function safeExec(command) {
try {
return execSync(command, { encoding: 'utf8', stdio: 'pipe' }).trim();
} catch {
return null;
}
}
function safeReadFile(filePath) {
try {
return fs.readFileSync(filePath, 'utf8');
} catch {
return null;
}
}
function safeFileExists(filePath) {
try {
return fs.existsSync(filePath);
} catch {
return false;
}
}
// 📚 1. HISTORIAL DE VERSIONES Y DESARROLLO
function analyzeVersionHistory() {
console.error('📚 Analizando historial de versiones...');
const history = {
gitAvailable: false,
totalCommits: 0,
recentCommits: [],
branches: [],
tags: [],
firstCommit: null,
lastCommit: null,
development: {
activeFiles: [],
recentChanges: [],
workingDirectory: 'clean'
}
};
// Git analysis
if (safeExec('git --version')) {
history.gitAvailable = true;
// Total commits
const commitCount = safeExec('git rev-list --count HEAD');
history.totalCommits = commitCount ? parseInt(commitCount) : 0;
// Recent commits (last 10)
const recentLog = safeExec('git log --oneline -10');
if (recentLog) {
history.recentCommits = recentLog.split('\n').map(line => {
const [hash, ...messageParts] = line.split(' ');
return { hash: hash.substring(0, 7), message: messageParts.join(' ') };
});
}
// Branches
const branches = safeExec('git branch -a');
if (branches) {
history.branches = branches.split('\n')
.map(b => b.replace('*', '').trim())
.filter(b => b && !b.includes('->'));
}
// Tags/releases
const tags = safeExec('git tag -l');
if (tags) {
history.tags = tags.split('\n').filter(t => t.trim());
}
// First and last commit
history.firstCommit = safeExec('git log --reverse --oneline | head -1');
history.lastCommit = safeExec('git log --oneline -1');
// Working directory status
const status = safeExec('git status --porcelain');
if (status) {
history.development.workingDirectory = 'dirty';
history.development.activeFiles = status.split('\n')
.filter(line => line.trim())
.map(line => ({
status: line.substring(0, 2).trim(),
file: line.substring(3)
}));
}
// Recent file changes
const changedFiles = safeExec('git diff --name-only HEAD~5 HEAD');
if (changedFiles) {
history.development.recentChanges = changedFiles.split('\n').filter(f => f.trim());
}
}
return history;
}
// 📦 2. INFORMACIÓN COMPLETA DEL PROYECTO
function analyzeProjectComplete() {
console.error('📦 Analizando proyecto completo...');
const project = {
basic: {},
scripts: [],
dependencies: {
production: {},
development: {},
critical: [],
problematic: []
},
files: {
key: [],
documentation: [],
config: [],
code: []
}
};
// Package.json analysis
const packageJson = safeReadFile('package.json');
if (packageJson) {
try {
const pkg = JSON.parse(packageJson);
project.basic = {
name: pkg.name || 'Unknown',
version: pkg.version || '0.0.0',
description: pkg.description || '',
author: pkg.author || 'Unknown',
license: pkg.license || 'Unknown',
repository: pkg.repository?.url || 'Unknown',
homepage: pkg.homepage || '',
main: pkg.main || 'index.js',
type: pkg.type || 'commonjs'
};
project.scripts = Object.entries(pkg.scripts || {}).map(([name, command]) => ({
name,
command,
isMCP: command.includes('context-control') || command.includes('ccmcp'),
isAnalysis: command.includes('analyze') || command.includes('kill-md'),
isUtility: command.includes('dashboard') || command.includes('status')
}));
project.dependencies.production = pkg.dependencies || {};
project.dependencies.development = pkg.devDependencies || {};
// Identify critical dependencies
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
project.dependencies.critical = Object.keys(allDeps).filter(dep =>
['@modelcontextprotocol/sdk', 'next', 'react', 'express'].includes(dep)
);
// Identify potentially problematic dependencies
project.dependencies.problematic = Object.keys(allDeps).filter(dep =>
dep.includes('beta') || dep.includes('alpha') || dep.includes('rc') ||
allDeps[dep].includes('^') && parseFloat(allDeps[dep].replace('^', '')) < 1
);
} catch (e) {
console.error('⚠️ Error parsing package.json');
}
}
// File analysis
const importantFiles = [
'README.md', 'ROADMAP.md', 'CHANGELOG.md', 'TODO.md',
'context-control-server.js', 'ccmcp-standalone.cjs',
'package.json', 'package-lock.json',
'.env.example', '.gitignore',
'next.config.js', 'tsconfig.json'
];
importantFiles.forEach(file => {
if (safeFileExists(file)) {
const content = safeReadFile(file);
const size = content ? content.length : 0;
const lines = content ? content.split('\n').length : 0;
const fileInfo = { name: file, size, lines, exists: true };
if (file.endsWith('.md')) {
project.files.documentation.push(fileInfo);
} else if (file.includes('config') || file.startsWith('.')) {
project.files.config.push(fileInfo);
} else if (file.endsWith('.js') || file.endsWith('.ts')) {
project.files.code.push(fileInfo);
} else {
project.files.key.push(fileInfo);
}
}
});
return project;
}
// 🚨 3. PROBLEMAS Y ERRORES CONOCIDOS
function analyzeKnownIssues() {
console.error('🚨 Analizando problemas conocidos...');
const issues = {
compatibility: [],
dependencies: [],
runtime: [],
documentation: []
};
// Check for common compatibility issues
const packageJson = safeReadFile('package.json');
if (packageJson) {
try {
const pkg = JSON.parse(packageJson);
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
// MCP SDK compatibility issue
if (deps['@modelcontextprotocol/sdk']) {
issues.compatibility.push({
type: 'MCP SDK Compatibility',
description: 'MCP SDK puede tener problemas con diferentes versiones de Node.js',
impact: 'Server MCP puede fallar al iniciar',
solution: 'Usar ccmcp-standalone.cjs como alternativa'
});
}
// Version conflicts
if (pkg.type === 'module' && pkg.main && !pkg.main.endsWith('.mjs')) {
issues.compatibility.push({
type: 'ES Module Configuration',
description: 'Configuración mixta de CommonJS/ES modules',
impact: 'Puede causar errores de importación',
solution: 'Verificar configuración de type y main en package.json'
});
}
} catch (e) {
issues.runtime.push({
type: 'Package.json Parse Error',
description: 'Error al parsear package.json',
impact: 'Información del proyecto no disponible',
solution: 'Verificar sintaxis JSON en package.json'
});
}
}
// Check for missing critical files
const criticalFiles = ['context-control-server.js', 'package.json'];
criticalFiles.forEach(file => {
if (!safeFileExists(file)) {
issues.runtime.push({
type: 'Missing Critical File',
description: `Archivo crítico ${file} no encontrado`,
impact: 'Funcionalidad principal no disponible',
solution: `Restaurar o crear ${file}`
});
}
});
return issues;
}
// 🗺️ 4. ROADMAP Y PRÓXIMOS PASOS
function analyzeRoadmapAndNext() {
console.error('🗺️ Analizando roadmap y próximos pasos...');
const roadmap = {
current: {
version: '4.0.3',
status: 'stable',
knownIssues: []
},
next: {
priorities: [],
improvements: [],
fixes: []
},
longTerm: {
vision: '',
features: []
}
};
// Read roadmap files
const roadmapFiles = ['ROADMAP.md', 'TODO.md', 'docs/ROADMAP.md'];
let roadmapContent = '';
for (const file of roadmapFiles) {
const content = safeReadFile(file);
if (content) {
roadmapContent += content + '\n';
break;
}
}
if (roadmapContent) {
// Extract priorities from roadmap
const priorities = roadmapContent.match(/(?:PRIORITY|CRÍTICO|HIGH|ALTA).*?(?:\n|$)/gi) || [];
roadmap.next.priorities = priorities.slice(0, 5).map(p => p.trim());
// Extract version information
const versionMatches = roadmapContent.match(/v?\d+\.\d+\.\d+/g) || [];
if (versionMatches.length > 0) {
roadmap.next.targetVersion = versionMatches[versionMatches.length - 1];
}
}
// Analyze recent commits for work direction
const recentCommits = safeExec('git log --oneline -5');
if (recentCommits) {
const commits = recentCommits.split('\n');
const workPatterns = {
'fix': commits.filter(c => c.includes('fix')).length,
'feat': commits.filter(c => c.includes('feat')).length,
'refactor': commits.filter(c => c.includes('refactor')).length,
'docs': commits.filter(c => c.includes('docs')).length
};
const mainWork = Object.entries(workPatterns)
.sort(([,a], [,b]) => b - a)[0];
if (mainWork && mainWork[1] > 0) {
roadmap.current.mainFocus = mainWork[0];
}
}
return roadmap;
}
// 💡 5. EJEMPLOS DE USO Y COMANDOS
function analyzeUsageExamples() {
console.error('💡 Analizando ejemplos de uso...');
const usage = {
mainCommands: [],
examples: [],
workflows: []
};
// Extract commands from package.json
const packageJson = safeReadFile('package.json');
if (packageJson) {
try {
const pkg = JSON.parse(packageJson);
const scripts = pkg.scripts || {};
usage.mainCommands = Object.entries(scripts).map(([name, command]) => ({
name,
command,
description: getCommandDescription(name, command)
}));
} catch (e) {
console.error('⚠️ Error extracting commands');
}
}
// Common workflows
usage.workflows = [
{
name: 'Nueva sesión IA',
steps: ['node ccmcp-full-context.cjs', 'Revisar output completo', 'Comenzar desarrollo']
},
{
name: 'Análisis rápido',
steps: ['node ccmcp-portable.cjs', 'Identificar próximos pasos']
},
{
name: 'Análisis completo MCP',
steps: ['npm run kill-md', 'Revisar gaps críticos', 'Implementar soluciones']
}
];
return usage;
}
function getCommandDescription(name, command) {
const descriptions = {
'kill-md': 'Análisis revolucionario que mata archivos .md manuales',
'analyze': 'Análisis standalone sin dependencias MCP',
'dashboard': 'Dashboard de métricas del proyecto',
'status': 'Estado del roadmap y progreso',
'context': 'Actualizar contexto del proyecto',
'handoff': 'Preparar handoff entre sesiones'
};
return descriptions[name] || `Ejecuta: ${command}`;
}
// 🚀 GENERACIÓN DE CONTEXTO COMPLETO
function generateFullContext() {
const timestamp = new Date().toISOString();
console.error('🔄 Generando contexto completo...');
const context = {
meta: {
generated: timestamp,
purpose: 'Contexto completo para nueva sesión de IA',
version: '5.0-full'
},
history: analyzeVersionHistory(),
project: analyzeProjectComplete(),
issues: analyzeKnownIssues(),
roadmap: analyzeRoadmapAndNext(),
usage: analyzeUsageExamples()
};
return context;
}
// 📄 FORMATEO DE OUTPUT PARA IA
function formatContextForAI(context) {
let output = `🔥 **CONTEXTO COMPLETO - CONTEXT CONTROL MCP**
═══════════════════════════════════════════════════════════════════
📅 **Generado**: ${new Date().toLocaleString()}
🎯 **Propósito**: Contexto completo para nueva sesión de IA
📊 **Versión del análisis**: ${context.meta.version}
## 📚 HISTORIAL Y DESARROLLO
**Git Status**: ${context.history.gitAvailable ? 'Disponible' : 'No disponible'}
**Total Commits**: ${context.history.totalCommits}
**Estado**: ${context.history.development.workingDirectory}
**Archivos activos**: ${context.history.development.activeFiles.length}
**Últimos commits**:
${context.history.recentCommits.slice(0, 5).map(c => `• ${c.hash} ${c.message}`).join('\n')}
**Cambios recientes en archivos**:
${context.history.development.recentChanges.slice(0, 8).map(f => `• ${f}`).join('\n')}
## 📦 INFORMACIÓN DEL PROYECTO
**Nombre**: ${context.project.basic.name} v${context.project.basic.version}
**Descripción**: ${context.project.basic.description}
**Tipo**: ${context.project.basic.type} (${context.project.basic.main})
**Autor**: ${context.project.basic.author}
**Licencia**: ${context.project.basic.license}
**Dependencias críticas** (${context.project.dependencies.critical.length}):
${context.project.dependencies.critical.map(dep => `• ${dep}: ${context.project.dependencies.production[dep] || context.project.dependencies.development[dep]}`).join('\n')}
${context.project.dependencies.problematic.length > 0 ? `
**⚠️ Dependencias problemáticas**:
${context.project.dependencies.problematic.map(dep => `• ${dep}`).join('\n')}
` : ''}
## 🔧 COMANDOS DISPONIBLES
**Scripts principales** (${context.project.scripts.length} total):
${context.project.scripts.filter(s => s.isMCP || s.isAnalysis).map(s => `• npm run ${s.name} - ${getCommandDescription(s.name, s.command)}`).join('\n')}
**Comandos de análisis**:
${context.project.scripts.filter(s => s.isAnalysis).map(s => `• npm run ${s.name}`).join('\n')}
**Comandos utilitarios**:
${context.project.scripts.filter(s => s.isUtility).map(s => `• npm run ${s.name}`).join('\n')}
## 📁 ARCHIVOS CLAVE
**Código principal** (${context.project.files.code.length}):
${context.project.files.code.map(f => `• ${f.name} (${f.lines} líneas)`).join('\n')}
**Documentación** (${context.project.files.documentation.length}):
${context.project.files.documentation.map(f => `• ${f.name} (${f.lines} líneas)`).join('\n')}
**Configuración** (${context.project.files.config.length}):
${context.project.files.config.map(f => `• ${f.name}`).join('\n')}
## 🚨 PROBLEMAS CONOCIDOS
${Object.entries(context.issues).map(([category, issues]) =>
issues.length > 0 ? `**${category.toUpperCase()}** (${issues.length}):\n${issues.map(issue =>
`• [${issue.type}] ${issue.description}\n 💥 Impacto: ${issue.impact}\n 🔧 Solución: ${issue.solution}`
).join('\n')}\n` : ''
).join('\n')}
## 🗺️ ROADMAP Y PRÓXIMOS PASOS
**Versión actual**: ${context.roadmap.current.version}
**Enfoque principal**: ${context.roadmap.current.mainFocus || 'Desarrollo general'}
**Próximas prioridades**:
${context.roadmap.next.priorities.slice(0, 3).map(p => `• ${p}`).join('\n')}
## 💡 WORKFLOWS RECOMENDADOS
${context.usage.workflows.map(w =>
`**${w.name}**:\n${w.steps.map((step, i) => `${i+1}. ${step}`).join('\n')}`
).join('\n\n')}
## 🎯 PARA CONTINUAR TRABAJANDO
**Comando principal**: \`npm run kill-md\` (análisis revolucionario)
**Comando portable**: \`node ccmcp-portable.cjs\` (sin dependencias)
**Comando completo**: \`node ccmcp-full-context.cjs\` (este comando)
**Próximo paso recomendado**: ${context.issues.compatibility.length > 0 ? 'Resolver problemas de compatibilidad' : 'Continuar con mejoras de funcionalidad'}
═══════════════════════════════════════════════════════════════════
🤖 **CONTEXTO COMPLETO GENERADO** - Todo lo que una IA nueva necesita saber
🔥 Context Control MCP v5.0 - Full Context Generator`;
return output;
}
// 🚀 EJECUCIÓN PRINCIPAL
console.error('🚀 Iniciando generación de contexto completo...');
const fullContext = generateFullContext();
const formattedOutput = formatContextForAI(fullContext);
console.log('\n' + formattedOutput);
console.error('\n✅ Contexto completo generado exitosamente');
console.error(`📊 Información analizada: ${fullContext.history.totalCommits} commits, ${fullContext.project.scripts.length} scripts, ${Object.values(fullContext.issues).flat().length} issues detectados`);
console.error('🤖 Una IA nueva tiene ahora TODO el contexto necesario para continuar el desarrollo');