ultracite 7.2.2 → 7.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,29 +7,14 @@
7
7
  "indentScriptAndStyle": true
8
8
  }
9
9
  },
10
- // Disable organizeImports for Astro files — Biome's import organizer
11
- // incorrectly removes all imports in template-based files when used with
12
- // experimentalFullSupportEnabled. Upstream: https://github.com/biomejs/biome/issues/8596
13
- "assist": {
14
- "actions": {
15
- "source": {
16
- "organizeImports": "off"
17
- }
18
- }
19
- },
20
10
  "overrides": [
21
11
  {
22
12
  "includes": ["**/*.astro"],
23
13
  "linter": {
24
14
  "rules": {
25
15
  "correctness": {
26
- "noUnusedVariables": "off",
27
16
  "noUnusedImports": "off"
28
17
  },
29
- "style": {
30
- "useConst": "off",
31
- "useImportType": "off"
32
- },
33
18
  "suspicious": {
34
19
  "noReactSpecificProps": "error"
35
20
  }
@@ -65,7 +65,13 @@
65
65
  // Enforce attribute sorting in JSX elements.
66
66
  "useSortedAttributes": "on",
67
67
  // Enforce ordering of a JS object properties.
68
- "useSortedKeys": "off"
68
+ "useSortedKeys": "off",
69
+ // Enforce no duplicate classes in the file.
70
+ "noDuplicateClasses": "on",
71
+ // Enforce ordering of a TypeScript interface members.
72
+ "useSortedInterfaceMembers": "on",
73
+ // Enforce ordering of a JavaScript object properties.
74
+ "useSortedProperties": "on"
69
75
  }
70
76
  }
71
77
  },
@@ -7,29 +7,14 @@
7
7
  "indentScriptAndStyle": true
8
8
  }
9
9
  },
10
- // Disable organizeImports for Svelte files — Biome's import organizer
11
- // incorrectly removes all imports in template-based files when used with
12
- // experimentalFullSupportEnabled. Upstream: https://github.com/biomejs/biome/issues/8596
13
- "assist": {
14
- "actions": {
15
- "source": {
16
- "organizeImports": "off"
17
- }
18
- }
19
- },
20
10
  "overrides": [
21
11
  {
22
12
  "includes": ["**/*.svelte"],
23
13
  "linter": {
24
14
  "rules": {
25
15
  "correctness": {
26
- "noUnusedVariables": "off",
27
16
  "noUnusedImports": "off"
28
17
  },
29
- "style": {
30
- "useConst": "off",
31
- "useImportType": "off"
32
- },
33
18
  "suspicious": {
34
19
  "noReactSpecificProps": "error"
35
20
  }
@@ -7,29 +7,14 @@
7
7
  "indentScriptAndStyle": true
8
8
  }
9
9
  },
10
- // Disable organizeImports for Vue files — Biome's import organizer
11
- // incorrectly removes all imports in template-based files when used with
12
- // experimentalFullSupportEnabled. Upstream: https://github.com/biomejs/biome/issues/8596
13
- "assist": {
14
- "actions": {
15
- "source": {
16
- "organizeImports": "off"
17
- }
18
- }
19
- },
20
10
  "overrides": [
21
11
  {
22
12
  "includes": ["**/*.vue"],
23
13
  "linter": {
24
14
  "rules": {
25
15
  "correctness": {
26
- "noUnusedVariables": "off",
27
16
  "noUnusedImports": "off"
28
17
  },
29
- "style": {
30
- "useConst": "off",
31
- "useImportType": "off"
32
- },
33
18
  "suspicious": {
34
19
  "noReactSpecificProps": "error"
35
20
  }
package/dist/index.js CHANGED
@@ -97,7 +97,7 @@ ${o}`)}}});var g3,U1=E(()=>{g3=G1({"./husky.ts":()=>(F1(),o1(Dt)),"./lefthook.ts
97
97
  `}else e+=`${i}: '${o}'
98
98
  `;return e},k3=async()=>{try{let t=D1(await d1("./package.json","utf-8"));return t?t.type==="module":!1}catch{return!1}},b3=async t=>{let e=D1(await d1("./package.json","utf-8"));e&&(e["lint-staged"]?e["lint-staged"]=q(e["lint-staged"],C(t)):e["lint-staged"]=C(t),await F("./package.json",JSON.stringify(e,null,2)))},z3=async(t,e)=>{let i=await d1(t,"utf-8"),o=D1(i);if(!o)return;let n=q(o,C(e));await F(t,JSON.stringify(n,null,2))},C3=async(t,e)=>{let i=await d1(t,"utf-8"),o=v3(i);if(!o)return;let n=q(o,C(e));await F(t,y3(n))},S3=async(t,e)=>{let n=(await import(u3(t).href)).default||{},s=q(n,C(e)),r=`export default ${JSON.stringify(s,null,2)};
99
99
  `;await F(t,r)},j3=async(t,e)=>{delete z1.cache[z1.resolve(`./${t}`)];let i=g3(`./${t}`),o=q(i,C(e)),n=`module.exports = ${JSON.stringify(o,null,2)};
100
- `;await F(t,n)},L1=async t=>{await F(".lintstagedrc.json",JSON.stringify(C(t),null,2))},P3=async(t,e)=>{if(t==="./package.json"){await b3(e);return}if(t.endsWith(".json")||t==="./.lintstagedrc"){await z3(t,e);return}if(t.endsWith(".yaml")||t.endsWith(".yml")){await C3(t,e);return}let i=await k3();if(t.endsWith(".mjs")||t.endsWith(".js")&&i){try{await S3(t,e)}catch{await L1(e)}return}if(t.endsWith(".cjs")||t.endsWith(".js")&&!i)try{await j3(t,e)}catch{await L1(e)}},G={exists:async()=>{for(let t of Ht)if(await l(t))return!0;return!1},install:async t=>{await h3("lint-staged",{packageManager:t,workspace:await b(),silent:!0,corepack:!1})},create:async t=>{await F(".lintstagedrc.json",JSON.stringify(C(t),null,2))},update:async t=>{let e=null;for(let i of Ht)if(await l(i)){e=i;break}if(!e){await L1(t);return}await P3(e,t)}}});import{Command as bi}from"commander";var k={name:"ultracite",description:"The AI-ready formatter that helps you write and generate code faster.",version:"7.2.2",type:"module",bin:{ultracite:"dist/index.js"},files:["config","dist/index.js","dist/index.d.ts","README.md"],scripts:{build:"tsup",test:"bun test","test:coverage":"bun test --coverage"},exports:{"./biome/*":"./config/biome/*/biome.jsonc","./eslint/*":"./config/eslint/*/eslint.config.mjs","./oxlint/*":"./config/oxlint/*/.oxlintrc.json","./prettier":"./config/prettier/prettier.config.mjs","./stylelint":"./config/stylelint/stylelint.config.mjs","./*":"./config/biome/*/biome.jsonc"},author:"Hayden Bleasel <hello@haydenbleasel.com>",bugs:{url:"https://github.com/haydenbleasel/ultracite/issues"},homepage:"https://www.ultracite.ai/",keywords:["ultracite","biome","linter","formatter","fixer"],license:"MIT",publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},repository:{type:"git",url:"git+https://github.com/haydenbleasel/ultracite.git"},devDependencies:{"@biomejs/biome":"2.3.15","@eslint/js":"^10.0.1","@next/eslint-plugin-next":"^16.1.6","@repo/data":"workspace:*","@tanstack/eslint-plugin-query":"^5.91.4","@types/node":"^25.2.3","@typescript-eslint/eslint-plugin":"^8.55.0","@typescript-eslint/parser":"^8.55.0","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.4","eslint-plugin-angular":"^5.0.0","eslint-plugin-astro":"^1.5.0","eslint-plugin-compat":"^6.1.0","eslint-plugin-cypress":"^5.3.0","eslint-plugin-github":"6.0.0","eslint-plugin-html":"^8.1.4","eslint-plugin-import":"^2.32.0","eslint-plugin-jest":"^29.14.0","eslint-plugin-jsx-a11y":"^6.10.2","eslint-plugin-n":"^17.23.2","eslint-plugin-prettier":"^5.5.5","eslint-plugin-promise":"^7.2.1","eslint-plugin-qwik":"^1.19.0","eslint-plugin-react":"^7.37.5","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-remix":"^1.1.1","eslint-plugin-solid":"^0.14.5","eslint-plugin-sonarjs":"^3.0.7","eslint-plugin-storybook":"^10.2.8","eslint-plugin-svelte":"^3.15.0","eslint-plugin-unicorn":"^63.0.0","eslint-plugin-unused-imports":"^4.4.1","eslint-plugin-vue":"^10.7.0",globals:"^17.3.0","prettier-plugin-tailwindcss":"^0.7.2","stylelint-config-idiomatic-order":"^10.0.0","stylelint-config-standard":"^40.0.0","stylelint-prettier":"^5.0.3",tsup:"^8.5.1",oxlint:"^1.47.0"},dependencies:{"@clack/prompts":"^1.0.1",commander:"^14.0.3",deepmerge:"^4.3.1",glob:"^13.0.3","jsonc-parser":"^3.3.1",nypm:"^0.6.5"},peerDependencies:{oxlint:"^1.0.0"},peerDependenciesMeta:{oxlint:{optional:!0}},packageManager:"bun@1.3.9"};m();import{spawnSync as B}from"child_process";import $ from"process";var je=(t,e)=>{let i=["check","--no-errors-on-unmatched",...e];t.length>0?i.push(...h(t)):i.push("./");let o=B("biome",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Biome: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},Pe=(t,e)=>{let i=[...e,...t.length>0?h(t):["."]],o=B("eslint",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run ESLint: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},Oe=(t,e)=>{let i=["--check",...e,...t.length>0?h(t):["."]],o=B("prettier",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Prettier: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},Ie=(t,e)=>{let i=[...e,...t.length>0?h(t):["."]],o=B("stylelint",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Stylelint: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},Ae=(t,e)=>{let i=[...e,...t.length>0?h(t):["."]],o=B("oxlint",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Oxlint: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},Fe=(t,e)=>{let i=["--check",...e,...t.length>0?h(t):["."]],o=B("oxfmt",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run oxfmt: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},H1=async(t=[],e=[])=>{let i=await n1();if(!i)throw new Error("No linter configuration found. Run `ultracite init` to set up a linter.");switch(i){case"eslint":{await Oe(t,[]),await Pe(t,e),await Ie(t,[]);break}case"oxlint":{await Fe(t,[]),await Ae(t,e);break}default:await je(t,e)}};import{spawnSync as j1}from"child_process";import{existsSync as S}from"fs";import{readFile as r1}from"fs/promises";import{join as j}from"path";import P from"process";import{intro as Ee,log as s1,outro as S1,spinner as Be}from"@clack/prompts";import{parse as V1}from"jsonc-parser";m();var $e=[".prettierrc",".prettierrc.js",".prettierrc.cjs",".prettierrc.mjs",".prettierrc.json",".prettierrc.yaml",".prettierrc.yml","prettier.config.js","prettier.config.mjs","prettier.config.cjs"],Ue=[".eslintrc",".eslintrc.js",".eslintrc.cjs",".eslintrc.mjs",".eslintrc.json",".eslintrc.yaml",".eslintrc.yml","eslint.config.js","eslint.config.mjs","eslint.config.cjs","eslint.config.ts","eslint.config.mts","eslint.config.cts"],_e=()=>{let t=j1("biome",["--version"],{encoding:"utf-8",shell:p});return t.status===0&&t.stdout?{name:"Biome installation",status:"pass",message:`Biome is installed (${t.stdout.trim()})`}:{name:"Biome installation",status:"fail",message:"Biome is not installed or not accessible"}},Le=()=>{let t=j1("eslint",["--version"],{encoding:"utf-8",shell:p});return t.status===0&&t.stdout?{name:"ESLint installation",status:"pass",message:`ESLint is installed (${t.stdout.trim()})`}:{name:"ESLint installation",status:"warn",message:"ESLint is not installed (optional)"}},De=()=>{let t=j1("oxlint",["--version"],{encoding:"utf-8",shell:p});return t.status===0&&t.stdout?{name:"Oxlint installation",status:"pass",message:`Oxlint is installed (${t.stdout.trim()})`}:{name:"Oxlint installation",status:"warn",message:"Oxlint is not installed (optional)"}},Ne=async()=>{let t=j(P.cwd(),"biome.json"),e=j(P.cwd(),"biome.jsonc"),i=null;if(S(t)?i=t:S(e)&&(i=e),!i)return{name:"Biome configuration",status:"warn",message:"No biome.json or biome.jsonc file found"};try{let o=await r1(i,"utf-8"),n=V1(o);return Array.isArray(n?.extends)&&n.extends.includes("ultracite/biome/core")?{name:"Biome configuration",status:"pass",message:"biome.json(c) extends ultracite/biome/core"}:{name:"Biome configuration",status:"warn",message:"biome.json(c) exists but doesn't extend ultracite/biome/core"}}catch{return{name:"Biome configuration",status:"fail",message:"Could not parse biome.json(c) file"}}},Re=async()=>{let t=["eslint.config.mjs","eslint.config.js","eslint.config.cjs","eslint.config.ts","eslint.config.mts","eslint.config.cts"],e=null;for(let i of t){let o=j(P.cwd(),i);if(S(o)){e=o;break}}if(!e)return{name:"ESLint configuration",status:"warn",message:"No eslint.config.* file found (optional)"};try{return(await r1(e,"utf-8")).includes("ultracite/eslint")?{name:"ESLint configuration",status:"pass",message:"eslint.config.* imports ultracite/eslint"}:{name:"ESLint configuration",status:"warn",message:"eslint.config.* exists but doesn't import ultracite/eslint"}}catch{return{name:"ESLint configuration",status:"fail",message:"Could not read eslint.config.* file"}}},Te=t=>`./node_modules/ultracite/config/oxlint/${t}/.oxlintrc.json`,Ge=async()=>{let t=j(P.cwd(),".oxlintrc.json");if(!S(t))return{name:"Oxlint configuration",status:"warn",message:"No .oxlintrc.json file found (optional)"};try{let e=await r1(t,"utf-8"),i=V1(e);return Array.isArray(i?.extends)&&i.extends.includes(Te("core"))?{name:"Oxlint configuration",status:"pass",message:".oxlintrc.json extends ultracite oxlint config"}:{name:"Oxlint configuration",status:"warn",message:".oxlintrc.json exists but doesn't extend ultracite config"}}catch{return{name:"Oxlint configuration",status:"fail",message:"Could not parse .oxlintrc.json file"}}},Me=async()=>{let t=j(P.cwd(),"package.json");if(!S(t))return{name:"Ultracite dependency",status:"warn",message:"No package.json found"};try{let e=JSON.parse(await r1(t,"utf-8")),i=e.dependencies?.ultracite||e.devDependencies?.ultracite||e.peerDependencies?.ultracite;return i?{name:"Ultracite dependency",status:"pass",message:`Ultracite is in package.json (${i})`}:{name:"Ultracite dependency",status:"warn",message:"Ultracite not found in package.json dependencies"}}catch{return{name:"Ultracite dependency",status:"warn",message:"Could not parse package.json"}}},Je=()=>{let t=$e.some(o=>S(j(P.cwd(),o))),i=Ue.filter(o=>!o.startsWith("eslint.config")).some(o=>S(j(P.cwd(),o)));if(t||i){let o=[];return t&&o.push("Prettier"),i&&o.push("ESLint (legacy config)"),{name:"Conflicting tools",status:"warn",message:`Found potentially conflicting tools: ${o.join(", ")}`}}return{name:"Conflicting tools",status:"pass",message:"No conflicting formatting/linting tools found"}},z=async(t,e)=>{let i=Be();i.start(`Checking ${e}...`);let o=await t();return o.status==="pass"||o.status,i.stop(o.message),o},X1=async()=>{Ee(`Ultracite v${k.version} Doctor`);let t=[];t.push(await z(_e,"Biome installation")),t.push(await z(Le,"ESLint installation")),t.push(await z(De,"Oxlint installation")),t.push(await z(Ne,"Biome configuration")),t.push(await z(Re,"ESLint configuration")),t.push(await z(Ge,"Oxlint configuration")),t.push(await z(Me,"Ultracite dependency")),t.push(await z(Je,"conflicting tools"));let e=t.filter(n=>n.status==="pass").length,i=t.filter(n=>n.status==="fail").length,o=t.filter(n=>n.status==="warn").length;if(s1.info(`Summary: ${e} passed, ${o} warnings, ${i} failed`),i>0)throw s1.error("Some checks failed. Run 'ultracite init' to fix issues."),S1("Doctor complete"),new Error("Doctor checks failed");if(o>0){s1.warn("Some optional improvements available. Run 'ultracite init' to configure."),S1("Doctor complete");return}s1.success("Everything looks good!"),S1("Doctor complete")};m();import{spawnSync as U}from"child_process";import _ from"process";var We=(t,e)=>{let i=["check","--write","--no-errors-on-unmatched",...e];t.length>0?i.push(...h(t)):i.push("./");let o=U("biome",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Biome: ${o.error.message}`);o.status!==0&&_.exit(o.status??1)},He=(t,e)=>{let i=["--fix",...e,...t.length>0?h(t):["."]],o=U("eslint",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run ESLint: ${o.error.message}`);o.status!==0&&_.exit(o.status??1)},Ve=(t,e)=>{let i=["--write",...e,...t.length>0?h(t):["."]],o=U("prettier",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Prettier: ${o.error.message}`);o.status!==0&&_.exit(o.status??1)},Xe=(t,e)=>{let i=["--fix",...e,...t.length>0?h(t):["."]],o=U("stylelint",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Stylelint: ${o.error.message}`);o.status!==0&&_.exit(o.status??1)},Qe=(t,e)=>{let i=e.includes("--unsafe"),o=e.filter(r=>r!=="--unsafe"),n=[i?"--fix-dangerously":"--fix",...o,...t.length>0?h(t):["."]],s=U("oxlint",n,{stdio:"inherit",shell:p});if(s.error)throw new Error(`Failed to run Oxlint: ${s.error.message}`);s.status!==0&&_.exit(s.status??1)},Ke=(t,e)=>{let i=["--write",...e,...t.length>0?h(t):["."]],o=U("oxfmt",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run oxfmt: ${o.error.message}`);o.status!==0&&_.exit(o.status??1)},Q1=async(t,e=[])=>{let i=await n1();if(!i)throw new Error("No linter configuration found. Run `ultracite init` to set up a linter.");switch(i){case"eslint":{await Ve(t,[]),await He(t,e),await Xe(t,[]);break}case"oxlint":{await Ke(t,[]),await Qe(t,e);break}default:await We(t,e)}};import ti from"process";import{cancel as J,intro as ei,isCancel as W,log as y1,multiselect as t1,select as ii,spinner as g}from"@clack/prompts";var K1="./aider-K7JLZT2D.svg";var Z1="./amazon-q-TSOJNPXB.svg";var Y1="./amp-EV4LVL5I.svg";var q1="./augmentcode-Q62PVXKO.svg";var tt="./claude-6DLEHRDQ.svg";var et="./cline-6HWKIYN7.svg";var it="./codex-NQZ5TJCL.svg";var ot="./copilot-L2IY45R2.svg";var nt="./crush-LYLRDQGZ.svg";var a1="./cursor-GQNH5LCA.svg";var st="./droid-266OHJBT.svg";var rt="./firebase-studio-ILLWWYU7.svg";var at="./firebender-UNO6LSZG.svg";var ct="./gemini-OYS6V4BH.svg";var lt="./goose-XBIEVD4H.svg";var ft="./jules-HJPVWU73.svg";var dt="./junie-RUWBUV6N.svg";var pt="./kilo-code-4QYUYY2E.svg";var mt="./mistral-HQ63EC2B.svg";var gt="./open-hands-K5EYKO6T.svg";var ut="./opencode-K3274JKQ.svg";var ht="./qwen-N3D5CQYL.svg";var wt="./roo-code-CVLBTS7D.svg";var xt="./vercel-27VSITAQ.svg";var vt="./warp-OZKAAQRT.svg";var L=[{id:"claude",name:"Claude Code",subtitle:"Anthropic's agentic CLI",description:"Anthropic's official CLI for Claude, an agentic coding tool that lives in your terminal.",config:{path:".claude/CLAUDE.md",appendMode:!0},logo:tt,hooks:{path:".claude/settings.json",getContent:t=>({hooks:{PostToolUse:[{matcher:"Write|Edit",hooks:[{type:"command",command:t}]}]}})}},{id:"codex",name:"Codex",subtitle:"OpenAI's coding agent",description:"OpenAI's cloud-based coding agent for autonomous software development tasks.",config:{path:"AGENTS.md",appendMode:!0},logo:it},{id:"jules",name:"Jules",subtitle:"Google's async agent",description:"Google's asynchronous AI coding agent that works in the background to complete development tasks.",config:{path:"AGENTS.md",appendMode:!0},logo:ft},{id:"copilot",name:"GitHub Copilot",subtitle:"GitHub's AI pair programmer",description:"GitHub's AI pair programmer that suggests code completions and helps write code faster.",config:{path:".github/copilot-instructions.md",appendMode:!0,header:`---
100
+ `;await F(t,n)},L1=async t=>{await F(".lintstagedrc.json",JSON.stringify(C(t),null,2))},P3=async(t,e)=>{if(t==="./package.json"){await b3(e);return}if(t.endsWith(".json")||t==="./.lintstagedrc"){await z3(t,e);return}if(t.endsWith(".yaml")||t.endsWith(".yml")){await C3(t,e);return}let i=await k3();if(t.endsWith(".mjs")||t.endsWith(".js")&&i){try{await S3(t,e)}catch{await L1(e)}return}if(t.endsWith(".cjs")||t.endsWith(".js")&&!i)try{await j3(t,e)}catch{await L1(e)}},G={exists:async()=>{for(let t of Ht)if(await l(t))return!0;return!1},install:async t=>{await h3("lint-staged",{packageManager:t,workspace:await b(),silent:!0,corepack:!1})},create:async t=>{await F(".lintstagedrc.json",JSON.stringify(C(t),null,2))},update:async t=>{let e=null;for(let i of Ht)if(await l(i)){e=i;break}if(!e){await L1(t);return}await P3(e,t)}}});import{Command as bi}from"commander";var k={name:"ultracite",description:"The AI-ready formatter that helps you write and generate code faster.",version:"7.2.3",type:"module",bin:{ultracite:"dist/index.js"},files:["config","dist/index.js","dist/index.d.ts","README.md"],scripts:{build:"tsup",test:"bun test","test:coverage":"bun test --coverage"},exports:{"./biome/*":"./config/biome/*/biome.jsonc","./eslint/*":"./config/eslint/*/eslint.config.mjs","./oxlint/*":"./config/oxlint/*/.oxlintrc.json","./prettier":"./config/prettier/prettier.config.mjs","./stylelint":"./config/stylelint/stylelint.config.mjs","./*":"./config/biome/*/biome.jsonc"},author:"Hayden Bleasel <hello@haydenbleasel.com>",bugs:{url:"https://github.com/haydenbleasel/ultracite/issues"},homepage:"https://www.ultracite.ai/",keywords:["ultracite","biome","linter","formatter","fixer"],license:"MIT",publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},repository:{type:"git",url:"git+https://github.com/haydenbleasel/ultracite.git"},devDependencies:{"@biomejs/biome":"2.4.0","@eslint/js":"^10.0.1","@next/eslint-plugin-next":"^16.1.6","@repo/data":"workspace:*","@tanstack/eslint-plugin-query":"^5.91.4","@types/node":"^25.2.3","@typescript-eslint/eslint-plugin":"^8.55.0","@typescript-eslint/parser":"^8.55.0","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.4","eslint-plugin-angular":"^5.0.0","eslint-plugin-astro":"^1.5.0","eslint-plugin-compat":"^6.1.0","eslint-plugin-cypress":"^5.3.0","eslint-plugin-github":"6.0.0","eslint-plugin-html":"^8.1.4","eslint-plugin-import":"^2.32.0","eslint-plugin-jest":"^29.14.0","eslint-plugin-jsx-a11y":"^6.10.2","eslint-plugin-n":"^17.23.2","eslint-plugin-prettier":"^5.5.5","eslint-plugin-promise":"^7.2.1","eslint-plugin-qwik":"^1.19.0","eslint-plugin-react":"^7.37.5","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-remix":"^1.1.1","eslint-plugin-solid":"^0.14.5","eslint-plugin-sonarjs":"^3.0.7","eslint-plugin-storybook":"^10.2.8","eslint-plugin-svelte":"^3.15.0","eslint-plugin-unicorn":"^63.0.0","eslint-plugin-unused-imports":"^4.4.1","eslint-plugin-vue":"^10.7.0",globals:"^17.3.0","prettier-plugin-tailwindcss":"^0.7.2","stylelint-config-idiomatic-order":"^10.0.0","stylelint-config-standard":"^40.0.0","stylelint-prettier":"^5.0.3",tsup:"^8.5.1",oxlint:"^1.47.0"},dependencies:{"@clack/prompts":"^1.0.1",commander:"^14.0.3",deepmerge:"^4.3.1",glob:"^13.0.3","jsonc-parser":"^3.3.1",nypm:"^0.6.5"},peerDependencies:{oxlint:"^1.0.0"},peerDependenciesMeta:{oxlint:{optional:!0}},packageManager:"bun@1.3.9"};m();import{spawnSync as B}from"child_process";import $ from"process";var je=(t,e)=>{let i=["check","--no-errors-on-unmatched",...e];t.length>0?i.push(...h(t)):i.push("./");let o=B("biome",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Biome: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},Pe=(t,e)=>{let i=[...e,...t.length>0?h(t):["."]],o=B("eslint",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run ESLint: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},Oe=(t,e)=>{let i=["--check",...e,...t.length>0?h(t):["."]],o=B("prettier",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Prettier: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},Ie=(t,e)=>{let i=[...e,...t.length>0?h(t):["."]],o=B("stylelint",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Stylelint: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},Ae=(t,e)=>{let i=[...e,...t.length>0?h(t):["."]],o=B("oxlint",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Oxlint: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},Fe=(t,e)=>{let i=["--check",...e,...t.length>0?h(t):["."]],o=B("oxfmt",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run oxfmt: ${o.error.message}`);o.status!==0&&$.exit(o.status??1)},H1=async(t=[],e=[])=>{let i=await n1();if(!i)throw new Error("No linter configuration found. Run `ultracite init` to set up a linter.");switch(i){case"eslint":{await Oe(t,[]),await Pe(t,e),await Ie(t,[]);break}case"oxlint":{await Fe(t,[]),await Ae(t,e);break}default:await je(t,e)}};import{spawnSync as j1}from"child_process";import{existsSync as S}from"fs";import{readFile as r1}from"fs/promises";import{join as j}from"path";import P from"process";import{intro as Ee,log as s1,outro as S1,spinner as Be}from"@clack/prompts";import{parse as V1}from"jsonc-parser";m();var $e=[".prettierrc",".prettierrc.js",".prettierrc.cjs",".prettierrc.mjs",".prettierrc.json",".prettierrc.yaml",".prettierrc.yml","prettier.config.js","prettier.config.mjs","prettier.config.cjs"],Ue=[".eslintrc",".eslintrc.js",".eslintrc.cjs",".eslintrc.mjs",".eslintrc.json",".eslintrc.yaml",".eslintrc.yml","eslint.config.js","eslint.config.mjs","eslint.config.cjs","eslint.config.ts","eslint.config.mts","eslint.config.cts"],_e=()=>{let t=j1("biome",["--version"],{encoding:"utf-8",shell:p});return t.status===0&&t.stdout?{name:"Biome installation",status:"pass",message:`Biome is installed (${t.stdout.trim()})`}:{name:"Biome installation",status:"fail",message:"Biome is not installed or not accessible"}},Le=()=>{let t=j1("eslint",["--version"],{encoding:"utf-8",shell:p});return t.status===0&&t.stdout?{name:"ESLint installation",status:"pass",message:`ESLint is installed (${t.stdout.trim()})`}:{name:"ESLint installation",status:"warn",message:"ESLint is not installed (optional)"}},De=()=>{let t=j1("oxlint",["--version"],{encoding:"utf-8",shell:p});return t.status===0&&t.stdout?{name:"Oxlint installation",status:"pass",message:`Oxlint is installed (${t.stdout.trim()})`}:{name:"Oxlint installation",status:"warn",message:"Oxlint is not installed (optional)"}},Ne=async()=>{let t=j(P.cwd(),"biome.json"),e=j(P.cwd(),"biome.jsonc"),i=null;if(S(t)?i=t:S(e)&&(i=e),!i)return{name:"Biome configuration",status:"warn",message:"No biome.json or biome.jsonc file found"};try{let o=await r1(i,"utf-8"),n=V1(o);return Array.isArray(n?.extends)&&n.extends.includes("ultracite/biome/core")?{name:"Biome configuration",status:"pass",message:"biome.json(c) extends ultracite/biome/core"}:{name:"Biome configuration",status:"warn",message:"biome.json(c) exists but doesn't extend ultracite/biome/core"}}catch{return{name:"Biome configuration",status:"fail",message:"Could not parse biome.json(c) file"}}},Re=async()=>{let t=["eslint.config.mjs","eslint.config.js","eslint.config.cjs","eslint.config.ts","eslint.config.mts","eslint.config.cts"],e=null;for(let i of t){let o=j(P.cwd(),i);if(S(o)){e=o;break}}if(!e)return{name:"ESLint configuration",status:"warn",message:"No eslint.config.* file found (optional)"};try{return(await r1(e,"utf-8")).includes("ultracite/eslint")?{name:"ESLint configuration",status:"pass",message:"eslint.config.* imports ultracite/eslint"}:{name:"ESLint configuration",status:"warn",message:"eslint.config.* exists but doesn't import ultracite/eslint"}}catch{return{name:"ESLint configuration",status:"fail",message:"Could not read eslint.config.* file"}}},Te=t=>`./node_modules/ultracite/config/oxlint/${t}/.oxlintrc.json`,Ge=async()=>{let t=j(P.cwd(),".oxlintrc.json");if(!S(t))return{name:"Oxlint configuration",status:"warn",message:"No .oxlintrc.json file found (optional)"};try{let e=await r1(t,"utf-8"),i=V1(e);return Array.isArray(i?.extends)&&i.extends.includes(Te("core"))?{name:"Oxlint configuration",status:"pass",message:".oxlintrc.json extends ultracite oxlint config"}:{name:"Oxlint configuration",status:"warn",message:".oxlintrc.json exists but doesn't extend ultracite config"}}catch{return{name:"Oxlint configuration",status:"fail",message:"Could not parse .oxlintrc.json file"}}},Me=async()=>{let t=j(P.cwd(),"package.json");if(!S(t))return{name:"Ultracite dependency",status:"warn",message:"No package.json found"};try{let e=JSON.parse(await r1(t,"utf-8")),i=e.dependencies?.ultracite||e.devDependencies?.ultracite||e.peerDependencies?.ultracite;return i?{name:"Ultracite dependency",status:"pass",message:`Ultracite is in package.json (${i})`}:{name:"Ultracite dependency",status:"warn",message:"Ultracite not found in package.json dependencies"}}catch{return{name:"Ultracite dependency",status:"warn",message:"Could not parse package.json"}}},Je=()=>{let t=$e.some(o=>S(j(P.cwd(),o))),i=Ue.filter(o=>!o.startsWith("eslint.config")).some(o=>S(j(P.cwd(),o)));if(t||i){let o=[];return t&&o.push("Prettier"),i&&o.push("ESLint (legacy config)"),{name:"Conflicting tools",status:"warn",message:`Found potentially conflicting tools: ${o.join(", ")}`}}return{name:"Conflicting tools",status:"pass",message:"No conflicting formatting/linting tools found"}},z=async(t,e)=>{let i=Be();i.start(`Checking ${e}...`);let o=await t();return o.status==="pass"||o.status,i.stop(o.message),o},X1=async()=>{Ee(`Ultracite v${k.version} Doctor`);let t=[];t.push(await z(_e,"Biome installation")),t.push(await z(Le,"ESLint installation")),t.push(await z(De,"Oxlint installation")),t.push(await z(Ne,"Biome configuration")),t.push(await z(Re,"ESLint configuration")),t.push(await z(Ge,"Oxlint configuration")),t.push(await z(Me,"Ultracite dependency")),t.push(await z(Je,"conflicting tools"));let e=t.filter(n=>n.status==="pass").length,i=t.filter(n=>n.status==="fail").length,o=t.filter(n=>n.status==="warn").length;if(s1.info(`Summary: ${e} passed, ${o} warnings, ${i} failed`),i>0)throw s1.error("Some checks failed. Run 'ultracite init' to fix issues."),S1("Doctor complete"),new Error("Doctor checks failed");if(o>0){s1.warn("Some optional improvements available. Run 'ultracite init' to configure."),S1("Doctor complete");return}s1.success("Everything looks good!"),S1("Doctor complete")};m();import{spawnSync as U}from"child_process";import _ from"process";var We=(t,e)=>{let i=["check","--write","--no-errors-on-unmatched",...e];t.length>0?i.push(...h(t)):i.push("./");let o=U("biome",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Biome: ${o.error.message}`);o.status!==0&&_.exit(o.status??1)},He=(t,e)=>{let i=["--fix",...e,...t.length>0?h(t):["."]],o=U("eslint",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run ESLint: ${o.error.message}`);o.status!==0&&_.exit(o.status??1)},Ve=(t,e)=>{let i=["--write",...e,...t.length>0?h(t):["."]],o=U("prettier",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Prettier: ${o.error.message}`);o.status!==0&&_.exit(o.status??1)},Xe=(t,e)=>{let i=["--fix",...e,...t.length>0?h(t):["."]],o=U("stylelint",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run Stylelint: ${o.error.message}`);o.status!==0&&_.exit(o.status??1)},Qe=(t,e)=>{let i=e.includes("--unsafe"),o=e.filter(r=>r!=="--unsafe"),n=[i?"--fix-dangerously":"--fix",...o,...t.length>0?h(t):["."]],s=U("oxlint",n,{stdio:"inherit",shell:p});if(s.error)throw new Error(`Failed to run Oxlint: ${s.error.message}`);s.status!==0&&_.exit(s.status??1)},Ke=(t,e)=>{let i=["--write",...e,...t.length>0?h(t):["."]],o=U("oxfmt",i,{stdio:"inherit",shell:p});if(o.error)throw new Error(`Failed to run oxfmt: ${o.error.message}`);o.status!==0&&_.exit(o.status??1)},Q1=async(t,e=[])=>{let i=await n1();if(!i)throw new Error("No linter configuration found. Run `ultracite init` to set up a linter.");switch(i){case"eslint":{await Ve(t,[]),await He(t,e),await Xe(t,[]);break}case"oxlint":{await Ke(t,[]),await Qe(t,e);break}default:await We(t,e)}};import ti from"process";import{cancel as J,intro as ei,isCancel as W,log as y1,multiselect as t1,select as ii,spinner as g}from"@clack/prompts";var K1="./aider-K7JLZT2D.svg";var Z1="./amazon-q-TSOJNPXB.svg";var Y1="./amp-EV4LVL5I.svg";var q1="./augmentcode-Q62PVXKO.svg";var tt="./claude-6DLEHRDQ.svg";var et="./cline-6HWKIYN7.svg";var it="./codex-NQZ5TJCL.svg";var ot="./copilot-L2IY45R2.svg";var nt="./crush-LYLRDQGZ.svg";var a1="./cursor-GQNH5LCA.svg";var st="./droid-266OHJBT.svg";var rt="./firebase-studio-ILLWWYU7.svg";var at="./firebender-UNO6LSZG.svg";var ct="./gemini-OYS6V4BH.svg";var lt="./goose-XBIEVD4H.svg";var ft="./jules-HJPVWU73.svg";var dt="./junie-RUWBUV6N.svg";var pt="./kilo-code-4QYUYY2E.svg";var mt="./mistral-HQ63EC2B.svg";var gt="./open-hands-K5EYKO6T.svg";var ut="./opencode-K3274JKQ.svg";var ht="./qwen-N3D5CQYL.svg";var wt="./roo-code-CVLBTS7D.svg";var xt="./vercel-27VSITAQ.svg";var vt="./warp-OZKAAQRT.svg";var L=[{id:"claude",name:"Claude Code",subtitle:"Anthropic's agentic CLI",description:"Anthropic's official CLI for Claude, an agentic coding tool that lives in your terminal.",config:{path:".claude/CLAUDE.md",appendMode:!0},logo:tt,hooks:{path:".claude/settings.json",getContent:t=>({hooks:{PostToolUse:[{matcher:"Write|Edit",hooks:[{type:"command",command:t}]}]}})}},{id:"codex",name:"Codex",subtitle:"OpenAI's coding agent",description:"OpenAI's cloud-based coding agent for autonomous software development tasks.",config:{path:"AGENTS.md",appendMode:!0},logo:it},{id:"jules",name:"Jules",subtitle:"Google's async agent",description:"Google's asynchronous AI coding agent that works in the background to complete development tasks.",config:{path:"AGENTS.md",appendMode:!0},logo:ft},{id:"copilot",name:"GitHub Copilot",subtitle:"GitHub's AI pair programmer",description:"GitHub's AI pair programmer that suggests code completions and helps write code faster.",config:{path:".github/copilot-instructions.md",appendMode:!0,header:`---
101
101
  applyTo: "**/*.{ts,tsx,js,jsx}"
102
102
  ---`},logo:ot},{id:"cline",name:"Cline",subtitle:"Autonomous VS Code agent",description:"An autonomous coding agent for VS Code that can create and edit files, run commands, and more.",config:{path:".clinerules",appendMode:!0},logo:et},{id:"amp",name:"AMP",subtitle:"Sourcegraph's coding agent",description:"Sourcegraph's AI coding agent that understands your entire codebase for intelligent assistance.",config:{path:"AGENTS.md",appendMode:!0},logo:Y1},{id:"aider",name:"Aider",subtitle:"Terminal pair programming",description:"AI pair programming in your terminal with support for multiple LLM providers.",config:{path:"ultracite.md"},logo:K1},{id:"firebase-studio",name:"Firebase Studio",subtitle:"Google's cloud IDE",description:"Google's AI-powered development environment integrated with Firebase services.",config:{path:".idx/airules.md",appendMode:!0},logo:rt},{id:"open-hands",name:"OpenHands",subtitle:"Open-source AI agents",description:"An open-source platform for AI software development agents with autonomous capabilities.",config:{path:".openhands/microagents/repo.md",appendMode:!0},logo:gt},{id:"gemini",name:"Gemini",subtitle:"Google's terminal AI",description:"Google's command-line interface for Gemini, bringing AI assistance to your terminal.",config:{path:"GEMINI.md",appendMode:!0},logo:ct},{id:"junie",name:"Junie",subtitle:"JetBrains' AI agent",description:"JetBrains' AI coding agent integrated into their IDE ecosystem.",config:{path:".junie/guidelines.md",appendMode:!0},logo:dt},{id:"augmentcode",name:"Augment Code",subtitle:"Enterprise AI assistant",description:"An AI coding assistant focused on enterprise development workflows and team collaboration.",config:{path:".augment/rules/ultracite.md"},logo:q1},{id:"kilo-code",name:"Kilo Code",subtitle:"Customizable VS Code AI",description:"A VS Code extension providing AI-powered coding assistance with customizable rules.",config:{path:".kilocode/rules/ultracite.md"},logo:pt},{id:"goose",name:"Goose",subtitle:"Block's open-source agent",description:"Block's open-source AI developer agent for autonomous software development.",config:{path:".goosehints",appendMode:!0},logo:lt},{id:"roo-code",name:"Roo Code",subtitle:"Codebase navigation AI",description:"An AI coding assistant focused on understanding and navigating complex codebases.",config:{path:".roo/rules/ultracite.md",appendMode:!0},logo:wt},{id:"warp",name:"Warp",subtitle:"Modern AI terminal",description:"A modern terminal with AI-powered command suggestions and workflow automation.",config:{path:"AGENTS.md",appendMode:!0},logo:vt},{id:"droid",name:"Droid",subtitle:"Automated code generation",description:"An AI development agent focused on automated code generation and task completion.",config:{path:"AGENTS.md",appendMode:!0},logo:st},{id:"opencode",name:"OpenCode",subtitle:"Open-source coding agent",description:"An open-source AI coding agent that runs in your terminal, desktop, or IDE with support for 75+ LLM providers.",config:{path:"AGENTS.md",appendMode:!0},logo:ut},{id:"crush",name:"Crush",subtitle:"Glamorous terminal agent",description:"Charmbracelet's glamorous AI coding agent for your terminal with multi-model support.",config:{path:"CRUSH.md",appendMode:!0},logo:nt},{id:"qwen",name:"Qwen Code",subtitle:"Alibaba's coding CLI",description:"Alibaba's command-line interface for Qwen3-Coder, enabling agentic coding with natural language.",config:{path:"AGENTS.md",appendMode:!0},logo:ht},{id:"amazon-q-cli",name:"Amazon Q CLI",subtitle:"AWS's terminal AI",description:"Amazon's AI-powered CLI with command autocompletion, natural language chat, and AWS integration.",config:{path:".amazonq/rules/ultracite.md",appendMode:!0},logo:Z1},{id:"firebender",name:"Firebender",subtitle:"Android Studio AI",description:"The most powerful AI coding assistant for Android Studio with codebase context and up-to-date Android knowledge.",config:{path:"firebender.json"},logo:at},{id:"cursor-cli",name:"Cursor CLI",subtitle:"Cursor's terminal agent",description:"Cursor's CLI, built to help you ship right from your terminal.",config:{path:".cursor/rules/ultracite.mdc",appendMode:!0},logo:a1},{id:"mistral-vibe",name:"Mistral Vibe",subtitle:"Minimal CLI coding agent",description:"Mistral's minimal CLI coding agent for streamlined development tasks.",config:{path:"VIBE.md"},logo:mt},{id:"vercel",name:"Vercel Agent",subtitle:"Vercel's AI Cloud agent",description:"Vercel's agent, powered by their AI Cloud.",config:{path:"AGENTS.md",appendMode:!0},logo:xt}];import D from"deepmerge";var yt="./antigravity-JVONECNW.svg";var kt="./kiro-N2M256R6.svg";var bt="./trae-RXVCFBOF.svg";var zt="./void-NYH3U3BB.svg";var Ct="./vscode-DEOUEB65.svg";var St="./windsurf-5T7JOTST.svg";var jt="./zed-SIARPESF.svg";var c1={"editor.defaultFormatter":"esbenp.prettier-vscode","typescript.tsdk":"node_modules/typescript/lib","editor.formatOnSave":!0,"editor.formatOnPaste":!0,"emmet.showExpandedAbbreviation":"never"},I2={"[javascript]":{"editor.defaultFormatter":"biomejs.biome"},"[typescript]":{"editor.defaultFormatter":"biomejs.biome"},"[javascriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[typescriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[json]":{"editor.defaultFormatter":"biomejs.biome"},"[jsonc]":{"editor.defaultFormatter":"biomejs.biome"},"[html]":{"editor.defaultFormatter":"biomejs.biome"},"[vue]":{"editor.defaultFormatter":"biomejs.biome"},"[svelte]":{"editor.defaultFormatter":"biomejs.biome"},"[css]":{"editor.defaultFormatter":"biomejs.biome"},"[yaml]":{"editor.defaultFormatter":"biomejs.biome"},"[graphql]":{"editor.defaultFormatter":"biomejs.biome"},"[markdown]":{"editor.defaultFormatter":"biomejs.biome"},"[mdx]":{"editor.defaultFormatter":"biomejs.biome"},"editor.codeActionsOnSave":{"source.fixAll.biome":"explicit","source.organizeImports.biome":"explicit"}},A2={"[javascript]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[javascriptreact]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[typescript]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[typescriptreact]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[json]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[jsonc]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[yaml]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[html]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[vue]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[vue-html]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[handlebars]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[css]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[scss]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[less]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[graphql]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[markdown]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"editor.codeActionsOnSave":{"source.fixAll.oxc":"explicit"}},F2={"editor.codeActionsOnSave":{"source.fixAll.eslint":"explicit","source.organizeImports":"explicit"}},O=(t="biome")=>{switch(t){case"biome":return D(c1,I2);case"eslint":return D(c1,F2);case"oxlint":return D(c1,A2);default:return c1}},l1={formatter:"language_server",format_on_save:"on",lsp:{"typescript-language-server":{settings:{typescript:{preferences:{includePackageJsonAutoImports:"on"}}}}}},E2={languages:{JavaScript:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},TypeScript:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},TSX:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}}}},B2={languages:{JavaScript:{formatter:{language_server:{name:"eslint"}},code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0}},TypeScript:{formatter:{language_server:{name:"eslint"}},code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0}},TSX:{formatter:{language_server:{name:"eslint"}},code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0}}}},$2={languages:{JavaScript:{formatter:{language_server:{name:"oxfmt"}},code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0}},TypeScript:{formatter:{language_server:{name:"oxfmt"}},code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0}},TSX:{formatter:{language_server:{name:"oxfmt"}},code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0}}},lsp:{oxlint:{initialization_options:{settings:{disableNestedConfig:!1,fixKind:"safe_fix",run:"onType",typeAware:!0,unusedDisableDirectives:"deny"}}},oxfmt:{initialization_options:{settings:{configPath:null,flags:{},"fmt.configPath":null,"fmt.experimental":!0,run:"onSave",typeAware:!1,unusedDisableDirectives:!1}}}}},U2=(t="biome")=>{switch(t){case"biome":return D(l1,E2);case"eslint":return D(l1,B2);case"oxlint":return D(l1,$2);default:return l1}},N=[{id:"vscode",name:"Visual Studio Code",subtitle:"The most popular code editor",description:"Microsoft's popular code editor with extensive extension support and built-in Git integration.",logo:Ct,config:{path:".vscode/settings.json",getContent:O,extensionCommand:"code --install-extension"}},{id:"cursor",name:"Cursor",subtitle:"The AI-first code editor",description:"The AI-first code editor built on VS Code with deep AI integration for coding assistance.",logo:a1,rules:{path:".cursor/rules/ultracite.mdc",header:`---
103
103
  description: Ultracite Rules - AI-Ready Formatter and Linter
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ultracite",
3
3
  "description": "The AI-ready formatter that helps you write and generate code faster.",
4
- "version": "7.2.2",
4
+ "version": "7.2.3",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "ultracite": "dist/index.js"
@@ -47,7 +47,7 @@
47
47
  "url": "git+https://github.com/haydenbleasel/ultracite.git"
48
48
  },
49
49
  "devDependencies": {
50
- "@biomejs/biome": "2.3.15",
50
+ "@biomejs/biome": "2.4.0",
51
51
  "@eslint/js": "^10.0.1",
52
52
  "@next/eslint-plugin-next": "^16.1.6",
53
53
  "@repo/data": "workspace:*",