132 lines
4.4 KiB
JavaScript
132 lines
4.4 KiB
JavaScript
import fs from 'fs';
|
|
import path from 'path';
|
|
import { fileURLToPath } from 'url';
|
|
import { dirname } from 'path';
|
|
import {
|
|
convertAllRulesToProfileRules,
|
|
convertRuleToProfileRule,
|
|
getRulesProfile
|
|
} from '../../src/utils/rule-transformer.js';
|
|
import * as rooProfile from '../../scripts/profiles/roo.js';
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = dirname(__filename);
|
|
|
|
describe('Roo Rule Transformer', () => {
|
|
const testDir = path.join(__dirname, 'temp-test-dir');
|
|
|
|
beforeAll(() => {
|
|
// Create test directory
|
|
if (!fs.existsSync(testDir)) {
|
|
fs.mkdirSync(testDir, { recursive: true });
|
|
}
|
|
});
|
|
|
|
afterAll(() => {
|
|
// Clean up test directory
|
|
if (fs.existsSync(testDir)) {
|
|
fs.rmSync(testDir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
it('should correctly convert basic terms', () => {
|
|
// Create a test Cursor rule file with basic terms
|
|
const testCursorRule = path.join(testDir, 'basic-terms.mdc');
|
|
const testContent = `---
|
|
description: Test Cursor rule for basic terms
|
|
globs: **/*
|
|
alwaysApply: true
|
|
---
|
|
|
|
This is a Cursor rule that references cursor.so and uses the word Cursor multiple times.
|
|
Also has references to .mdc files.`;
|
|
|
|
fs.writeFileSync(testCursorRule, testContent);
|
|
|
|
// Convert it
|
|
const testRooRule = path.join(testDir, 'basic-terms.md');
|
|
convertRuleToProfileRule(testCursorRule, testRooRule, rooProfile);
|
|
|
|
// Read the converted file
|
|
const convertedContent = fs.readFileSync(testRooRule, 'utf8');
|
|
|
|
// Verify transformations
|
|
expect(convertedContent).toContain('Roo Code');
|
|
expect(convertedContent).toContain('roocode.com');
|
|
expect(convertedContent).toContain('.md');
|
|
expect(convertedContent).not.toContain('cursor.so');
|
|
expect(convertedContent).not.toContain('Cursor rule');
|
|
});
|
|
|
|
it('should correctly convert tool references', () => {
|
|
// Create a test Cursor rule file with tool references
|
|
const testCursorRule = path.join(testDir, 'tool-refs.mdc');
|
|
const testContent = `---
|
|
description: Test Cursor rule for tool references
|
|
globs: **/*
|
|
alwaysApply: true
|
|
---
|
|
|
|
- Use the search tool to find code
|
|
- The edit_file tool lets you modify files
|
|
- run_command executes terminal commands
|
|
- use_mcp connects to external services`;
|
|
|
|
fs.writeFileSync(testCursorRule, testContent);
|
|
|
|
// Convert it
|
|
const testRooRule = path.join(testDir, 'tool-refs.md');
|
|
convertRuleToProfileRule(testCursorRule, testRooRule, rooProfile);
|
|
|
|
// Read the converted file
|
|
const convertedContent = fs.readFileSync(testRooRule, 'utf8');
|
|
|
|
// Verify transformations
|
|
expect(convertedContent).toContain('search_files tool');
|
|
expect(convertedContent).toContain('apply_diff tool');
|
|
expect(convertedContent).toContain('execute_command');
|
|
expect(convertedContent).toContain('use_mcp_tool');
|
|
});
|
|
|
|
it('should correctly update file references', () => {
|
|
// Create a test Cursor rule file with file references
|
|
const testCursorRule = path.join(testDir, 'file-refs.mdc');
|
|
const testContent = `---
|
|
description: Test Cursor rule for file references
|
|
globs: **/*
|
|
alwaysApply: true
|
|
---
|
|
|
|
This references [dev_workflow.mdc](mdc:.cursor/rules/dev_workflow.mdc) and
|
|
[taskmaster.mdc](mdc:.cursor/rules/taskmaster.mdc).`;
|
|
|
|
fs.writeFileSync(testCursorRule, testContent);
|
|
|
|
// Convert it
|
|
const testRooRule = path.join(testDir, 'file-refs.md');
|
|
convertRuleToProfileRule(testCursorRule, testRooRule, rooProfile);
|
|
|
|
// Read the converted file
|
|
const convertedContent = fs.readFileSync(testRooRule, 'utf8');
|
|
|
|
// Verify transformations
|
|
expect(convertedContent).toContain('(mdc:.roo/rules/dev_workflow.md)');
|
|
expect(convertedContent).toContain('(mdc:.roo/rules/taskmaster.md)');
|
|
expect(convertedContent).not.toContain('(mdc:.cursor/rules/');
|
|
});
|
|
|
|
it('should run post-processing when converting all rules for Roo', () => {
|
|
// Simulate a rules directory with a .mdc file
|
|
const assetsRulesDir = path.join(testDir, 'assets', 'rules');
|
|
fs.mkdirSync(assetsRulesDir, { recursive: true });
|
|
const assetRule = path.join(assetsRulesDir, 'dev_workflow.mdc');
|
|
fs.writeFileSync(assetRule, 'dummy');
|
|
// Should create .roo/rules and call post-processing
|
|
convertAllRulesToProfileRules(testDir, rooProfile);
|
|
// Check for post-processing artifacts, e.g., rules-* folders or extra files
|
|
const rooDir = path.join(testDir, '.roo');
|
|
const found = fs.readdirSync(rooDir).some((f) => f.startsWith('rules-'));
|
|
expect(found).toBe(true); // There should be at least one rules-* folder
|
|
});
|
|
});
|