Biome Validator Validates Biome 2.3+ configuration and prevents outdated patterns. Ensures type-aware linting, domains, and modern Biome features are properly configured. When This Activates - Setting up linting for a new project - Before any code quality work - Auditing existing Biome configurations - After AI generates biome.json - CI/CD pipeline validation Quick Start What Gets Checked 1. Biome Version & Schema GOOD - Biome 2.3+: BAD - Old schema: 2. Package Version 3. Linter Configuration GOOD - Biome 2.x: 4. Biome Assist (2.0+) GOOD - Using assist: BAD - Old organizeImports location: 5.…

, '', content, flags=re.MULTILINE)\n content = re.sub(r'/\\*.*?\\*/', '', content, flags=re.DOTALL)\n config = json.loads(content)\n except json.JSONDecodeError as e:\n result.add_issue('error', config_path.name, f'Invalid JSON: {e}')\n return None\n\n return config\n\n\ndef check_schema_version(config: dict, result: ValidationResult):\n \"\"\"Check $schema version.\"\"\"\n schema = config.get('$schema', '')\n\n if not schema:\n result.add_issue('warning', 'biome.json',\n 'No $schema defined',\n fix='Add \"$schema\": \"https://biomejs.dev/schemas/2.3.12/schema.json\"')\n return\n\n # Extract version from schema URL\n match = re.search(r'/schemas/(\\d+\\.\\d+\\.\\d+)/', schema)\n if match:\n version = match.group(1)\n result.schema_version = version\n\n parts = version.split('.')\n major, minor = int(parts[0]), int(parts[1])\n\n if major \u003c 2:\n result.add_issue('error', 'biome.json',\n f'Schema version {version} is outdated. Use 2.3+',\n fix='Update $schema to \"https://biomejs.dev/schemas/2.3.12/schema.json\"')\n elif major == 2 and minor \u003c 3:\n result.add_issue('warning', 'biome.json',\n f'Schema version {version}. Consider upgrading to 2.3+',\n fix='Update $schema to \"https://biomejs.dev/schemas/2.3.12/schema.json\"')\n else:\n result.add_passed(f'Schema version: {version}')\n else:\n result.add_issue('warning', 'biome.json',\n f'Could not parse schema version from: {schema}')\n\n\ndef check_linter_config(config: dict, result: ValidationResult):\n \"\"\"Check linter configuration.\"\"\"\n linter = config.get('linter', {})\n\n if not linter.get('enabled', True):\n result.add_issue('warning', 'biome.json',\n 'Linter is disabled',\n fix='Set linter.enabled: true')\n return\n\n result.add_passed('Linter enabled')\n\n # Check rules\n rules = linter.get('rules', {})\n if rules.get('recommended'):\n result.add_passed('Using recommended rules')\n else:\n result.add_issue('warning', 'biome.json',\n 'Recommended rules not enabled',\n fix='Add \"recommended\": true to linter.rules')\n\n # Check for useful rules\n correctness = rules.get('correctness', {})\n if correctness.get('useAwaitThenable'):\n result.add_passed('useAwaitThenable rule enabled')\n else:\n result.add_issue('warning', 'biome.json',\n 'useAwaitThenable not enabled (catches await on non-Promise)',\n fix='Add correctness.useAwaitThenable: \"error\"')\n\n if correctness.get('noLeakedRender'):\n result.add_passed('noLeakedRender rule enabled')\n\n # Check domains (Biome 2.0+)\n domains = linter.get('domains', {})\n if domains:\n enabled_domains = [k for k, v in domains.items() if v == 'on']\n if enabled_domains:\n result.add_passed(f'Domains enabled: {\", \".join(enabled_domains)}')\n else:\n result.add_issue('warning', 'biome.json',\n 'No domains configured (consider enabling react, next, test)',\n fix='Add linter.domains: { \"react\": \"on\", \"next\": \"on\" }')\n\n\ndef check_assist_config(config: dict, result: ValidationResult):\n \"\"\"Check assist configuration (Biome 2.0+).\"\"\"\n assist = config.get('assist', {})\n\n # Check for old organizeImports location\n if 'organizeImports' in config:\n result.add_issue('error', 'biome.json',\n 'organizeImports at root level is deprecated',\n fix='Move to assist.actions.source.organizeImports')\n return\n\n actions = assist.get('actions', {})\n source = actions.get('source', {})\n\n if source.get('organizeImports') == 'on':\n result.add_passed('Using assist.actions for import organization')\n else:\n result.add_issue('warning', 'biome.json',\n 'Import organization not configured',\n fix='Add assist.actions.source.organizeImports: \"on\"')\n\n\ndef check_formatter_config(config: dict, result: ValidationResult):\n \"\"\"Check formatter configuration.\"\"\"\n formatter = config.get('formatter', {})\n\n if not formatter.get('enabled', True):\n result.add_issue('warning', 'biome.json',\n 'Formatter is disabled',\n fix='Set formatter.enabled: true')\n return\n\n result.add_passed('Formatter enabled')\n\n # Check basic settings\n if formatter.get('indentStyle'):\n result.add_passed(f'Indent style: {formatter[\"indentStyle\"]}')\n\n\ndef check_old_configs(root: Path, result: ValidationResult):\n \"\"\"Check for old ESLint/Prettier configs that should be removed.\"\"\"\n old_files = [\n '.eslintrc',\n '.eslintrc.js',\n '.eslintrc.json',\n '.eslintrc.yml',\n '.eslintrc.yaml',\n '.prettierrc',\n '.prettierrc.js',\n '.prettierrc.json',\n '.prettierrc.yml',\n '.prettierrc.yaml',\n 'prettier.config.js',\n '.eslintignore',\n '.prettierignore',\n ]\n\n for old_file in old_files:\n if (root / old_file).exists():\n result.add_issue('warning', old_file,\n f'Old config file found - Biome replaces ESLint/Prettier',\n fix=f'rm {old_file}')\n\n\ndef print_report(result: ValidationResult, verbose: bool = False):\n \"\"\"Print validation report.\"\"\"\n print(\"\\n\" + \"=\" * 50)\n print(\" Biome 2.3+ Validation Report\")\n print(\"=\" * 50 + \"\\n\")\n\n if result.biome_version:\n print(f\"Package Version: @biomejs/biome@{result.biome_version.lstrip('^~>=')}\")\n if result.schema_version:\n print(f\"Schema Version: {result.schema_version}\")\n print()\n\n if verbose and result.passed:\n print(\"Passed Checks:\")\n for msg in result.passed:\n print(f\" [PASS] {msg}\")\n print()\n\n if result.issues:\n errors = [i for i in result.issues if i.severity == 'error']\n warnings = [i for i in result.issues if i.severity == 'warning']\n\n if errors:\n print(\"Errors:\")\n for issue in errors:\n print(f\" [ERROR] {issue.file}\")\n print(f\" {issue.message}\")\n if issue.fix:\n print(f\" Fix: {issue.fix}\")\n print()\n\n if warnings:\n print(\"Warnings:\")\n for issue in warnings:\n print(f\" [WARN] {issue.file}\")\n print(f\" {issue.message}\")\n if issue.fix:\n print(f\" Fix: {issue.fix}\")\n print()\n\n print(\"-\" * 50)\n error_count = len([i for i in result.issues if i.severity == 'error'])\n warning_count = len([i for i in result.issues if i.severity == 'warning'])\n\n if error_count == 0 and warning_count == 0:\n print(\"Result: All checks passed! Biome configured correctly.\")\n else:\n print(f\"Result: {error_count} error(s), {warning_count} warning(s)\")\n\n print()\n\n\ndef main():\n parser = argparse.ArgumentParser(description='Validate Biome 2.3+ configuration')\n parser.add_argument('--root', '-r', type=str, default='.', help='Project root directory')\n parser.add_argument('--strict', action='store_true', help='Treat warnings as errors')\n parser.add_argument('--ci', action='store_true', help='CI mode: exit with non-zero on errors')\n parser.add_argument('--verbose', '-v', action='store_true', help='Show passed checks')\n parser.add_argument('--json', action='store_true', help='Output as JSON')\n\n args = parser.parse_args()\n root = Path(args.root).resolve()\n\n if not root.exists():\n print(f\"Error: Directory not found: {root}\")\n sys.exit(1)\n\n result = ValidationResult()\n\n # Run all checks\n check_package_version(root, result)\n config = check_biome_config(root, result)\n\n if config:\n check_schema_version(config, result)\n check_linter_config(config, result)\n check_assist_config(config, result)\n check_formatter_config(config, result)\n\n check_old_configs(root, result)\n\n # Output\n if args.json:\n output = {\n 'biome_version': result.biome_version,\n 'schema_version': result.schema_version,\n 'passed': result.passed,\n 'issues': [\n {\n 'severity': i.severity,\n 'file': i.file,\n 'message': i.message,\n 'fix': i.fix\n }\n for i in result.issues\n ]\n }\n print(json.dumps(output, indent=2))\n else:\n print_report(result, verbose=args.verbose)\n\n # Exit code\n if args.ci or args.strict:\n if result.has_errors:\n sys.exit(1)\n if args.strict and any(i.severity == 'warning' for i in result.issues):\n sys.exit(1)\n\n sys.exit(0)\n\n\nif __name__ == '__main__':\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":12477,"content_sha256":"172edbc0d5f7bf5e9d8e3e6fa75fd143db8465ff2e57e8f9b5e14acc1013d442"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Biome Validator","type":"text"}]},{"type":"paragraph","content":[{"text":"Validates Biome 2.3+ configuration and prevents outdated patterns. Ensures type-aware linting, domains, and modern Biome features are properly configured.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When This Activates","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Setting up linting for a new project","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Before any code quality work","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Auditing existing Biome configurations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"After AI generates biome.json","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CI/CD pipeline validation","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Start","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/validate.py --root .\npython3 scripts/validate.py --root . --strict","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"What Gets Checked","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. Biome Version & Schema","type":"text"}]},{"type":"paragraph","content":[{"text":"GOOD - Biome 2.3+:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"$schema\": \"https://biomejs.dev/schemas/2.3.12/schema.json\"\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"BAD - Old schema:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"$schema\": \"https://biomejs.dev/schemas/1.9.0/schema.json\"\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. Package Version","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"// GOOD: v2.3+\n\"@biomejs/biome\": \"^2.3.0\"\n\n// BAD: v1.x or v2.0-2.2\n\"@biomejs/biome\": \"^1.9.0\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. Linter Configuration","type":"text"}]},{"type":"paragraph","content":[{"text":"GOOD - Biome 2.x:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"linter\": {\n \"enabled\": true,\n \"rules\": {\n \"recommended\": true,\n \"suspicious\": {\n \"noExplicitAny\": \"warn\"\n }\n }\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4. Biome Assist (2.0+)","type":"text"}]},{"type":"paragraph","content":[{"text":"GOOD - Using assist:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"assist\": {\n \"actions\": {\n \"source\": {\n \"organizeImports\": \"on\"\n }\n }\n }\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"BAD - Old organizeImports location:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"organizeImports\": {\n \"enabled\": true\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"5. Domains (2.0+)","type":"text"}]},{"type":"paragraph","content":[{"text":"GOOD - Using domains for framework-specific rules:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"linter\": {\n \"domains\": {\n \"react\": \"on\",\n \"next\": \"on\"\n }\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"6. Suppression Comments","type":"text"}]},{"type":"paragraph","content":[{"text":"GOOD - Biome 2.0+ comments:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"typescript"},"content":[{"text":"// biome-ignore lint/suspicious/noExplicitAny: legacy code\n// biome-ignore-all lint/style/useConst\n// biome-ignore-start lint/complexity\n// biome-ignore-end","type":"text"}]},{"type":"paragraph","content":[{"text":"BAD - Wrong format:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"typescript"},"content":[{"text":"// @ts-ignore // Not Biome\n// eslint-disable // Wrong tool","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Biome 2.3+ Features","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Type-Aware Linting","type":"text"}]},{"type":"paragraph","content":[{"text":"Biome 2.0+ includes type inference without requiring TypeScript compiler:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"linter\": {\n \"rules\": {\n \"correctness\": {\n \"noUndeclaredVariables\": \"error\",\n \"useAwaitThenable\": \"error\"\n }\n }\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Assist Actions","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"assist\": {\n \"actions\": {\n \"source\": {\n \"organizeImports\": \"on\",\n \"useSortedKeys\": \"on\"\n }\n }\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Multi-file Analysis","type":"text"}]},{"type":"paragraph","content":[{"text":"Lint rules can query information from other files for more powerful analysis.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Framework Domains","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"linter\": {\n \"domains\": {\n \"react\": \"on\", // React-specific rules\n \"next\": \"on\", // Next.js rules\n \"test\": \"on\" // Testing framework rules\n }\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Recommended Configuration","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"$schema\": \"https://biomejs.dev/schemas/2.3.12/schema.json\",\n \"assist\": {\n \"actions\": {\n \"source\": {\n \"organizeImports\": \"on\"\n }\n }\n },\n \"linter\": {\n \"enabled\": true,\n \"rules\": {\n \"recommended\": true,\n \"complexity\": {\n \"noForEach\": \"off\"\n },\n \"style\": {\n \"noNonNullAssertion\": \"off\"\n },\n \"suspicious\": {\n \"noArrayIndexKey\": \"off\",\n \"noExplicitAny\": \"warn\"\n },\n \"correctness\": {\n \"useAwaitThenable\": \"error\",\n \"noLeakedRender\": \"error\"\n }\n },\n \"domains\": {\n \"react\": \"on\",\n \"next\": \"on\"\n }\n },\n \"formatter\": {\n \"enabled\": true,\n \"indentStyle\": \"space\",\n \"indentWidth\": 2,\n \"lineWidth\": 100\n },\n \"javascript\": {\n \"formatter\": {\n \"quoteStyle\": \"single\",\n \"trailingCommas\": \"es5\",\n \"semicolons\": \"always\"\n }\n },\n \"files\": {\n \"ignore\": [\n \"node_modules\",\n \"dist\",\n \"build\",\n \".next\",\n \"out\",\n \".cache\",\n \".turbo\",\n \"coverage\"\n ]\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Deprecated Patterns","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Deprecated","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Replacement (2.3+)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"organizeImports.enabled","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"assist.actions.source.organizeImports","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Schema \u003c 2.0","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Schema 2.3.11+","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"@biomejs/biome","type":"text","marks":[{"type":"code_inline"}]},{"text":" \u003c 2.3","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"@biomejs/biome@latest","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No domains config","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"linter.domains","type":"text","marks":[{"type":"code_inline"}]},{"text":" for frameworks","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Validation Output","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"=== Biome 2.3+ Validation Report ===\n\nPackage Version: @biomejs/[email protected] ✓\n\nConfiguration:\n ✓ Schema version: 2.3.11\n ✓ Linter enabled with recommended rules\n ✓ Using assist.actions for imports\n ✗ No domains configured (consider enabling react, next)\n ✓ Formatter configured\n\nRules:\n ✓ noExplicitAny: warn\n ✓ useAwaitThenable: error\n ✗ noLeakedRender not enabled (recommended)\n\nSummary: 2 issues found","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Migration from ESLint","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1: Install Biome","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bun remove eslint prettier eslint-config-* eslint-plugin-*\nbun add -D @biomejs/biome@latest","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 2: Create biome.json","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bunx biome init","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 3: Migrate rules","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bunx biome migrate eslint --write","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 4: Update scripts","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"scripts\": {\n \"lint\": \"biome lint .\",\n \"lint:fix\": \"biome lint --write .\",\n \"format\": \"biome format --write .\",\n \"check\": \"biome check .\",\n \"check:fix\": \"biome check --write .\"\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 5: Remove old configs","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"rm .eslintrc* .prettierrc* .eslintignore .prettierignore","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"VS Code Integration","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"// .vscode/settings.json\n{\n \"editor.formatOnSave\": true,\n \"editor.defaultFormatter\": \"biomejs.biome\",\n \"editor.codeActionsOnSave\": {\n \"source.organizeImports.biome\": \"explicit\",\n \"quickfix.biome\": \"explicit\"\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"CI/CD Integration","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"yaml"},"content":[{"text":"# .github/workflows/lint.yml\n- name: Validate Biome Config\n run: |\n python3 scripts/validate.py \\\n --root . \\\n --strict \\\n --ci\n\n- name: Lint\n run: bunx biome check --error-on-warnings .","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Integration","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"linter-formatter-init","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Sets up Biome from scratch","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"nextjs-validator","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Validates Next.js (enable next domain)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"bun-validator","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Validates Bun workspace","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"biome-validator","author":"@skillopedia","source":{"stars":24,"repo_name":"library","origin_url":"https://github.com/shipshitdev/library/blob/HEAD/skills/biome-validator/SKILL.md","repo_owner":"shipshitdev","body_sha256":"fa356baca41a68270234f2692685c6d535609790f7b2f05bbd0c604fa706b6f3","cluster_key":"d5ab26f2e876bfc939da8011e91f77f967f1cdf4c227c727b0f6f1197ac67316","clean_bundle":{"format":"clean-skill-bundle-v1","source":"shipshitdev/library/skills/biome-validator/SKILL.md","attachments":[{"id":"885b4d4d-5dcd-5cc4-b661-e04804c0ff1b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/885b4d4d-5dcd-5cc4-b661-e04804c0ff1b/attachment.json","path":"plugin.json","size":301,"sha256":"a44a33bf62fe39b73e0d951d38214fb15cd411e327b73dd3f61e7e4124a02949","contentType":"application/json; charset=utf-8"},{"id":"13403ee5-ed98-5adb-b5db-946f12281e39","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/13403ee5-ed98-5adb-b5db-946f12281e39/attachment.py","path":"scripts/validate.py","size":12477,"sha256":"172edbc0d5f7bf5e9d8e3e6fa75fd143db8465ff2e57e8f9b5e14acc1013d442","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"20b525e64e8de913d37ac3c4ea60ae9d6994567b74e3a689f6a27a5d9c0ef099","attachment_count":2,"text_attachments":2,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":2,"skill_md_path":"skills/biome-validator/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"security","category_label":"Security"},"exact_dupes_collapsed_into_this":1},"version":"v1","category":"security","metadata":{"tags":"biome, linter, formatter, validation, code-quality","version":"1.0.0"},"import_tag":"clean-skills-v1","description":"Validate Biome 2.3+ configuration and detect outdated patterns. Ensures proper schema version, domains, assists, and recommended rules. Use before any linting work or when auditing existing projects."}},"renderedAt":1782980401440}

Biome Validator Validates Biome 2.3+ configuration and prevents outdated patterns. Ensures type-aware linting, domains, and modern Biome features are properly configured. When This Activates - Setting up linting for a new project - Before any code quality work - Auditing existing Biome configurations - After AI generates biome.json - CI/CD pipeline validation Quick Start What Gets Checked 1. Biome Version & Schema GOOD - Biome 2.3+: BAD - Old schema: 2. Package Version 3. Linter Configuration GOOD - Biome 2.x: 4. Biome Assist (2.0+) GOOD - Using assist: BAD - Old organizeImports location: 5.…