run method

  1. @override
void run()
override

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