Skip to main content
Glama

Memory Bank MCP

externalRulesLoader.test.ts3.74 kB
import { test, expect, describe, beforeEach, afterEach } from 'bun:test'; import fs from 'fs-extra'; import path from 'path'; import { fileURLToPath } from 'url'; import { ExternalRulesLoader } from '../utils/ExternalRulesLoader.js'; // Get the directory name const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); describe('ExternalRulesLoader Tests', () => { const tempDir = path.join(__dirname, 'temp-rulesloader-test-dir'); const projectDir = path.join(tempDir, 'project'); let rulesLoader: ExternalRulesLoader; beforeEach(async () => { // Create temporary directories await fs.ensureDir(tempDir); await fs.ensureDir(projectDir); // Create a new ExternalRulesLoader with the project directory rulesLoader = new ExternalRulesLoader(projectDir); }); afterEach(async () => { // Clean up rulesLoader.dispose(); await fs.remove(tempDir); }); test('Should use provided project directory', async () => { // Create a .clinerules file in the project directory const clineruleContent = ` mode: test instructions: general: - "This is a test rule" `; await fs.writeFile(path.join(projectDir, '.clinerules'), clineruleContent); // Load rules const rules = await rulesLoader.detectAndLoadRules(); // Verify rules were loaded from the project directory expect(rules.size).toBeGreaterThan(0); expect(rules.has('test')).toBe(true); // Verify the rule has instructions const rule = rules.get('test'); expect(rule).not.toBeNull(); expect(rule?.instructions).not.toBeNull(); expect(Array.isArray(rule?.instructions.general)).toBe(true); expect(rule?.instructions.general.length).toBeGreaterThan(0); }); test('Should use default directory when not provided', async () => { // Create a new ExternalRulesLoader without a project directory const defaultLoader = new ExternalRulesLoader(); // Create a temporary .clinerules file in the current directory const currentDir = process.cwd(); const tempClinerulePath = path.join(currentDir, '.temp-test-clinerules'); const clineruleContent = ` mode: default-test instructions: general: - "This is a default test rule" `; try { // Write temporary file await fs.writeFile(tempClinerulePath, clineruleContent); // Load rules const rules = await defaultLoader.detectAndLoadRules(); // Verify the loader is using the current directory // Note: This test might be flaky if there are existing .clinerules files // in the current directory, so we're just checking basic functionality expect(rules.size).toBeGreaterThanOrEqual(1); } finally { // Clean up defaultLoader.dispose(); await fs.remove(tempClinerulePath); } }); test('Should create missing .clinerules files in project directory', async () => { // Validate required files (should create missing files) const result = await rulesLoader.validateRequiredFiles(); // Verify files were created in the project directory expect(result.valid).toBe(true); expect(result.existingFiles.length).toBeGreaterThan(0); // Check if files exist in the project directory // Note: The files are created with a different naming convention than expected in the test // They are created as .clinerules-code instead of .clinerules.code const codeRuleExists = await fs.pathExists(path.join(projectDir, '.clinerules-code')); expect(codeRuleExists).toBe(true); const askRuleExists = await fs.pathExists(path.join(projectDir, '.clinerules-ask')); expect(askRuleExists).toBe(true); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/movibe/memory-bank-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server