Cursor rule
.cursor/rules/tests.mdcGuidelines for implementing and maintaining tests for Task Master CLI
Cursor rules
Quality
74/100
Scores the file, not the repository.Length
2,821 words
17 headings · 25 code blocksRepository
192
— · pushed 309 days agoLast changed
3 days ago
First indexed 3 days ago.123456# Testing Guidelines for Task Master CLI78## Test Organization Structure910- **Unit Tests**11 - Located in `tests/unit/`12 - Test individual functions and utilities in isolation13 - Mock all external dependencies14 - Keep tests small, focused, and fast15 - Example naming: `utils.test.js`, `task-manager.test.js`1617- **Integration Tests**18 - Located in `tests/integration/`19 - Test interactions between modules20 - Focus on component interfaces rather than implementation details21 - Use more realistic but still controlled test environments22 - Example naming: `task-workflow.test.js`, `command-integration.test.js`2324- **End-to-End Tests**25 - Located in `tests/e2e/`26 - Test complete workflows from a user perspective27 - Focus on CLI commands as they would be used by users28 - Example naming: `create-task.e2e.test.js`, `expand-task.e2e.test.js`2930- **Test Fixtures**31 - Located in `tests/fixtures/`32 - Provide reusable test data33 - Keep fixtures small and representative34 - Export fixtures as named exports for reuse3536## Test File Organization3738```javascript39// 1. Imports40import { jest } from '@jest/globals';4142// 2. Mock setup (MUST come before importing the modules under test)43jest.mock('fs');44jest.mock('@anthropic-ai/sdk');45jest.mock('../../scripts/modules/utils.js', () => ({46 CONFIG: {47 projectVersion: '1.5.0'48 },49 log: jest.fn()50}));5152// 3. Import modules AFTER all mocks are defined53import { functionToTest } from '../../scripts/modules/module-name.js';54import { testFixture } from '../fixtures/fixture-name.js';55import fs from 'fs';5657// 4. Set up spies on mocked modules (if needed)58const mockReadFileSync = jest.spyOn(fs, 'readFileSync');5960// 5. Test suite with descriptive name61describe('Feature or Function Name', () => {62 // 6. Setup and teardown (if needed)63 beforeEach(() => {64 jest.clearAllMocks();65 // Additional setup code66 });6768 afterEach(() => {69 // Cleanup code70 });7172 // 7. Grouped tests for related functionality73 describe('specific functionality', () => {74 // 8. Individual test cases with clear descriptions75 test('should behave in expected way when given specific input', () => {76 // Arrange - set up test data77 const input = testFixture.sampleInput;78 mockReadFileSync.mockReturnValue('mocked content');7980 // Act - call the function being tested81 const result = functionToTest(input);8283 // Assert - verify the result84 expect(result).toBe(expectedOutput);85 expect(mockReadFileSync).toHaveBeenCalledWith(expect.stringContaining('path'));86 });87 });88});89```9091## Jest Module Mocking Best Practices9293- **Mock Hoisting Behavior**94 - Jest hoists `jest.mock()` calls to the top of the file, even above imports95 - Always declare mocks before importing the modules being tested96 - Use the factory pattern for complex mocks that need access to other variables9798```javascript99 // ✅ DO: Place mocks before imports100 jest.mock('commander');101 import { program } from 'commander';102103 // ❌ DON'T: Define variables and then try to use them in mocks104 const mockFn = jest.fn();105 jest.mock('module', () => ({106 func: mockFn // This won't work due to hoisting!107 }));108```109110- **Mocking Modules with Function References**111 - Use `jest.spyOn()` after imports to create spies on mock functions112 - Reference these spies in test assertions113114```javascript115 // Mock the module first116 jest.mock('fs');117118 // Import the mocked module119 import fs from 'fs';120121 // Create spies on the mock functions122 const mockExistsSync = jest.spyOn(fs, 'existsSync').mockReturnValue(true);123124 test('should call existsSync', () => {125 // Call function that uses fs.existsSync126 const result = functionUnderTest();127128 // Verify the mock was called correctly129 expect(mockExistsSync).toHaveBeenCalled();130 });131```132133- **Testing Functions with Callbacks**134 - Get the callback from your mock's call arguments135 - Execute it directly with test inputs136 - Verify the results match expectations137138```javascript139 jest.mock('commander');140 import { program } from 'commander';141 import { setupCLI } from '../../scripts/modules/commands.js';142143 const mockVersion = jest.spyOn(program, 'version').mockReturnValue(program);144145 test('version callback should return correct version', () => {146 // Call the function that registers the callback147 setupCLI();148149 // Extract the callback function150 const versionCallback = mockVersion.mock.calls[0][0];151 expect(typeof versionCallback).toBe('function');152153 // Execute the callback and verify results154 const result = versionCallback();155 expect(result).toBe('1.5.0');156 });157```158159## ES Module Testing Strategies160161When testing ES modules (`"type": "module"` in package.json), traditional mocking approaches require special handling to avoid reference and scoping issues.162163- **Module Import Challenges**164 - Functions imported from ES modules may still reference internal module-scoped variables165 - Imported functions may not use your mocked dependencies even with proper jest.mock() setup166 - ES module exports are read-only properties (cannot be reassigned during tests)167168- **Mocking Entire Modules**169```javascript170 // Mock the entire module with custom implementation171 jest.mock('../../scripts/modules/task-manager.js', () => {172 // Get original implementation for functions you want to preserve173 const originalModule = jest.requireActual('../../scripts/modules/task-manager.js');174175 // Return mix of original and mocked functionality176 return {177 ...originalModule,178 generateTaskFiles: jest.fn() // Replace specific functions179 };180 });181182 // Import after mocks183 import * as taskManager from '../../scripts/modules/task-manager.js';184185 // Now you can use the mock directly186 const { generateTaskFiles } = taskManager;187```188189- **Direct Implementation Testing**190 - Instead of calling the actual function which may have module-scope reference issues:191```javascript192 test('should perform expected actions', () => {193 // Setup mocks for this specific test194 mockReadJSON.mockImplementationOnce(() => sampleData);195196 // Manually simulate the function's behavior197 const data = mockReadJSON('path/file.json');198 mockValidateAndFixDependencies(data, 'path/file.json');199200 // Skip calling the actual function and verify mocks directly201 expect(mockReadJSON).toHaveBeenCalledWith('path/file.json');202 expect(mockValidateAndFixDependencies).toHaveBeenCalledWith(data, 'path/file.json');203 });204```205206- **Avoiding Module Property Assignment**207```javascript208 // ❌ DON'T: This causes "Cannot assign to read only property" errors209 const utils = await import('../../scripts/modules/utils.js');210 utils.readJSON = mockReadJSON; // Error: read-only property211212 // ✅ DO: Use the module factory pattern in jest.mock()213 jest.mock('../../scripts/modules/utils.js', () => ({214 readJSON: mockReadJSONFunc,215 writeJSON: mockWriteJSONFunc216 }));217```218219- **Handling Mock Verification Failures**220 - If verification like `expect(mockFn).toHaveBeenCalled()` fails:221 1. Check that your mock setup is before imports222 2. Ensure you're using the right mock instance223 3. Verify your test invokes behavior that would call the mock224 4. Use `jest.clearAllMocks()` in beforeEach to reset mock state225 5. Consider implementing a simpler test that directly verifies mock behavior226227- **Full Example Pattern**228```javascript229 // 1. Define mock implementations230 const mockReadJSON = jest.fn();231 const mockValidateAndFixDependencies = jest.fn();232233 // 2. Mock modules234 jest.mock('../../scripts/modules/utils.js', () => ({235 readJSON: mockReadJSON,236 // Include other functions as needed237 }));238239 jest.mock('../../scripts/modules/dependency-manager.js', () => ({240 validateAndFixDependencies: mockValidateAndFixDependencies241 }));242243 // 3. Import after mocks244 import * as taskManager from '../../scripts/modules/task-manager.js';245246 describe('generateTaskFiles function', () => {247 beforeEach(() => {248 jest.clearAllMocks();249 });250251 test('should generate task files', () => {252 // 4. Setup test-specific mock behavior253 const sampleData = { tasks: [{ id: 1, title: 'Test' }] };254 mockReadJSON.mockReturnValueOnce(sampleData);255256 // 5. Create direct implementation test257 // Instead of calling: taskManager.generateTaskFiles('path', 'dir')258259 // Simulate reading data260 const data = mockReadJSON('path');261 expect(mockReadJSON).toHaveBeenCalledWith('path');262263 // Simulate other operations the function would perform264 mockValidateAndFixDependencies(data, 'path');265 expect(mockValidateAndFixDependencies).toHaveBeenCalledWith(data, 'path');266 });267 });268```269270## Mocking Guidelines271272- **File System Operations**273```javascript274 import mockFs from 'mock-fs';275276 beforeEach(() => {277 mockFs({278 'tasks': {279 'tasks.json': JSON.stringify({280 meta: { projectName: 'Test Project' },281 tasks: []282 })283 }284 });285 });286287 afterEach(() => {288 mockFs.restore();289 });290```291292- **API Calls (Anthropic/Claude)**293```javascript294 import { Anthropic } from '@anthropic-ai/sdk';295296 jest.mock('@anthropic-ai/sdk');297298 beforeEach(() => {299 Anthropic.mockImplementation(() => ({300 messages: {301 create: jest.fn().mockResolvedValue({302 content: [{ text: 'Mocked response' }]303 })304 }305 }));306 });307```308309- **Environment Variables**310```javascript311 const originalEnv = process.env;312313 beforeEach(() => {314 jest.resetModules();315 process.env = { ...originalEnv };316 process.env.MODEL = 'test-model';317 });318319 afterEach(() => {320 process.env = originalEnv;321 });322```323324## Testing Common Components325326- **CLI Commands**327 - Mock the action handlers and verify they're called with correct arguments328 - Test command registration and option parsing329 - Use `commander` test utilities or custom mocks330331- **Task Operations**332 - Use sample task fixtures for consistent test data333 - Mock file system operations334 - Test both success and error paths335336- **UI Functions**337 - Mock console output and verify correct formatting338 - Test conditional output logic339 - When testing strings with emojis or formatting, use `toContain()` or `toMatch()` rather than exact `toBe()` comparisons340 - For functions with different behavior modes (e.g., `forConsole`, `forTable` parameters), create separate tests for each mode341 - Test the structure of formatted output (e.g., check that it's a comma-separated list with the right number of items) rather than exact string matching342 - When testing chalk-formatted output, remember that strict equality comparison (`toBe()`) can fail even when the visible output looks identical343 - Consider using more flexible assertions like checking for the presence of key elements when working with styled text344 - Mock chalk functions to return the input text to make testing easier while still verifying correct function calls345346## Test Quality Guidelines347348- ✅ **DO**: Write tests before implementing features (TDD approach when possible)349- ✅ **DO**: Test edge cases and error conditions, not just happy paths350- ✅ **DO**: Keep tests independent and isolated from each other351- ✅ **DO**: Use descriptive test names that explain the expected behavior352- ✅ **DO**: Maintain test fixtures separate from test logic353- ✅ **DO**: Aim for 80%+ code coverage, with critical paths at 100%354- ✅ **DO**: Follow the mock-first-then-import pattern for all Jest mocks355356- ❌ **DON'T**: Test implementation details that might change357- ❌ **DON'T**: Write brittle tests that depend on specific output formatting358- ❌ **DON'T**: Skip testing error handling and validation359- ❌ **DON'T**: Duplicate test fixtures across multiple test files360- ❌ **DON'T**: Write tests that depend on execution order361- ❌ **DON'T**: Define mock variables before `jest.mock()` calls (they won't be accessible due to hoisting)362363364- **Task File Operations**365 - ✅ DO: Use test-specific file paths (e.g., 'test-tasks.json') for all operations366 - ✅ DO: Mock `readJSON` and `writeJSON` to avoid real file system interactions367 - ✅ DO: Verify file operations use the correct paths in `expect` statements368 - ✅ DO: Use different paths for each test to avoid test interdependence369 - ✅ DO: Verify modifications on the in-memory task objects passed to `writeJSON`370 - ❌ DON'T: Modify real task files (tasks.json) during tests371 - ❌ DON'T: Skip testing file operations because they're "just I/O"372373```javascript374 // ✅ DO: Test file operations without real file system changes375 test('should update task status in tasks.json', async () => {376 // Setup mock to return sample data377 readJSON.mockResolvedValue(JSON.parse(JSON.stringify(sampleTasks)));378379 // Use test-specific file path380 await setTaskStatus('test-tasks.json', '2', 'done');381382 // Verify correct file path was read383 expect(readJSON).toHaveBeenCalledWith('test-tasks.json');384385 // Verify correct file path was written with updated content386 expect(writeJSON).toHaveBeenCalledWith(387 'test-tasks.json',388 expect.objectContaining({389 tasks: expect.arrayContaining([390 expect.objectContaining({391 id: 2,392 status: 'done'393 })394 ])395 })396 );397 });398```399400## Running Tests401402```bash403# Run all tests404npm test405406# Run tests in watch mode407npm run test:watch408409# Run tests with coverage reporting410npm run test:coverage411412# Run a specific test file413npm test -- tests/unit/specific-file.test.js414415# Run tests matching a pattern416npm test -- -t "pattern to match"417```418419## Troubleshooting Test Issues420421- **Mock Functions Not Called**422 - Ensure mocks are defined before imports (Jest hoists `jest.mock()` calls)423 - Check that you're referencing the correct mock instance424 - Verify the import paths match exactly425426- **Unexpected Mock Behavior**427 - Clear mocks between tests with `jest.clearAllMocks()` in `beforeEach`428 - Check mock implementation for conditional behavior429 - Ensure mock return values are correctly configured for each test430431- **Tests Affecting Each Other**432 - Isolate tests by properly mocking shared resources433 - Reset state in `beforeEach` and `afterEach` hooks434 - Avoid global state modifications435436## Common Testing Pitfalls and Solutions437438- **Complex Library Mocking**439 - **Problem**: Trying to create full mocks of complex libraries like Commander.js can be error-prone440 - **Solution**: Instead of mocking the entire library, test the command handlers directly by calling your action handlers with the expected arguments441```javascript442 // ❌ DON'T: Create complex mocks of Commander.js443 class MockCommand {444 constructor() { /* Complex mock implementation */ }445 option() { /* ... */ }446 action() { /* ... */ }447 // Many methods to implement448 }449450 // ✅ DO: Test the command handlers directly451 test('should use default PRD path when no arguments provided', async () => {452 // Call the action handler directly with the right params453 await parsePrdAction(undefined, { numTasks: '10', output: 'tasks/tasks.json' });454455 // Assert on behavior456 expect(mockParsePRD).toHaveBeenCalledWith('scripts/prd.txt', 'tasks/tasks.json', 10);457 });458```459460- **ES Module Mocking Challenges**461 - **Problem**: ES modules don't support `require()` and imports are read-only462 - **Solution**: Use Jest's module factory pattern and ensure mocks are defined before imports463```javascript464 // ❌ DON'T: Try to modify imported modules465 import { detectCamelCaseFlags } from '../../scripts/modules/utils.js';466 detectCamelCaseFlags = jest.fn(); // Error: Assignment to constant variable467468 // ❌ DON'T: Try to use require with ES modules469 const utils = require('../../scripts/modules/utils.js'); // Error in ES modules470471 // ✅ DO: Use Jest module factory pattern472 jest.mock('../../scripts/modules/utils.js', () => ({473 detectCamelCaseFlags: jest.fn(),474 toKebabCase: jest.fn()475 }));476477 // Import after mocks are defined478 import { detectCamelCaseFlags } from '../../scripts/modules/utils.js';479```480481- **Function Redeclaration Errors**482 - **Problem**: Declaring the same function twice in a test file causes errors483 - **Solution**: Use different function names or create local test-specific implementations484```javascript485 // ❌ DON'T: Redefine imported functions with the same name486 import { detectCamelCaseFlags } from '../../scripts/modules/utils.js';487488 function detectCamelCaseFlags() { /* Test implementation */ }489 // Error: Identifier has already been declared490491 // ✅ DO: Use a different name for test implementations492 function testDetectCamelCaseFlags() { /* Test implementation */ }493```494495- **Console.log Circular References**496 - **Problem**: Creating infinite recursion by spying on console.log while also allowing it to log497 - **Solution**: Implement a mock that doesn't call the original function498```javascript499 // ❌ DON'T: Create circular references with console.log500 const mockConsoleLog = jest.spyOn(console, 'log');501 mockConsoleLog.mockImplementation(console.log); // Creates infinite recursion502503 // ✅ DO: Use a non-recursive mock implementation504 const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation(() => {});505```506507- **Mock Function Method Issues**508 - **Problem**: Trying to use jest.fn() methods on imported functions that aren't properly mocked509 - **Solution**: Create explicit jest.fn() mocks for functions you need to call jest methods on510```javascript511 // ❌ DON'T: Try to use jest methods on imported functions without proper mocking512 import { parsePRD } from '../../scripts/modules/task-manager.js';513 parsePRD.mockClear(); // Error: parsePRD.mockClear is not a function514515 // ✅ DO: Create proper jest.fn() mocks516 const mockParsePRD = jest.fn().mockResolvedValue(undefined);517 jest.mock('../../scripts/modules/task-manager.js', () => ({518 parsePRD: mockParsePRD519 }));520 // Now you can use:521 mockParsePRD.mockClear();522```523524- **EventEmitter Max Listeners Warning**525 - **Problem**: Commander.js adds many listeners in complex mocks, causing warnings526 - **Solution**: Either increase the max listeners limit or avoid deep mocking527```javascript528 // Option 1: Increase max listeners if you must mock Commander529 class MockCommand extends EventEmitter {530 constructor() {531 super();532 this.setMaxListeners(20); // Avoid MaxListenersExceededWarning533 }534 }535536 // Option 2 (preferred): Test command handlers directly instead537 // (as shown in the first example)538```539540- **Test Isolation Issues**541 - **Problem**: Tests affecting each other due to shared mock state542 - **Solution**: Reset all mocks in beforeEach and use separate test-specific mocks543```javascript544 // ❌ DON'T: Allow mock state to persist between tests545 const globalMock = jest.fn().mockReturnValue('test');546547 // ✅ DO: Clear mocks before each test548 beforeEach(() => {549 jest.clearAllMocks();550 // Set up test-specific mock behavior551 mockFunction.mockReturnValue('test-specific value');552 });553```554555## Reliable Testing Techniques556557- **Create Simplified Test Functions**558 - Create simplified versions of complex functions that focus only on core logic559 - Remove file system operations, API calls, and other external dependencies560 - Pass all dependencies as parameters to make testing easier561562```javascript563 // Original function (hard to test)564 const setTaskStatus = async (taskId, newStatus) => {565 const tasksPath = 'tasks/tasks.json';566 const data = await readJSON(tasksPath);567 // Update task status logic568 await writeJSON(tasksPath, data);569 return data;570 };571572 // Test-friendly simplified function (easy to test)573 const testSetTaskStatus = (tasksData, taskIdInput, newStatus) => {574 // Same core logic without file operations575 // Update task status logic on provided tasksData object576 return tasksData; // Return updated data for assertions577 };578```579580- **Avoid Real File System Operations**581 - Never write to real files during tests582 - Create test-specific versions of file operation functions583 - Mock all file system operations including read, write, exists, etc.584 - Verify function behavior using the in-memory data structures585586```javascript587 // Mock file operations588 const mockReadJSON = jest.fn();589 const mockWriteJSON = jest.fn();590591 jest.mock('../../scripts/modules/utils.js', () => ({592 readJSON: mockReadJSON,593 writeJSON: mockWriteJSON,594 }));595596 test('should update task status correctly', () => {597 // Setup mock data598 const testData = JSON.parse(JSON.stringify(sampleTasks));599 mockReadJSON.mockReturnValue(testData);600601 // Call the function that would normally modify files602 const result = testSetTaskStatus(testData, '1', 'done');603604 // Assert on the in-memory data structure605 expect(result.tasks[0].status).toBe('done');606 });607```608609- **Data Isolation Between Tests**610 - Always create fresh copies of test data for each test611 - Use `JSON.parse(JSON.stringify(original))` for deep cloning612 - Reset all mocks before each test with `jest.clearAllMocks()`613 - Avoid state that persists between tests614615```javascript616 beforeEach(() => {617 jest.clearAllMocks();618 // Deep clone the test data619 testTasksData = JSON.parse(JSON.stringify(sampleTasks));620 });621```622623- **Test All Path Variations**624 - Regular tasks and subtasks625 - Single items and multiple items626 - Success paths and error paths627 - Edge cases (empty data, invalid inputs, etc.)628629```javascript630 // Multiple test cases covering different scenarios631 test('should update regular task status', () => {632 /* test implementation */633 });634635 test('should update subtask status', () => {636 /* test implementation */637 });638639 test('should update multiple tasks when given comma-separated IDs', () => {640 /* test implementation */641 });642643 test('should throw error for non-existent task ID', () => {644 /* test implementation */645 });646```647648- **Stabilize Tests With Predictable Input/Output**649 - Use consistent, predictable test fixtures650 - Avoid random values or time-dependent data651 - Make tests deterministic for reliable CI/CD652 - Control all variables that might affect test outcomes653654```javascript655 // Use a specific known date instead of current date656 const fixedDate = new Date('2023-01-01T12:00:00Z');657 jest.spyOn(global, 'Date').mockImplementation(() => fixedDate);658```659660See [tests/README.md](mdc:tests/README.md) for more details on the testing approach.661662Refer to [jest.config.js](mdc:jest.config.js) for Jest configuration options.
Also in skindhu/AI-TASK-MANAGER
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| skindhu/AI-TASK-MANAGER.cursor/rules/ui.mdc · 192 | Cursor rules | ui | 62/100 | 3 days ago | |
| skindhu/AI-TASK-MANAGER.cursor/rules/architecture.mdc · 192 | Cursor rules | testarchtesting-strategy | 42/100 | 3 days ago | |
| skindhu/AI-TASK-MANAGER.cursor/rules/commands.mdc · 192 | Cursor rules | stylearch | 62/100 | 3 days ago | |
| skindhu/AI-TASK-MANAGER.cursor/rules/cursor_rules.mdc · 192 | Cursor rules | no sections | 36/100 | 3 days ago | |
| skindhu/AI-TASK-MANAGER.cursor/rules/dependencies.mdc · 192 | Cursor rules | arch | 66/100 | 3 days ago | |
| skindhu/AI-TASK-MANAGER.cursor/rules/dev_workflow.mdc · 192 | Cursor rules | setup | 52/100 | 3 days ago | |
| skindhu/AI-TASK-MANAGER.cursor/rules/new_features.mdc · 192 | Cursor rules | testtesting-strategydocs | 65/100 | 3 days ago | |
| skindhu/AI-TASK-MANAGER.cursor/rules/self_improve.mdc · 192 | Cursor rules | no sections | 36/100 | 3 days ago | |
| skindhu/AI-TASK-MANAGER.cursor/rules/tasks.mdc · 192 | Cursor rules | arch | 70/100 | 3 days ago | |
| skindhu/AI-TASK-MANAGER.cursor/rules/utilities.mdc · 192 | Cursor rules | securitydocs | 54/100 | 3 days ago | |
| skindhu/AI-TASK-MANAGERassets/.windsurfrules · 192 | Windsurf rules | setup | 40/100 | 3 days ago |
Diff against .cursor/rules/ui.mdc Diff against .cursor/rules/architecture.mdc Diff against .cursor/rules/commands.mdc Diff against .cursor/rules/cursor_rules.mdc Diff against .cursor/rules/dependencies.mdc Diff against .cursor/rules/dev_workflow.mdc Diff against .cursor/rules/new_features.mdc Diff against .cursor/rules/self_improve.mdc Diff against .cursor/rules/tasks.mdc Diff against .cursor/rules/utilities.mdc Diff against assets/.windsurfrules
Similar configs
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| hiromaily/go-crypto-wallet.cursor/rules/typescript.mdc · 126 | Cursor rules | setupbuildtestlint-format+6 | 100/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/10-hermes-api.mdc · 45 | Cursor rules | testlint-formatstylearch+5 | 100/100 | 3 days ago | |
| markstev/mark-starter.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+6 | 99/100 | 3 days ago | |
| Allymahmoud/case-intake-platform.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| deifos/clipmira-subtitles.cursor/rules/frontend.mdc · 1 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| dodgecfr/combatfilms-webapp.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| langflow-ai/langflow.cursor/rules/docs_development.mdc · 153k | Cursor rules | setupbuildtestlint-format+7 | 97/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/20-hermes-api-tests.mdc · 45 | Cursor rules | teststyletesting-strategysecurity+3 | 97/100 | 3 days ago |
