run method
Runs this command.
The return value is wrapped in a Future if necessary and returned by
CommandRunner.runCommand.
Implementation
@override
void run() {
if (!ContextService.isInitialized()) {
print('ContextForge has not been initialized in this repository.\n');
print('Run:');
print(' contextforge init');
return;
}
try {
print('Upgrading ContextForge MCP server files...\n');
// Read IDE preference from config
final ide = _readIdeFromConfig() ?? 'vscode';
// Update MCP server files
final mcpServerDir = '${ContextService.contextDir}/mcp_server';
_updateFile('$mcpServerDir/package.json', _mcpPackageJson);
print('✅ Updated MCP package.json');
_updateFile('$mcpServerDir/index.js', _mcpIndexJs);
print('✅ Updated MCP index.js');
// Update MCP config file based on IDE
final configDir = _getConfigDirectory(ide);
final configFileName = _getConfigFileName(ide);
final mcpTemplate = _getMcpTemplate(ide);
final configPath = '$configDir/$configFileName';
final configDirObj = Directory(configDir);
if (!configDirObj.existsSync()) {
configDirObj.createSync(recursive: true);
}
_updateFile(configPath, mcpTemplate);
print('✅ Updated $configPath');
// Update .github/copilot-instructions.md with IDE-specific content
final githubDir = Directory('.github');
if (!githubDir.existsSync()) {
githubDir.createSync(recursive: true);
}
final ideInstructions = _getCopilotInstructions(ide);
_updateFile('.github/copilot-instructions.md', ideInstructions);
print('✅ Updated .github/copilot-instructions.md');
// Update rules files in .contextforge/rules/
final rulesDir = Directory('${ContextService.contextDir}/rules');
if (!rulesDir.existsSync()) {
rulesDir.createSync(recursive: true);
}
_updateFile('${ContextService.contextDir}/rules/git.md', _gitRules);
_updateFile('${ContextService.contextDir}/rules/tasks.md', _tasksRules);
_updateFile('${ContextService.contextDir}/rules/files.md', _filesRules);
_updateFile('${ContextService.contextDir}/rules/communication.md', _communicationRules);
print('✅ Updated rules files');
// Migrate planned status to todo in features.yaml
_migrateTaskStatus();
// Run npm install to update dependencies
print('\nInstalling MCP server dependencies...');
final result =
Process.runSync('npm', ['install'], workingDirectory: mcpServerDir);
if (result.exitCode != 0) {
print('Error running npm install: ${result.stderr}');
return;
}
print('✅ Dependencies installed');
print('\n✅ ContextForge upgraded successfully.');
print('Restart your editor to apply the changes.');
} catch (e) {
print('Error upgrading ContextForge: $e');
}
}