{"id":31655552,"url":"https://github.com/tigredonorte/eslint-plugin-test-flakiness","last_synced_at":"2026-02-20T18:07:42.421Z","repository":{"id":314614587,"uuid":"1056157644","full_name":"tigredonorte/eslint-plugin-test-flakiness","owner":"tigredonorte","description":"ESLint plugin that prevents common sources of flaky tests (hard-coded timeouts, missing awaits, random data, unmocked network/IO). Flat-config ready, with recommended/strict/all presets. Works with Jest, Playwright, Vitest, Cypress, Testing Library.","archived":false,"fork":false,"pushed_at":"2026-02-17T00:17:01.000Z","size":598,"stargazers_count":1,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-17T05:44:54.751Z","etag":null,"topics":["ci","cicd","cypress","eslint","eslint-plugin","flaky-tests","jest","playwright","quality","quality-assurance","test","test-automation","testing","testing-library","testing-tools","vitest"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tigredonorte.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-13T14:06:36.000Z","updated_at":"2025-09-26T10:50:07.000Z","dependencies_parsed_at":"2025-12-27T09:03:27.331Z","dependency_job_id":null,"html_url":"https://github.com/tigredonorte/eslint-plugin-test-flakiness","commit_stats":null,"previous_names":["tigredonorte/eslint-plugin-test-flakiness"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/tigredonorte/eslint-plugin-test-flakiness","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tigredonorte%2Feslint-plugin-test-flakiness","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tigredonorte%2Feslint-plugin-test-flakiness/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tigredonorte%2Feslint-plugin-test-flakiness/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tigredonorte%2Feslint-plugin-test-flakiness/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tigredonorte","download_url":"https://codeload.github.com/tigredonorte/eslint-plugin-test-flakiness/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tigredonorte%2Feslint-plugin-test-flakiness/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29558099,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-17T20:52:40.164Z","status":"ssl_error","status_checked_at":"2026-02-17T20:48:10.325Z","response_time":100,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ci","cicd","cypress","eslint","eslint-plugin","flaky-tests","jest","playwright","quality","quality-assurance","test","test-automation","testing","testing-library","testing-tools","vitest"],"created_at":"2025-10-07T13:15:40.779Z","updated_at":"2026-02-17T23:00:28.778Z","avatar_url":"https://github.com/tigredonorte.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# eslint-plugin-test-flakiness\n\n\u003e ESLint plugin to detect and prevent flaky test patterns\n\n[![npm version](https://img.shields.io/npm/v/eslint-plugin-test-flakiness.svg)](https://www.npmjs.com/package/eslint-plugin-test-flakiness)\n[![npm downloads](https://img.shields.io/npm/dt/eslint-plugin-test-flakiness.svg)](https://www.npmjs.com/package/eslint-plugin-test-flakiness)\n[![CI Status](https://github.com/tigredonorte/eslint-plugin-test-flakiness/actions/workflows/ci.yml/badge.svg)](https://github.com/tigredonorte/eslint-plugin-test-flakiness/actions/workflows/ci.yml)\n[![Coverage Status](https://img.shields.io/codecov/c/github/tigredonorte/eslint-plugin-test-flakiness)](https://codecov.io/gh/tigredonorte/eslint-plugin-test-flakiness)\n[![TypeScript](https://img.shields.io/badge/types-included-blue.svg)](https://www.typescriptlang.org/)\n[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nCatch flaky test patterns before they cause intermittent failures in your CI/CD pipeline. This plugin identifies\ncommon anti-patterns that lead to flaky tests and provides automatic fixes where possible.\n\n**[🚀 Try it live in StackBlitz](https://stackblitz.com/github/tigredonorte/eslint-plugin-test-flakiness/tree/main/playground)**\n| **[📦 View on NPM](https://www.npmjs.com/package/eslint-plugin-test-flakiness)**\n| **[🎬 See it in action](docs/demo-example.md)**\n\n## Features\n\n- **Comprehensive Detection**: Identifies 15+ types of flaky patterns\n- **Auto-fixable**: Many rules include automatic fixes\n- **Framework Support**: Works with Jest, Vitest, Testing Library, Playwright, Cypress\n- **Risk-based**: Rules categorized by flakiness risk (high/medium/low)\n- **Fast**: Runs at lint-time, no runtime overhead\n- **Configurable**: Tune rules to match your team's needs\n\n## Compatibility\n\n| Environment          | Version                            | Status             |\n| -------------------- | ---------------------------------- | ------------------ |\n| **Node.js**          | 14.x, 16.x, 18.x, 20.x, 22.x, 24.x | ✅ Tested in CI    |\n| **ESLint**           | 7.x, 8.x, 9.x                      | ✅ Fully supported |\n| **TypeScript**       | 4.x, 5.x                           | ✅ Types included  |\n| **Package Managers** | npm, yarn, pnpm                    | ✅ All supported   |\n\n## Installation\n\n```bash\nnpm install --save-dev eslint-plugin-test-flakiness\n# or\nyarn add -D eslint-plugin-test-flakiness\n# or\npnpm add -D eslint-plugin-test-flakiness\n```\n\n## Quick Start\n\n**[🚀 Try it live in StackBlitz](https://stackblitz.com/github/tigredonorte/eslint-plugin-test-flakiness/tree/main/playground)**\n\n- See the plugin in action with interactive examples\n\n### Flat Config (ESLint 9+)\n\n```javascript\n// eslint.config.js\nimport testFlakiness from \"eslint-plugin-test-flakiness\";\n\nexport default [\n  {\n    plugins: {\n      \"test-flakiness\": testFlakiness,\n    },\n    rules: {\n      // Start with recommended rules\n      ...testFlakiness.configs.recommended.rules,\n\n      // Override specific rules as needed\n      \"test-flakiness/no-hard-coded-timeout\": [\n        \"error\",\n        {\n          maxTimeout: 100, // Allow timeouts under 100ms\n        },\n      ],\n\n      // Turn off rules that don't apply to your project\n      \"test-flakiness/no-animation-wait\": \"off\",\n    },\n  },\n];\n```\n\n### Legacy Config (.eslintrc)\n\n```json\n{\n  \"plugins\": [\"test-flakiness\"],\n  \"extends\": [\"plugin:test-flakiness/recommended\"],\n  \"rules\": {\n    // Override specific rules\n    \"test-flakiness/no-hard-coded-timeout\": [\n      \"error\",\n      {\n        \"maxTimeout\": 100\n      }\n    ],\n    \"test-flakiness/no-animation-wait\": \"off\"\n  }\n}\n```\n\n## Adoption Path\n\nGradual rollout strategy to minimize disruption while improving test quality:\n\n### Week 1: Discovery Phase\n\n- Install the plugin with `recommended` config\n- Set all rules to `warn` to identify problem areas\n- Run `npx eslint . --ext .test.js,.test.ts \u003e flaky-patterns.txt` to audit your codebase\n- Review the results with your team to prioritize fixes\n\n### Week 2: High-Risk Mitigation\n\n- Switch high-risk rules to `error`:\n  - `no-hard-coded-timeout`\n  - `await-async-events`\n  - `no-immediate-assertions`\n- Fix or add eslint-disable comments with justification\n- Add pre-commit hooks to prevent new violations\n\n### Week 3: CI Integration\n\n- Enable `strict` config for CI/CD pipelines\n- Use `--max-warnings 0` for high-risk rules\n- Keep medium-risk rules as warnings for gradual improvement\n- Track warning counts as technical debt metrics\n\n### Week 4+: Full Adoption\n\n- Gradually convert warnings to errors as fixes are implemented\n- Consider custom configurations per test directory\n- Document team-specific exceptions in your contributing guide\n\n## Available Configurations\n\n### `recommended`\n\nBalanced configuration for most projects. Enables high-risk rules as errors and medium-risk as warnings.\n\n```json\n{\n  \"extends\": [\"plugin:test-flakiness/recommended\"]\n}\n```\n\n### `strict`\n\nZero-tolerance for flaky patterns. All rules enabled as errors.\n\n```json\n{\n  \"extends\": [\"plugin:test-flakiness/strict\"]\n}\n```\n\n### `all`\n\nEnables all available rules as errors. Use with caution.\n\n```json\n{\n  \"extends\": [\"plugin:test-flakiness/all\"]\n}\n```\n\n### Configuration Risk Mapping\n\n| Configuration | High Risk Rules | Medium Risk Rules | Low Risk Rules | Special Rules |\n| ------------- | --------------- | ----------------- | -------------- | ------------- |\n| `recommended` | ❌ Error        | ⚠️ Warning        | 🔕 Off         | ❌ Error      |\n| `strict`      | ❌ Error        | ❌ Error          | ⚠️ Warning     | ❌ Error      |\n| `all`         | ❌ Error        | ❌ Error          | ❌ Error       | ❌ Error      |\n\n## Rules\n\n### High Risk\n\nRules that frequently cause test failures in CI/CD environments.\n\n| Rule                                                               | Why it matters                                                                       | Auto-fix | What the fixer does                                                                    |\n| ------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | :------: | -------------------------------------------------------------------------------------- |\n| [`no-hard-coded-timeout`](docs/rules/no-hard-coded-timeout.md)     | Hard-coded timeouts like `setTimeout(fn, 1000)` are brittle and fail on slow systems |    ✅    | Converts to `waitFor` pattern when safe; suggests manual fix otherwise                 |\n| [`await-async-events`](docs/rules/await-async-events.md)           | Missing awaits cause race conditions between actions and assertions                  |    ✅    | Adds `await` keyword to async Testing Library/Playwright/Cypress methods               |\n| [`no-immediate-assertions`](docs/rules/no-immediate-assertions.md) | Assertions immediately after state changes miss async updates                        |    ✅    | Wraps assertion in `waitFor` with appropriate timeout                                  |\n| [`no-unconditional-wait`](docs/rules/no-unconditional-wait.md)     | Fixed delays don't guarantee operations complete                                     |    ✅    | Replaces with `waitFor` condition check when assertion follows; suggests fix otherwise |\n| [`no-promise-race`](docs/rules/no-promise-race.md)                 | Promise.race can produce unpredictable test results                                  |    ❌    | No auto-fix (requires manual refactoring)                                              |\n\n### Medium Risk\n\nRules that cause intermittent failures or maintenance issues.\n\n| Rule                                                                 | Why it matters                                                     | Auto-fix | What the fixer does                                       |\n| -------------------------------------------------------------------- | ------------------------------------------------------------------ | :------: | --------------------------------------------------------- |\n| [`no-index-queries`](docs/rules/no-index-queries.md)                 | Index-based queries (`:nth-child`, `[0]`) break when order changes |    ❌    | No auto-fix (requires semantic query refactoring)         |\n| [`no-animation-wait`](docs/rules/no-animation-wait.md)               | Animation timing varies across environments                        |    ❌    | No auto-fix (requires animation-specific handling)        |\n| [`no-global-state-mutation`](docs/rules/no-global-state-mutation.md) | Global state changes affect other tests                            |    ❌    | No auto-fix (requires architectural changes)              |\n| [`no-unmocked-network`](docs/rules/no-unmocked-network.md)           | Network calls fail when services are down                          |    ❌    | No auto-fix (requires mock implementation)                |\n| [`no-unmocked-fs`](docs/rules/no-unmocked-fs.md)                     | File system operations are environment-dependent                   |    ❌    | No auto-fix (requires mock implementation)                |\n| [`no-database-operations`](docs/rules/no-database-operations.md)     | Database state affects test reliability                            |    ❌    | No auto-fix (requires mock/stub implementation)           |\n| [`no-element-removal-check`](docs/rules/no-element-removal-check.md) | Checking element removal is timing-sensitive                       |    ✅    | Converts to `waitForElementToBeRemoved` with proper await |\n\n### Low Risk\n\nRules that improve test maintainability and reduce edge-case failures.\n\n| Rule                                                           | Why it matters                                     | Auto-fix | What the fixer does                         |\n| -------------------------------------------------------------- | -------------------------------------------------- | :------: | ------------------------------------------- |\n| [`no-random-data`](docs/rules/no-random-data.md)               | Random data makes tests non-reproducible           |    ❌    | No auto-fix (requires deterministic values) |\n| [`no-long-text-match`](docs/rules/no-long-text-match.md)       | Long text matches break with minor content changes |    ❌    | No auto-fix (requires semantic matching)    |\n| [`no-viewport-dependent`](docs/rules/no-viewport-dependent.md) | Tests fail on different screen sizes               |    ❌    | No auto-fix (requires responsive design)    |\n| [`no-focus-check`](docs/rules/no-focus-check.md)               | Focus behavior varies across browsers              |    ❌    | No auto-fix (requires alternative approach) |\n\n### Special Rules\n\nDevelopment and CI/CD specific rules.\n\n| Rule                                                   | Why it matters                                   | Auto-fix | What the fixer does                       |\n| ------------------------------------------------------ | ------------------------------------------------ | :------: | ----------------------------------------- |\n| [`no-test-focus`](docs/rules/no-test-focus.md)         | `.only` and `.focus` skip other tests in CI      |    ✅    | Removes `.only` and `.focus` modifiers    |\n| [`no-test-isolation`](docs/rules/no-test-isolation.md) | Tests without proper isolation affect each other |    ❌    | No auto-fix (requires test restructuring) |\n\n## Rule Configuration\n\nEach rule can be configured individually:\n\n```javascript\n{\n  \"rules\": {\n    \"test-flakiness/no-hard-coded-timeout\": [\"error\", {\n      \"maxTimeout\": 500,        // Allow timeouts under 500ms\n      \"allowInSetup\": true      // Allow in beforeEach/afterEach\n    }],\n\n    \"test-flakiness/await-async-events\": [\"error\", {\n      \"customAsyncMethods\": [\"myAsyncHelper\", \"customEvent\"]\n    }]\n  }\n}\n```\n\n## Examples\n\n### Bad: Hard-coded timeout\n\n```javascript\nit(\"should show notification\", async () =\u003e {\n  showNotification();\n  await new Promise((resolve) =\u003e setTimeout(resolve, 2000));\n  expect(notification).toBeVisible();\n});\n```\n\n### Good: Using waitFor\n\n```javascript\nit(\"should show notification\", async () =\u003e {\n  showNotification();\n  await waitFor(\n    () =\u003e {\n      expect(notification).toBeVisible();\n    },\n    { timeout: 2000 },\n  );\n});\n```\n\n### Bad: Missing await\n\n```javascript\nit(\"should update on click\", () =\u003e {\n  userEvent.click(button); // Missing await!\n  expect(screen.getByText(\"Updated\")).toBeInTheDocument();\n});\n```\n\n### Good: Properly awaited\n\n```javascript\nit(\"should update on click\", async () =\u003e {\n  await userEvent.click(button);\n  expect(await screen.findByText(\"Updated\")).toBeInTheDocument();\n});\n```\n\n### Bad: Index-based query\n\n```javascript\nconst thirdItem = container.querySelectorAll(\".item\")[2];\nconst lastButton = screen.getAllByRole(\"button\")[buttons.length - 1];\n```\n\n### Good: Specific query\n\n```javascript\nconst specificItem = screen.getByTestId(\"item-3\");\nconst submitButton = screen.getByRole(\"button\", { name: /submit/i });\n```\n\n## Integration with CI/CD\n\n### GitHub Actions\n\n```yaml\nname: Lint\non: [push, pull_request]\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-node@v3\n      - run: npm ci\n      - run: npx eslint . --ext .test.js,.test.ts\n```\n\n### Pre-commit Hook\n\n```json\n// package.json\n{\n  \"husky\": {\n    \"hooks\": {\n      \"pre-commit\": \"eslint --ext .test.js,.test.ts\"\n    }\n  }\n}\n```\n\n### Custom Script for Analysis\n\n```javascript\n// analyze-flakiness.js\nconst {\n  analyzeFileContent,\n} = require(\"eslint-plugin-test-flakiness/lib/analyzer\");\nconst fs = require(\"fs\");\n\nconst content = fs.readFileSync(\"my-test.spec.js\", \"utf8\");\nconst analysis = analyzeFileContent(content, \"my-test.spec.js\");\n\nif (analysis.riskLevel === \"high\") {\n  console.error(\"High flakiness risk detected!\");\n  process.exit(1);\n}\n```\n\n## Philosophy\n\nThis plugin follows these principles:\n\n1. **Prevention over Detection**: Catch issues at lint-time, not runtime\n2. **Actionable Feedback**: Every error includes why it's a problem and how to fix it\n3. **Progressive Enhancement**: Start with recommended, move to strict as your tests improve\n4. **Framework Agnostic**: Core patterns apply regardless of test framework\n\n## How It Works\n\nThe plugin uses AST (Abstract Syntax Tree) analysis to detect patterns that commonly cause test flakiness:\n\n- **Timing Issues**: Hard-coded delays, missing awaits\n- **Structural Fragility**: Index-based queries, order dependencies\n- **State Management**: Global mutations, missing cleanup\n- **Network/IO**: Unmocked external calls\n- **Non-determinism**: Random data, time-based logic\n\n## Framework Compatibility\n\n| Rule                       | Jest | Vitest | Testing Library | Playwright | Cypress | Framework-Agnostic |\n| -------------------------- | :--: | :----: | :-------------: | :--------: | :-----: | :----------------: |\n| `no-hard-coded-timeout`    |  ✅  |   ✅   |       ✅        |     ✅     |   ✅    |         ✅         |\n| `await-async-events`       |  ✅  |   ✅   |       ✅        |     ✅     |   ✅    |         -          |\n| `no-immediate-assertions`  |  ✅  |   ✅   |       ✅        |     ✅     |   ✅    |         ✅         |\n| `no-unconditional-wait`    |  ✅  |   ✅   |       ✅        |     ✅     |   ✅    |         ✅         |\n| `no-promise-race`          |  ✅  |   ✅   |       ✅        |     ✅     |   ✅    |         ✅         |\n| `no-index-queries`         |  -   |   -    |       ✅        |     ✅     |   ✅    |         ✅         |\n| `no-animation-wait`        |  -   |   -    |       ✅        |     ✅     |   ✅    |         -          |\n| `no-global-state-mutation` |  ✅  |   ✅   |       ✅        |     ✅     |   ✅    |         ✅         |\n| `no-unmocked-network`      |  ✅  |   ✅   |        -        |     ✅     |   ✅    |         -          |\n| `no-unmocked-fs`           |  ✅  |   ✅   |        -        |     -      |    -    |         -          |\n| `no-database-operations`   |  ✅  |   ✅   |        -        |     -      |    -    |         -          |\n| `no-element-removal-check` |  -   |   -    |       ✅        |     ✅     |   ✅    |         -          |\n| `no-random-data`           |  ✅  |   ✅   |       ✅        |     ✅     |   ✅    |         ✅         |\n| `no-long-text-match`       |  ✅  |   ✅   |       ✅        |     ✅     |   ✅    |         -          |\n| `no-viewport-dependent`    |  -   |   -    |       ✅        |     ✅     |   ✅    |         -          |\n| `no-focus-check`           |  -   |   -    |       ✅        |     ✅     |   ✅    |         -          |\n| `no-test-focus`            |  ✅  |   ✅   |        -        |     ✅     |   ✅    |         -          |\n| `no-test-isolation`        |  ✅  |   ✅   |       ✅        |     ✅     |   ✅    |         ✅         |\n\n**Prerequisites:**\n\n- Testing Library rules require `@testing-library/*` packages\n- Playwright rules require `@playwright/test`\n- Cypress rules require `cypress` package\n\n## Resources\n\n- [Writing Reliable Tests](https://testing-library.com/docs/guide-disappearance)\n- [Common Testing Mistakes](https://kentcdodds.com/blog/common-mistakes-with-react-testing-library)\n- [Playwright Best Practices](https://playwright.dev/docs/best-practices)\n- [Cypress Anti-patterns](https://docs.cypress.io/guides/references/best-practices)\n\n## FAQ\n\n**Q: Is this plugin performance-intensive?**\nA: No, it runs during ESLint's normal AST traversal with minimal overhead.\n\n**Q: Can I use this with TypeScript?**\nA: Yes! It works with `.ts` and `.tsx` test files automatically.\n\n**Q: Does it work with all test frameworks?**\nA: It detects patterns common across frameworks. Some rules are framework-specific but will only activate when\nrelevant.\n\n**Q: How do I handle false positives?**\nA: You can disable rules inline with `// eslint-disable-next-line test-flakiness/rule-name` or configure rules to be\nless strict.\n\n### Handling False Positives\n\nFor high-risk rules that may trigger false positives, use inline disables with a clear rationale:\n\n```javascript\n// ❌ Bad: No explanation\n// eslint-disable-next-line test-flakiness/no-hard-coded-timeout\nawait setTimeout(1000);\n\n// ✅ Good: Clear rationale\n// eslint-disable-next-line test-flakiness/no-hard-coded-timeout -- Required for animation completion\nawait setTimeout(1000);\n```\n\n**Allowed Patterns for Common False Positives:**\n\n1. **no-hard-coded-timeout**: Allowed in test setup/teardown when documented\n2. **no-unconditional-wait**: Acceptable for rate limiting or animation waits with clear comments\n3. **no-index-queries**: OK when testing list ordering specifically\n4. **no-random-data**: Fine when testing randomization features themselves\n\nFor more details on handling false positives, see our [False Positive Guide](docs/FALSE_POSITIVES.md).\n\n## Who's Using This?\n\n\u003e Is your team using eslint-plugin-test-flakiness?\n\u003e [Add your company/project](https://github.com/tigredonorte/eslint-plugin-test-flakiness/edit/main/README.md) to this list!\n\n- **Your Company Here** - [Submit a PR](https://github.com/tigredonorte/eslint-plugin-test-flakiness/pulls) to add\n  your logo and testimonial\n- Looking for early adopters! Be one of the first to showcase your commitment to test quality\n\n### Success Stories\n\nShare how this plugin helped reduce flaky tests in your project.\n[Create an issue](https://github.com/tigredonorte/eslint-plugin-test-flakiness/issues/new) with the `success-story` label.\n\n## Reporting Issues\n\nFound a bug or have a feature request? Please [open an issue](https://github.com/tigredonorte/eslint-plugin-test-flakiness/issues).\n\n## License\n\nMIT © [Your Name]\n\n## Contributing\n\nContributions are welcome! Please read our [contributing guide](docs/CONTRIBUTING.md) for details.\n\n### Development Setup\n\nThis project uses **pnpm 10.15.1** for package management. To contribute:\n\n1. Install pnpm: `npm install -g pnpm@10.15.1`\n2. Fork and clone the repository\n3. Run `pnpm install` to install dependencies\n4. Run `pnpm test:watch` for development\n5. Run `pnpm lint` before committing\n\n### Additional Documentation\n\n- [Deployment Guide](docs/DEPLOYMENT.md) - Complete setup for publishing and CI/CD\n- [Commit Guidelines](docs/COMMIT_GUIDELINES.md) - Conventional commit format and examples\n\n---\n\n---\n\nMade with care to reduce test flakiness everywhere\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftigredonorte%2Feslint-plugin-test-flakiness","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftigredonorte%2Feslint-plugin-test-flakiness","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftigredonorte%2Feslint-plugin-test-flakiness/lists"}